c語言“貪喫蛇”

忽然心血來潮,自己寫了一個貪喫蛇的程序,後面有彩蛋偶!

按照習慣,我先使用宏定義定義了一些內容

#define UP 72                      // 向上方向鍵   72
#define DOWN 80                    // 向下方向鍵     80
#define RIGHT 77                   // 向右方向鍵  77
#define LEFT 75                    // 向左方向鍵     75 
#define Enter 13                   //回車鍵          13
#define null 32                    //空格鍵

按照常規,我先定義一下我的蛇,還有食物,這了需要控制檯輸出句柄,定義座標值

struct Point {                        //定義座標
    int x, y;
};

struct Food{                         //食物的結構體定義
    struct Point position;           //食物的位置
    int addFood;       //判斷是否要出現食物的變量
    int direction;   //食物的方向
}food;

struct Snake {
    struct Point nodes[MAX_LENGTH];  //蛇身數組,保存每節蛇身的座標
    int length;                      //當前蛇長
    int direction;                   //蛇頭運動方向
} snake;

接着我寫出我的菜單函數,因爲是控制檯程序,爲了不讓他顯得太low,就僞造一個界面,結果是這樣的這裏寫圖片描述
是根據光標的移動來選擇操作,根據菜單函數的返回值,來決定下一步操作。

switch (menu()) //遊戲選項
        {
        case 0:
            gamePlay();
            break;
        case 1:
            Setspeed();
            break;
        case 2:
            gamerand();
            break;
        case 3:
            close();
            break;
        }

其中有一個gamerand();函數,這是其中的彩蛋!我之後會提到。
接着我就要框出我的遊戲範圍,這個用whlie循環就好,我就不多說了,還有就是畫蛇,之前蛇的定義爲數組形式,這裏用循環也可以畫出來,我認爲最主要的環節就是讓蛇動起來,我採用的方式是畫出新的蛇頭,擦出舊的蛇尾,

void moveSnake(){
    lastx = snake.nodes[snake.length - 1].x;
    lasty = snake.nodes[snake.length - 1].y;
    gotoxy(lastx, lasty);
    printf("%2s","");

    for (int k = snake.length - 1; k > 0; k--)
    {
        snake.nodes[k ].x = snake.nodes[k-1].x;
        snake.nodes[k ].y = snake.nodes[k-1].y;
    }
    switch (snake.direction)
    {
    case UP:snake.nodes[0].y -= 1; break;
    case DOWN:snake.nodes[0].y += 1; break;
    case LEFT:snake.nodes[0].x -= 1; break;
    case RIGHT:snake.nodes[0].x += 1; break;
    }
    SetConsoleTextAttribute(hout, FOREGROUND_RED | FOREGROUND_INTENSITY);
    gotoxy(snake.nodes[0].x, snake.nodes[0].y);
    printf("■");
    SetConsoleTextAttribute(hout, FOREGROUND_RED | FOREGROUND_GREEN | FOREGROUND_INTENSITY);
    gotoxy(snake.nodes[1].x, snake.nodes[1].y);
    printf("■");

}

畫出遊戲區域和範圍之後我就要畫出我的食物了,在創造食物的過程中我使用了rand函數,來隨機出一個食物的位置,判斷食物是否在邊界,或者蛇身上,然後畫出食物的位置。

void createFood(){
    int i;
label:
    food.position.x = left + 10 * ((int)rand() % 11);
    food.position.y = top + 10 * ((int)rand() % 11);    
    for (i = 0; i <snake.length ; i++)
    {
        if (snake.nodes[i].x == food.position.x&&snake.nodes[i].y == food.position.y||food.position.x<=left+4||food.position.x>=right-4||food.position.y<=top+4||food.position.y>=bottom-4)
        {
            goto label;
        }
    }
}

其中我的蛇的速度是用Sleep函數實現的,還有一個功能是設置速度,我使用的是全局變量,速度設置界面

int Setspeed(){
    system("cls");
    system("color 3c");
    gotoxy(15, 9);
    printf("┏━━━━━━━┓");
    gotoxy(15, 10);
    printf("┃%2s%s%2s┃", "", "請輸入速度", "");
    gotoxy(15,11);
    printf("┃%2s%8s%4s┃", "", "(1-10)", "");
    gotoxy(15, 12);
    printf("┃%2s%10s%2s┃", "", "", "");
    gotoxy(15,13);
    printf("┗━━━━━━━┛");

    gotoxy(19, 12);
    scanf_s("%d", &SET_SPEED);
    return 0;   
}

其他的我認爲就沒有什麼難點了,下來我們接着說之前的那個gamerand函數,只是我定義的一個可以根據你喫的食物的增多,來增大遊戲難度,主要是提高蛇的移動速度,在遊戲區域內增加新的牆,來增大遊戲難度,新牆的生成我也使用到了rand函數,來隨機牆的X,Y。其中也要判斷新的牆是否在遊戲範圍內,還要不在蛇身上,食物上以及不在已經生成的牆上,這了就要用到多次判斷,如果重疊就重新生成。


void RAND(){
    for (; dw < DRAWWALL.much; dw++){
    L1: DRAWWALL.wall[dw].x = (left +( 4 * rand() % 10)*4);
        DRAWWALL.wall[dw].y = (top + (3 * rand() % 10)*5);
        for (int i = 0; i < snake.length; i++)
        {
            if (DRAWWALL.wall[dw].x == snake.nodes[i].x && DRAWWALL.wall[dw].y == snake.nodes[i].y)  goto L1;
        }
        if (DRAWWALL.wall[dw].x <= left || DRAWWALL.wall[dw].x >= right || DRAWWALL.wall[dw].y <= top || DRAWWALL.wall[dw].y >= bottom) goto L1;
        for (int j = 0; j < dw; j++){
            if (DRAWWALL.wall[j].x == DRAWWALL.wall[dw].x&&DRAWWALL.wall[j].y == DRAWWALL.wall[dw].y) goto L1;
        }
    }
}

void ADDwall(){
    SetConsoleTextAttribute(hout, BACKGROUND_RED | BACKGROUND_BLUE);
    gotoxy(27, 1);
    printf("%-4d", level);
    DRAWWALL.much += 5;
    SetConsoleTextAttribute(hout, FOREGROUND_RED);
    RAND();
    for (dw-=5; dw< level * 5; dw++)
    {
    gotoxy(DRAWWALL.wall[dw].x, DRAWWALL.wall[dw].y);
    printf("■");
    }

    level++;
}

最後,我想在貪喫蛇中加點好玩的,讓食物也動起來,我寫了食物的移動函數

void fooddir(){
    int i;
    i = ((rand() * 11) % 4);
    switch (i)
    {
    case 0: food.direction = UP; break;
    case 1:food.direction = DOWN; break;
    case 2:food.direction = LEFT; break;
    case 3:food.direction = right; break;
    default:
        break;
    }
}
void movefood(){
    lastfx = food.position.x;
    lastfy = food.position.y;
label:  if (food.position.x<=left+2||food.position.x>=right-2||food.position.y<=top+2||food.position.y>=bottom-2)
{
    fooddir(); 
    goto label;
}

    for (int i = 0; i < snake.length;i++){
        if (food.position.x == snake.nodes[i].x&&food.position.y == snake.nodes[i].y)
        {
            fooddir(); 
            goto label;
        }
    }
    switch (food.direction)
    {
    case UP:food.position.y -= 1; break;
    case DOWN:food.position.y += 1; break;
    case LEFT:food.position.x -= 1; break;
    case RIGHT:food.position.x += 1; break;
    }

}

這樣我的貪喫蛇就和以前的不一樣了。
最後吧源碼貢獻給大家,這是不帶食物移動的,如果需要可以自行將以上內容添加進去

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

#include"resource.h"


/*-----------------------------------------------------------------------------宏定義*/
#define TRUE 1
#define FALSE 0
#define ESC 27
#define UP 72                      // 向上方向鍵   72
#define DOWN 80                    // 向下方向鍵     80
#define RIGHT 77                   // 向右方向鍵  77
#define LEFT 75                    // 向左方向鍵     75 
#define Enter 13                   //回車鍵          13
#define null 32
#define MAX_LENGTH 100           //蛇身最大長度
#define top 2
#define left 2
#define bottom 32
#define right 35
#define GAME_SPEED 15
#define MAX_ADD    200

/*----------------------------------------------------------------------------全局變量*/
HANDLE hout;

