找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
uid:111517 日志

一個(gè)PC上的貪吃蛇程序,為以后12864做準(zhǔn)備

已有 1480 次閱讀2016-8-22 23:50

//-----C-FREE上測試通過-----//
//-----可能有BUG,歡迎指出------//
#include<stdio.h>
#include<windows.h>
#include<conio.h>
#include<time.h>
#include<stdlib.h>

struct COOR
{
    int x;
    int y;
};
 

struct SNAKE
{
    int length;
    struct COOR body[500];
    char dir;
};
struct SNAKE snake = {3, {6, 0}, 77};
struct FOOD
{
    int x;
    int y;
};
typedef enum {false = 0, true = !false} bool;

#define B_DU  58
#define B_LR  26

struct FOOD food;
char KEY=77;  //鍵盤按鍵
bool flag_isgameover=false;
bool flag_iseat=false;
int foodcount=0;
int score=0;
int delaytime=700;
int gamelevel=1;


/*************設(shè)置光標(biāo)位置*****************/
void gopos(int x,int y)
{
    COORD pos;       //COORD系統(tǒng)已定義的一個(gè)關(guān)于光標(biāo)的結(jié)構(gòu)體
    HANDLE han;     //新建一個(gè)句柄
    pos.X=x;         //為結(jié)構(gòu)體賦初值
    pos.Y=y;
    han=GetStdHandle(STD_OUTPUT_HANDLE);   //將獲得的輸入輸出狀態(tài)的函數(shù) 句柄賦給已經(jīng)新建的那個(gè)
    SetConsoleCursorPosition(han,pos);     //windows api 設(shè)置光標(biāo)位置函數(shù)
}

void creatmap()
{
    int x,y;
    for(x=0;x<=B_DU;x+=2)
    {
        gopos(x,0);
        printf("■");
        gopos(x,26);
        printf("■");
    }
    
    for(y=0;y<=B_LR;y++)
    {
        gopos(0,y);
        printf("■");
        gopos(58,y);
        printf("■");
    }
}

void initconlose()
{
    HANDLE han;               //新建一個(gè)句柄
    srand((long)time(NULL));  //使用time函數(shù)做隨機(jī)數(shù)種子 【time:函數(shù)返回當(dāng)前時(shí)
                              //間,如果發(fā)生錯(cuò)誤返回零。如果給定參數(shù)time ,那么
                              //當(dāng)前時(shí)間存儲到參數(shù)time中。 】
     system ("mode con: cols=60 lines=29");//顯示模式  
    system ("title 貪吃蛇");
    han=GetStdHandle(STD_OUTPUT_HANDLE);   //將獲得的輸入輸出狀態(tài)的函數(shù) 句柄賦給已經(jīng)新建的那個(gè)  
    SetConsoleTextAttribute(han, 0xe);  //設(shè)置控制臺顯示顏色
}


void initsnake()            //初始化蛇身
{
    int i;
    for(i=0;i<snake.length;i++)    
    {
        snake.body[i].x=6-i*2;
        snake.body[i].y=1;
        gopos(snake.body[i].x,snake.body[i].y);
        printf("■");
    }
}
void setlevel()
{
    if(foodcount==15)
    {
        foodcount=0;
        gamelevel++;
        delaytime-=50;
    }
    gopos(0,27);
    printf("score=%d",score);
    gopos(10,27);
    printf("等級=%d",gamelevel);
}
void initfood()
{
    int i;
    while (1)
    {
        food.x = (rand() % 28 + 1) * 2;  
        food.y = rand() % 24 +1;
        for(i=0;i<snake.length;i++)
        {
            if(food.x==snake.body[i].x&&food.y==snake.body[i].y)
                break;
        }
        if(i==snake.length)
            break;
    }
    gopos(food.x,food.y);
    printf("■");
    flag_iseat=false;
    setlevel();
}

int jbitself(int x,int y)        //判斷蛇是否咬到自己
{
    int i;
    for(i=1;i<snake.length;i++)
    {
        if(x==snake.body[i].x&&y==snake.body[i].y)
            return 1;            //咬到了自己   
    }
    return 0;
}

int jgameover()
{
    int x=snake.body[0].x;
    int y=snake.body[0].y;
    if(jbitself(x,y)||x==0||x==B_DU||y==0||y==B_LR)
        return 1;           //游戲結(jié)束
    else
        return 0;           //沒有結(jié)束
}

void move(char key)
{
    int i;
    int s_x=snake.body[0].x;
    int s_y=snake.body[0].y;
    
    switch(key)
    {
        case 72:s_y--;break;
        case 75:s_x-=2;break;
        case 77:s_x+=2;break;
        case 80:s_y++;break;
        default:break;
    }
    
    if(jgameover())
    {
        flag_isgameover=true;
    }    
    else
    {
        if(s_y==food.y&&s_x==food.x)
            {
                score=score+gamelevel;
                foodcount++;
                snake.length++;
                flag_iseat=true;    
            }
            else
            {
                gopos(snake.body[snake.length-1].x,snake.body[snake.length-1].y);
                printf("  ");    
            }
        
        gopos(s_x,s_y);
        printf("■");
        for(i=snake.length-1;i>0;i--)
        {
            snake.body[i]=snake.body[i-1];
        }
        snake.body[0].x=s_x;
        snake.body[0].y=s_y;
        KEY=key;    
    }
    
}

int  play()
{
    char key1=0,key2=0;
    while(key1!=27&&flag_isgameover==false)
    {
        Sleep(delaytime);
        if(kbhit())
        {
            key1=getch();
            if(key1<=0)
            {
                key2=getch();
            }
            if (key2 == 72 || key2 == 75 || key2 == 77 || key2 == 80)//說明是方向鍵   
            {  
                if (key2 != KEY && key2 + KEY != 152)//說明是使蛇轉(zhuǎn)向的方向鍵  
                    move(key2);  
                else  
                    move(KEY);  
            }  
            else                                      //暫停
            {
                gopos(10,10);
                printf("游戲暫停中,請按回車鍵繼續(xù)游戲!");
                key1=getchar();    
                gopos(10,10);
                printf("                                ");
            }
                   
        }
        else
            move(KEY);
        if(flag_iseat==true)    
            initfood();
        if(flag_isgameover==true)
        {
            gopos(10,10);
            printf("游戲結(jié)束,請按任意鍵結(jié)束程序!");
            key1=getch();
            break;
        }
    }
    return;
    
}

int main()
{
    initconlose();
    creatmap();
    initsnake();
    initfood();
    play();
    return 0;

}

路過

雞蛋

鮮花

握手

雷人

評論 (0 個(gè)評論)

小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機(jī)教程網(wǎng)

返回頂部