C 之貪吃蛇 詳細註解

2021-08-09 02:07:33 字數 3881 閱讀 5357

**僅在vs2017和dev-c++6.0編譯執行. 並未測試在其它編譯器上編譯情況。

第一次寫遊戲,第一次寫部落格,如有不足還請指出,謝謝!

_getch()每次讀入乙個位元組, 上下左右為兩個位元組(第乙個位元組ascii碼為224),空格(32)回車(13)為乙個位元組,因此我們設定兩個變數來儲存,先判斷第乙個位元組是否為224,是就意味著讀入了方向鍵.否就判斷是否讀入的是32 or 13 判斷是確認模式 or 暫停遊戲.

1. double start_time = (double)clock() / clocks_per_sec;//獲取到 1. 的時間

//[執行到 2. 的時間 - 執行到 1. 的時間](單位 s) > [autospeed(單位 ms) / 1000.0]

/************************貪吃蛇***********************/

/* by:yinggcy */

/**********************2017/10/07********************/

#include

#include

#include //包含 隱藏游標

#include //包含 _getch() 和 _kbhit()

#include

#define n 30

#define up 1 //方向鍵對應的的ascii為 72

#define down 2 //的ascii為 80

#define left 3 //的ascii為 75

#define right 4 //的ascii為 77

using

namespace

std;

class map ;

class food ;

food food;

snake head, tail; //蛇頭 蛇尾

deque

direction; //儲存每次前進的方向,最近一次前進新增到最前面

int mod; //遊戲模式 普通模式 == 0, 冒險模式 == 1;

int score;

int grade;

int autospeed; //更新遊戲自動更新速度

char

map[n][n]; //儲存輸出 //如 xx[up] = 80 down的ascii碼為80

int opposite_direction[5] = ;//儲存各方向的反方向的ascii碼(接上面)

int speed[9] = ;//儲存自動前進速度,單位ms

public:

map() : head(), tail(), //建構函式

mod(0), score(0), grade(1), autospeed(speed[grade])

void hello(); //歡迎介面

void print_hello(int); //列印歡迎介面

void start_game();

void initialize_map();

int update_map();

void show_map();

void rand_food();

void reset(); //復位

};void map::hello()

continue;

}

//enter 的ascii碼為 13, 按了回車確定模式

if (mod == 0) while (grade > 8 || grade < 1); //判斷等級輸入是否正確

autospeed = speed[grade]; //更新自動快進速度

break;

}else

//冒險模式

break;

}start_game(); //開始遊戲

}void map::print_hello(int mod)

void map::start_game()

while (update_map());

cout

<< "\t\t game over!!! 你先繼續嗎? (y/others)";

cin >> choose;

if (choose == 'y' || choose == 'y')

}void map::initialize_map()

void map::show_map() //輸出遊戲畫面

}int map::update_map() //更新遊戲(最主要的)

if (sign) break; //讀入了方向鍵,推出迴圈 判斷情況}}

//未讀入方向鍵或空格,判斷是否超過自動前進時間

if ((double)clock() / clocks_per_sec - start_time > autospeed / 1000.0)

} while (true);

map[head.x][head.y] = 'o'; //更新地圖把蛇頭原蛇頭位置置為蛇身

switch (direction.front())

if (head.x == food.x && head.y == food.y)

}rand_food(); //更新食物

}else

if (map[head.x][head.y] != ' ' && !(head.x == tail.x && head.y == tail.y))

return

0; //if(更新的頭位置是否不為地圖中的空白 && 是否不為蛇尾) (接下)

//前面已經判斷沒吃到食物,所以蛇尾會前進,因為只更新了蛇頭沒有更新蛇尾,所以排除蛇尾情況

else

direction.pop_back(); //彈出 前 蛇尾座標

}return

1; //未撞牆或吃到自己

}void map::rand_food()

while (map[food.x][food.y] != ' ');

map[food.x][food.y] = '%';

}void map::reset()

; tail = ;

mod = 0;

score = 0;

grade = 1;

autospeed = 800;

direction.clear();

}int main()

c 實現貪吃蛇(附詳細講解)

更新了不會刷屏的貪吃蛇版本,鏈結為 snake2。修復星星出現在牆上的bug。條件判斷 迴圈函式 陣列多cpp檔案呼叫 不然你也可以直接寫在乙個檔案裡 指標結構體 鍊錶 採用頭插法 1.畫圖 這一步是最簡單的,沒錯,我的習慣就是從最簡單的開始。我們的目標是畫乙個框框,然後這個框框裡有條蛇,還有個星星...

貪吃蛇之按鍵

貪吃蛇遊戲中我們需要通過按鍵來控制貪吃蛇的前進方向,在 中,我用到了kbhit 函式來實現這一功能。kbhit 函式是乙個用於非阻塞的響應鍵盤輸入事件的c語言函式,下面我們就來簡單介紹一下這個函式的功能和用法。直接來乙個 吧 函式名kbhit 函式原型 int kbhit void 標頭檔案coni...

C 貪吃蛇二

小菜學習winform 一 貪吃蛇 說到oo可能一說一大堆,這裡面小菜只是簡單的把貪吃蛇抽象出來,先來說蛇,具有的屬性和行為,屬性比如蛇的長度 蛇的寬度 蛇的行動方向等 行為比如是否吃到食物 是否撞牆等,那我們可以抽象乙個蛇的類,這樣實現 1 using system 2using system.c...