| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 1008 人关注过本帖
标题:有闲情雅致的的帮我看一下我的贪吃蛇,出了一点错误,导致我无法理解了
取消只看楼主 加入收藏
晨阳、
Rank: 2
等 级:论坛游民
帖 子:44
专家分:20
注 册:2017-3-4
结帖率:72.73%
收藏
 问题点数:0 回复次数:0 
有闲情雅致的的帮我看一下我的贪吃蛇,出了一点错误,导致我无法理解了
程序代码:
# include <iostream>
# include <cstdlib>
# include <windows.h>
# include <time.h>
# include <conio.h>
# include <stdio.h>

    
    using namespace std;
    const int height=20;
    const int wide=20;

    enum state{area,apple,barrier,self,selft};        //申明枚举类型来表示地图每个元素的状态(state)
    state pada;                                        //用于switch中的分支语句

//函数声明区
    void color(int b);                //颜色函数
    void HideCursor();                //隐藏光标函数
    void gotoxy(int x,int y);        //输出位置函数
    int rungo(int n);                //运行函数
    bool enddd();                    //结束判断函数
    int drawApple();                //随机画苹果函数
    state pandan(int nx,int ny);
    void draw(void);
    int begin();

    int sna[height*wide][2];        //蛇身数组,储存蛇身位置
    int snkl=0;                        //蛇身数组,以及蛇身最长度snkl 或者蛇头位置


    int ax,ay;                        //苹果位置又时间函数加键入值随机
    int nx,ny;                        //根据蛇头的位置,计算按键所指向的位置
    int eatapple=0;                    //用来给吃掉的苹果计数
    int noeat=0;                    //走过的空地的数量
    char c;                            //定义用户输入的字符储存单位

int main()
{    int n;                            //用来传递游戏难度的值
    bool endD;
    do
    {
        n=begin();
        rungo(n);
        endD=enddd();
    }while(endD);


    cin.get();
return 0;
}    

