vc++ 6.0 贪吃蛇源码

/**************************************************
vc++ 6.0 贪吃蛇
需要安装easyX
说明:鄙人还是个新手 游戏尚存在不少bug(比如加速后计时就不准了)
游戏内置等级制和分数 升级后蛇会加速
**************************************************/
参考代码:

#include<stdio.h>
#include<graphics.h>
#include<conio.h>
#include<windows.h>

#define UP 'w' //define operate key
#define DOWN 's'
#define LEFT 'a'
#define RIGHT 'd'

void initial_interface();
void game_interface();
void during_game();
void gameover();
void draw_time(int);//显示时间
void draw_score(int);//显示分数
void draw_level(int);//显示等级
void random_fruit();//随机果子
void move_snake();//移动蛇
int death_judgment();//判断死亡条件
void eat_fruit();//吃到水果

struct position//定义坐标位置
{
    int x;
    int y;
}pos1,pos2,snake[323],tail;//定义绘图坐标(2个),蛇身,蛇尾

int time=0,score=0,level=1,length=2,seed1,seed2,count=0,speed=0,countlevel=0;
//定义时间,分数,等级,蛇的长度,随机种子,计时的数,速度,等级计数
void main()
{
    initial_interface();
    game_interface();
    during_game();
    gameover();
}

void initial_interface()//初始界面
{
    initgraph(640,480);//创建窗口

    char ch1[] = "经典贪吃蛇";
    char ch2[] = "Start Game";
    char ch3[] = "纪念蛇院院长";
    char ch4[] = "西弗勒斯·斯内普";

    settextstyle(50, 0, _T("宋体"));//设置字体风格
    settextcolor(GREEN);//设置字体颜色

    outtextxy(200, 150, ch1);
    outtextxy(200, 240, ch2);

    settextstyle(16, 0, _T("宋体"));//设置字体风格

    outtextxy(465, 370, ch3);
    outtextxy(450, 410, ch4);

}

void game_interface()//游戏界面
{
    while(1)//按回车或空格进入游戏
    {
        char c = getch();
        if(c==32||c==13)
        {
            break;
        }
    }

    cleardevice();//清除屏幕内容

    setlinestyle(PS_SOLID);//画线风格
    setlinecolor(RGB(255,255,255));//画线颜色
    setfillstyle(BS_SOLID);//填充风格
    setfillcolor(RGB(255,0,0));//填充颜色(多余的一条 放一起好复制)

    pos1.x=0;pos1.y=0;pos2.x=24;pos2.y=24;//初始化坐标位置

    for(int i=0;i<20;i++)//画填充矩形
    {
        for(int j=0;j<20;j++)
        {
            if(i==0||j==0||i==19||j==19)
            {
                setfillcolor(RGB(102,102,153));//填充颜色
            }
            else
            {
                setfillcolor(RGB(255,255,255));//填充颜色
            }
            fillrectangle(pos1.x,pos1.y,pos2.x,pos2.y);
            pos1.x+=24;
            pos2.x+=24;
        }
        pos1.x=0;//重置点位
        pos2.x=24; //重置点位
        pos1.y+=24;
        pos2.y+=24;
    }

    //显示时间
    draw_time(time);
    //显示分数
    draw_score(score);
    //显示等级
    draw_level(level);

}


//游戏过程
void during_game()
{
    //出现蛇
    snake[0].x=240;snake[0].y=216;//蛇的初始坐标
    snake[1].x=240;snake[1].y=240;
    setfillcolor(GREEN);//蛇院之绿
    fillrectangle(snake[0].x,snake[0].y,snake[0].x+24,snake[0].y+24);
    fillrectangle(snake[1].x,snake[1].y,snake[1].x+24,snake[1].y+24);

    //随机果子
    random_fruit();

    //移动蛇
    move_snake();   
}

void gameover()//游戏结束
{
    cleardevice();//清除屏幕内容
    char ch5[] = "Game Over";
    settextstyle(100, 0, _T("宋体"));//设置字体风格
    settextcolor(GREEN);//设置字体颜色
    outtextxy(80, 160, ch5);
    draw_time(time);//显示时间
    draw_score(score);//显示分数
    draw_level(level);//显示等级
    getchar();
    closegraph();
}

