c语言贪吃蛇 要怎么重新开始 要怎么写
#include <stdio.h>#include <stdlib.h>
#include <conio.h>
#include <windows.h>
#include <mmsystem.h>
#include <time.h>
#include <string.h>
char arr_block[20][48] = { "■■■■■■■■■■■■■■■■■■■■■■■\n", //字符串数组,一个■占两个字节,要显示20*23的边框
"■ ■\n",
"■ ■\n",
"■ ■\n",
"■ ■\n",
"■ ■\n",
"■ ■\n",
"■ ■\n",
"■ ■\n",
"■ ■\n",
"■ ■\n",
"■ ■\n",
"■ ■\n",
"■ ■\n",
"■ ■\n",
"■ ■\n",
"■ ■\n",
"■ ■\n",
"■ ■\n",
"■■■■■■■■■■■■■■■■■■■■■■■\n"};
int arr_snack[20][3]={0}; //蛇身的每一节需要横纵坐标以及移动方向3个值,用二维数组存放
//arr_snack[n][0]存放第n-1节蛇身的纵坐标
//arr_snack[n][1]存放第n-1节蛇身的横坐标
//arr_snack[n][2]存放第n-1节蛇身的移动方向
//蛇身可以很多节,在此使用20节,代表蛇身最长为20节
enum{to_east = 2,to_west = -2,to_south = 1,to_north = -1}; //枚举四个方向,东西方向移动一次是一个■所以是2
int snackdirection = to_west; //蛇第一次出现时默认方向是向西
bool foodflag = true; //为1时调用food函数生成食物,为0时跳过该函数
int row ; //食物所在的行
int col ; //食物所在的列
int length = 2;//初始化时蛇为三节,代表蛇尾数组下标,用于growup函数
void welcome();
void start();
void block();
void randomposition();
void displaysnack();
void dropsnack();
void move();
void direction();
bool gameover();
void food();
void growup();
int bitself();
void pause();
int main()
{
welcome();//显示游戏操作提示
start(); //按回车开始游戏
randomposition(); //随机生成一个三节蛇的位置
while(1)
{
system("cls");//清屏
direction();
growup();
food();
if(gameover()==false)
{
printf("\t\t你撞墙了\n");
printf("\t\tgame over\n");
printf("\t\t你的得分:%d\n",10*(length-2));
break;
}
if(bitself()==0)
{
printf("\t\t你咬到自己的尾巴了\n");
printf("\t\tgame over\n");
printf("\t\t你的得分:%d\n",10*(length-2));
break;
}
move();
block();
printf("\t\tscore:%d",10*(length-2));
Sleep(500);
pause();
}
system("pause");
system("cls");
return main();
}
/**************************
welcome
显示欢迎界面和操作说明
**************************/
void welcome()
{
printf("\t\t\t《欢迎来到贪吃蛇游戏世界》\n");
printf("\t\t\t 按键操作:上下左右:WSAD\n");
printf("\t\t\t 按回车开始游戏\n");
printf("\t\t\t 按空格键暂停游戏 按任意键继续游戏\n");
printf("\t\t\t 游戏下方会显示你的得分\n");
}
/**************************
start
按' '开始游戏
**************************/
void start()
{
char s;
while(1)
{
s = _getch();
if(s == '\r'||s=='\n')
{
break;
}
}
}
/**************************
block
显示■障碍物
打印字符串数组,displaysnack和dropsnack都是改变字符串数组中的元素,并不显示
**************************/
void block()//显示四周障碍物,■占两个字节
{
int i=0;
for(i = 0;i < 20;i ++)
{
printf("%s",arr_block[i]);
}
}
/**************************
randomposition
在■障碍里随机生成一条三节蛇
生成横纵坐标的随机数并初始化其方向为西
从西向东依次为第一节,第二节,第三节
**************************/
void randomposition()//只在游戏刚开始时调用一次= -1
{
int X ;
int Y ;
srand((unsigned int)time(NULL));
X = rand()%16 + 1; //蛇第一次出现有三节,X坐标范围1-19
Y = rand()%16 + 2; //Y坐标范围1-18
//第一节
arr_snack[0][0] = Y;
arr_snack[0][1] = X * 2; //■占两个字节
arr_snack[0][2] = to_west;
//第二节
arr_snack[1][0] = Y;
arr_snack[1][1] = (X + 1) * 2;
arr_snack[1][2] = to_west;
//第三节
arr_snack[2][0] = Y;
arr_snack[2][1] = (X + 2) * 2;
arr_snack[2][2] = to_west;
displaysnack();
}
/**************************
displaysnack
显示蛇
即在原本显示障碍的字符串数组中,在蛇的横纵坐标处用"■"替换原有的" "
**************************/
void displaysnack()
{
int i;
for(i = 0;arr_snack[i][0] != 0;i++)//有值的时候复制
{
strncpy(&arr_block[arr_snack[i][0]][arr_snack[i][1]],"■",2);
}
}
/**************************
dropsnack
显示蛇
即在原本显示障碍和蛇身的字符串数组中,在蛇的横纵坐标处用" "替换原有的"■"
**************************/
void dropsnack()
{
int i;
for(i = 0;arr_snack[i][0] != 0;i++)//有值的时候复制
{
strncpy(&arr_block[arr_snack[i][0]][arr_snack[i][1]]," ",2);
}
}
/**************************
move
让蛇移动
若不处理蛇头,只相当于蛇所有的值向后移动一节,蛇头的值不变
**************************/
void move()
{
dropsnack();
int i;
for(i = 19;i >= 1;i --)
{
if(arr_snack[i][0] == 0) //遍历过于浪费,过滤空的节
continue;
arr_snack[i][0] = arr_snack[i-1][0];//将蛇身前一节的三个元素分别赋给该节蛇身的后一节
arr_snack[i][1] = arr_snack[i-1][1];
arr_snack[i][2] = arr_snack[i-1][2];
}
arr_snack[0][2] = snackdirection;
if(arr_snack[0][2] == to_west || arr_snack[0][2] == to_east)
{
arr_snack[0][1] += arr_snack[0][2];
}
else
{
arr_snack[0][0] += arr_snack[0][2];
}
displaysnack();
}
/**************************
direction
检测按键输入,控制蛇头方向
控制蛇头的方向就能通过move里的赋值改变整个蛇身的方向
蛇不能按照原方向掉头,所以要另加判断
**************************/
void direction()
{
if(GetAsyncKeyState('W'))
{
if(arr_snack[0][2] != to_south)
snackdirection = to_north;
}
if(GetAsyncKeyState('S'))
{
if(arr_snack[0][2] != to_north)
snackdirection = to_south;
}
if(GetAsyncKeyState('A'))
{
if(arr_snack[0][2] != to_east)
snackdirection = to_west;
}
if(GetAsyncKeyState('D'))
{
if(arr_snack[0][2] != to_west)
snackdirection = to_east;
}
}
/**************************
gameover
如果蛇头再走一步碰到■就跳出
**************************/
bool gameover()
{
int i;
if(arr_snack[0][2] == to_west || arr_snack[0][2] == to_east)
{
if(strncmp(&arr_block[arr_snack[0][0]][arr_snack[0][1] + arr_snack[0][2]],"■",2) == 0)
{
return false;
}
}
else
{
if(strncmp(&arr_block[arr_snack[0][0] + arr_snack[0][2]][arr_snack[0][1]],"■",2) == 0)
{
return false;
}
}
return true;
}
/**************************
food
随机产生食物,要避免与蛇身和障碍重合
**************************/
void food()
{
int i;
int temp = false;
if(foodflag == true)
{
srand((unsigned int)time(NULL));
while(1)
{
row = rand()%16 + 2; //row坐标范围1-19
col = rand()%18 + 2; //col坐标范围1-21
for(i = 0;arr_snack[i][0] != 0;i++)//有值的时候复制
{
if(arr_snack[i][0] != row && arr_snack[i][1] != col * 2)
{
temp = true;
}
}
if(temp == true)
break;
}
strncpy(&arr_block[row][col * 2],"★",2);
}
foodflag = false;
}
/***蛇身边长**/
void growup()
{
if(arr_snack[0][0] == row && arr_snack[0][1] == col*2)//蛇头和食物重合就变长
{
if(arr_snack[length][2] == to_east)
{
arr_snack[length+1][0] = arr_snack[length][0];
arr_snack[length+1][1] = arr_snack[length][1] - 2;
arr_snack[length+1][2] = arr_snack[length][2];
}
if(arr_snack[length][2] == to_west)
{
arr_snack[length+1][0] = arr_snack[length][0];
arr_snack[length+1][1] = arr_snack[length][1] + 2;
arr_snack[length+1][2] = arr_snack[length][2];
}
if(arr_snack[length][2] == to_north)
{
arr_snack[length+1][0] = arr_snack[length][0] + 1;
arr_snack[length+1][1] = arr_snack[length][1];
arr_snack[length+1][2] = arr_snack[length][2];
}
if(arr_snack[length][2] == to_south)
{
arr_snack[length+1][0] = arr_snack[length][0] - 1;
arr_snack[length+1][1] = arr_snack[length][1];
arr_snack[length+1][2] = arr_snack[length][2];
}
length ++;
foodflag = true;
}
}
int bitself()
{
int i;
for(i=1;arr_snack[i][0] != 0;i++)
{
if(arr_snack[0][0]==arr_snack[i][0]&&arr_snack[0][1]==arr_snack[i][1])
return 0;
}
}
void pause()
{
if(GetAsyncKeyState(VK_SPACE))
{
system("pause");
}
}