int SET_SPEED = 1;
int Score = 0;


int level = 1;

int keyCode;
int lastx, lasty;
int lastfx, lastfy;
int dw=0;

/*-------------------------------------------------------------------------結構體聲明*/
struct Point {                        //定義座標
    int x, y;
};

struct Snake {
    struct Point nodes[MAX_LENGTH];  //蛇身數組,保存每節蛇身的座標
    int length;                      //當前蛇長
    int direction;                   //蛇頭運動方向
} snake;

struct Wall{                       
    struct Point wall[MAX_ADD];          
    int much;
}DRAWWALL;


/*---------------------------------------------------------------------------函數聲明*/
int gamePlay(void);                    //遊戲主循環
void init(void);                        //初始化
int menu(void);                         //主菜單
int Setspeed(void);                     //設置速度
void createFood(void);                  //創造一個食物

void drawWall(void);                    //畫牆
void drawFood(void);                    //畫出食物
void drawSnake(void);                   //畫出蛇
void drawScore(void);                   //畫出分數
int touchWall(void);                    //判斷是否碰到牆
int touchSelf(void);                    //判斷是否碰到自己
void button(void);                      //鍵盤輸入      
void moveSnake(void);                   //移動蛇
int oppositeDirection(int keyCode);     //判斷是否方向有誤
int foodEat(void);                      //判斷是否喫到食物
void expandSnake(void);                 //把蛇增長一節
int gameOver(void);                    //遊戲結束
void close(void);                       //關閉遊戲
void gotoxy(int, int);

void gamerand();                        //挑戰模式
void scorerand();
void RAND();                            //隨機函數
void ADDwall();                         //增加牆
int touchAdd();
int randover();

/*-----------------------------------------------------------------------------主函數*/
int main(){



    hout = GetStdHandle(STD_OUTPUT_HANDLE);            // 獲取控制檯輸出句柄
    SetConsoleTitleA("貪喫蛇————LSX");

    CONSOLE_CURSOR_INFO cursorInfo = { 1, FALSE };     //設置
    SetConsoleCursorInfo(hout, &cursorInfo);  // 設置光標隱藏

    while (1)
    {
        init();

        //system("color 50");
        switch (menu()) //遊戲選項
        {
        case 0:
            gamePlay();
            break;
        case 1:
            Setspeed();
            break;
        case 2:
            gamerand();
            break;
        case 3:
            close();
            break;
        }
    }

}

