| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 32247 人关注过本帖, 8 人收藏
标题:写个贪吃蛇代码来玩玩~
只看楼主 加入收藏
九转星河
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
来 自:长长久久
等 级:贵宾
威 望:52
帖 子:5023
专家分:14003
注 册:2016-10-22
结帖率:99.25%
收藏(8)
已结贴  问题点数:100 回复次数:42 
写个贪吃蛇代码来玩玩~
上课看了贪吃蛇~然后自己动手做了个~

程序代码:
/*
    文件名称:main/cpp
    文件描述:c语言+图形界面库实现人工智能版的贪吃蛇
    编译环境:VC6.0  VS2008 VS 2010 VS2013 VS2015+图形界面库
    <2017年3月17日> <创建工程>  <制作人:九转星河>
*/
#include<stdio.h>
#include<graphics.h>
#include<conio.h>
#include<time.h>

#define WINDOW_WIDTH     640                       //窗口的宽
#define WINDOW_HEIGHT    480                       //窗口的高
#define WINDOW_BLOCK     100                       //窗口的边界

#define MAXSNAKENUM      100                       //蛇的最大节数
#define MAXFOODNUM       100                       //食物的个数
#define SNAKESIZE 10                               //蛇的像素

#define TIME 50

//用一个什么样的数据去表示这个元素

//自定义的结构体类型  当前有多少字节  蛇的方向 蛇的下标

typedef enum Ch
{
    up=72,
    w='w',
    W='W',
    down=80,
    s='s',
    S='S',
    left=75,
    a='a',
    A='A',
    right=77,
    d='d',
    D='D',
};

typedef struct Timer
{
    char Print_hour[10];     //
    char Print_minute[10];   //
    char Print_second[10];   //
    clock_t TIME_START;            //设置游戏时间
    clock_t TIME_NOW;              //设置游戏时间
}Timer;

typedef struct Coor
{
    int x;
    int y;
    COLORREF color;
}COOR;

typedef struct Snake
{
    COOR sCor[MAXSNAKENUM];   //当前的节数
    Ch ch;               //蛇的方向
    int n;               //节数的长度
    char St_n[10];       //蛇身长度字符串

    int score;           //游戏得分
    char St_score[10];    //用于转换字符串
}SNAKE;

typedef struct Food
{
    Coor fcoor[MAXFOODNUM];
    COLORREF fcolor;
    int isEat;
    int Eatnum;   //初始化被吃食物的编号
}Food;

Timer timer={0};  //设计时间结构体
SNAKE snake={0};  //把蛇定义出来
Food food={0};   //初始化

void Draw_Main();  //绘图主函数

void GameInit();

void BLOCKDraw();   //边界绘制

void SnakeMove();
void SnakeStyle();  //蛇的状态
void SnakeDraw();   //蛇的绘制
void SnakeChange();
void SnakeBreak();  //判断是否撞墙

void FoodInit();   //初始化食物
void FoodCreat();  //创建食物
void FoodDraw();   //食物的绘制
void IsEatFood();  //判断食物有没有吃掉

void IsDelLength();  //判断蛇身的长度

void OuttextDraw();  //输出文本绘制

void GameOver();   //游戏结束

void GetTime();    //获取当前时间
void GetLength();  //获取当前蛇身长度

int main()
{
    GameInit();

    while (1)
    {
        while (!kbhit())
        {
            cleardevice();   //清屏

            SnakeStyle();    //更新蛇的状态量
            SnakeMove();     //移动
            IsEatFood();     //判断食物是否被吃
            SnakeBreak();    //判断是否撞到墙

            Sleep(TIME);     
        }

        SnakeChange();      //改变蛇的方向
    }

    getch();
    closegraph();
    return 0;
}

void GameInit()
{
    srand((unsigned)time(NULL));  //获取随机种子

    initgraph(WINDOW_WIDTH,WINDOW_HEIGHT);   //初始化图形界面                        


    setbkcolor(YELLOW);       //背景颜色
    setlinecolor(BLACK);      //线条颜色
    setfillcolor(LIGHTGRAY);  //填充颜色

    settextcolor(RED);                //文字颜色
    settextstyle(30,0,"微软雅黑");    //文字大小和风格
    setbkmode(TRANSPARENT);           //字体不背景透明处理

    cleardevice();

    FoodCreat();

    snake.ch=down;
    snake.n=3;           //节数

    sprintf(snake.St_score,"%d",0);  //初始化分数

    snake.sCor[0].x=100;   
    snake.sCor[0].y=100;
    snake.sCor[0].color=getfillcolor();

    snake.sCor[1].x=100;   
    snake.sCor[1].y=90;
    snake.sCor[1].color=getfillcolor();

    snake.sCor[2].x=100;   
    snake.sCor[2].y=80;
    snake.sCor[2].color=getfillcolor();

    food.Eatnum=0;

    FoodInit();

    SnakeDraw();
    BLOCKDraw();
    FoodDraw();

    outtextxy(10,WINDOW_HEIGHT-WINDOW_BLOCK+3*SNAKESIZE,
        "简单说明:wsad上下左右移动,ESC退出游戏");
    outtextxy(10,WINDOW_HEIGHT-WINDOW_BLOCK+6*SNAKESIZE,
        "连续吃掉三种相同颜色的食物可以减少蛇身长度");
    outtextxy(300,WINDOW_HEIGHT-WINDOW_BLOCK+SNAKESIZE,"作者:九转星河");
    outtextxy(10,WINDOW_HEIGHT-WINDOW_BLOCK+SNAKESIZE,"按任意键开始游戏");

    getch();

    OuttextDraw();
    timer.TIME_START=clock();//游戏开始
    
}

