求助,贪吃蛇去除不了蛇残留

来源:互联网 发布:淘宝永久封店 身份证 编辑:程序博客网 时间:2024/04/27 23:49
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include<conio.h>
#include <time.h>
#include <windows.h>
#include <mmsystem.h>
#pragma comment(lib,"winmm.lib")
#define SNACK_LONG 400 //蛇的最长节点


//菜单
void menu();
//播放音乐
void bmusic();
//检测空格  
void detblack();
//终止音乐
void tmusic();
//背景
void background();
//设置蛇的一个随机位置
void setsanckrandsite();
//画蛇
void drawsnack();
//蛇动
void snackmove();
//销去蛇残留
void destroysnack();
//控制蛇的方向
void direction();
//蛇死亡判断
bool snackdie();
//产生新的食物
void food();
//蛇变成
void snackgrowup();
//分数 
void score();
//结束
void gameover();




//声明食物坐标
int x,y;
//声明判断食物是否被蛇吃掉变量
int n=1;
//蛇的长度
int snacklong=2;
//声明分数变量
int g_score=0;
//边框
char arr_background[20][48]={"■■■■■■■■■■■■■■■■■■■■■■■\n",
                        "■                                          ■\n",
"■                                          ■\n",
"■                                          ■\n",
"■                                          ■\n",
"■                                          ■\n",
"■                                          ■\n",
"■                                          ■\n",
"■                                          ■\n",
"■                                          ■\n",
"■                                          ■\n",
"■                                          ■\n",
"■                                          ■\n",
"■                                          ■\n",
"■                                          ■\n",
"■                                          ■\n",
"■                                          ■\n",
"■                                          ■\n",
"■                                          ■\n",
"■■■■■■■■■■■■■■■■■■■■■■■\n"};
//蛇的节点
int arr_snack[SNACK_LONG][3]={0}; //初始化蛇为0,3个分别表示蛇的X,Y,方向
//方向
enum direction{to_east=2,to_south=1,to_west=-2,to_north=-1};
//改变方向
int direct_snack=to_west;




