| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 643 人关注过本帖
标题:一个自制的贪吃蛇遇到一些问题
只看楼主 加入收藏
gaiuipp
Rank: 1
等 级:新手上路
帖 子:1
专家分:0
注 册:2014-1-5
结帖率:0
收藏
已结贴  问题点数:20 回复次数:1 
一个自制的贪吃蛇遇到一些问题
这是我从网上抄了一个贪吃蛇后自己改了一部分,但是发现出了些问题老是解决不了,一旦吃了第一个爱心就会有一块墙壁消失,而且一旦进入商店之后一出来就会玩不了,我设置了分数到达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);
        }  
    }
}
搜索更多相关主题的帖子: standard library include 贪吃蛇 stream 
2014-01-05 00:43
mic123
Rank: 3Rank: 3
等 级:论坛游侠
帖 子:22
专家分:123
注 册:2013-12-23
收藏
得分:20 
MARK  
看看
2014-01-07 09:37
快速回复:一个自制的贪吃蛇遇到一些问题
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.014643 second(s), 7 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved