**僅在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...