贪吃蛇游戏(c实现)

用c实现了贪吃蛇的代码。

刚开始总是不明白如何去更新原来的图像,看了别人博客貌似都有一个gotoxy函数,刚开始没仔细看没怎么弄懂,不清楚把屏幕上的指针移到某个位置有神马用,后来偶然看到了下面紧跟着的printf,突然顿悟,这样就能实现图像的具体地方的更新了。

不过还是有点坑的是刚开始我直接贴的一个gotoxy函数的坐标和我自己的坐标是反过来的,老是出错,调了会儿就改过来了,结果刚开始改的时候犯了点傻,没改函数改了自己写的坐标导致我后面的坐标都写反了T_T。

#include <iostream>
#include<string.h>
#include<algorithm>
#include<stdio.h>
#include<stdlib.h>
#include<time.h>
#include<windows.h>
#include <conio.h>
using namespace std;
typedef long long ll;
struct data
{
    char hh;
    int x,y;
} a[22][44];
int timef;
int sx,sy,ex,ey;
void gotoxy(int x,int y)
{
    HANDLE h1;
    COORD pos;
    pos.X=x;
    pos.Y=y;
    h1=GetStdHandle(STD_OUTPUT_HANDLE);
    SetConsoleCursorPosition(h1,pos);
}
int score;
void error()
{
    Sleep(1000);
    system("cls");
    printf("----------------------------------------------------\n");
    printf("|                                                  |\n");
    printf("|                你的最终得分:%d                  |\n",score);
    printf("|                                                  |\n");
    printf("|     菜鸡,你怎么又输了!(输入任何键加回车返回)   |\n");
    printf("|                                                  |\n");
    printf("|                                                  |\n");
    printf("----------------------------------------------------\n");
    char ff;
    scanf(" %c",&ff);
}

void getfood()
{
    while(1)///还没有吃到食物
    {
        int tex=rand()%20+1,tey=rand()%42+1;
        if(a[tex][tey].hh==0)
        {
            a[tex][tey].hh='*';
            gotoxy(tey,tex);
            printf("*");
            break;
        }
    }
}

void show()///显示初始蛇的图像
{
    system("cls");
    for(int i=0; i<22; i++)
        for(int j=0; j<44; j++)
        {
            a[i][j].x=i,a[i][j].y=j;
            if(j==0)
                a[i][j].hh='|';
            else if(j==43)
                a[i][j].hh='|';
            if(i==0)
                a[i][j].hh='-';
            else if(i==21)
                a[i][j].hh='-';
            if(j==0||j==43||i==0||i==21)
            {
                gotoxy(j,i);
                printf("%c",a[i][j].hh);
            }
        }
    a[11][20].hh='@';
    a[11][21].hh='@';
    a[11][22].hh='O';
    sx=11,sy=22;
    ex=11,ey=20;
    a[11][22].x=11;
    a[11][22].y=21;
    a[11][21].x=11;
    a[11][21].y=20;
    gotoxy(20,11);
    printf("@");
    gotoxy(21,11);
    printf("@");
    gotoxy(22,11);
    printf("O");
    getfood();
    gotoxy(50,9);
    printf("    你的分数:");
    gotoxy(50,10);
    printf("当前速度:");
    gotoxy(65,10);
    printf("单位/秒");
    gotoxy(0,23);
}