void FoodInit()   //初始化食物
{
    COLORREF foodcolor[6]={BLUE,GREEN,CYAN,RED,MAGENTA,BROWN};

    for (int i=0;i<MAXFOODNUM;++i)
    {
            food.fcoor[i].x=rand()%((WINDOW_WIDTH)/SNAKESIZE)*SNAKESIZE;
            food.fcoor[i].y=rand()%((WINDOW_HEIGHT-WINDOW_BLOCK)/SNAKESIZE)*SNAKESIZE;
            food.fcoor[i].color=foodcolor[rand()%6];

          for (int j=0;j<snake.n;++j)
              if (snake.sCor[j].x==food.fcoor[i].x&&snake.sCor[j].y==food.fcoor[i].y)
              {
                food.fcoor[i].x=rand()%(WINDOW_WIDTH/SNAKESIZE)*SNAKESIZE;
                food.fcoor[i].y=rand()%(WINDOW_HEIGHT-WINDOW_BLOCK/SNAKESIZE)*SNAKESIZE;
                 j=0;
              }

         for ( j=0;j<i;++j)
              if (food.fcoor[j].x==food.fcoor[i].x&&food.fcoor[j].y==food.fcoor[i].y)
              {
                food.fcoor[i].x=rand()%(WINDOW_WIDTH/SNAKESIZE)*SNAKESIZE;
                food.fcoor[i].y=rand()%(WINDOW_HEIGHT/SNAKESIZE)*SNAKESIZE;
                 j=0;
              }
    }
}

void Draw_Main()
{
    SnakeDraw();
    BLOCKDraw();
    FoodDraw();
    OuttextDraw();
}

void BLOCKDraw()
{
    setfillcolor(LIGHTCYAN);

    fillrectangle(0,WINDOW_HEIGHT-WINDOW_BLOCK+SNAKESIZE,WINDOW_WIDTH,WINDOW_HEIGHT);

}

void SnakeStyle()
{
    for (int i=snake.n-1;i>0;--i)
    {
        snake.sCor[i].x=snake.sCor[i-1].x;
        snake.sCor[i].y=snake.sCor[i-1].y;
    }

    if (food.isEat==0&&snake.n<MAXSNAKENUM-1)   //如果食物被吃
    {
        
        snake.sCor[snake.n].color=food.fcoor[food.Eatnum].color;  //预先设定下一节的颜色

        FoodCreat();    //创建食物

        ++snake.n;

        snake.sCor[snake.n-1].x=snake.sCor[snake.n-2].x;
        snake.sCor[snake.n-1].y=snake.sCor[snake.n-2].y;
        snake.score+=10;                                    //分数奖励
        sprintf(snake.St_score,"%d",snake.score);           //把分数转换成字符串形式保存
    }

    IsDelLength();
}

void SnakeMove()
{
    switch (snake.ch)
    {
        case up:
            snake.sCor[0].y-=SNAKESIZE;
            break;
        case down:
            snake.sCor[0].y+=SNAKESIZE;
             break;
        case left:
            snake.sCor[0].x-=SNAKESIZE;
            break;
        case right:
             snake.sCor[0].x+=SNAKESIZE;
            break;

        default :
            break;
    }

    Draw_Main();
}


void SnakeDraw()  //蛇的绘制
{
    for (int i=0;i<snake.n;++i)
    {
            setfillcolor(snake.sCor[i].color);
            fillrectangle(snake.sCor[i].x,snake.sCor[i].y,
            snake.sCor[i].x+SNAKESIZE,
            snake.sCor[i].y+SNAKESIZE);
    }
}