/*-----------------------------------------------------------------------------主菜單*/
int menu(){
    int ch, index = 0;
    static const char *modeItem[] = { "→開始遊戲", "→設置速度", "→挑戰模式", "→退出" };

    system("cls");
    drawWall();
    SetConsoleTextAttribute(hout, FOREGROUND_GREEN);
    gotoxy(15, 4);
    printf("┏━━━━━━━┓");
    gotoxy(15, 5);
    printf("┃%2s%s%2s┃", "", "■貪喫蛇■", "");
    gotoxy(15, 6);
    printf("┃%2s%10s%2s┃", "", "", "");
    gotoxy(15, 7);
    printf("┃%2s%s%2s┃", "", "★劉少雄★", "");
    gotoxy(15, 8);
    printf("┗━━━━━━━┛");

    SetConsoleTextAttribute(hout, 0xF0);
    gotoxy(16, 14);
    printf("%2s%s%2s", "", modeItem[0], "");
    SetConsoleTextAttribute(hout, 0x0F);
    gotoxy(16, 16);
    printf("%2s%s%2s", "", modeItem[1], "");
    SetConsoleTextAttribute(hout, 0x0F);
    gotoxy(16, 18);
    printf("%2s%s%2s", "", modeItem[2], "");
    SetConsoleTextAttribute(hout, 0x0F);
    gotoxy(16, 20);
    printf("%2s%s%2s", "", modeItem[3], "");
    do
    {
        ch = _getch();
        switch (ch)
        {
        case 's': case 'S': case '2': case 80:  //if (index == 0)
            {
                index = 1;
                SetConsoleTextAttribute(hout, 0x0F);
                gotoxy(16, 14);
                printf("%2s%s%2s", "", modeItem[0], "");
                SetConsoleTextAttribute(hout, 0xF0);
                gotoxy(16, 16);
                printf("%2s%s%2s", "", modeItem[1], "");
            }
            else if (index == 1)
            {
                index = 2;
                SetConsoleTextAttribute(hout, 0x0F);
                gotoxy(16, 16);
                printf("%2s%s%2s", "", modeItem[1], "");
                SetConsoleTextAttribute(hout, 0xF0);
                gotoxy(16, 18);
                printf("%2s%s%2s", "", modeItem[2], "");
            }
            else if (index == 2)
            {
                index = 3;
                SetConsoleTextAttribute(hout, 0xF0);
                gotoxy(16, 20);
                printf("%2s%s%2s", "", modeItem[3], "");
                SetConsoleTextAttribute(hout, 0x0F);
                gotoxy(16, 18);
                printf("%2s%s%2s", "", modeItem[2], "");
            }
            else if (index == 3)
            {
                index = 0;
                SetConsoleTextAttribute(hout, 0xF0);
                gotoxy(16, 14);
                printf("%2s%s%2s", "", modeItem[0], "");
                SetConsoleTextAttribute(hout, 0x0F);
                gotoxy(16, 20);
                printf("%2s%s%2s", "", modeItem[3], "");
            }
            break;

        case 'w': case 'W': case '8': case 72:  //if (index == 0)
            {
                index = 3;
                SetConsoleTextAttribute(hout, 0x0F);
                gotoxy(16, 14);
                printf("%2s%s%2s", "", modeItem[0], "");
                SetConsoleTextAttribute(hout, 0xF0);
                gotoxy(16, 20);
                printf("%2s%s%2s", "", modeItem[3], "");
            }
            else if (index == 1)
            {
                index = 0;
                SetConsoleTextAttribute(hout, 0xF0);
                gotoxy(16, 14);
                printf("%2s%s%2s", "", modeItem[0], "");
                SetConsoleTextAttribute(hout, 0x0F);
                gotoxy(16, 16);
                printf("%2s%s%2s", "", modeItem[1], "");
            }
            else if (index == 2)
            {
                index = 1;
                SetConsoleTextAttribute(hout, 0xF0);
                gotoxy(16, 16);
                printf("%2s%s%2s", "", modeItem[1], "");
                SetConsoleTextAttribute(hout, 0x0F);
                gotoxy(16, 18);
                printf("%2s%s%2s", "", modeItem[2], "");
            }
            else if (index == 3)
            {
                index = 2;
                SetConsoleTextAttribute(hout, 0xF0);
                gotoxy(16, 18);
                printf("%2s%s%2s", "", modeItem[2], "");
                SetConsoleTextAttribute(hout, 0x0F);
                gotoxy(16, 20);
                printf("%2s%s%2s", "", modeItem[3], "");
            }
            break;

        case ' ': case 13:
            return index;
            break;
        }
    }
    while (1);
}

/*-----------------------------------------------------------------------------初始化*/
void init(){

    snake.nodes[0].x = 16;
    snake.nodes[0].y = 16;
    snake.nodes[1].x = 16;
    snake.nodes[1].y = 17;      

    snake.direction = UP;
    snake.length = 2;

    Score = 0;
    food.addFood = 0;

}


/*------------------------------------------------------------------------------畫牆*/
void drawWall(){
    int i;  
    for ( i = 3; i < right; i++)
    {
        SetConsoleTextAttribute(hout, FOREGROUND_RED);
        gotoxy(i, 2);
        printf("━━");
        gotoxy(i, 32);
        printf("━━");
    }
    gotoxy(2, 2);
    printf("┏");
    gotoxy(2, 32);
    printf("┗");
    gotoxy(35, 2);
    printf("┓");
    gotoxy(35, 32);
    printf("┛");
    for ( i = 3; i <bottom; i++)
    {
        SetConsoleTextAttribute(hout, FOREGROUND_RED);
        gotoxy(2, i);
        printf("┃");
        gotoxy(35, i);
        printf("┃");
    }

}


/*--------------------------------------------------------------------------設置速度*/
int Setspeed(){
    system("cls");
    system("color 3c");
    gotoxy(15, 9);
    printf("┏━━━━━━━┓");
    gotoxy(15, 10);
    printf("┃%2s%s%2s┃", "", "請輸入速度", "");
    gotoxy(15,11);
    printf("┃%2s%8s%4s┃", "", "(1-10)", "");
    gotoxy(15, 12);
    printf("┃%2s%10s%2s┃", "", "", "");
    gotoxy(15,13);
    printf("┗━━━━━━━┛");

    gotoxy(19, 12);
    scanf_s("%d", &SET_SPEED);
    return 0;   
}

