大概用了2天的时间编写的这个,讲一下这个游戏的大致思路。
1.首先是数据设计
包含两个东西
- 食物的结构体
- 蛇的结构体(通过数组实现蛇的存储(包含一些辅助宏))
- 我们在做两个全局变量
- 蛇的初始化移动方向
- 蛇的变化标记
#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.功能设计
简单来讲就是抽象到函数,具体到对象
- 画地图
- 食物的产生
- 按键操作(wasd控制操作)
- 蛇的状态(判断是否结束游戏)
- 一个控制光标移动的辅助函数
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;
}