void SnakeChange()
{
    char move;

    move=getch();

    switch(move)
    {
        case up:
        case W:
        case w:
            if (snake.ch!=down)
                snake.ch=up;
            break;

        case down:
        case S:
        case s:
            if (snake.ch!=up)
                 snake.ch=down;
            break;

        case left:
        case A:
        case a:
            if (snake.ch!=right)
                snake.ch=left;
            break;

        case right:
        case D:
        case d:
            if (snake.ch!=left)
                snake.ch=right;
            break;

        case VK_ESCAPE:
            GameOver();  //游戏结束处理
        break;

        default:
            break;
    }
}

void FoodCreat()  //创建食物
{
    COLORREF foodcolor[6]={BLUE,GREEN,CYAN,RED,MAGENTA,BROWN}; //获取食物信息

    food.fcoor[food.Eatnum].x=rand()%((WINDOW_WIDTH)/SNAKESIZE)*SNAKESIZE;
       food.fcoor[food.Eatnum].y=rand()%((WINDOW_HEIGHT-WINDOW_BLOCK)/SNAKESIZE)*SNAKESIZE;
       food.fcoor[food.Eatnum].color=foodcolor[rand()%6];

    for (int i=0;i<snake.n;++i)
    {
        if (snake.sCor[i].x==food.fcoor[food.Eatnum].x&&snake.sCor[i].y==food.fcoor[food.Eatnum].y)
        {
                food.fcoor[food.Eatnum].x=rand()%(WINDOW_WIDTH/SNAKESIZE)*SNAKESIZE;
                food.fcoor[food.Eatnum].y=rand()%(WINDOW_HEIGHT/SNAKESIZE)*SNAKESIZE;
                 i=0;
        }

        for (int j=0;j<MAXFOODNUM;++j)
            if (j!=food.Eatnum&&food.fcoor[j].x==food.fcoor[food.Eatnum].x&&food.fcoor[j].y==food.fcoor[food.Eatnum].y)
            {
                 food.fcoor[food.Eatnum].x=rand()%(WINDOW_WIDTH/SNAKESIZE)*SNAKESIZE;
                food.fcoor[food.Eatnum].y=rand()%(WINDOW_HEIGHT/SNAKESIZE)*SNAKESIZE;
                 j=0;
            }
    }

    food.isEat=1;
}

void FoodDraw()
{
    for (int i=0;i<MAXFOODNUM;++i)    //食物的绘制
    {
        setfillcolor(food.fcoor[i].color);
        fillroundrect(food.fcoor[i].x,food.fcoor[i].y,
          food.fcoor[i].x+SNAKESIZE,food.fcoor[i].y+SNAKESIZE,
        SNAKESIZE,SNAKESIZE);
    }
}

void IsEatFood()
{
    for (int i=0;i<MAXFOODNUM;++i)
    if (snake.sCor[0].x==food.fcoor[i].x&&snake.sCor[0].y==food.fcoor[i].y)
    {
        food.isEat=0;
        food.Eatnum=i;
        break;
    }
}

void IsDelLength()  //如果遇到相同三种颜色则消去其长度
{

    COLORREF A=snake.sCor[snake.n-1].color;
    COLORREF B=snake.sCor[snake.n-2].color;
    COLORREF C=snake.sCor[snake.n-3].color;

    if (A==B&&B==C&&snake.n>3)
    {
        snake.n-=3;
        snake.score+=50;
    }
}

void SnakeBreak()
{
    if (snake.n>=MAXSNAKENUM-1)
        GameOver();

    if (snake.sCor[0].x>WINDOW_WIDTH||snake.sCor[0].y>WINDOW_HEIGHT-WINDOW_BLOCK)
        GameOver();

    if (snake.sCor[0].x<0||snake.sCor[0].y<0)
        GameOver();

    for (int i=snake.n-1;i>0;--i)
        if (snake.sCor[0].x==snake.sCor[i].x&&snake.sCor[0].y==snake.sCor[i].y)
            GameOver();
}

void GetTime()   //获取当前时间
{
    timer.TIME_NOW=clock();

    double duration = (double)(timer.TIME_NOW-timer.TIME_START)/CLOCKS_PER_SEC;
    int my_time=(int )duration;

    int now_second=my_time%60;
    int now_minute=(my_time/60)%60;
    int now_hour=my_time/3600;

    sprintf(timer.Print_hour,"%02d",now_hour);
    sprintf(timer.Print_minute,"%02d",now_minute);
    sprintf(timer.Print_second,"%02d",now_second);
}

void GetLength()
{
    sprintf(snake.St_n,"%d",snake.n);
}