void start()
{
    show();
    int fx=1;///1右 2上 3左 4下
    while(1)
    {
        Sleep(timef-score*(timef*0.01));
        int key=0;
        if(kbhit())
            while(kbhit())///捕捉输入信息
            {
                gotoxy(0,23);
                key=getche();
            }
        if (key == 72) fx=2;///是上箭头;
        else if (key== 80)  fx=4;///是下箭头;
        else if (key== 75)  fx=3;///是左箭头
        else if (key== 77)  fx=1;
        int flag=0;///蛇是否吃到了食物
        if(fx==1)///右
        {
            if(sy+1<43&&a[sx][sy+1].hh!='@')
            {
                if(a[sx][sy+1].hh=='*')
                {
                    getfood();
                    flag=1;
                }
                gotoxy(sy,sx);
                putchar('@');
                gotoxy(sy+1,sx);
                putchar('O');
                gotoxy(0,23);
                a[sx][sy].hh='@',a[sx][sy+1].hh='O',a[sx][sy+1].y=sy,sy++;
            }
            else
            {
                error();
                return;
            }
        }
        else if(fx==2)///上
        {
            if(sx-1>0&&a[sx-1][sy].hh!='@')
            {
                if(a[sx-1][sy].hh=='*')
                {
                    getfood();
                    flag=1;
                }
                gotoxy(sy,sx);
                putchar('@');
                gotoxy(sy,sx-1);
                putchar('O');
                gotoxy(0,23);
                a[sx][sy].hh='@',a[sx-1][sy].hh='O',a[sx-1][sy].x=sx,sx--;
            }
            else
            {
                error();
                return;
            }
        }
        else if(fx==3)///左
        {
            if(sy-1>0&&a[sx][sy-1].hh!='@')
            {
                if(a[sx][sy-1].hh=='*')
                {
                    getfood();
                    flag=1;
                }
                gotoxy(sy,sx);
                putchar('@');
                gotoxy(sy-1,sx);
                putchar('O');
                gotoxy(0,23);
                a[sx][sy].hh='@',a[sx][sy-1].hh='O',a[sx][sy-1].y=sy,sy--;
            }
            else
            {
                error();
                return;
            }
        }
        else if(fx==4)///下
        {
            if(sx+1<21&&a[sx+1][sy].hh!='@')
            {
                if(a[sx+1][sy].hh=='*')
                {
                    getfood();
                    flag=1;
                }
                gotoxy(sy,sx);
                putchar('@');
                gotoxy(sy,sx+1);
                putchar('O');
                gotoxy(0,23);
                a[sx][sy].hh='@',a[sx+1][sy].hh='O',a[sx+1][sy].x=sx,sx++;
            }
            else
            {
                error();
                return;
            }
        }
        if(flag)score++;
        gotoxy(64,9);
        printf("%d",score);
        gotoxy(59,10);
        printf("%.2f",1000.0/(double)(timef-(timef*0.01)*score));
        gotoxy(0,23);
        int tx=sx,ty=sy;
        while(!flag)
        {
            int xx=tx,yy=ty;
            if(a[tx][ty].x==ex&&a[tx][ty].y==ey)
            {
                gotoxy(ey,ex);
                printf(" ");
                gotoxy(0,23);
                a[ex][ey].hh=0;
                a[tx][ty].x=tx,a[tx][ty].y=ty;
                ex=tx,ey=ty;
                break;
            }
            tx=a[xx][yy].x;
            ty=a[xx][yy].y;
        }
    }
}

void init()
{
    score=0;
    char x;
    memset(a,0,sizeof(a));
    printf("------------------------------\n");
    printf("|                            |\n");
    printf("|     这里是贪吃蛇小游戏     |\n");
    printf("|    下面请输入游戏的难度:  |\n");
    printf("|          a:简单            |\n");
    printf("|          b:一般            |\n");
    printf("|          c:困难            |\n");
    printf("|                            |\n");
    printf("------------------------------\n");
    scanf(" %c",&x);
    if(x=='a')
        timef=400;
    else if(x=='b')
        timef=250;
    else
        timef=160;
}

int main()
{
    while(1)
    {
        srand(time(0));
        system("cls");
        init();
        start();
    }
    return 0;
}




