亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 編程 > C > 正文

C語言實現推箱子游戲的代碼示例

2020-01-26 13:24:12
字體:
來源:轉載
供稿:網友

很早就想過做點小游戲了,但是一直沒有機會動手。今天閑來無事,動起手來。過程還是蠻順利的,代碼也不是非常難。今天給大家分享一下~

一、介紹

開發語言:C語言
開發工具:Dev-C++ 5.11
日期:2019年9月28日
作者:ZackSock

也不說太多多余的話了,先看一下效果圖:

游戲中的人物、箱子、墻壁、球都是字符構成的。通過wasd鍵移動,規則的話就是推箱子的規則,也就不多說了。

二、代碼實現

關于代碼方面,我盡可能講的細致。希望大家可以理解~

(1)方法列表

//主函數void main();//初始化一些數據initData();//在控制臺上打印地圖drawMap();//向上移動moveUp();//向左移動moveLeft()//向下移動moveDown()//向右移動moveRight();

這幾個方法都顧名思義,而且用意也非常明確,就initData可能不知道具體用處,但是沒有什么大問題。唯一的問題就是,上左下右的順序可能會逼死幾個強迫癥患者,哈哈。

(2)參數列表

為了方便,我把include和宏定義也放到參數列表當中

//導入函數庫#include <stdio.h>#include <stdlib.h>//宏定義#define WIDTH 8#define HEIGHT 8//定義地圖數組,二維數組有兩個維度,而地圖也是二維的矩形int map[HEIGHT][WIDTH] = { {0, 0, 1, 1, 1, 0, 0, 0}, {0, 0, 1, 4, 1, 0, 0, 0}, {0, 0, 1, 0, 1, 1, 1, 1}, {1, 1, 1, 3, 0, 3, 4, 1}, {1, 4, 0, 3, 2, 1, 1, 1}, {1, 1, 1, 1, 3, 1, 0, 0}, {0, 0, 0, 1, 4, 1, 0, 0}, {0, 0, 0, 1, 1, 1, 0, 0} };//人的位置,在二維地圖中,我們可以用坐標表示一個人的位置,就好比經緯度int x, y;//箱子的個數,推箱子肯定要有箱子嘛。int boxs;

這里參數不多,其中橫為x,縱為y,另外這里再規定一下map的一些東西:

/*** 0 表示空* 1 表示墻* 2 表示人* 3 表示箱子* 4 表示目的地(球)* 5 表示已完成的箱子*/

(3)函數具體分析

接下來我們一個一個函數來分析。

1、main函數