/*--------------------------------------------------------------------------位置定義*/
void gotoxy(int x, int y)
{
    static COORD cd;

    cd.X = (int)(x << 1);
    cd.Y = y;
    SetConsoleCursorPosition(hout, cd);
}

/*------------------------------------------------------------------------遊戲主循環*/
int gamePlay(){
    int ch;
    system("cls");
    //system("color 50");
    drawScore();    //輸出分數
    drawWall();    //畫牆     
    drawSnake();
    createFood();
    food.addFood = 1;
    drawFood();
    fooddir();
    do
    {
        if (touchWall() || touchSelf()){
            gameOver();
            return 0;
        }
        if (!food.addFood)
        {
            createFood();
            food.addFood = 1;
            drawFood();
        }
        for (int d = (22 - SET_SPEED*2); d >= 0; d--)
        {
            Sleep(GAME_SPEED);
        }
        if (_kbhit())
        {
            button();
            if (keyCode = ESC)
            {
                gameOver;
            }
            if (keyCode == null){
                _getch();
            }
        }
        moveSnake();
        if (foodEat()){
            food.addFood = FALSE;
            Score += 1;
            drawScore();
            expandSnake();
        }
    } while (1);

}


/*----------------------------------------------------------------------創造一個食物*/
void createFood(){
    int i;
label:
    food.position.x = left + 10 * ((int)rand() % 11);
    food.position.y = top + 10 * ((int)rand() % 11);      //創造食物,利用rand隨機函數
    for (i = 0; i <snake.length ; i++)
    {
        if (snake.nodes[i].x == food.position.x&&snake.nodes[i].y == food.position.y||food.position.x<=left+4||food.position.x>=right-4||food.position.y<=top+4||food.position.y>=bottom-4)//判斷食物是否存在
        {
            goto label;
        }
    }
}

/*-------------------------------------------------------------------------畫出食物*/
void drawFood(){
    SetConsoleTextAttribute(hout, FOREGROUND_GREEN);
    gotoxy(food.position.x, food.position.y);
    printf("■");
    gotoxy(lastfx, lastfy);
    printf("  ");
}

/*--------------------------------------------------------------------------畫出蛇*/
void drawSnake(){
    SetConsoleTextAttribute(hout, FOREGROUND_RED | FOREGROUND_INTENSITY);
    gotoxy(snake.nodes[0].x, snake.nodes[0].y);
    printf("■");
    SetConsoleTextAttribute(hout, FOREGROUND_RED | FOREGROUND_GREEN | FOREGROUND_INTENSITY);
    gotoxy(snake.nodes[snake.length - 1].x, snake.nodes[snake.length - 1].y);
    printf("■");
}

/*------------------------------------------------------------------------畫出分數*/
void drawScore(){
    SetConsoleTextAttribute(hout, BACKGROUND_RED | BACKGROUND_BLUE);
    gotoxy(15, 1);
    printf("%6s%-4d","Score:",Score);

}
/*------------------------------------------------------------------------分數等級*/
void scorerand(){
    SetConsoleTextAttribute(hout, BACKGROUND_RED | BACKGROUND_BLUE);
    gotoxy(15, 1);
    printf("%6s%4d\t%6s%4d", "Score:", Score, "Level:", level);

}

/*------------------------------------------------------------------判斷是否碰到牆*/
int touchWall(){
    int x1 = snake.nodes[0].x;
    int y1 = snake.nodes[0].y;
    if (x1<left+2 || x1>right-2 || y1<top+2 || y1>bottom-2)
    {
        return TRUE;
    }
    else
    {
        return FALSE;
    }
}


/*----------------------------------------------------------------判斷是否碰到自己*/
int touchSelf(){
    for (int i = 1; i < snake.length; i++)
    {
        if (snake.nodes[0].x == snake.nodes[i].x&&snake.nodes[0].y == snake.nodes[i].y)
        {
            return TRUE;
        }
    }
    return FALSE;
}

