C++案例---贪吃蛇

模块

墙壁;蛇;食物

墙壁模块

#pragma once
#include<iostream>
#include<string>
#include<vector>
#include<list>
using namespace std;
class Wall
{
public:
	enum
	{
		ROW=40,
		COL=40
	};

	//初始化墙壁
	void wallInit();

	//显示墙壁
	void showWall();

	//设置墙壁内同
	void setWall(int x,int y,char c);
	//查看墙壁内容
	char getWall(int x,int y);


	char gameArry[ROW][COL];
};

蛇模块

#pragma once 
#include"wall.h"
#include"food.h"

class Snake
{
public:
	enum
	{
		UP='W',
		DOWN='S',
		LEFT='A',
		RIGHT='D'
	};
	struct Node{
		int x;
		int y;
	    Node* next;
	};
	Snake(Wall &wall,Food &food);
	//初始化蛇
	void snakeInit();

	//销毁蛇
	void destroy();

	//增加节点
	void addNode(int x,int y);
	//删除尾节点节点
	void deleteNode();
	//移动
	bool move(char key);

     Node* pHead;
	 Wall &wall;
	 Food &food;
	 bool isRound;

};

食物模块

#pragma once 
#include"wall.h"

class Food
{
public:
	Food(Wall & wall);
	//设置食物
	void setFood();

	int FoodX;
	int FoodY;
	Wall &wall;
};

主函数

#include"wall.h"
#include"snake.h"
#include"food.h"
#include<time.h>
#include<conio.h>
#include<windows.h>
HANDLE hOut2 = GetStdHandle(STD_OUTPUT_HANDLE);//定义显示器句柄变量,并且这个只能在每个头文件中单独定义句柄和函数,否则无效
void gotoxy2(HANDLE hOut2, int x, int y)//其中x,y是与正常理解相反的,注意区分
{
	COORD pos;
	pos.X = x;             //横坐标
	pos.Y = y;            //纵坐标
	SetConsoleCursorPosition(hOut2, pos);
}//光标定位函数
int main()
{
	char preKey=NULL;
	bool isDead =false;
	srand((unsigned int)time(NULL));
	Wall wall;
	wall.wallInit();
	wall.showWall();

	Food food(wall);
	food.setFood();

	Snake snake(wall,food);
	snake.snakeInit();

	gotoxy2(hOut2,0,Wall::ROW);

	while(!isDead)
	{
		char key = _getch();
		if( preKey ==NULL && key==snake.LEFT)
			continue;
		do
		{
			if(key==snake.UP ||key ==snake.DOWN || key == snake.LEFT || key == snake.RIGHT)
			{
				//输入上下左右正确了,解决180度按键问题
				if(key == snake.LEFT && preKey == snake.RIGHT ||
					key == snake.RIGHT && preKey == snake.LEFT ||
					key ==snake.UP && preKey == snake.DOWN ||
					key == snake.DOWN && preKey == snake.UP)
				{
					key = preKey;
				}
				else
					preKey = key;//保存上一次的输入
			

				if(snake.move(key)==true)
				{
					//system("cls");
					//wall.showWall();
					gotoxy2(hOut2,0,Wall::ROW);
					Sleep(100);
				}
				else
				{
					isDead = true;
					break;
				}
			}
			else
			{
				key=preKey;
			}

		}while(!kbhit()); //没有键盘输入一直返回1
	}
	while(1){};
	return 0;
}

.cpp具体实现见源码
链接:https://pan.baidu.com/s/1nnpP1tyz54QNBJH3ojExCw
提取码:tdzw
复制这段内容后打开百度网盘手机App,操作更方便哦***

发布了59 篇原创文章 · 获赞 15 · 访问量 1万+

猜你喜欢

转载自blog.csdn.net/YanWenCheng_/article/details/104107627