int main(int argc, char *argv[]) { char direction; //存儲鍵盤按的方向  initData();  //初始化一些數據  //開始游戲的循環,這里是個死循環,每按一次按鈕循環一次 while(1){ //每次循環的開始清除屏幕 system("cls"); //繪畫地圖 drawMap(); //判斷,當boxs的數量0時,!0為真,然后走break跳出循環(結束游戲)  if(!boxs){  break; }  //鍵盤輸入方向,這里使用getch,因為getch讀取字符不會顯示在屏幕上 direction = getch();  //用switch判斷用戶輸入的方向 switch(direction){  case 'w':  //按w時,調用向上移動函數  moveUp();  break;  case 'a':  //按a時,調用向左移動函數  moveLeft();   break;  case 's':  moveDown();  break;  case 'd':  moveRight();  break;  } }  //當跳出循環時,運行該語句,游戲結束 printf("恭喜你完成游戲!※"); return 0;}

我大概說一下流程,循環外面沒有什么特別的。initData()只是一些簡單數據的初始化,不需要太在意。循環中大致流程如下:

  • 清除屏幕
  • 繪制地圖
  • 判斷游戲是否結束
  • 對用戶按下的按鈕進行反饋

進入循環體,先清除屏幕,再繪制地圖,然后再判斷游戲是否結束。可能大家對這個順序不是很理解,這里我們先不考慮判斷游戲結束的問題。我們把清屏和繪制地圖合在一起,簡稱“重繪地圖”,而游戲結束的判斷先不考慮,那么流程就簡化為“重繪地圖 + 響應用戶的操作”。簡單來說就是,用戶按一下按鈕,我改變一下地圖。

2、initData()

void initData(){ int i, j;  //加載數據時讓用戶等待,一般情況加載數據比較快 printf("游戲加載中,請稍后.........");   //遍歷地圖中的數據 for(i = 0; i < HEIGHT; i++){ for(j = 0; j < WIDTH; j++){  //遍歷到2(人)時,記錄人的坐標。x, y是前面定義的全局變量  if(map[i][j] == 2){  x = j;  y = i;  }   //遍歷到3時,箱子的數目增加。boxs是前面定義的全局變量   if(map[i][j] == 3){  boxs++;  } } } }

這個方法很簡單,就是遍歷地圖,然后初始化人的位置和箱子的個數。這里有一點要注意一下,就是到底內層循環是WIDTH還是外層循環是WIDTH。

如圖,在遍歷過程中。外層循環控制行數,即HEIGHT。那么內層循環應該是WIDTH。

3、drawMap()

void drawMap(){ int i, j; for(i = 0; i < WIDTH; i++){ for(j = 0; j < HEIGHT; j++){  switch(map[i][j]){  case 0:   printf(" ");   break;  case 1:   printf("■");   break;  case 2:   printf("♀");   break;  case 3:   printf("◆");   break;  case 4:   printf("●");   break;  case 5:   printf("★");   break;   } } printf("/n"); }}

這里也非常簡單,變量map中的元素,然后通過switch判斷應該輸出的內容。然后內層循環每走完一次就換行。

4、moveUp()

這個函數內容有點多,想講一下大概思路:

向上移有兩種情況

1、前面為空白
 這種情況有兩個步驟
 (1)將人當前的位置設置為空白(0),
 (2)再講人前面的位置設置為人(2)
2、前面為箱子
 當前面為箱子時有三種情況
 1、箱子前面為空白
  移動人和箱子,這個操作有三個步驟
  (1)將人當前位置設置為空(0)
  (2)將箱子位置設置為人(2)
  (3)將箱子前面設置為箱子(3)
 2、箱子前面為墻
  這種情況不需要做任何操作
 3、箱子前面為終點
  這種情況有四個個步驟
  (1)將人的位置設置為空(0)
  (2)將箱子的位置設置為人(2)
  (3)將終點位置設置為★(5)
  (4)箱子boxs的數量減一
3、前面為墻
 這種情況最簡單,不需要做任何操作
4、前面為終點
 我這里沒有考慮太多,這種情況不做操作。(如果更換地圖的話可能需要修改代碼)

具體代碼如下,解析我全寫在注釋里面:

void moveUp(){ //定義變量存放人物上方的坐標 int ux, uy;   //當上方沒有元素時,直接return (其實人不可能在邊緣) if(y == 0){ return; }  //記錄上方坐標,x為橫,y為縱,所有ux = x, uy = y - 1; ux = x; uy = y - 1;   //上方為已完成的箱子 if(map[uy][ux] == 5){ return; }  //假設上方為墻,直接return,這個和上面的判斷可以合在一起,這里為了看清楚分開寫  if(map[uy][ux] == 1){ return; }  //假設上方為箱子 if(map[uy][ux] == 3){ //判斷箱子上方是否為墻  if(map[uy - 1][ux] == 1){  return; }  //判斷箱子上方是否為終點 if(map[uy - 1][ux] == 4){  //將箱子上面內容賦值為5★   map[uy - 1][ux] = 5;  map[uy][ux] = 0;     //箱子的數目減1   boxs--;  }else{  //移動箱子  map[uy - 1][ux] = 3; } } //當上面幾種return的情況都沒遇到,人肯定會移動,移動操作如下 map[y][x] = 0; map[uy][ux] = 2; //更新人的坐標 y = uy; } 

這是一個方向的,其它方向要考慮的問題也和前面一樣,我也就不贅述了。

6、moveLeft()

這里大致都和上面一樣,就是在記錄左邊坐標時,應該應該是lx = x - 1。

void moveLeft(){ //定義變量存放人物左邊的坐標 int lx, ly;   //當左邊沒有元素時,直接return  if(x == 0){ return; }  //記錄左邊坐標 lx = x - 1; ly = y;   //左邊為已完成方塊 if(map[ly][lx] == 5){ return; }   //假設左邊為墻,直接return  if(map[ly][lx] == 1){ return; }  //假設左邊為箱子 if(map[ly][lx] == 3){ //判斷箱子左邊是否為墻  if(map[ly][lx - 1] == 1){  return; }  //判斷箱子左邊是否為球 if(map[ly][lx - 1] == 4){  //將箱子左邊內容賦值為5★   map[ly][lx - 1] = 5;  map[ly][lx] = 0;   //箱子的數目減1   boxs--;  }else{  //移動箱子   map[ly][lx - 1] = 3;  } } map[y][x] = 0; map[ly][lx] = 2; x = lx; }

7、moveDown()

這里在判斷邊界時,判斷的是 y == HEIGHT - 1。

void moveDown(){ //定義變量存放人物下方的坐標 int dx, dy;   //當下方沒有元素時,直接return  if(y == HEIGHT - 1){ return; }  //記錄下方坐標 dx = x; dy = y + 1;   //下方為已完成方塊 if(map[dy][dx] == 5){ return; }   //假設下方為墻,直接return  if(map[dy][dx] == 1){ return; }  //假設下方為箱子 if(map[dy][dx] == 3){ //判斷箱子下方是否為墻  if(map[dy + 1][dx] == 1){  return; }  //判斷箱子下方是否為球 if(map[dy + 1][dx] == 4){  //將箱子下面內容賦值為5★   map[dy + 1][dx] = 5;  map[dy][dx] = 0;    //箱子的數目減1   boxs--;  }else{  //移動箱子  map[dy + 1][dx] = 3;  } } map[y][x] = 0; map[dy][dx] = 2; y = dy; }

8、moveRight()

這里也沒什么特別說的:

void moveRight(){ //定義變量存放人物右邊的坐標 int rx, ry;   //當右邊沒有元素時,直接return  if(x == WIDTH - 1){ return; }  //記錄右邊坐標 rx = x + 1; ry = y;   //右邊為已完成方塊 if(map[ry][rx] == 5){ return; }   //假設右邊為墻,直接return  if(map[ry][rx] == 1){ return; }  //假設右邊為箱子 if(map[ry][rx] == 3){ //判斷箱子右邊是否為墻  if(map[ry][rx + 1] == 1){  return; }  //判斷箱子左邊是否為球 if(map[ry][rx + 1] == 4){  //將箱子右邊內容賦值為5★   map[ry][rx + 1] = 5;  map[ry][rx] = 0;    //箱子的數目減1   boxs--;  }else{  //移動箱子   map[ry][rx + 1] = 3;  } } map[y][x] = 0; map[ry][rx] = 2; x = rx; }

三、總結

現在再回顧開始的運行步驟

  • 清除屏幕
  • 繪制地圖
  • 判斷游戲是否結束
  • 對用戶按下的按鈕進行反饋

這里把判斷游戲是否結束放到了重繪圖像后面,因為在對用戶進行反饋的時候只是改變了map中的數據,實際上最后一個箱子推到終點的圖像還沒有顯示出來,所以要在重繪之后再判斷是否結束游戲。

代碼有很多冗余的地方,一方面是想大家更好的理解,還有一方面出于懶。哈哈,代碼運行起來沒有問題,源碼和源程序我會上傳,有興趣的可以下下來,或者直接復制代碼運行也是沒問題的。

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持武林網。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表

圖片精選

亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
欧美精品电影免费在线观看| 91沈先生在线观看| 91sao在线观看国产| 成人激情视频免费在线| 日韩av网址在线观看| 久久精品国产综合| 久久免费国产精品1| 亚洲欧美在线免费| 亚洲人成五月天| 日韩最新在线视频| 国产精品自产拍高潮在线观看| 精品国产网站地址| 欧美激情国产精品| 亚洲一区二区三区成人在线视频精品| 日韩在线观看免费全集电视剧网站| 国产精品永久免费在线| 国产精品男人的天堂| 狠狠色香婷婷久久亚洲精品| 国产亚洲激情在线| 国产精品久久久久久超碰| 亚洲精品www久久久久久广东| 欧美日韩精品在线观看| 日韩在线观看视频免费| 成人激情视频小说免费下载| 亚洲成人av在线播放| 久久国产精品影视| 亚洲国产毛片完整版| 奇门遁甲1982国语版免费观看高清| 国内精品伊人久久| 国产成人亚洲综合| 91精品久久久久久久久久久久久久| 人妖精品videosex性欧美| 亚洲性日韩精品一区二区| 欧美最猛性xxxxx免费| 欧美日韩色婷婷| 亚洲丁香久久久| 91精品国产成人www| 亚洲欧洲日产国码av系列天堂| 日韩h在线观看| 国内精品久久久久久久| 精品福利在线看| 91精品国产高清| 97视频在线观看免费| 在线播放国产精品| 久久亚洲欧美日韩精品专区| 亚洲人成电影网站色xx| 亚洲欧美日韩精品久久| 中文字幕亚洲在线| 91av视频在线| 欧美日韩亚洲网| 日本伊人精品一区二区三区介绍| 国产精品成人久久久久| 亚洲第一中文字幕在线观看| 久久精品国产欧美激情| 国产精品毛片a∨一区二区三区|国| 国产精品777| 成人在线视频网| 国产精品视频一区二区三区四| 国产成人亚洲综合| 午夜精品久久久久久99热软件| 成人一区二区电影| 国产精品久久久久久婷婷天堂| 成人精品在线观看| 欧美床上激情在线观看| 亚洲欧美一区二区三区在线| 亚洲午夜未满十八勿入免费观看全集| 最近2019好看的中文字幕免费| 黄网站色欧美视频| 久久久久久久久久久免费精品| 精品国产一区二区在线| 久青草国产97香蕉在线视频| 日韩一区二区三区在线播放| 78m国产成人精品视频| 日韩电影第一页| 久久久久久高潮国产精品视| www.99久久热国产日韩欧美.com| 精品人伦一区二区三区蜜桃免费| 日韩性生活视频| 亚洲电影av在线| 国产成人精品免费视频| 日韩中文字幕在线视频播放| 国产美女精品免费电影| 久久久噜久噜久久综合| 欧美一级视频免费在线观看| 欧美国产在线电影| 国产精品一区二区三区毛片淫片| 日韩国产中文字幕| 欧美视频在线看| 日韩精品在线私人| 亚洲另类xxxx| 992tv在线成人免费观看| 欧美成人精品在线视频| 亚洲护士老师的毛茸茸最新章节| 亚洲japanese制服美女| 欧美成人全部免费| 久久久国产精彩视频美女艺术照福利| 亚洲福利影片在线| 57pao成人国产永久免费| 国产福利精品av综合导导航| 国产精品中文字幕在线观看| 成人免费自拍视频| 91av视频在线观看| 亚洲va欧美va国产综合剧情| 国产精品视频色| 久久精品亚洲国产| 午夜精品三级视频福利| 精品国产拍在线观看| 欧美精品久久一区二区| 日韩精品视频在线观看网址| 久久久噜噜噜久久中文字免| 中文字幕无线精品亚洲乱码一区| 亚洲国产又黄又爽女人高潮的| 日韩在线观看免费| 国产一区在线播放| 国产精品精品视频一区二区三区| 亚洲国产精品成人va在线观看| 精品国产电影一区| 97精品伊人久久久大香线蕉| 亚洲精品av在线播放| 久久久久久91香蕉国产| 中文字幕精品www乱入免费视频| 亚洲自拍偷拍色片视频| 久久精品国产亚洲精品2020| 久久成人精品一区二区三区| 日本午夜在线亚洲.国产| 97香蕉超级碰碰久久免费的优势| 青青草原一区二区| 日韩中文字幕视频在线| 日产精品久久久一区二区福利| 欧洲日本亚洲国产区| 国内揄拍国内精品| 精品视频在线播放免| 色综合色综合网色综合| 欧美成人性色生活仑片| 亚洲欧洲高清在线| 日本中文字幕久久看| 国产色婷婷国产综合在线理论片a| 国产精品伦子伦免费视频| 在线观看国产精品日韩av| 欧美激情一级精品国产| 久久精品国产视频| 成人午夜两性视频| 中文字幕日韩精品在线| 亚洲福利精品在线| 日韩精品视频在线观看免费| 欧美俄罗斯乱妇| 伊人久久久久久久久久久| 91探花福利精品国产自产在线| 成人福利在线视频| 国产精品久久久久99| 国产精品美女免费视频| 成人福利网站在线观看11| 精品香蕉在线观看视频一| 成人情趣片在线观看免费| 国产精品视频区| 国产精品一区二区久久久久| 亚洲女在线观看| 国产美女直播视频一区| 日韩av在线免费看| 欧美激情视频在线| 久久国产精品网站| 91精品国产综合久久久久久蜜臀| 一夜七次郎国产精品亚洲| 欧美在线不卡区|