#include
#include
#include
#include
#include
/* 地图长和宽 */
#define MAPHEIGHT 25
#define MAPWIDTH 60
#define SNAKSIZE 50
// 数据结构设计
int changeFlag = 0; // 蛇变化标记
int key = 'w';
// 食物位置
struct _food_
{
int x;
int y;
}food;
// 贪吃蛇数据结构
struct snake
{
int x[SNAKSIZE]; // 蛇坐标
int y[SNAKSIZE];
int len; // 当前长度
int speed; // 移动速度
}mysnake;
// cmd移动辅助函数
void gotoxy(int x, int y)
{
// 获取cmd窗口句柄
HANDLE handle = GetStdHandle(STD_OUTPUT_HANDLE);
// 光标位置
COORD coord;
coord.X = x;
coord.Y = y;
SetConsoleCursorPosition(handle, coord);
}
// 绘制地图
void drawMap()
{
srand((unsigned int)time(NULL));
// 食物
// 1.食物属性
food.x = rand() % (MAPWIDTH - 4) + 2;
food.y = rand() % (MAPHEIGHT - 2) + 1;
// 2.画食物
gotoxy(food.x, food.y);
printf("⊙");
// 蛇
// 1.蛇属性
mysnake.x[0] = MAPWIDTH / 2; // 定位在中间
mysnake.y[0] = MAPHEIGHT / 2;
// 2.画蛇
gotoxy(mysnake.x[0], mysnake.y[0]);
printf("■");
mysnake.len = 3;
mysnake.speed = 100;
for (int i = 1; i < mysnake.len; ++i) {
mysnake.x[i] = mysnake.x[i - 1] + 2;
mysnake.y[i] = mysnake.y[i - 1];
gotoxy(mysnake.x[i], mysnake.y[i]);
printf("■");
}
// 边框
// 1.左右
for (int i = 0; i < MAPHEIGHT; ++i) {
gotoxy(0, i);
printf("■");
gotoxy(MAPWIDTH, i);
printf("■");
}
// 2.上下
for (int i = 0; i < MAPWIDTH; ++i) {
gotoxy(i, 0);
printf("■");
gotoxy(i, MAPHEIGHT);
printf("■");
}
}
// 按键检测
void keyDown()
{
key = _getch();
switch (key)
{
case 'w':
case 'W':
case 72:
mysnake.y[0]--;
break;
case 's':
case 'S':
case 80:
mysnake.y[0]++;
break;
case 'a':
case 'A':
case 75:
mysnake.x[0] -= 2;
break;
case 'd':
case 'D':
case 77:
mysnake.x[0] += 2;
break;
default:
return;
}
gotoxy(mysnake.x[0], mysnake.y[0]);
printf("■");
changeFlag = 0;
gotoxy(MAPHEIGHT + 2, 0);
}
// 产生食物
void createFood()
{
if (mysnake.x[0] == food.x && mysnake.y[0] == food.y)
{
srand((unsigned int)time(NULL));
while (1)
{
int flag = 1;
food.x = rand() % (MAPWIDTH - 4) + 2;
food.y = rand() % (MAPHEIGHT - 2) + 1;
for (int i = 0; i < mysnake.len; ++i) {
if (mysnake.x[i] == food.x && mysnake.y[i] == food.y) {
flag = 0;
break;
}
}
// 食物坐标要为偶数且不能在蛇的身上
if (flag && food.x % 2 == 0)
break;
}
gotoxy(food.x, food.y);
printf("⊙");
mysnake.len++;
changeFlag = 1;
}
}
// 蛇状态
int snakeStatus()
{
if (mysnake.x[0] == 0 || mysnake.x[0] == MAPHEIGHT - 2
|| mysnake.y[0] == MAPWIDTH - 2 || mysnake.y[0] == 0)
{
return 0;
}
for (int i = 1; i < mysnake.len; ++i) {
if (mysnake.x[i] == mysnake.x[0] && mysnake.y[i] == mysnake.y[0])
return 0;
}
return 1;
}
int main()
{
drawMap();
while (1)
{
createFood();
Sleep(mysnake.speed);
keyDown();
if (!snakeStatus())
break;
}
MessageBox(NULL, TEXT("GameOver"), TEXT("提示"), MB_OK | MB_ICONWARNING);
return 0;
}