/*------------------------------------------------------------------------鍵盤輸入*/
void button(){
    keyCode = (_getch()); //將按鍵從控制檯中取出並保存到key中  
    if (keyCode == UP || keyCode == DOWN || keyCode == LEFT || keyCode == RIGHT ){

            lastx = snake.nodes[snake.length - 1].x;
            lasty = snake.nodes[snake.length - 1].y;
            if (oppositeDirection(keyCode))
            {
                snake.direction = keyCode;
            }

    }
}   

/*-------------------------------------------------------------------------移動蛇*/
void moveSnake(){
    lastx = snake.nodes[snake.length - 1].x;
    lasty = snake.nodes[snake.length - 1].y;
    gotoxy(lastx, lasty);
    printf("%2s","");

    for (int k = snake.length - 1; k > 0; k--)
    {
        snake.nodes[k ].x = snake.nodes[k-1].x;
        snake.nodes[k ].y = snake.nodes[k-1].y;
    }
    switch (snake.direction)
    {
    case UP:snake.nodes[0].y -= 1; break;
    case DOWN:snake.nodes[0].y += 1; break;
    case LEFT:snake.nodes[0].x -= 1; break;
    case RIGHT:snake.nodes[0].x += 1; break;
    }
    SetConsoleTextAttribute(hout, FOREGROUND_RED | FOREGROUND_INTENSITY);
    gotoxy(snake.nodes[0].x, snake.nodes[0].y);
    printf("■");
    SetConsoleTextAttribute(hout, FOREGROUND_RED | FOREGROUND_GREEN | FOREGROUND_INTENSITY);
    gotoxy(snake.nodes[1].x, snake.nodes[1].y);
    printf("■");

}   //移動蛇身

/*---------------------------------------------------------------判斷是否方向有誤*/
int oppositeDirection(int keyCode) {
    if (keyCode == DOWN && snake.direction == DOWN){
        return 0;
    }
    else if (keyCode == UP && snake.direction == UP) {
        return 0;
    }
    else if (keyCode == RIGHT && snake.direction == RIGHT){
        return 0;
    }
    else if (keyCode == LEFT && snake.direction == LEFT){
        return 0;
    }
    if (keyCode == DOWN && snake.direction == UP){
        return 0;
    }
    else if (keyCode == UP && snake.direction == DOWN) {
        return 0;
    }
    else if (keyCode == RIGHT && snake.direction == LEFT){
        return 0;
    }
    else if (keyCode == LEFT && snake.direction == RIGHT){
        return 0;
    }
    else
        return 1;
}   

/*---------------------------------------------------------------判斷是否喫到食物*/
int foodEat(){
    if (snake.nodes[0].x == food.position.x&&snake.nodes[0].y == food.position.y)
    {
        return TRUE;
    }
    return FALSE;
}  //判斷食物是否被喫

/*------------------------------------------------------------------把蛇增長一節*/
void expandSnake() {

    if (keyCode == UP && snake.direction != DOWN){
        snake.direction = UP;
        lastx -= 1;
    }
    else if (keyCode == DOWN && snake.direction != UP){
        snake.direction = DOWN;
        lastx += 1;
    }
    else if (keyCode == LEFT && snake.direction != RIGHT){
        snake.direction = LEFT;
        lasty -= 1;
    }
    else if (keyCode == RIGHT && snake.direction != LEFT){
        snake.direction = RIGHT;
        lasty += 1;
    }

    snake.nodes[snake.length].x = lastx;
    snake.nodes[snake.length].y = lasty;
    snake.length++;

}  

/*---------------------------------------------------------------------遊戲結束*/
int gameOver(){
    SetConsoleTextAttribute(hout, FOREGROUND_RED | FOREGROUND_INTENSITY);
    gotoxy(15, 13);
    printf("┏━━━━━━━━┓");
    gotoxy(15,14);
    printf("┃%3s%s%4s┃", "", "GAME OVER", "");
    gotoxy(15, 15);
    printf("┃%1s%s%1s┃", "", "Your Score is:", "");
    gotoxy(15, 16);
    printf("┃%6s%4d%6s┃", "", Score, "");
    gotoxy(15, 17);
    printf("┗━━━━━━━━┛");

    if ((_getch(keyCode))== ESC)
    {
        close();
    }
    else
    {
        return 0;
    }

}

