标题:新手共享贪吃蛇代码(200行)
取消只看楼主
洛云
Rank: 5Rank: 5
等 级:职业侠客
帖 子:204
专家分:356
注 册:2010-2-3
结帖率:75%
已结贴  问题点数:10 回复次数:5 
新手共享贪吃蛇代码(200行)
暑假期间用C语言写的一个贪吃蛇游戏,无需图形驱动,控制台程序。现在贴出来与和我一样的新手共享,并请高手多指教。欢迎大家回帖指正批评。
pcc32.h是在网上找的一个头文件,因为我用dev,不支持tc的bioskey等函数。程序及源码下载地址在代码下面。
代码如下,在dev-c++编译通过:
程序代码:
#include <stdio.h>
#include "pcc32.h"

#define FALSE 0
#define TURE 1

#define WIDTH 22
#define HEIGH 18
#define BASETIME 300

#define TIME(x) BASETIME-23*(x)

enum DIR{
    LEFT,
    RIGHT,
    UP,
    DOWN
};
struct COOR{
    uint8 x;
    uint8 y;
};
struct SNAKE{
    uint16 length;
    struct COOR body[328];
    enum DIR dir;
};

struct SNAKE snake={0,{0,0},0};
struct COOR food;
uint16 score=0;

void Ready();
void Play();
void Over();
void Wall();
void InitSnake();
void InitFood();
uint8 IsOver(uint8 x, uint8 y);
uint8 InSnake(uint8 x, uint8 y);
uint8 MoveSnake();

void Ready()
{
    printf("说明:\n");
    printf("开始游戏前请将输入法切换成英文输入法。\n");
    printf("↑↓←→分别控制蛇上下左右移动。\n");
    printf("回车键暂停或继续游戏。\n");
    printf("\n\n请按任意键开始游戏");
    jkGetKey();
}
void Play()
{
    uint8 level=1;
    system("cls");
    Wall();
    setTextColor(YELLOW);
    InitSnake();
    InitFood();
    do
    {
        if(level<10)
            level=(snake.length+5)/10;
        gotoTextPos(0,HEIGH+1);
        printf("SCORE:   %5u           LEVEL:   %u",score,level);
        sleep(TIME(level));
        if(jkHasKey())
            switch(jkGetKey())
            {
                case JK_LEFT:
                    if(snake.dir!=RIGHT)
                        snake.dir=LEFT;
                    break;
                case JK_RIGHT:
                    if(snake.dir!=LEFT)
                        snake.dir=RIGHT;
                    break;
                case JK_UP:
                    if(snake.dir!=DOWN)
                        snake.dir=UP;
                    break;
                case JK_DOWN:
                    if(snake.dir!=UP)
                        snake.dir=DOWN;
                    break;
                case JK_ENTER:
                    for(;jkGetKey()!=JK_ENTER;);
                    break;
                default:;
            }
    }while(MoveSnake());
}
void Over()
{
    gotoTextPos(WIDTH-10,HEIGH/2-1);
    setTextColor(WHITE);
    printf("Your score is:%u",score);
    sleep(1500);
    jkGetKey();
}
void Wall()
{
    uint8 x=0,y=0;
    setTextColor(RED_ORANGE);
    gotoTextPos(0,0);
    while(x++<WIDTH)
        printf("");
    while(++y<HEIGH)
    {
        gotoTextPos(0,y);
        printf("");
        gotoTextPos((WIDTH-1)*2,y);
        printf("");
    }
    gotoTextPos(0,HEIGH-1);
    while(--x>0)
        printf("");
}
void InitFood()
{
    srand((unsigned)time(NULL));
    do
    {
        food.x=rand()%(WIDTH-2)+1;
        food.y=rand()%(HEIGH-2)+1;
    }while(InSnake(food.x, food.y));
    gotoTextPos(food.x*2, food.y );
    printf("");
}
void InitSnake()
{
    uint8 i=0;
    snake.length=5;
    snake.dir=RIGHT;
    setTextColor(YELLOW);
    do
    {
        snake.body[i].x=5-i;
        snake.body[i].y=4;
        gotoTextPos(snake.body[i].x*2,snake.body[i].y);
        printf("");
    }while(++i<snake.length);
}
uint8 IsOver(uint8 x,uint8 y)
{
    if(InSnake(x,y)||0==x||WIDTH-1==x||0==y||HEIGH-1==y)
        return TURE;
    return FALSE;
}
uint8 InSnake(uint8 x, uint8 y)
{
    uint8 i= snake.length;
    while(i--)
        if(snake.body[i].x==x&&snake.body[i].y==y)
            return TRUE;
    return FALSE;
}
uint8 MoveSnake()
{
    uint8 i,x=snake.body[0].x, y=snake.body[0].y;
    switch(snake.dir)
    {
        case LEFT: --x; break;
        case RIGHT: ++x; break;
        case UP: --y; break;
        default: ++y;
    }
    if(x==food.x&&y==food.y)
    {
        ++snake.length;
        InitFood();
        score+=50;
    }
    else
    {
        gotoTextPos(snake.body[snake.length-1].x*2,snake.body[snake.length-1].y);
        printf(" ");
    }
    gotoTextPos(x*2,y);
    printf("");
    for(i=snake.length-1;i>0;--i)
        snake.body[i]=snake.body[i-1];
    if(IsOver(x,y))
        return FALSE;
    snake.body[i].x=x;
    snake.body[i].y=y;
    return TRUE;
}
int main(void)
{
    setConsoleTitle("Snake 贪吃蛇    貌似掉线  QQ群:31066229");
    setCursorVisible(0);
    fixConsoleSize(WIDTH*2,HEIGH+2);
    Ready();
    Play();
    Over();
    return 0;
}

