貪吃蛇C語言程式碼
1 #include<stdio.h> 2 #include<time.h> 3 #include<windows.h> 4 #include<stdlib.h> 5 6 #define U 1 7 #define D 2 8 #define L 3 9 #define R 4 //蛇的狀態,U:上 ;D:下;L:左 R:右 10 11 typedef struct SNAKE //蛇身的一個節點 12 { 13 int x; 14 int y; 15 struct SNAKE *next; 16 }snake; 17 18 //全域性變數// 19 int score = 0, add = 10;//總得分與每次吃食物得分。 20 int status, sleeptime = 200;//每次執行的時間間隔 21 snake *head, *food;//蛇頭指標,食物指標 22 snake *q;//遍歷蛇的時候用到的指標 23 int endGamestatus = 0; //遊戲結束的情況,1:撞到牆;2:咬到自己;3:主動退出遊戲。 24 25 //宣告全部函式// 26 void Pos(); 27 void creatMap(); 28 void initSnake(); 29 int biteSelf(); 30 void createFood(); 31 void cantCrossWall(); 32 void snakeMove(); 33 void pause(); 34 void runGame(); 35 void initGame(); 36 void endGame(); 37 void gameStart(); 38 39 void Pos(int x, int y)//設定游標位置 40 { 41 COORD pos; 42 HANDLE hOutput; 43 pos.X = x; 44 pos.Y = y; 45 hOutput = GetStdHandle(STD_OUTPUT_HANDLE);//返回標準的輸入、輸出或錯誤的裝置的控制代碼,也就是獲得輸入、輸出/錯誤的螢幕緩衝區的控制代碼 46 SetConsoleCursorPosition(hOutput, pos); 47 } 48 49 void creatMap()//建立地圖 50 { 51 int i; 52 for (i = 0; i<58; i += 2)//列印上下邊框 53 { 54 Pos(i, 0); 55 printf("■");//一個方塊佔兩個位置 56 Pos(i, 26); 57 printf("■"); 58 } 59 for (i = 1; i<26; i++)//列印左右邊框 60 { 61 Pos(0, i); 62 printf("■"); 63 Pos(56, i); 64 printf("■"); 65 } 66 } 67 68 void initSnake()//初始化蛇身 69 { 70 snake *tail; 71 int i; 72 tail = (snake*)malloc(sizeof(snake));//從蛇尾開始,頭插法,以x,y設定開始的位置// 73 tail->x = 24; 74 tail->y = 5; 75 tail->next = NULL; 76 for (i = 1; i <= 4; i++)//初始長度為4 77 { 78 head = (snake*)malloc(sizeof(snake)); 79 head->next = tail; 80 head->x = 24 + 2 * i; 81 head->y = 5; 82 tail = head; 83 } 84 while (tail != NULL)//從頭到為,輸出蛇身 85 { 86 Pos(tail->x, tail->y); 87 printf("■"); 88 tail = tail->next; 89 } 90 } 91 //?? 92 int biteSelf()//判斷是否咬到了自己 93 { 94 snake *self; 95 self = head->next; 96 while (self != NULL) 97 { 98 if (self->x == head->x && self->y == head->y) 99 { 100 return 1; 101 } 102 self = self->next; 103 } 104 return 0; 105 } 106 107 void createFood()//隨機出現食物 108 { 109 snake *food_1; 110 srand((unsigned)time(NULL));//為了防止每次產生的隨機數相同,種子設定為time 111 food_1 = (snake*)malloc(sizeof(snake)); 112 while ((food_1->x % 2) != 0) //保證其為偶數,使得食物能與蛇頭對其 113 { 114 food_1->x = rand() % 52 + 2; 115 } 116 food_1->y = rand() % 24 + 1; 117 q = head; 118 while (q->next == NULL) 119 { 120 if (q->x == food_1->x && q->y == food_1->y) //判斷蛇身是否與食物重合 121 { 122 free(food_1); 123 createFood(); 124 } 125 q = q->next; 126 } 127 Pos(food_1->x, food_1->y); 128 food = food_1; 129 printf("■"); 130 } 131 132 void cantCrossWall()//不能穿牆 133 { 134 if (head->x == 0 || head->x == 56 || head->y == 0 || head->y == 26) 135 { 136 endGamestatus = 1; 137 endGame(); 138 } 139 } 140 141 void snakeMove()//蛇前進,上U,下D,左L,右R 142 { 143 snake * nexthead; 144 cantCrossWall(); 145 146 nexthead = (snake*)malloc(sizeof(snake)); 147 if (status == U) 148 { 149 nexthead->x = head->x; 150 nexthead->y = head->y - 1; 151 if (nexthead->x == food->x && nexthead->y == food->y)//如果下一個有食物// 152 { 153 nexthead->next = head; 154 head = nexthead; 155 q = head; 156 while (q != NULL) 157 { 158 Pos(q->x, q->y); 159 printf("■"); 160 q = q->next; 161 } 162 score = score + add; 163 createFood(); 164 } 165 else //如果沒有食物// 166 { 167 nexthead->next = head; 168 head = nexthead; 169 q = head; 170 while (q->next->next != NULL) 171 { 172 Pos(q->x, q->y); 173 printf("■"); 174 q = q->next; 175 } 176 Pos(q->next->x, q->next->y); 177 printf(" "); 178 free(q->next); 179 q->next = NULL; 180 } 181 } 182 if (status == D) 183 { 184 nexthead->x = head->x; 185 nexthead->y = head->y + 1; 186 if (nexthead->x == food->x && nexthead->y == food->y) //有食物 187 { 188 nexthead->next = head; 189 head = nexthead; 190 q = head; 191 while (q != NULL) 192 { 193 Pos(q->x, q->y); 194 printf("■"); 195 q = q->next; 196 } 197 score = score + add; 198 createFood(); 199 } 200 else //沒有食物 201 { 202 nexthead->next = head; 203 head = nexthead; 204 q = head; 205 while (q->next->next != NULL) 206 { 207 Pos(q->x, q->y); 208 printf("■"); 209 q = q->next; 210 } 211 Pos(q->next->x, q->next->y); 212 printf(" "); 213 free(q->next); 214 q->next = NULL; 215 } 216 } 217 if (status == L) 218 { 219 nexthead->x = head->x - 2; 220 nexthead->y = head->y; 221 if (nexthead->x == food->x && nexthead->y == food->y)//有食物 222 { 223 nexthead->next = head; 224 head = nexthead; 225 q = head; 226 while (q != NULL) 227 { 228 Pos(q->x, q->y); 229 printf("■"); 230 q = q->next; 231 } 232 score = score + add; 233 createFood(); 234 } 235 else //沒有食物 236 { 237 nexthead->next = head; 238 head = nexthead; 239 q = head; 240 while (q->next->next != NULL) 241 { 242 Pos(q->x, q->y); 243 printf("■"); 244 q = q->next; 245 } 246 Pos(q->next->x, q->next->y); 247 printf(" "); 248 free(q->next); 249 q->next = NULL; 250 } 251 } 252 if (status == R) 253 { 254 nexthead->x = head->x + 2; 255 nexthead->y = head->y; 256 if (nexthead->x == food->x && nexthead->y == food->y)//有食物 257 { 258 nexthead->next = head; 259 head = nexthead; 260 q = head; 261 while (q != NULL) 262 { 263 Pos(q->x, q->y); 264 printf("■"); 265 q = q->next; 266 } 267 score = score + add; 268 createFood(); 269 } 270 else //沒有食物 271 { 272 nexthead->next = head; 273 head = nexthead; 274 q = head; 275 while (q->next->next != NULL) 276 { 277 Pos(q->x, q->y); 278 printf("■"); 279 q = q->next; 280 } 281 Pos(q->next->x, q->next->y); 282 printf(" "); 283 free(q->next); 284 q->next = NULL; 285 } 286 } 287 if (biteSelf() == 1) //判斷是否會咬到自己 288 { 289 endGamestatus = 2; 290 endGame(); 291 } 292 } 293 294 void pause()//暫停 295 { 296 while (1) 297 { 298 Sleep(300); 299 if (GetAsyncKeyState(VK_SPACE)) 300 { 301 break; 302 } 303 304 } 305 } 306 307 void runGame()//控制遊戲 308 { 309 310 Pos(64, 15); 311 printf("不能穿牆,不能咬到自己\n"); 312 Pos(64, 16); 313 printf("用↑.↓.←.→分別控制蛇的移動."); 314 Pos(64, 17); 315 printf("F1 為加速,F2 為減速\n"); 316 Pos(64, 18); 317 printf("ESC :退出遊戲.space:暫停遊戲."); 318 Pos(64, 20); 319 printf("C語言研究中心 www.clang.cc"); 320 status = R; 321 while (1) 322 { 323 Pos(64, 10); 324 printf("得分:%d ", score); 325 Pos(64, 11); 326 printf("每個食物得分:%d分", add); 327 if (GetAsyncKeyState(VK_UP) && status != D) 328 { 329 status = U; 330 } 331 else if (GetAsyncKeyState(VK_DOWN) && status != U) 332 { 333 status = D; 334 } 335 else if (GetAsyncKeyState(VK_LEFT) && status != R) 336 { 337 status = L; 338 } 339 else if (GetAsyncKeyState(VK_RIGHT) && status != L) 340 { 341 status = R; 342 } 343 else if (GetAsyncKeyState(VK_SPACE)) 344 { 345 pause(); 346 } 347 else if (GetAsyncKeyState(VK_ESCAPE)) 348 { 349 endGamestatus = 3; 350 break; 351 } 352 else if (GetAsyncKeyState(VK_F1)) 353 { 354 if (sleeptime >= 50) 355 { 356 sleeptime = sleeptime - 30; 357 add = add + 2; 358 if (sleeptime == 320) 359 { 360 add = 2;//防止減到1之後再加回來有錯 361 } 362 } 363 } 364 else if (GetAsyncKeyState(VK_F2)) 365 { 366 if (sleeptime<350) 367 { 368 sleeptime = sleeptime + 30; 369 add = add - 2; 370 if (sleeptime == 350) 371 { 372 add = 1; //保證最低分為1 373 } 374 } 375 } 376 Sleep(sleeptime); 377 snakeMove(); 378 } 379 } 380 381 void initGame()//開始介面 382 { 383 Pos(40, 12); 384 385 system("title C語言研究中心 www.clang.cc"); 386 printf("歡迎來到貪食蛇遊戲!"); 387 Pos(40, 25); 388 printf(" C語言研究中心 www.clang.cc.\n"); 389 system("pause"); 390 system("cls"); 391 Pos(25, 12); 392 printf("用↑.↓.←.→分別控制蛇的移動, F1 為加速,2 為減速\n"); 393 Pos(25, 13); 394 printf("加速將能得到更高的分數。\n"); 395 system("pause"); 396 system("cls"); 397 } 398 399 void endGame()//結束遊戲 400 { 401 402 system("cls"); 403 Pos(24, 12); 404 if (endGamestatus == 1) 405 { 406 printf("對不起,您撞到牆了。遊戲結束."); 407 } 408 else if (endGamestatus == 2) 409 { 410 printf("對不起,您咬到自己了。遊戲結束."); 411 } 412 else if (endGamestatus == 3) 413 { 414 printf("您的已經結束了遊戲。"); 415 } 416 Pos(24, 13); 417 printf("您的得分是%d\n", score); 418 while (getchar() != 'y') 419 { 420 printf("close?[y]"); 421 } 422 exit(0); 423 } 424 425 void gameStart()//遊戲初始化 426 { 427 system("mode con cols=100 lines=30"); 428 initGame(); 429 creatMap(); 430 initSnake(); 431 createFood(); 432 } 433 434 int main() 435 { 436 gameStart(); 437 runGame(); 438 endGame(); 439 return 0; 440 }
相關推薦
貪吃蛇C語言程式碼
1 #include<stdio.h> 2 #include<time.h> 3 #include<windows.h> 4 #include<stdlib.h> 5 6 #define U 1
智慧貪吃蛇c語言實現
#include <stdio.h> #include <windows.h> #include <stdlib.h> #include <math.h> #include <conio.h> #inc
貪吃蛇C語言原始碼與演算法分析
經典的貪吃蛇遊戲演算法,無疑是一個較大的挑戰,綜合性較高,像我這種剛入門C語言的也差不多花了整整一週時間才差不多理解透徹,內部包含了較多的函式,陣列,二維陣列,迴圈等思想。 Github專案地址:https://github.com/knighty
貪吃蛇-C語言小遊戲
貪吃蛇 貪吃蛇對於大家來說肯定不陌生,那麼今天我們將用C語言來實現貪吃蛇的功能,自己動手做一款屬於自己的小遊戲。 首先先看幾個我做的貪吃蛇遊戲截圖: 在編寫程式之前,我們先來簡單分析一下,我們最終要實現成什麼樣子呢,要有哪些功能,要將這些功能分
貪吃蛇(C語言版)
還有比較多的bug,但是沒空更改了,這只是寫給自己看的。以後用到了就能直接拷過來。 #include <windows.h> #include <stdio.h> #include <stdlib.h> #include <stri
貪吃蛇C語言實現(簡易版)
/************************************************************************************************************** **檔案:snake.c **編寫者:Nightmare **編寫日期:2017
貪吃蛇---C語言實現
感想 大一剛放寒假,用了兩天時間終於將貪吃蛇寫好了。第一次寫專案,雖然小了點,但是在這過程中遇到的問題都讓我有所收穫。 實現 貪吃蛇各函式關係圖。如下圖: 有了各功能關係圖之後就可以開工寫程式碼了。 寫程式碼過程中遇到最多的問題,還是編譯器的問題。最開始使用dev c++
2017第八屆藍橋杯 (C/C++C)組貪吃蛇長度-C語言程式碼和思路
標題:貪吃蛇長度 ±------------------------------------------------+ | | | H###### #### | | # # # | | # # # | | # #### # # | | # # # # # | | #####
C語言小遊戲————貪吃蛇.c
1.主函式框架的搭建 int main (void) { starup();//資料初始化 while(1) { show();//列印畫面 updateWithoutInput();//與使用者輸入無關的更新 updateWithInput();//與
貪吃蛇 c++ ncurses
set cti nbsp over 訓練 fine || front 空字符 近期學ncurses。用貪吃蛇訓練下 思路:不構造鏈表。蛇頭向前進方向打點,蛇尾逐點消失,形成移動。 須要記錄蛇頭方向,蛇尾方向。並用list仿造隊列,增加拐點信息(空間
CRC32 C語言程式碼 和 JAVA程式碼
C語言如下: uint32_t crc32_compute(uint8_t const * p_data, uint32_t size){ uint32_t crc; crc = 0xFFFFFFFF; for (uin
CRC8 C語言程式碼 和 JAVA 程式碼
crc8 從語言程式碼如下: unsigned char const crc8_tab[256] = { 0x00,0x07,0x0E,0x09,0x1C,0x1B,0x12,0x15,0x38,0x3F,0x36,0x
如何在ubuntu中寫一個簡單的C語言程式碼並編譯執行
首先需要安裝一個編譯器 因為筆者也是剛剛開始學習ubuntu所以不知道各個編譯器之間的區別,筆者所用的是gcc就簡單介紹一下gcc的安裝方法吧。 方法一: 開啟控制檯輸入以下程式碼: sudo apt-get build-dep gcc; sudo apt-get bui
快速傅立葉變換FFT的學習筆記一:C語言程式碼的簡單實現
快速傅立葉變換FFT的學習筆記一:C語言程式碼的簡單實現 fft.c #include "math.h" #include "fft.h" void conjugate_complex(int n,complex in[],complex out[]) { int i = 0
GSM A5/1演算法C語言程式碼實現和分析
介紹 全球超過200個國家和地區超過10億人正在使用GSM電話。對中國使用者來說,GSM就是移動和聯通的2g模式。 在1982年A5首次提出時,人們認為A5 / 1金鑰長度要128位,但最終確定的結果是64位金鑰(政府可以使用暴力破解算出)。很可能是政府的壓力迫使金鑰位數縮
c語言程式碼比較18bb/1
kata1: 我的程式碼: 別人的程式碼1: 用數學公式實現 第n個數是1+2+3+4…+n = (1+n)n/2; 進而結果是對求和的求和 對(1+n)n/2遍歷1 to n; 進而sum = 1/2 * (12 + 23 +34+…+nn+1) 即 sum = 1/
c語言程式碼比較18bb/16
kata: 比如說: dig_pow(89, 1) should return 1 since 8¹ + 9² = 89 = 89 * 1 dig_pow(92, 1) should return -1 since there is no k such as 9¹ + 2² equal
C語言程式碼比較18ba/16
the kata: 題目描述: In a small town the population is p0 = 1000 at the beginning of a year. The population regularly increases by 2 percent per
貪吃蛇C++
貪吃蛇(codeblocks)C++ #include #include <windows.h> #include <time.h> #include <conio.h> using namespace std; //int N = 22; inli
哈夫曼樹詳細講解(帶例題和C語言程式碼實現——全註釋)
** 哈夫曼樹詳細講解(帶例題和C語言程式碼實現——全註釋) ** 定義 哈夫曼樹又稱最優二叉樹,是一種帶權路徑長度最短的二叉樹。所謂樹的帶權路徑長度,就是樹中所有的葉結點的權值乘上其到根結點的 路徑長度(若根結點為0層,葉結點到根結點的路徑長度為葉結點