#define N 200<br>#include <graphics.h><br>#include <stdlib.h><br>#include <dos.h><br>#define LEFT 0x4b00<br>#define RIGHT 0x4d00<br>#define DOWN 0x5000<br>#define UP 0x4800<br>#define ESC 0x011b<br>int i,key;<br>int score=0;/*得分*/<br>int gamespeed=50000;/*游戏速度自己调整*/<br>struct Food<br>{<br> int x;/*食物的横坐标*/<br> int y;/*食物的纵坐标*/<br> int yes;/*判断是否要出现食物的变量*/<br>}food;/*食物的结构体*/<br>struct Snake<br>{<br> int x[N];<br> int y[N];<br> int node;/*蛇的节数*/<br> int direction;/*蛇移动方向*/<br> int life;/* 蛇的生命,0活着,1死亡*/<br>}snake;<br>void Init(void);/*图形驱动*/<br>void Close(void);/*图形结束*/<br>void DrawK(void);/*开始画面*/<br>void GameOver(void);/*结束游戏*/<br>void GamePlay(void);/*玩游戏具体过程*/<br>void PrScore(void);/*输出成绩*/<br>/*主函数*/<br>void main(void)<br>{<br> Init();/*图形驱动*/<br> DrawK();/*开始画面*/<br> GamePlay();/*玩游戏具体过程*/<br> Close();/*图形结束*/<br>}<br>/*图形驱动*/<br>void Init(void)<br>{<br> int gd=DETECT,gm;<br> initgraph(&gd,&gm,"c:\\tc");<br> cleardevice();<br>}<br>/*开始画面,左上角坐标为(50,40),右下角坐标为(610,460)的围墙*/<br>void DrawK(void)<br>{<br>/*setbkcolor(LIGHTGREEN);*/<br> setcolor(11);<br> setlinestyle(SOLID_LINE,0,THICK_WIDTH);/*设置线型*/<br> for(i=50;i<=600;i+=10)/*画围墙*/<br> {<br> rectangle(i,40,i+10,49); /*上边*/<br> rectangle(i,451,i+10,460);/*下边*/<br> }<br> for(i=40;i<=450;i+=10)<br> {<br> rectangle(50,i,59,i+10); /*左边*/<br> rectangle(601,i,610,i+10);/*右边*/<br> }<br>}<br>/*玩游戏具体过程*/<br>void GamePlay(void)<br>{<br> randomize();/*随机数发生器*/<br> food.yes=1;/*1表示需要出现新食物,0表示已经存在食物*/<br> snake.life=0;/*活着*/<br> snake.direction=1;/*方向往右*/<br> snake.x[0]=100;snake.y[0]=100;/*蛇头*/<br> snake.x[1]=110;snake.y[1]=100;<br> snake.node=2;/*节数*/<br> PrScore();/*输出得分*/<br> while(1)/*可以重复玩游戏,压ESC键结束*/<br> {<br> while(!kbhit())/*在没有按键的情况下,蛇自己移动身体*/<br> {<br> if(food.yes==1)/*需要出现新食物*/<br> {<br> food.x=rand()%400+60;<br> food.y=rand()%350+60;<br> while(food.x%10!=0)/*食物随机出现后必须让食物能够在整格内,这样才可以让蛇吃到*/<br> food.x++;<br> while(food.y%10!=0)<br> food.y++;<br> food.yes=0;/*画面上有食物了*/<br> }<br> if(food.yes==0)/*画面上有食物了就要显示*/<br> {<br> setcolor(GREEN);<br> rectangle(food.x,food.y,food.x+10,food.y-10);<br> }<br> for(i=snake.node-1;i>0;i--)/*蛇的每个环节往前移动,也就是贪吃蛇的关键算法*/<br> {<br> snake.x[i]=snake.x[i-1];<br> snake.y[i]=snake.y[i-1];<br> }<br> /*1,2,3,4表示右,左,上,下四个方向,通过这个判断来移动蛇头*/<br> switch(snake.direction)<br> {<br> case 1:snake.x[0]+=10;break;<br> case 2: snake.x[0]-=10;break;<br> case 3: snake.y[0]-=10;break;<br> case 4: snake.y[0]+=10;break;<br> }<br> for(i=3;i<snake.node;i++)/*从蛇的第四节开始判断是否撞到自己了,因为蛇头为两节,第三节不可能拐过来*/<br> {<br> if(snake.x[i]==snake.x[0]&&snake.y[i]==snake.y[0])<br> {<br> GameOver();/*显示失败*/<br> snake.life=1;<br> break;<br> }<br> }<br> if(snake.x[0]<55||snake.x[0]>595||snake.y[0]<55||<br> snake.y[0]>455)/*蛇是否撞到墙壁*/<br> {<br> GameOver();/*本次游戏结束*/<br> snake.life=1; /*蛇死*/<br> }<br> if(snake.life==1)/*以上两种判断以后,如果蛇死就跳出内循环,重新开始*/<br> break;<br> if(snake.x[0]==food.x&&snake.y[0]==food.y)/*吃到食物以后*/<br> {<br> setcolor(0);/*把画面上的食物东西去掉*/<br> rectangle(food.x,food.y,food.x+10,food.y-10);<br> snake.x[snake.node]=-20;snake.y[snake.node]=-20;<br> /*新的一节先放在看不见的位置,下次循环就取前一节的位置*/<br> snake.node++;/*蛇的身体长一节*/<br> food.yes=1;/*画面上需要出现新的食物*/<br> score+=10;<br> PrScore();/*输出新得分*/<br> }<br> setcolor(4);/*画出蛇*/<br> for(i=0;i<snake.node;i++)<br> rectangle(snake.x[i],snake.y[i],snake.x[i]+10,<br> snake.y[i]-10);<br> delay(gamespeed);<br> setcolor(0);/*用黑色去除蛇的的最后一节*/<br> rectangle(snake.x[snake.node-1],snake.y[snake.node-1],<br> snake.x[snake.node-1]+10,snake.y[snake.node-1]-10);<br> } /*endwhile(!kbhit)*/<br> if(snake.life==1)/*如果蛇死就跳出循环*/<br> break;<br> key=bioskey(0);/*接收按键*/<br> if(key==ESC)/*按ESC键退出*/<br> break;<br> else<br> if(key==UP&&snake.direction!=4)<br>/*判断是否往相反的方向移动*/<br> snake.direction=3;<br> else<br> if(key==RIGHT&&snake.direction!=2)<br> snake.direction=1;<br> else<br> if(key==LEFT&&snake.direction!=1)<br> snake.direction=2;<br> else<br> if(key==DOWN&&snake.direction!=3)<br> snake.direction=4;<br> }/*endwhile(1)*/<br>}<br>/*游戏结束*/<br>void GameOver(void)<br>{<br> cleardevice(); <br> PrScore();<br> setcolor(RED);<br> settextstyle(0,0,4);<br> outtextxy(200,200,"GAME OVER");<br> getch();<br>}<br>/*输出成绩*/<br>void PrScore(void)<br>{ <br> char str[10];<br> setfillstyle(SOLID_FILL,YELLOW);<br> bar(50,15,220,35);<br> setcolor(6);<br> settextstyle(0,0,2);<br> sprintf(str,"score:%d",score);<br> outtextxy(55,20,str);<br>}<br>/*图形结束*/<br>void Close(void)<br>{ <br> getch();<br> closegraph();<br>}<br>
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值