//主函数
int main()
{
bmusic(); //播放音乐
menu(); //显示菜单
detblack(); //检测空格
tmusic(); //终止音乐
system("cls");//清空菜单
setsanckrandsite();//设置蛇的位置
background(); //显示背景
while(1)
{
system("cls");//清除上一个背景
food(); //产生食物
snackgrowup();//蛇变长
direction(); //控制蛇的方向
if(snackdie()==false)
{
break;
}
snackmove(); //蛇动
background(); //背景
score(); //分数
Sleep(500); //挂起500ms
}
gameover(); //结束游戏
system("pause");
return 0;
}
//菜单
void menu()
{
putchar('\n');
putchar('\n');
putchar('\n');
putchar('\n');
putchar('\n');
putchar('\n');
printf("\t\t\t\t☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆\n\n");
printf("\t\t\t\t☆\t\t欢迎来到贪吃蛇的世界\t\t  ☆\n\n");
printf("\t\t\t\t☆\t\t  按空格开始游戏\t\t  ☆\n\n");
printf("\t\t\t\t☆\t\t 按W A S D控制方向\t\t  ☆\n\n");
printf("\t\t\t\t☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆\n\n");
}
//音乐
void bmusic()
{
PlaySound("白智英 - 像中枪一样.wav",NULL,SND_FILENAME|SND_ASYNC);
}
//检测空格
void detblack()
{
char chIntput;
while(1)
{
chIntput=getch();
if(' '==chIntput)
{
break;
}
}
}
//终止音乐
void tmusic()
{
PlaySound(NULL,0,0);
}
//背景
void background()
{
int i;
system("cls");
for(i=0;i<20;i++)
{
printf("%s",arr_background[i]);//打印边框
}
Sleep(300); //挂起300ms
}
//画蛇
void drawsnack()
{
int i;
for(i=0;arr_snack[i][0]!=0;i++)//遇到节点为0的终止循环
{
strncpy(&arr_background[arr_snack[i][0]][arr_snack[i][1]],"■",2);//生成蛇的节点
}
}
//销去蛇残留
void destroysnack()
{
int i;
for(i=0;arr_snack[i][0]!=0;i++)//遇到节点为0的终止循环
{
strncpy(&arr_background[arr_snack[i][0]][arr_snack[i][1]],"  ",2);//减去蛇的节点
}
}
//设置蛇的一个随机位置
void setsanckrandsite()
{
int X=0;
int Y=0;
srand((unsigned)time(NULL));//种种子
X=rand()%17+3;//设置蛇头的随机位置,蛇头靠前2格,X轴范围
Y=rand()%18+1;//Y轴范围
arr_snack[0][0]=Y;//第一个节点
arr_snack[0][1]=X*2;//正方形占两个字节,要乘以2
arr_snack[0][2]=to_west;//起始方向向西


arr_snack[1][0]=Y;//第二个节点
arr_snack[1][1]=X*2+2;//往后移两个字节
arr_snack[1][2]=to_west;


arr_snack[2][0]=Y;//第三个节点
arr_snack[2][1]=X*2+4;//再加两个字节
arr_snack[2][2]=to_west;
drawsnack(); //画蛇
}
//蛇动
void snackmove()
{
int i;
destroysnack();//消去蛇的残留 
arr_snack[0][2]=direct_snack;//设定方向
for(i=SNACK_LONG-1;i>=1;i--)
{
if(arr_background[i][0]!=0)//当节点不为0时,才能把前一个节点的值给后一个节点
{
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];
}

}
if(arr_snack[0][2]==to_east||arr_snack[0][2]==to_west)//处理蛇头
{
arr_snack[0][1]+=arr_snack[0][2];//向东走加2,向西走减2
}
else
{
arr_snack[0][0]+=arr_snack[0][2];//向北走减1,向南走加1
}
drawsnack(); //画蛇
}
//控制蛇的方向
void direction()
{
if(GetAsyncKeyState('W'))
{
if(to_south!=arr_snack[0][2])
{
direct_snack=to_north;

}
}
else if(GetAsyncKeyState('S'))
{
if(to_north!=arr_snack[0][2])
{
direct_snack=to_south;

}
}
else if(GetAsyncKeyState('A'))
{
if(to_east!=arr_snack[0][2])
{
direct_snack=to_west;

}
}
else if(GetAsyncKeyState('D'))
{
if(to_west!=arr_snack[0][2])
{
direct_snack=to_east;

}
}
}
//蛇死亡判断
bool snackdie()
{
if(arr_snack[0][2]==to_east||arr_snack[0][2]==to_west)//蛇头下一格是方块就死亡
{
if(0==strncmp(&arr_background[arr_snack[0][0]][arr_snack[0][1]+arr_snack[0][2]],"■",2))
{
return false;
}
}
else
{
if(0==strncmp(&arr_background[arr_snack[0][0]+arr_snack[0][2]][arr_snack[0][1]],"■",2))
{
return false;
}
}
return true;


}
//产生新的食物
void food()
{
int i;
if(n==0)
{
return;
}
srand((unsigned)time(NULL));
while(1)
{
x=(rand()%21+1)*2;
y=rand()%18+1;
for(i=0;arr_snack[i][0]!=0;i++)
{
if(x==arr_snack[i][1]&&y==arr_snack[i][0])
{
n=0;
}
}
if(n==1)
{
break;
}
}
n=0;
//画蛇食物位置
strncpy(&arr_background[y][x],"☆",2);
}
//蛇变长
void snackgrowup()
{
if(x==arr_snack[0][1]&&y==arr_snack[0][0])//食物坐标和蛇头重合
{
if(to_west==arr_snack[snacklong][2])//向西,尾部向东加一节
{
arr_snack[snacklong+1][0]=arr_snack[snacklong][0];
arr_snack[snacklong+1][1]=arr_snack[snacklong][1]+2;
arr_snack[snacklong+1][2]=arr_snack[snacklong][2];
}
else if(to_east==arr_snack[snacklong][2])//向东,尾部向西加一节
{
arr_snack[snacklong+1][0]=arr_snack[snacklong][0];
arr_snack[snacklong+1][1]=arr_snack[snacklong][1]-2;
arr_snack[snacklong+1][2]=arr_snack[snacklong][2];
}
else if(to_north==arr_snack[snacklong][2])//向南,尾部向北加一节
{
arr_snack[snacklong+1][0]=arr_snack[snacklong][0]-1;
arr_snack[snacklong+1][1]=arr_snack[snacklong][1];
arr_snack[snacklong+1][2]=arr_snack[snacklong][2];
}
else if(to_south==arr_snack[snacklong][2])//向北,尾部向南加一节
{
arr_snack[snacklong+1][0]=arr_snack[snacklong][0]+1;
arr_snack[snacklong+1][1]=arr_snack[snacklong][1];
arr_snack[snacklong+1][2]=arr_snack[snacklong][2];
}
snacklong++;
n=1;
g_score++;
}
}
//分数
void score()
{
COORD coord;
coord.X=65;
coord.Y=8;
SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE),coord);//光标定位函数
printf("你目前获得的分数为:%d",g_score);
}
//游戏结束
void gameover()
{
putchar('\n');
putchar('\n');
putchar('\n');
putchar('\n');
putchar('\n');
putchar('\n');
printf("\t\t\t\t☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆\n\n");
printf("\t\t\t\t☆你的\t\t\t\t\t\t  ☆\n\n");
printf("\t\t\t\t☆\t\t    蛇\t\t\t\t  ☆\n\n");
printf("\t\t\t\t☆\t\t\t\t  死亡了!!!\t  ☆\n\n");
printf("\t\t\t\t☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆\n\n");
}
原创粉丝点击