#include <stdio.h> #include <stdlib.h> #include <time.h> #include <Windows.h> #include <conio.h> /* 地图长和宽 */ #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; }