程序源码下载地址:http://www.
如果不能下载就试下这个:http://www.
搜索更多相关主题的帖子: 贪吃 代码 
2010-08-30 16:59
洛云
Rank: 5Rank: 5
等 级:职业侠客
帖 子:204
专家分:356
注 册:2010-2-3
得分:0 
发现可以直接贴附件就直接贴上来了。
200行的简单SnakeC语言源码.rar (15.06 KB)

QQ群:C语言初级群:31066229
   JAVA2自学交流群(筹备中):31066388
UC群:C语言学习:10051714
2010-08-30 17:03
洛云
Rank: 5Rank: 5
等 级:职业侠客
帖 子:204
专家分:356
注 册:2010-2-3
得分:0 
回复 5楼 sunyh1999
貌似压缩包里有。

QQ群:C语言初级群:31066229
   JAVA2自学交流群(筹备中):31066388
UC群:C语言学习:10051714
2010-09-02 12:32
洛云
Rank: 5Rank: 5
等 级:职业侠客
帖 子:204
专家分:356
注 册:2010-2-3
得分:0 
回复 6楼 walshao
我也不懂,就是写了一段代码,然后给编译软件,然后貌似它就预处理,编译,链接,生成了。

[ 本帖最后由 洛云 于 2010-9-2 12:42 编辑 ]

QQ群:C语言初级群:31066229
   JAVA2自学交流群(筹备中):31066388
UC群:C语言学习:10051714
2010-09-02 12:34
洛云
Rank: 5Rank: 5
等 级:职业侠客
帖 子:204
专家分:356
注 册:2010-2-3
得分:0 
回复 12楼 icepeplo
你有加入那个头文件吗?

QQ群:C语言初级群:31066229
   JAVA2自学交流群(筹备中):31066388
UC群:C语言学习:10051714
2010-09-02 17:10
洛云
Rank: 5Rank: 5
等 级:职业侠客
帖 子:204
专家分:356
注 册:2010-2-3
得分:0 
什么是c+编译?

QQ群:C语言初级群:31066229
   JAVA2自学交流群(筹备中):31066388
UC群:C语言学习:10051714
2010-09-03 07:14



参与讨论请移步原网站贴子:https://bbs.bccn.net/thread-317213-1-1.html




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

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