忽然心血來潮,自己寫了一個貪喫蛇的程序,後面有彩蛋偶!
按照習慣,我先使用宏定義定義了一些內容
#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;
}