一个自制的贪吃蛇遇到一些问题
这是我从网上抄了一个贪吃蛇后自己改了一部分,但是发现出了些问题老是解决不了,一旦吃了第一个爱心就会有一块墙壁消失,而且一旦进入商店之后一出来就会玩不了,我设置了分数到达3的时候能自动进入商店,但是却出不来,求大神指导,这是小弟后天要上交的作业,关乎期末考试,请大家帮帮忙#include<iostream.h> //是input output stream的简写,意思为标准的输入输出流头文件
#include<windows.h>
#include<stdio.h>
#include <dos.h>
#include<time.h>//是C/C++中的日期和时间头文件
#include<stdlib.h> //standard library标准库头文件
#include<conio.h> //定义了通过控制台进行数据输入和数据输出的函数
#define N 21
int getyou();
int getcomputer();
void charge(int y,int c);
void gotoxy(int x,int y)//位置函数
{
COORD pos; //光标的作用
pos.X=2*x;
pos.Y=y;
SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE),pos); //是API中定位光标位置的函数,GetStdHandle是一个Windows API函数。它用于从一个特定的标准设备中取得一个句柄
}
void color(int a)//颜色函数
{
SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),a); //是API设置字体颜色和背景色的函数,GetStdHandle是一个Windows API函数。它用于从一个特定的标准设备中取得一个句柄
}
void h(void)
{
int i;
char a;
char b;
char c;
char d;
for(i=0;i<49;i++)
printf("\003");
for(i=0;i<6;i++)
printf("\n\003\t\t\t\t\t\t\003");
printf("\n\003");
for(i=0;i<8;i++)
printf(" ");
printf("\017欢迎小虫子来到快乐多超市\017");
for(i=0;i<13;i++)
printf(" ");
printf("\003");
for(i=0;i<6;i++)
printf("\n\003\t\t\t\t\t\t\003");
printf("\n");
for(i=0;i<49;i++)
printf("\003");
printf("\n");
printf("Y:进入商店购买东西\n");
printf("N:离开商店继续游戏\n");
c=getch();
switch(c)
{
case'Y':system ("cls");goto shop;
case'y':system ("cls");goto shop;
case'N':system ("cls");printf("\n\n\n\n欢迎下次光临\n\n\n\n");return;
case'n':system ("cls");printf("\n\n\n\n欢迎下次光临\n\n\n\n");return;
}
shop:
for(i=0;i<49;i++)
printf("\003");
for(i=0;i<5;i++)
printf("\n\003\t\t\t\t\t\t\003");
printf("\n\003");
printf("\t\t1:功能道具\t\t\t\003");
printf("\n\003\t\t\t\t\t\t\003\n");
printf("\003\t\t2:剧情道具\t\t\t\003");
for(i=0;i<4;i++)
printf("\n\003\t\t\t\t\t\t\003");
printf("\n\003\t\t3:离开商店\t\t\t\003");
printf("\n");
for(i=0;i<49;i++)
printf("\003");
printf("\n");;
a=getch();
switch(a)
{
case'1':system ("cls");goto shop1;
case'2':system ("cls");goto shop2;
case'3':system ("cls");printf("\n\n\n\n欢迎下次光临\n\n\n\n\n");return;
}
shop1:
for(i=0;i<49;i++)
printf("\003");
for(i=0;i<5;i++)
printf("\n\003\t\t\t\t\t\t\003");
printf("\n\003");
printf("\t\ta:缩短果实\t\t\t\003");
printf("\n\003\t\tb:重生果实:\t\t\t\003");
printf("\n\003\t\tc:减速果实:\t\t\t\003");
for(i=0;i<4;i++)
printf("\n\003\t\t\t\t\t\t\003");
printf("\n\003\t\td:离开商店:\t\t\t\003");
printf("\n");
for(i=0;i<49;i++)
printf("\003");
b=getch();
switch(b)
{
case'a':system ("cls");printf("恭喜你获得了缩短果实\n");return;
case'b':system ("cls");printf("恭喜你获得了重生果实\n");return;
case'c':system ("cls");printf("恭喜你获得了减速果实\n");return;
case'd':system ("cls");printf("\n\n\n\n欢迎下次光临\n\n\n\n");return;
}
shop2:
for(i=0;i<49;i++)
printf("\003");
for(i=0;i<5;i++)
printf("\n\003\t\t\t\t\t\t\003");
printf("\n\003");
printf("\t\tA:一封情书\t\t\t\003");
printf("\n\003\t\t\t\t\t\t\003\n");
printf("\003\t\tB:爱心胶水:\t\t\t\003");
for(i=0;i<5;i++)
printf("\n\003\t\t\t\t\t\t\003");
printf("\n\003\t\tC:离开商店:\t\t\t\003");
printf("\n");
for(i=0;i<49;i++)
printf("\003");
d=getch();
switch(d)
{
case'A':system ("cls");printf("这是一封情书\n");goto word;
case'B':system ("cls");printf("恭喜你获得了爱心胶水,你可以将碎片合成爱心了\n");return;
case'C':system ("cls");printf("\n\n\n\n欢迎下次光临\n\n\n\n\n");return;
}
word:system ("cls");printf("哈哈\n");
}
void g(void)
{
int y,c;
int i,j;//初始化围墙
int wall[N+2][N+2]={{0}}; //定义一个二维数组来输入整个游戏的区域
printf("\tThis is a game\n");
printf("\t'r': Rock ; 's': Scissors ; 'p': Paper \n");
while(1){
y=getyou();
c=getcomputer();
if(y==c)
{
printf("\nThe same,again!\n");
}
else if(y==(c-1)||y==(c+2))
{
printf("\nYou win!\n"); break;
}
else
{
printf("\nComputer win!\n");
}
system ("cls");
printf(" 清朝末年,军阀混战,政局动荡,民不聊生。\n");
printf(" 好色虫---菜青虫家族第32代家主只隐约记得当时他的《金瓶梅》才看了31遍,他家中的老婆才只有27位。\n但他永远不会忘记的是在戴望舒的雨巷,那真正的丁香姑娘.");
printf("于是他踏上了漫长的征程,\n他知道,当他收集齐100颗爱心碎片时,她将会回来。。。。\n");
for(i=1;i<=N;i++)
{
for(j=1;j<=N;j++)
wall[i][j]=1;
}
color(11);
for(i=0;i<N+2;i++)
{
for(j=0;j<N+2;j++)
{
if(wall[i][j])
printf("■");
else printf("□") ;
}
printf("\n");
}
gotoxy(N+3,6);//显示信息,就是游戏区隔壁的显示栏
color(30);
printf("按W S A D 移动方向\n");
gotoxy(N+3,7);
color(30);
printf("按任意键暂停\n");
gotoxy(N+3,8);
color(30);
printf("得分:");
gotoxy(5,8);
color(40);
printf("■■■");
for(i=8,j=10;j<13;j++)
{
gotoxy(i,j);
printf("■");
}
}
}
int getyou()
{
char choice;
int your_choice;
printf("Enter your choice:");
scanf("%c",&choice);
getchar();
switch(choice){
case 'r':
your_choice=0;
printf("You picked Rock, ");
break;
case 's':
your_choice=1;
printf("You picked Scissors, ");
break;
case 'p':
your_choice=2;
printf("You picked Paper, ");
break;
default:
printf("Bye!\n");
exit(0);
break;
}
return your_choice;
}
int getcomputer()
{
int computer_choice;
srand(time(NULL));
computer_choice=rand()%3;
switch(computer_choice)
{
case 0:
printf("Computer picked Rock.");
break;
case 1:
printf("Computer picked Scissors.");
break;
case 2:
printf("Computer picked Paper.");
break;
defaut:
break;
}
return computer_choice;
}
void charge(int y,int c)
{
if(y==c)
{
printf("\nThe same,again!\n");
}
else if(y==(c-1)||y==(c+2))
{
printf("\nYou win!\n");
}
else
{
printf("\nComputer win!\n");
}
}
void init(int apple[2])//初始化函数(初始化围墙、显示信息、苹果)
{
int i,j;//初始化围墙
int c=3;
int wall[N+2][N+2]={{0}}; //定义一个二维数组来输入整个游戏的区域
printf(" 清朝末年,军阀混战,政局动荡,民不聊生。\n");
printf(" 好色虫---菜青虫家族第32代家主只隐约记得当时他的《金瓶梅》才看了31遍,他家中的老婆才只有27位。\n但他永远不会忘记的是在戴望舒的雨巷,那真正的丁香姑娘.");
printf("于是他踏上了漫长的征程,\n他知道,当他收集齐100颗爱心碎片时,她将会回来。。。。\n");
for(i=1;i<=N;i++)
{
for(j=1;j<=N;j++)
wall[i][j]=1;
}
color(11);
for(i=0;i<N+2;i++)
{
for(j=0;j<N+2;j++)
{
if(wall[i][j])
printf("■");
else printf("□") ;
}
printf("\n");
}
gotoxy(N+3,6);//显示信息,就是游戏区隔壁的显示栏
color(30);
printf("按W S A D 移动方向\n");
gotoxy(N+3,7);
color(30);
printf("按任意键暂停\n");
gotoxy(N+3,8);
color(30);
printf("得分:");
gotoxy(5,8);
color(40);
printf("■■■");
for(i=8,j=10;j<13;j++)
{
gotoxy(i,j);
printf("■");
}
apple[0]=rand()%N+1;//爱心
apple[1]=rand()%N+6;
gotoxy(apple[0],apple[1]);
color(12);
printf("%c\n",c);
}
void m(void)
{
int i,j;//初始化围墙
int wall[N+2][N+2]={{0}}; //定义一个二维数组来输入整个游戏的区域
for(i=1;i<=N;i++){
for(j=1;j<=N;j++)
wall[i][j]=1;
}
color(11);
for(i=0;i<N+2;i++)
{
for(j=0;j<N+2;j++)
{
if(wall[i][j])
printf("■");
else printf("□");
}
printf("\n");
}
gotoxy(6,18);
color(15);
printf("□□□");
gotoxy(11,18);
printf("□□□");
gotoxy(4,14);
printf("您好,我好像丢了什么东西。");
gotoxy(3,15);
printf("好像本来是在这儿,但现在,我找不到了。");
gotoxy(N+3,1);//显示信息,就是游戏区隔壁的显示栏
color(30);
printf("按W S A D 移动方向\n");
gotoxy(N+3,2);
color(30);
printf("按任意键暂停\n");
gotoxy(N+3,3);
color(30);
printf("得分:");
}
void y(void)
{
int i,j;//初始化围墙
int wall[N+2][N+2]={{0}}; //定义一个二维数组来输入整个游戏的区域
char n;
n=3;
for(i=1;i<=N;i++){
for(j=1;j<=N;j++)
wall[i][j]=1;
}
color(11);
for(i=0;i<N+2;i++){
for(j=0;j<N+2;j++){
if(wall[i][j])
printf("■");
else printf("□");
}
printf("\n");
}
gotoxy(6,18);
color(15);
printf("□□□");
gotoxy(11,18);
printf("□□□");
gotoxy(7,14);
printf("在这里呢。。。");
color(12);
for(i=10,j=18;i<15,j>13;i++,j--){
gotoxy(i,j);
printf("%c",n);}
gotoxy(14,13);
printf("%c",n);
gotoxy(11,12);
printf("%c %c %c",n,n,n);
gotoxy(10,13);
printf("%c",n);
gotoxy(7,12);
printf("%c %c %c",n,n,n);
gotoxy(6,13);
printf("%c",n);
gotoxy(6,14);
printf("%c",n);
for(i=7,j=15;i<11,j<19;i++,j++){
gotoxy(i,j);
printf("%c",n);
}
gotoxy(N+3,1);
color(30);
printf("按W S A D 移动方向\n");
gotoxy(N+3,2);
color(30);
printf("按任意键暂停\n");
gotoxy(N+3,3);
color(30);
printf("得分:");
}
void main()
{
void m(void);
void g(void);
void h(void);
void y(void);
int i;
int** snake=NULL;
int apple[2];
int score=0;
int tail[2];
int len=3;
int b=15;
int c=3;
char ch='p';
srand((unsigned)time(NULL)); //随机数发生器的初始化函数
init(apple);
snake=(int**)realloc(snake,sizeof(int*)*len); //指针名=(数据类型*)realloc(要改变内存大小的指针名,新的大小),sizeof是判断数据类型或者表达式长度符
for(i=0;i<len;i++)
snake[i]=(int*)malloc(sizeof(int)*2); //向系统申请分配指定size个字节的内存空间
for(i=0;i<len;i++)
{
snake[i][0]=N/2;
snake[i][1]=N/2+i;
gotoxy(snake[i][0],snake[i][1]);
color(14);
printf("%c\n",b);
}
while(1)//进入消息循环
{
tail[0]=snake[len-1][0];
tail[1]=snake[len-1][1];
gotoxy(tail[0],tail[1]);
color(11);
printf("■\n");
for(i=len-1;i>0;i--)
{
snake[i][0]=snake[i-1][0];
snake[i][1]=snake[i-1][1];
gotoxy(snake[i][0],snake[i][1]);
color(14);
printf("%c\n",b);
}
if(kbhit()) //检查当前是否有键盘输入,若有则返回一个非0值,否则返回0
{
gotoxy(0,N+2);
ch=getche();
}
switch(ch)
{
case 'w':snake[0][1]--;break;
case 's':snake[0][1]++;break;
case 'a':snake[0][0]--;break;
case 'd':snake[0][0]++;break;
default: break;
}
for(i=3;i<len;i++)
{
if((snake[i][1]==snake[0][1])&&(snake[i][0]==snake[0][0]))
{
gotoxy(N/2,N/2);
color(30);
printf("idiot!!咬死自己了!!\n");
for(i=0;i<len;i++)
free(snake[i]);
Sleep(INFINITE);
exit(0);
}
}
gotoxy(snake[0][0],snake[0][1]);
color(14);
printf("囧");
Sleep(abs(200-0.5*score)); // 执行挂起一段时间,abs是返回传递给它的参数的绝对值
if(snake[0][0]==apple[0]&&snake[0][1]==apple[1])//吃掉苹果后蛇分数加1,蛇长加1
{
score++;
len++;
snake=(int**)realloc(snake,sizeof(int*)*len); //指针名=(数据类型*)realloc(要改变内存大小的指针名,新的大小)
snake[len-1]=(int*)malloc(sizeof(int)*2); //向系统申请分配指定size个字节的内存空间
apple[0]=rand()%N+1; //从0-22中随机出一个数字
apple[1]=rand()%N+6; //同上
gotoxy(apple[0],apple[1]);
color(12);
printf("%c\n",c);
gotoxy(N+6,8);
color(30);
printf("%d\n",score);
if(score==3)
h();
}
if(snake[0][0]==4&&snake[0][1]==20)
g();
if((snake[0][1]==6)||(snake[0][1]==(N+6))||(snake[0][0]==0)||(snake[0][0]==N))//撞到围墙后失败
{
gotoxy(N/2,N/2);
color(30);
printf("你真TM失败!!!\n");
for(i=0;i<len;i++)
free(snake[i]);
Sleep(INFINITE);
exit(0);
}
}
}