贪吃蛇

真正意义上的第一个程序.留作纪念.

#include<stdio.h>
#include<conio.h>
#include<stdlib.h>
#include<graphics.h>
#include<time.h>

#define N 100
int i,s,m;
char key;

struct Food
{
    int x;
    int y;
    int flag;
}food;
struct Snake
{
    int x[N];
    int y[N];
    int node;
    int dir;
    int life;
}snake; 

void welcome()
{
    initgraph(640,480);
    setcolor(RED);
    //setlinestyle(PS_DASHDOT,10);    //线条类型
    setlinestyle(PS_SOLID, 10);
    line(200,120,440,120);       //欢迎界面的上划线
    line(200,300,440,300);       //欢迎界面的下划线
    line(200,120,200,300);       //欢迎界面的左划线
    line(440,120,440,300);       //欢迎界面的右划线
    setcolor(YELLOW);
    settextstyle(30, 0, "黑体");
    outtextxy(240,180,"贪吃蛇游戏");
    int i=255;
    int c=255;
    while(!kbhit())
    {
        setcolor(RGB(c, 0, 0));
        settextstyle(15, 0, "宋体");
        outtextxy(280, 240, "按任意键继续");
        c -= 8;
        if (c < 0) c = 255;
        Sleep(50);
    }
    getch();
    cleardevice();
}

int speed()
{
    setcolor(RED);
    setlinestyle(PS_DASHDOT);
    line(200,120,440,120);       //登录界面的上划线
    line(200,300,440,300);       //登录界面的下划线
    line(200,120,200,300);       //登录界面的左划线
    line(440,120,440,300);       //登录界面的右划线
    setcolor(RED);
    settextstyle(25, 0, "黑体");
    outtextxy(240,140,"选择游戏难度");
    settextstyle(20, 0, "宋体");
    outtextxy(260,180,"1.不战而退.");
    outtextxy(260,200,"2.简单难度.");
    outtextxy(260,220,"3.一般难度.");
    outtextxy(260,240,"4.噩梦难度.");
    m=getch();
    switch(m)
    {
        case 49:
            return 0;
            break;
        case 50:
            return 300;
            break;
        case 51:
            return 150;
            break;
        case 52:
            return 50;
            break;
    }
}

void wall(int x,int y)
{
    setfillcolor(WHITE);
    solidrectangle(x, y, x+10, y+10);
    setfillcolor(RED);
    solidrectangle(x+2, y+2, x+8, y+8);
}

void Dwall()
{
    cleardevice();
    int i;
    setlinecolor(RED);
    setlinestyle(PS_SOLID, 10);
    line(10,10,500,10);           //游戏界面的上划线
    line(10,460,500,460);        //游戏界面的下划线
    line(10,10,10,460);          //游戏界面的左划线
    line(500,10,500,460);        //游戏界面的右划线
    for(i=20;i<=480;i=i+20){
        wall(i,20);             //游戏界面的上面墙
        wall(i,440);            //游戏界面的下面墙
    }
    for(i=20;i<440; i=i+20){
        wall(20,i);               //游戏界面的左面墙
        wall(480,i);            //游戏界面的右面墙
    }
    setcolor(BLUE);
    settextstyle(30,0, "黑体");
    outtextxy(540,120,"score");
    outtextxy(540,200,"longth");
    setcolor(RGB(120,220,255));
    settextstyle(20,0, "宋体");
    outtextxy(510,280,"W  --上");
    outtextxy(510,300,"s  --下");
    outtextxy(510,320,"a  --左");
    outtextxy(510,340,"d  --右");
    outtextxy(510,360,"esc  --退出");
    outtextxy(510,380,"space  --暂停");
}


void gameover()
{
    cleardevice();              //清屏 
    int c=255;
    while(!kbhit())
    {
        setcolor(RGB(c, 0, 0));
        settextstyle(50, 0, "宋体");
        outtextxy(100,240,"GAME OVER,LOSER!!!");
        settextstyle(15, 0, "宋体");
        outtextxy(260,300,"按任意键退出.");
        c -= 8;
        if (c < 0) c = 255;
        Sleep(30);
    }
}

