用C语言编写贪吃蛇小游戏如何在以下程序中加菜单和游戏结束时可以选择重新开始或退出游戏的程序
/*1数据设计
2.模块化设计
3.实现过程*/
#include<stdio.h>
#include<stdlib.h>
#include<windows.h> //光标设置的API//
#include<time.h> //食物随机
#include<conio.h> //按键监控
//辅助宏定义
#define MAPHEIGHT 26 //窗口
#define MAPWIDTH 60
#define SNAKESIZE 1000
///数据设计///
/// 食物的结构体
struct
{
///如何去定位:坐标
int x;
int y;
}food;
///蛇的结构体
struct
{
///记录每一节蛇的坐标
int x[SNAKESIZE];
int y[SNAKESIZE];
int len; ///蛇的长度
int speed ; ///蛇的速度
}snake;
//全局变量
int key='A'; ///蛇的初始移动方向
int changeFlag=0; ///蛇的变化的标记
//模块化设计,功能划分,抽象到函数
///1画地图
void drawMap();
///2食物的产生
void createFood();
///3按键操作
void KeyDown();
///4蛇的状态:判断蛇是否撞墙
int snakeStatus();
///5辅助函数:光标移动
void gotoxy(int x,int y);
///模块化设计///
int main()
{
drawMap();
while(1)
{
createFood();
KeyDown();
Sleep(snake.speed);
if(!snakeStatus())
{
break;
}
}
gotoxy(MAPWIDTH/2,MAPHEIGHT/2);
printf("游戏结束");
system("pause");
return 0;
}
//1.画地图
void drawMap()
{int i;
int k;
srand((unsigned int)time(NULL));//随机函数
//1圈地
//1.1左右边框
for(i=0;i<=MAPHEIGHT;i++)
{
gotoxy(0,i);
printf("。");
gotoxy(MAPWIDTH,i);
printf("。");
}
//占两个字符
for(i=0;i<=MAPWIDTH;i+=2)
{
gotoxy(i,0);
printf("。");
gotoxy(i,MAPHEIGHT);
printf("。");
}
//2画蛇。
//2.1确定蛇的属性
snake.len=3;
snake.speed=300;
//蛇头在中间
snake.x[0]=MAPWIDTH/2;
snake.y[0]=MAPHEIGHT/2;
//画蛇头
gotoxy(snake.x[0],snake.y[0]);
printf("。");
//画剩下的身体
for(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("。");
}
//3画食物。
while(1){
food.x=rand()%(MAPWIDTH-4)+2;
food.y=rand()%(MAPHEIGHT-2)+1;
if(food.x%2==0)
break;
}
gotoxy(food.x,food.y);
printf("。");
}
//2.食物的产生
void createFood()
{ int k;
//蛇把食物吃了
if(snake.x[0]==food.x&&snake.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(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;
}
}
snake.len++;
changeFlag=1;
}
gotoxy(food.x,food.y);
printf("。");
}
//3.按键操作
void KeyDown()
{int i;
//无按键的处理
if(_kbhit())
{
//有按键接受
fflush(stdin);
key=_getch();
}
if(!changeFlag)
{
gotoxy(snake.x[snake.len-1],snake.y[snake.len-1]);
printf(" ");
}
//后面的节数
for( 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 's':
case 'S':
snake.y[0]++;
break;
case 'A':
case 'a':
snake.x[0]-=2; //一个符号
break;
case 'd':
case 'D':
snake.x[0]+=2;
break;
}
gotoxy(snake.x[0],snake.y[0]);
printf("。");
changeFlag=0;
gotoxy(MAPHEIGHT+2,0); //不能一直看着光标
}
//4.蛇的状态;判断游戏是否结束
int snakeStatus()
{int k;
if( snake.x[0]==0||snake.x[0]==MAPWIDTH ||snake.y[0]==0||snake.y[0]==MAPHEIGHT)
return 0;
for(k=1;k<snake.len;k++)
{
if(snake.x[0]==snake.x[k]&&snake.y[k]==snake.y[0])
return 0;
}
return 1;
}
//辅助函数,光标移动
void gotoxy(int x,int y)
{
///调用win32 API 去设置控制台的光标位置
///1.找到控制台的这个窗口
HANDLE handle=GetStdHandle(STD_OUTPUT_HANDLE);
//2.光标的结构体
COORD coord;
///3.设置坐标
coord.X=x;
coord.Y=y;
//4.同步到控制台Set Console Cursor Position
SetConsoleCursorPosition(handle,coord);
}