依爱 发表于 2019-7-14 16:59:31

贪吃蛇纯c编译成功,运行出错,求大神指点

运行就出错

AmosAlbert 发表于 2019-7-16 17:55:25

#include "stdafx.h"//dev的话吧这行删掉

#include <stdio.h>

#include <windows.h>

#include <time.h>

#include <conio.h>

#include <stdlib.h>

//方向键的ASCLL值:上72,左75,右77,下80

//背景颜色的代码: 0=黑色1蓝色 2 绿色 3湖蓝色 4红色 5紫色 6黄色 7白色 8灰色 9淡蓝色

//**改变当前光标方块的背景颜色和字体颜色**//

void BackGround(unsigned int ForeColor = 7, unsigned int BackGroundColor = 0) {

        HANDLE handle = GetStdHandle(STD_OUTPUT_HANDLE);//获取控制台的句柄

        SetConsoleTextAttribute(handle, ForeColor + BackGroundColor * 0x10);//改变当前光标的背景和字体颜色

}



//**改变光标的位置**//

void gotoxy(int x, int y) {

        HANDLE handle;

        COORD coord;   //获取坐标轴结构体

        coord.X = x;

        coord.Y = y;

        handle = GetStdHandle(STD_OUTPUT_HANDLE);//获取控制台句柄,值为-11

        SetConsoleCursorPosition(handle, coord);   //移动光标到x,y处

}



//**初始化地图数据**//

void restart(int bk, int look, int move) {

        //bk为总的地图数据记录整个地图,为1时表示墙体,为2时表示果实,为3时表示蛇

        //look记录数据,为0时表示朝向,为1时表示长度,为3时表示胜负情况,为4表示分数

        //move记录蛇走过的路程,用来打印蛇时判断用

        int pp, qq;//用来记录获取的随机坐标

        //接下来要初始化整个地图//

        for(int i=0;i<=16;i++)

                for (int j = 0; j <= 16; j++) {

                        if (i == 0 || i == 16 || j == 0 || j == 16)bk = 1;//1表示墙体

                        else bk = 0; //0表示什么都没有

                        move = 0;    //该数组用来记录蛇移动的轨迹

                }

        //将蛇初始化在8,8坐标上

        bk = 3;

        move = 1;//则此时8,8,上的轨迹就应该记录为1

        move = 1;//用此来记录步数

        pp = rand() % 15 + 1;//范围是1-15

        qq = rand() % 15 + 1;

        bk = 2;//表示这个位置有果实了

        look = 1;//表示朝向,向上

        look = 1;//表示长度

        look = 0;//当为1是表示失败

        look = 0;//记录得分

        //接下来要绘制地图//

        for(int i=0;i<=16;i++)

                for (int j = 0; j <= 16; j++) {

                        gotoxy(i * 2, j);//光标移动,每个光标都是矩形

                        switch (bk) {

                        case 0:

                                BackGround(0, 0);

                                break;//如果没有东西打印黑色

                        case 1:

                                BackGround(0, 1);

                                break;//墙打印蓝色

                        case 2:

                                BackGround(0, 2);

                                break;//果实打印绿色

                        case 3:

                                BackGround(0, 3);

                                break;//蛇打印湖蓝色

                        default:

                                break;

                        }

                        printf("");//地图中直接就是涂空格符

                }

        //接下来要显示积分//

        gotoxy(35, 0);

        BackGround(7, 0);//用白字黑底打印

        printf("现在得分是:%d,请再接再厉!^_^", look);

}





//**运动主体**//

void map(int bk, int look, int xy, int move) {

        //bk是地图信息,look作数据记录,xy记录坐标,move记录蛇的运动轨迹

        int b, qq=0, pp=0;//b用来吸收输入,qq和pp用来随机初始化果实坐标

        if (kbhit()) {//记录按下的是哪个方向键

                b = getch();//用b来记录

                if (b == 224)b = getch();//如果为224表示为方向键,但是要再一次获取才行

                if (b == 72 && look != 2)

                        //如果输入的为上并且朝向不为下

                        look = 1;

                if (b == 80 && look != 1)

                        look = 2;

                if (b == 75 && look != 4)

                        look = 3;

                if (b == 77 && look != 3)

                        look = 4;

        }

        switch (look) {

        case 1:

                //往上走

                xy--;

                break;

        case 2:

                //往下走

                xy++;

                break;

        case 3:

                //往左走

                xy--;

                break;

        case 4:

                //往右走

                xy++;

                break;

        }

        //接下来蛇就开始走动了//

        move++;//蛇的步数加一

        move]] = move;//记录当前格子中蛇的轨迹

        gotoxy(35, 2);

        BackGround(7, 0);

        printf("横坐标:%d,纵坐标:%d", xy,xy);

        gotoxy(xy * 2, xy);//这里蛇头就往前移动了

        BackGround(0, 3);//与蛇体一个颜色

        printf("");



        //如果吃了果实//

        if (bk]] == 2) {

                look++;//分数加一

                look++;//长度加一

                //更新分数

                gotoxy(35, 0);

                BackGround(7, 0);

                printf("现在得分是:%d,请再接再厉!^_^", look);

                while (bk != 0) {

                        pp = rand() % 15 + 1;

                        qq = rand() % 15 + 1;

                }

                bk = 2;//将这个地方变为果实

                gotoxy(pp * 2, qq);

                BackGround(0, 2);

                printf("");

        }



        //如果撞了墙或者自己//

        if (bk]] == 1 || bk]] == 3) {

                look = 1;//表示已经输了

                gotoxy(6, 6);

                BackGround(7, 0);

                printf("你输了,最后得分:%d", look);

        }



        bk]] = 3;//使这个位置变成蛇

        //接下来要检测蛇然后刷新蛇的位置//

        for(int i=0;i<=16;i++)

                for (int j = 0; j <= 16; j++) {

                        if (move == move]] - look){

                                //如果符合这个条件,则表示蛇已经移动出这个位置了

                                //要删除这个位置的蛇尾巴

                                //一次只有一个方块会符合要求吧?

                                bk = 0;

                                gotoxy(i * 2, j);

                                BackGround(0, 0);

                                printf("");

                                break;//一次只找一个

                        }

                }

        end:;

}

int main() {

        int bk, xy, move, look;

        xy = xy = 8;

        srand((unsigned) time(NULL));//初始化随机种子

        system("pause");

        restart(bk, look, move);

        while (look == 0) {

                Sleep(200);//休眠400ms一次

                map(bk, look, xy, move);

        }

        system("pause");

        printf("游戏结束,谢谢游玩!^_^");

        return 0;

}

AmosAlbert 发表于 2019-7-16 17:55:56

采纳我吧

cplus 发表于 2019-8-11 10:32:47

楼主,问题解决了,请结帖!
页: [1]
查看完整版本: 贪吃蛇纯c编译成功,运行出错,求大神指点