/*---------------------------------------------------------------------遊戲結束*/
int randover(){
    SetConsoleTextAttribute(hout, FOREGROUND_RED | FOREGROUND_INTENSITY);
    gotoxy(15, 13);
    printf("┏━━━━━━━━┓");
    gotoxy(15, 14);
    printf("┃%3s%s%4s┃", "", "GAME OVER", "");
    gotoxy(15, 15);
    printf("┃%1s%s%1s┃", "", "Your Score is:", "");
    gotoxy(15, 16);
    printf("┃%6s%4d%6s┃", "", Score, "");
    gotoxy(15, 17);
    printf("┃%1s%s%1s┃", "", "Your Level is:", "");
    gotoxy(15, 18);
    printf("┃%6s%4d%6s┃", "", level, "");
    gotoxy(15, 19);
    printf("┗━━━━━━━━┛");

    if ((_getch(keyCode)) == ESC)
    {
        close();
    }
    else
    {
        return 0;
    }

}

/*---------------------------------------------------------------------關閉遊戲*/
void close(){
    exit(1);
}
/*-------------------------------------------------------------------------挑戰模式*/
void gamerand(){

    DRAWWALL.much = 0;

    int ch;
    system("cls");
    system("color 0c");
    SET_SPEED = 1;
    scorerand();    //輸出分數
    drawWall();    //畫牆     
    drawSnake();
    createFood();
    food.addFood = 1;
    drawFood();
    fooddir();
    do
    {
        if (touchWall() || touchSelf()||touchAdd()){
            randover();
            return 0;
        }
        if (!food.addFood)
        {
            createFood();
            food.addFood = 1;
            drawFood();
        }
        for (int d = (22 - SET_SPEED * 2); d >= 0; d--)
        {
            Sleep(GAME_SPEED);
        }


        if (_kbhit())
        {
            button();
            if (keyCode == ESC){
                randover();
            }
            if (keyCode == null){
                _getch();
            }   
        }
        moveSnake();
        if (foodEat()){
            food.addFood = FALSE;
            Score += 1;
            drawScore();
            expandSnake();
            if ((Score%5) == 0)
            {
                SET_SPEED++;
                ADDwall();
            }

        }
    } while (1);

}

/*--------------------------------------------------------------------------隨機函數*/
void RAND(){

    for (; dw < DRAWWALL.much; dw++){
    L1: DRAWWALL.wall[dw].x = (left +( 4 * rand() % 10)*4);
        DRAWWALL.wall[dw].y = (top + (3 * rand() % 10)*5);
        for (int i = 0; i < snake.length; i++)
        {
            if (DRAWWALL.wall[dw].x == snake.nodes[i].x && DRAWWALL.wall[dw].y == snake.nodes[i].y)  goto L1;
        }
        if (DRAWWALL.wall[dw].x <= left || DRAWWALL.wall[dw].x >= right || DRAWWALL.wall[dw].y <= top || DRAWWALL.wall[dw].y >= bottom) goto L1;
        for (int j = 0; j < dw; j++){
            if (DRAWWALL.wall[j].x == DRAWWALL.wall[dw].x&&DRAWWALL.wall[j].y == DRAWWALL.wall[dw].y) goto L1;
        }
    }

}

/*--------------------------------------------------------------------------增加牆*/
void ADDwall(){

    SetConsoleTextAttribute(hout, BACKGROUND_RED | BACKGROUND_BLUE);
    gotoxy(27, 1);
    printf("%-4d", level);
    DRAWWALL.much += 5;
    SetConsoleTextAttribute(hout, FOREGROUND_RED);
    RAND();
    for (dw-=5; dw< level * 5; dw++)
    {
        gotoxy(DRAWWALL.wall[dw].x, DRAWWALL.wall[dw].y);
        printf("■");
    }

    level++;
}

/*----------------------------------------------------------------判斷是否碰到新牆*/
int touchAdd(){
    int x1 = snake.nodes[0].x;
    int y1 = snake.nodes[0].y;
    for (int i = 0; i <DRAWWALL.much; i++)
    {
        if (x1 == DRAWWALL.wall[i].x && y1==DRAWWALL.wall[i].y)
        {
            return TRUE;
        }
    }
    return FALSE;
}



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章