void draw_time(int a)//显示时间
{
    char s1[10];
    sprintf(s1, "Time : %d", a);
    settextstyle(20, 0, _T("宋体"));
    settextcolor(GREEN);
    outtextxy(520, 100, s1);
}

void draw_score(int b)//显示分数
{
    char s2[10];
    sprintf(s2, "Score: %d", b);
    settextstyle(20, 0, _T("宋体"));
    settextcolor(GREEN);
    outtextxy(520, 380, s2);
}

void draw_level(int c)//显示等级
{
    char s3[10];
    sprintf(s3, "Level: %d", c);
    settextstyle(20, 0, _T("宋体"));
    settextcolor(GREEN);
    outtextxy(520, 130, s3);
}

void random_fruit()//随机果子
{
loop1:seed1=1+rand()%18;
    seed2=1+rand()%18;
    for(int i=0;i<length;i++)//防止果实一出生就在蛇体内
    {
        if(24*seed1==snake[i].x && 24*seed2==snake[i].y)
        {
            goto loop1;//goto语句待改进
        }
    }
    setfillcolor(RED);
    fillrectangle(24*seed1,24*seed2,24*(seed1+1),24*(seed2+1));
}

void move_snake()//移动蛇
{
    char ch;
    while(death_judgment())
    {
        if(kbhit())
        {
            ch=getch();
        }
        if(ch=='w'||ch=='s'||ch=='a'||ch=='d')
        {
            tail.x=snake[length-1].x;//存放蛇尾
            tail.y=snake[length-1].y;
            setfillcolor(RGB(255,255,255));//背景颜色(障眼法)
            fillrectangle(snake[length-1].x,snake[length-1].y,snake[length-1].x+24,snake[length-1].y+24);
            for(int k=length-1;k>0;k--)
            {
                snake[k].x=snake[k-1].x;
                snake[k].y=snake[k-1].y;
            }
            /*绘制0,0点的蛇头*/
            switch(ch)
            {
                case UP: snake[0].y -= 24;break;
                case DOWN:  snake[0].y += 24;break;
                case LEFT: snake[0].x -= 24;break;
                case RIGHT: snake[0].x += 24;break;
                default: break;
            }
            eat_fruit();//吃到水果
            setfillcolor(GREEN);//蛇院之绿
            fillrectangle(snake[0].x,snake[0].y,snake[0].x+24,snake[0].y+24);
            draw_score(score);//刷新分数
            count++;//实现计时
            if(count%2==0)
            {
                time++;
            }
            draw_time(time);//刷新时间
            draw_level(level);//刷新等级
            Sleep(500-speed);//控制速度
        }
    }
}

int death_judgment()//判断死亡条件
{
    if(snake[0].x==0||snake[0].x==456||snake[0].y==0||snake[0].y==456)
    {
        return 0;
    }
    for(int i=1;i<length;i++)
    {
        if(snake[0].x==snake[i].x && snake[0].y==snake[i].y)
        {
            return 0;
        }
    }
    return 1;
}

void eat_fruit()//吃到水果
{
    if(24*seed1==snake[0].x && 24*seed2==snake[0].y)//判断是否吃到果子
    {
        length++;//蛇长度+1
        score += 10*level;//分数增加(以等级为基数)
        countlevel++;//等级计数
        if(countlevel%10==0)//吃到10个升级
        {
            level++;
            speed += 50*(level-1);//实现加速(基于等级)
        }
        setfillcolor(GREEN);
        fillrectangle(tail.x,tail.y,tail.x+24,tail.y+24);//将消失的最后一块填上
        snake[length-1].x=tail.x;//重新定义最后一块
        snake[length-1].y=tail.y;
        random_fruit();//诞生新的水果
    }
}



  • 6
    点赞
  • 25
    收藏
    觉得还不错? 一键收藏
  • 6
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值