标题:新手共享贪吃蛇代码(200行)
只看楼主
洛云
Rank: 5Rank: 5
等 级:职业侠客
帖 子:204
专家分:356
注 册:2010-2-3
结帖率:75%
已结贴  问题点数:10 回复次数:13 
新手共享贪吃蛇代码(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
vandychan
Rank: 15Rank: 15Rank: 15Rank: 15Rank: 15
等 级:贵宾
威 望:18
帖 子:2296
专家分:6418
注 册:2010-8-20
得分:1 
以下是引用洛云在2010-8-30 17:03:11的发言:

发现可以直接贴附件就直接贴上来了。
收藏了
楼主 继续加油 你一定能成为最出色的程序员

到底是“出来混迟早要还”还是“杀人放火金腰带”?
2010-08-30 17:05
sunyh1999
Rank: 16Rank: 16Rank: 16Rank: 16
等 级:版主
威 望:14
帖 子:1178
专家分:3032
注 册:2009-5-17
得分:1 
很好!加油

欢迎来到我的博客:http://blog..cn/noisunyuhong
2010-08-31 11:23
sunyh1999
Rank: 16Rank: 16Rank: 16Rank: 16
等 级:版主
威 望:14
帖 子:1178
专家分:3032
注 册:2009-5-17
得分:0 
楼主能不能放个pcc32.h上来呢?

欢迎来到我的博客:http://blog..cn/noisunyuhong
2010-08-31 11:26
walshao
Rank: 1
等 级:新手上路
帖 子:10
专家分:6
注 册:2010-8-31
得分:1 
本人小白 问下 你那exe用什么生成的啊

Life is not fair, get used to it.
2010-08-31 11:34
cosdos
Rank: 9Rank: 9Rank: 9
来 自:ShangHai
等 级:蜘蛛侠
威 望:6
帖 子:2109
专家分:1385
注 册:2007-6-19
得分:1 
收藏

—>〉Sun〈<—
2010-08-31 22:46
d7d7
Rank: 4
等 级:业余侠客
帖 子:91
专家分:210
注 册:2008-9-29
得分:1 
非常不错了。
2010-08-31 22:49
洛云
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



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




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

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