void play()
{
    int score;
    char str1[5];
    char str2[5];
    srand((unsigned)time(0));      //这个函数是给随机数产生一个随机种子
    food.flag=1;
    snake.life=0;
    snake.dir=1;
    snake.x[0]=250;
    snake.y[0]=220;
    snake.x[1]=240;
    snake.y[1]=220;
    snake.node=2;
    do{
        if(snake.node==100){
            cleardevice();
            setcolor(RED);
            settextstyle(50, 0, "宋体");
            outtextxy(100,240,"GAME OVER,WINNER!!!");
            settextstyle(20,0, "宋体");
            outtextxy(260,300,"按任意键退出.");
            break;
        }
        score=(snake.node-2)*(m-49);
        sprintf(str1, "%d", score);
        sprintf(str2, "%d", snake.node);
        setcolor(RED);
        settextstyle(20,0, "宋体");
        outtextxy(570,160,str1);
        setcolor(RED);
        settextstyle(20,0, "宋体");
        outtextxy(570,240,str2);
        while(!kbhit()){
            if(food.flag==1){
                do{
                    food.x=rand()%450+30;
                    food.y=rand()%410+30;
                    food.flag=0;
                }while(food.x%10!=0||food.y%10!=0);
            }
            //出现食物
            if(food.flag==0){
                setfillcolor(GREEN);
                solidrectangle(food.x, food.y,food.x+10,food.y+10);
            }
            //蛇移动
            for(i=snake.node-1;i>0;i--){
                snake.x[i]=snake.x[i-1];
                snake.y[i]=snake.y[i-1];
            }
            switch(snake.dir){
                case 1:
                    snake.x[0]=snake.x[0]+10;           //向右移动
                    break;
                case 2:
                    snake.x[0]=snake.x[0]-10;           //向左移动
                    break;
                case 3:
                    snake.y[0]=snake.y[0]-10;           //向上移动
                    break;
                case 4:
                    snake.y[0]=snake.y[0]+10;           //向下移动
                    break;
            }
            //咬到自己
            for(i=3;i<=snake.node;i++){
                if(snake.x[i]==snake.x[0]&&snake.y[i]==snake.y[0]){
                    gameover();
                    snake.life=1;
                    break;
                }
            }
            //撞墙
            if(snake.x[0]<30||snake.x[0]>470||snake.y[0]<30||snake.y[0]>430){
                gameover();
                snake.life=1;
                break;      
            }
            //画蛇
            setfillcolor(GREEN);
            solidrectangle(snake.x[0], snake.y[0],snake.x[0]+10,snake.y[0]+10);
            for(i=1;i<snake.node;i++){
                setfillcolor(BLUE);
                solidrectangle(snake.x[i], snake.y[i],snake.x[i]+10,snake.y[i]+10);
            }
            //吃食物
            if(snake.x[0]==food.x&&snake.y[0]==food.y){
                setfillcolor(BLACK);
                solidrectangle(food.x,food.y,food.x+10,food.y+10);
                snake.node++;
                food.flag=1;
            }
            setfillcolor(RED);
            solidrectangle(snake.x[snake.node-1], snake.y[snake.node-1],snake.x[snake.node-1]+10,snake.y[snake.node-1]+10);
            Sleep(s);
            setfillcolor(BLACK);
            solidrectangle(snake.x[snake.node-1], snake.y[snake.node-1],snake.x[snake.node-1]+10,snake.y[snake.node-1]+10);     
        }
        if(snake.life==1){
            break;
        }
        key=getch();
        if(key=='w'||key==38&&snake.dir!=4)  //上移
        {
            snake.dir=3;
        }
        else if(key=='s'||key==40&&snake.dir!=3)  //下移
        {
            snake.dir=4;
        }
        else if(key=='d'||key==39&&snake.dir!=2)   //右移
        {
            snake.dir=1;
        }
        else if(key=='a'||key==37&&snake.dir!=1)   //左移
        {
            snake.dir=2;
        }
        else if(key==32)
        {
            getch();
        }
    }while(s!=0&&key!=27);
}

void main()
{
    initgraph(640,480);
    welcome();
    s=speed();
    Dwall();
    play();
    //getch();
    closegraph();
}

程序用的IDE是VC6.0 编译器没有graphics.h头文件,采用了第三方库Easyx

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值