//无参数,输出询问语句,并将难度返回给主函数
int begin()                //开始界面函数
{int i;
    color(13);gotoxy(2*wide+8,11);HideCursor();
    cout<<"贪吃蛇大作战";
    gotoxy(2*wide+8,12);
    cout<<"请选择难度";
    gotoxy(2*wide+8,13);
    cout<<"输入数字1-n,即可改变难度";

        cin >>i;

        return i;
}
//接收难度,接收键入值,调用:随机值函数,画图函数,延时函数,判断函数
int rungo(int n)                                        //运行函数
{
    sna[0][0]=(height-(height%2))/2;
    sna[0][1]=(wide-(wide%2))/2;                    //初始化蛇身位置为地图中心
    snkl=0;                                            //在DO循环之前初始化蛇身长度
    draw();                                            //画图
    drawApple();                                    //画苹果
    gotoxy(2*sna[0][1]+2,sna[0][0]+1);cout << "";    //画蛇

    while(1)                                        //无限循环等待用户输入一个方向键
    {if(kbhit())
        {
        c=getch();
        if(c=='H'||c=='K'||c=='P'||c=='M')break;
        }
    }

    do
    {    
        if (kbhit())                                //判断有没有按键
            c=getch();
        switch(c)                                    //根据键入值判断用户所指向的下一个单位的位置
        {
        case 'H':nx=sna[snkl][0];ny=sna[snkl][1]-1;    //向上H
            break;
        case 'K':nx=sna[snkl][0]+1;ny=sna[snkl][1];    //向右K
            break;
        case 'P':nx=sna[snkl][0];ny=sna[snkl][1]+1;    //向下P
            break;
        case 'M':nx=sna[snkl][0]-1;ny=sna[snkl][1];    //向左M
        }

        pada=pandan(nx,ny);                    //执行判断下一个单元的函数,将下一个单元的内容告诉pada
        
        switch(pada)                        //判断pada是什么,对每种情况进行相应的操作
        {
        case area:                            //等于空地时,蛇身运算
                noeat++;
                gotoxy(2*wide+8,4);cout <<"走过的空格"<< noeat ;
                gotoxy(2*sna[0][0]+2,sna[0][1]+1);cout <<"";
                for(int i=0;i<snkl;i++)        
                {
                sna[i][0]=sna[i+1][0];sna[snkl][0]=nx;
                sna[i][1]=sna[i+1][1];sna[snkl][1]=ny;
                }
                gotoxy(2*sna[snkl][0]+2,sna[snkl][1]+1);cout << "";
                break;
        case apple:                            //等于苹果时的运算
                eatapple++;
                gotoxy(2*wide+8,5);cout <<"吃的苹果"<< eatapple ;
                sna[snkl+1][0]=ax;
                sna[snkl+1][1]=ay;
                gotoxy(ax,ay);cout <<"";
                drawApple();                //设置苹果的位置    
                snkl=snkl+1;
                break;
        case self:                            //等于自己的运算
                return 0;
        case selft:                            //原路返回的不执行,按原来的方向走
                gotoxy(2*sna[0][0]+2,sna[0][1]+1);cout <<"";
                for(int i=0;i<snkl;i++)        
                {
                sna[i][0]=sna[i+1][0];sna[snkl][0]=sna[snkl][0]-(nx-sna[snkl][0]);
                sna[i][1]=sna[i+1][1];sna[snkl][1]=sna[snkl][1]-(ny-sna[snkl][1]);
                }
                gotoxy(2*sna[snkl][0]+2,sna[snkl][1]+1);cout << "";
                break;
        case barrier:                        //撞墙不运算,结束本函数
                return 0;

        Sleep(n*300);                        //休眠0.3*n秒
        }
    }while (1);
    
    return 0;
}
//接收下一个位置的坐标,并在蛇身位置数组中查找,根据不同的情况返回一个,枚举类型
state pandan(int nx,int ny)                                
{int i;                                                    //局部变量i;

    if (nx==ax||ny==ay)                                    //首先判断是否吃苹果,如果是的话,相比放在后面在比较运算量要少的多
        return(apple);    
    if(snkl>1)
    {
        for(i=0;i<snkl-2;i++)                            //判断是否撞到自己,除去蛇头位置(蛇头不会装蛇头),除去蛇身第二节位置,方向按反不会死
        {                                                //第三节也是不会撞到的,所以减少程序运算量
        if (sna[i][0]==nx||sna[i][1]==ny)                //同时等于说明撞自己了
        return(self);
        }
    }

    if(snkl>0)
    {
    if(sna[snkl-1][0]==nx||sna[snkl-1][1]==ny)            //判断是否撞到第二节
        return(selft);
    }
    if(nx<0||nx>wide||ny<0||ny>height)                    //判断时候撞墙,此处越界就是撞墙
        return(barrier);
    return(area);                                        //如果不撞墙,不吃苹果,不吃自己第三节以后,不原路返回,就是空地了
}
//随机函数,无参数,返回一个随机坐标,赋给苹果的位置,并在地图上生成一个新苹果
int drawApple()
{    int i,j,k;    
    srand((unsigned)time(NULL));
    i=rand();
    k=height*wide-snkl+1;        //k是除去蛇身后地图上还剩下的单位的数量
    j=i%k;                        //j<剩余单元数
    int n=0;
    for (int a=0;a<wide;a++)
    {
        for (int b=0;b<height;b++)
        {
            if( ((j-j%wide)/wide+a)!= sna[n++][1]&& (j%wide+b)!=sna[n++][2] )        //如果随机产生的值不等于蛇身
            {
                ax=(j-j%wide)/wide+a;
                ay=j%wide+b;
                gotoxy(2*ay+2,ax+1);cout << "";
                return 0;
            }        //则赋给苹果,负责位置往前移动N位
        }
    }
}
//使用全局变量数组smap,sna画出地图,无参数无返回值
void draw(void)                                        //画图函数
{    int i,j,k;
        system("mode con cols=80 lines=25");
        system("CLS");                                //清屏函数
        for(k=0;k<wide+2;k++)                        //第一行输出wide个■
        {
        HideCursor();
        cout <<"";
        }

        for (i=0;i<height+1;i++)                    //循环输出地图
        {    
            gotoxy(0,i+1);                            //每行开头输出一个方块作为边界
            cout<<"";
            for (j=0;j<wide;j++)                    //所有位置输出空方格
            cout<<"";
            cout << ""<<endl;                        //每次到结尾换行一下
        }
        for (k=0;k<wide+2;k++)
                cout <<"";
}
//结束询问函数,无参数,返回一个bool型数据,告诉主函数还要不要继续
bool enddd()
{    
    char ge;
    gotoxy(2*wide+8,8);
    cout <<"您一共走了"<<noeat<<"个格子";
    gotoxy(2*wide+8,9);
    cout <<"你一共吃了"<<eatapple<<"个苹果";
    gotoxy(2*wide+8,10);
/*    cout <<"请问你还要继续吗";
    gotoxy(2*wide+8,11);
    cout <<"↑、继续!!";
    gotoxy(2*wide+8,12);
    cout <<"↓、结束!!";
    if (kbhit())
        {
        ge=getch();
        if(ge=='H')
        return true;
        if(ge=='P')
        return false;
        }*/
    return true;
}

void color(int b)        //颜色函数
{
     HANDLE hConsole = GetStdHandle((STD_OUTPUT_HANDLE)) ;
     SetConsoleTextAttribute(hConsole,b) ;

 }

void HideCursor()        //隐藏光标
{
     HANDLE hOut=GetStdHandle(STD_OUTPUT_HANDLE);
     CONSOLE_CURSOR_INFO cursor_info={1,0};
     SetConsoleCursorInfo(hOut,&cursor_info);

 }

void gotoxy(int x,int y)//设置字符显示位置
{
     HANDLE hOut=GetStdHandle(STD_OUTPUT_HANDLE);
     COORD loc={x,y};
     SetConsoleCursorPosition(hOut,loc);

 }

搜索更多相关主题的帖子: int 函数 位置 return cout 
2018-05-11 18:43
快速回复:有闲情雅致的的帮我看一下我的贪吃蛇,出了一点错误,导致我无法理解了 ...
数据加载中...
 
   



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

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