void OuttextDraw()  //输出文本绘制
{
    GetTime();
    GetLength();   
    outtextxy(10,WINDOW_HEIGHT-WINDOW_BLOCK+SNAKESIZE,"当前游戏时间");
    outtextxy(180,WINDOW_HEIGHT-WINDOW_BLOCK+SNAKESIZE,timer.Print_hour);
    outtextxy(205,WINDOW_HEIGHT-WINDOW_BLOCK+SNAKESIZE,":");
    outtextxy(210,WINDOW_HEIGHT-WINDOW_BLOCK+SNAKESIZE,timer.Print_minute);
    outtextxy(235,WINDOW_HEIGHT-WINDOW_BLOCK+SNAKESIZE,":");
    outtextxy(240,WINDOW_HEIGHT-WINDOW_BLOCK+SNAKESIZE,timer.Print_second);

    outtextxy(10,WINDOW_HEIGHT-WINDOW_BLOCK+3*SNAKESIZE,"当前分数:");
    outtextxy(110,WINDOW_HEIGHT-WINDOW_BLOCK+3*SNAKESIZE,snake.St_score);

    outtextxy(300,WINDOW_HEIGHT-WINDOW_BLOCK+SNAKESIZE,"蛇身长度:");
    outtextxy(410,WINDOW_HEIGHT-WINDOW_BLOCK+SNAKESIZE,snake.St_n);

}
void GameOver()
{
    outtextxy(WINDOW_WIDTH/2-50,WINDOW_HEIGHT-WINDOW_BLOCK/2,"游戏结束");
    getch();
    closegraph();
    exit(0);
}
搜索更多相关主题的帖子: 人工智能 贪吃蛇 制作人 c语言 工程 
2017-03-18 06:39
九转星河
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
来 自:长长久久
等 级:贵宾
威 望:52
帖 子:5023
专家分:14003
注 册:2016-10-22
收藏
得分:0 
很久都没有发百分贴了~初学图形编程~感觉制作方面还有很大提升空间~~~先帮自己顶一下~

[code]/*~个性签名:bug是什么意思?bug是看上去没有可能的东西实际上是有可能做到的 就是这样~2018-08-08更~*/[/code]
2017-03-18 06:41
wp231957
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
来 自:神界
等 级:贵宾
威 望:423
帖 子:13688
专家分:53332
注 册:2012-10-18
收藏
得分:9 
好长啊

DO IT YOURSELF !
2017-03-18 07:44
九转星河
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
来 自:长长久久
等 级:贵宾
威 望:52
帖 子:5023
专家分:14003
注 册:2016-10-22
收藏
得分:0 
回复 3楼 wp231957
诶~实话说算短了~听说人家做项目的精美游戏代码超过3000行~汗啊~

[code]/*~个性签名:bug是什么意思?bug是看上去没有可能的东西实际上是有可能做到的 就是这样~2018-08-08更~*/[/code]
2017-03-18 08:52
ehszt
Rank: 12Rank: 12Rank: 12
等 级:贵宾
威 望:40
帖 子:1745
专家分:3216
注 册:2015-12-2
收藏
得分:9 
怎么我用vc6编译提示'graphics.h': No such file or directory
Error executing cl.exe.
ps:我有个贪吃蛇代码,是别人写的。https://bbs.bccn.net/viewthread.php?tid=469359&highlight=%CC%B0%B3%D4%C9%DF
我编的走迷宫程序部分参照这个来的。

[此贴子已经被作者于2017-3-18 12:10编辑过]

2017-03-18 11:49
哈哈哈1994
Rank: 1
等 级:新手上路
帖 子:4
专家分:9
注 册:2017-3-5
收藏
得分:9 
回复 5楼 ehszt
我也这样的,其他人都成功了?
2017-03-18 12:40
alice_usnet
Rank: 11Rank: 11Rank: 11Rank: 11
等 级:贵宾
威 望:18
帖 子:370
专家分:2020
注 册:2016-3-7
收藏
得分:9 
回复 6楼 哈哈哈1994
貌似还要graphics这个库

未佩好剑,转身便已是江湖
2017-03-18 12:47
bjut_Allen
Rank: 9Rank: 9Rank: 9
来 自:平乐园工业技术学校
等 级:蜘蛛侠
威 望:8
帖 子:323
专家分:1223
注 册:2016-10-16
收藏
得分:9 
回复 5楼 ehszt
graphics.h这个头文件在easyx库中,需要安装一下easyx

Code is my life.
2017-03-18 13:14
ehszt
Rank: 12Rank: 12Rank: 12
等 级:贵宾
威 望:40
帖 子:1745
专家分:3216
注 册:2015-12-2
收藏
得分:0 
回复 8楼 bjut_Allen
多谢!原来还有个这么好的东西。
2017-03-18 13:21
mnmn4429
Rank: 4
等 级:业余侠客
帖 子:64
专家分:245
注 册:2017-2-21
收藏
得分:9 
真长,编译成功了
2017-03-18 14:43
快速回复:写个贪吃蛇代码来玩玩~
数据加载中...
 
   



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

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