关于c编写贪吃蛇小游戏

大概用了2天的时间编写的这个,讲一下这个游戏的大致思路。

1.首先是数据设计

包含两个东西

  1. 食物的结构体
  2. 蛇的结构体(通过数组实现蛇的存储(包含一些辅助宏))
  3. 我们在做两个全局变量
  4. 蛇的初始化移动方向
  5. 蛇的变化标记
#define MAPHEIGHT 25	
#define MAPWIDTH 60
#define SNAKESIZE 50
struct 
{
	//shiweudingwei食物定位
	int x;
	int	y;
}food;
struct 
{
	int x[SNAKESIZE];
	int y[SNAKESIZE];
	int len;
	int speed;
}snake;

2.功能设计

简单来讲就是抽象到函数,具体到对象

  1. 画地图
  2. 食物的产生
  3. 按键操作(wasd控制操作)
  4. 蛇的状态(判断是否结束游戏)
  5. 一个控制光标移动的辅助函数
void drawMap();
void creatFood();
void keyDown();
int snakeStatus();
void  gotoxy(int x, int y);

接下来我们就是去实现这几个函数

void drawMap() {
	//蛇■ 食物⊙
	srand((unsigned int)time(NULL));
	food.x = rand() % (MAPWIDTH - 4) + 2;
	food.y = rand() % (MAPHEIGHT - 2) + 1;
	gotoxy(food.x, food.y);
	printf("⊙");
	for (int i = 0; i <= MAPHEIGHT; i++)
	{
		gotoxy(0, i);
		printf("■");
		gotoxy(MAPWIDTH, i);
		printf("■");
	}
	for (int i = 0; i <= MAPWIDTH; i+=2)
	{
		gotoxy(i,0);
		printf("■");
		gotoxy(i,MAPHEIGHT);
		printf("■");
	}
	snake.len = 3;
	snake.speed = 250;
	snake.x[0] = MAPWIDTH / 2;
	snake.y[0] = MAPHEIGHT / 2;
	//she蛇头
	gotoxy(snake.x[0], snake.y[0]);
	printf("■");
	//she长度
	for (int k = 1;k < snake.len;k++)
	{
		snake.x[k] = snake.x[k - 1] + 2;
		snake.y[k] = snake.y[k - 1];
		gotoxy(snake.x[k], snake.y[k]);
		printf("■");
	}
}
void creatFood() {
	//舌头与食物坐标一样
	if (snake.x[0] ==food.x&&snake.y[0]==food.y)
	{
		srand((unsigned int)time(NULL));
		//shiwu食物不能再舍的身上并且坐标得是偶数
		while (1)
		{
			int flag = 1;
			food.x = rand() % (MAPWIDTH - 4) + 2;
			food.y = rand() % (MAPHEIGHT - 2) + 1;
			for (int k = 0;k < snake.len;k++)
			{
				if (snake.x[k] ==food.x&&snake.y[k]==food.y)
				{
					flag = 0;
						break;
				}
			}
			if (flag&&food.x % 2 == 0)
			{
				break;
			}
		}
		gotoxy(food.x, food.y);
		printf("⊙");
		snake.len++;
		gotoxy(MAPHEIGHT+4,MAPWIDTH+4);
		printf("%d",snake.len);
		//printf("■");
		changFlag = 1;
	}
}
void keyDown() {
	if (_kbhit())
	{
		fflush(stdin);
		key = _getch();
	}
	if (!changFlag)
	{
		gotoxy(snake.x[snake.len - 1], snake.y[snake.len - 1]);
		printf("  ");//////擦除

	for (int i = snake.len-1; i >0; i--)
	{
		snake.x[i] = snake.x[i - 1];
		snake.y[i] = snake.y[i - 1];
	}
	//移动方向的处理
	switch (key)
	{
		case 'w':
		case 'W':
			snake.y[0]--;
			break;
		case 'a':
		case 'A':
			snake.x[0]-=2;
			break;
		case 's':
		case 'S':
			snake.y[0]++;
			break;
		case 'd':
		case 'D':
			snake.x[0]+=2;
			break;
	}
	gotoxy(snake.x[0], snake.y[0]);
	printf("■");
	changFlag = 0;
	gotoxy(MAPHEIGHT + 2, 0);//yi已抵用移动不能一直看着光标
}
int snakeStatus() 
{
	if (snake.x[0] == 0 || snake.x[0] == MAPWIDTH - 2 || snake.y[0] == 0 || snake.y[0] == MAPHEIGHT - 2)
	{
		return 0;
	}
	for (int k = 1;k < snake.len;k++)
	{
		if (snake.x[0] == snake.x[k] && snake.y[k] == snake.y[0])
			return 0;
	}
	//return 1;
}
//5.辅助函数,光标移动
void  gotoxy(int x, int y)
{
	HANDLE handle = GetStdHandle(STD_OUTPUT_HANDLE);
	COORD coord;
	coord.X = x;
	coord.Y = y;
	//同步控制台
	SetConsoleCursorPosition(handle, coord);
}

3.main函数实现

话不多说直接上代码

int main()
{
	drawMap();
	while (1)
	{
		creatFood();

		Sleep(snake.speed);
		keyDown();
		if (!snakeStatus())
		{
			break;
		}
	}
	gotoxy(MAPWIDTH / 2,MAPHEIGHT / 2);
	printf("GameOver");
	system("pause");
	return 0;
}
发布了8 篇原创文章 · 获赞 5 · 访问量 354

猜你喜欢

转载自blog.csdn.net/weixin_44269495/article/details/103424922