亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

C語言實現(xiàn)推箱子游戲完整代碼

 更新時間:2020年12月29日 10:29:49   作者:l阿童木c  
這篇文章主要為大家詳細介紹了C語言實現(xiàn)推箱子游戲完整代碼,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下

C語言實現(xiàn)推箱子游戲完整代碼,供大家參考,具體內容如下

前言

自己做的,可能有些代碼不夠工整,或者有些小問題,但游戲的基本操作是可以實現(xiàn)的

代碼效果

代碼一共分為8個部分,4個控制上下左右移動,2個判斷輸贏,1個統(tǒng)計歸為的個數(shù),一個作圖。

手動設置地圖

用'0'表示空格,“1”表示墻,“2”表示箱子,“3”表示人,“4”表示終點

這樣可以提高代碼的移植性

如需改為手動輸入地圖可以直接定義一個二維數(shù)組,在給他賦值就可以了

int screen[9][11]={
 {0,1,1,1,1,1,1,1,1,0,0},
 {0,1,0,0,0,1,0,0,0,1,0},
 {0,1,0,2,2,2,2,2,0,1,0},
 {0,1,0,2,0,2,0,2,0,1,1},
 {0,1,0,0,0,3,0,0,2,0,1},
 {1,1,0,1,1,1,1,0,2,0,1},
 {1,0,4,4,4,4,4,1,0,0,1},
 {1,0,4,4,4,4,4,0,0,1,1},
 {1,1,1,1,1,1,1,1,1,1,0}
};//定義為全局變量 (地圖) i表示行,j表示列 

計算地圖中終點的個數(shù)

這一步主要是為了后面判斷游戲輸贏的

int cum(){
 int i,j,k=0;
 for(i=0;i<9;i++){
 for(j=0;j<11;j++){
 if(screen[i][j]==2){
 k++;
 }
 }
 }//遍歷整個二維數(shù)組
 return k;
}//計算地圖中有多少個終點

打印地圖函數(shù)

通過switch函數(shù)對二維數(shù)組中的值進行可視化,也就是畫出地圖

注意:這里還定義出了6和7,是通過重疊的關系來算的,就是箱子在終點上,這個位置又有箱子又有終點2個標識,所以讓兩個的數(shù)值加起來,方便理解,也方便后面的計算

void print(){
 int i,j;
 printf("請用wsad代表上下左右來進行游戲\n");
 for(i=0;i<9;i++){
 for(j=0;j<11;j++){
 switch(screen[i][j]){
 case 0:
  printf(" ");//空 
  break;
 case 1:
  printf("■");//墻 
  break;
 case 2:
  printf("★");//箱子 
  break;
 case 3:
  printf("♀");//人 
  break;
 case 4:
  printf("○");//終點 
  break;
 case 6:
  printf("★");
  break;//箱子和終點 
 case 7://人和終點顯示人
  printf("♀");
  break; 
 }
 }
 printf("\n");
 }
}

判斷游戲輸贏

這里我寫了2個函數(shù),一個判斷贏,一個判斷輸,并返回值,然后在主函數(shù)的最后面通過判斷返回值來確定游戲的輸贏

判斷贏

int win(){
 int i,j,k=0;
 int t=0;
 for(i=0;i<9;i++){
 for(j=0;j<11;j++){
 if(screen[i][j]==6){
 k++;
 }
 }
 }//遍歷整個二維數(shù)組,計算箱子在終點上的個數(shù)
 if(k==cum()){
 t=1;
 }//如果個數(shù)等于前面計算出的終點個數(shù),則說明所有終點都放了箱子,說明游戲勝利
 return t;
} //判斷贏 

判斷輸

int lose(){
 int i,j;
 int k=0;
 for(i=0;i<9;i++){
 for(j=0;j<11;j++){
 if(i>0 && j>0 ){ 
 if(screen[i][j] == 2 || screen[i][j] == 6){
 if(((screen[i-1][j] == 1 || screen[i-1][j] == 2 || screen[i-1][j] == 6) && (screen[i][j-1] == 1 || screen[i][j-1] == 2 || screen[i][j-1] == 6)) 
 || ((screen[i][j-1] == 1 || screen[i][j-1] == 2 || screen[i][j-1] == 6) && (screen[i+1][j] == 1 || screen[i+1][j] == 2 || screen[i+1][j] == 6))
 || ((screen[i+1][j] == 1 || screen[i+1][j] == 2 || screen[i+1][j] == 6) && (screen[i][j+1] == 1 || screen[i][j+1] == 2 || screen[i][j+1] == 6))
 || ((screen[i][j+1] == 1 || screen[i][j+1] == 2 || screen[i][j+1] == 6) && (screen[i-1][j] == 1 || screen[i-1][j] == 2 || screen[i-1][j] == 6))){
  k++;
 }
 }
 }
 }/*這里也是遍歷了整個數(shù)組,判斷所有的箱子四個方向的情況,
 如果有三個方向被堵住了說明箱子無法移動了,也表明這個箱子失效了,
 用k來記錄失效的個數(shù),當全部失效時游戲失敗
 (這是游戲的玩法,其實有一個被堵住就已經(jīng)不可能勝利了)*/
 }
 if(k==cum()){
 k=1;
 }
 return k;//返回1說明游戲失敗
}

接下來是最重要的四個控制函數(shù)

向上移動

通過數(shù)字的變化來控制二維數(shù)組的變化,進而控制地圖的更新

這里非常重要的就是要理解:加1,加2,加3減3都是什么意思

加1:箱子的值是2,人的值是3,所以箱子的位置變成人需要加1來實現(xiàn)

加2:空地的值是0,箱子的值是2,箱子和終點在一起的值是6,所以在推箱子的時候,前方的空格或者終點放上箱子后數(shù)值會加2

加3減3:人的值是3,人要動的話,它原先在的格子就會因為人走了導致數(shù)值減3,走到的那個格子就會因為站了人而加3

如果這個理解的話,代碼就非常簡單了

void movew(){
 if(x>0){
 if(screen[x-1][y]==1){
 return ;/*如果箱子的上面是墻,則地圖不會發(fā)生變化,因為
 推不動嘛*/
 }else if(screen[x-1][y]==0){
 screen[x-1][y]+=3;
 screen[x][y]-=3;
 x--;/*如果前面是空地,則需要向前移動一格,也就是原先人的位置
 變成空地,前方的空地變成人,空地(0)變成人(3)需要加3,
 人變成空地需要減3*/
 }else if(screen[x-1][y]==4){
 screen[x-1][y]+=3;
 screen[x][y]-=3;
 x--;
 }//一樣的
 else if(screen[x-1][y]==2||screen[x-1][y]==6){
 if(screen[x-2][y]==0){
  screen[x-2][y]+=2;//箱子前面的格變成箱子(2)
  screen[x-1][y]+=1;//箱子的位置變成人(3)
  screen[x][y]-=3;/*如果前面是空地,則需要向前移動
  一格,也就是原先是箱子的格子變成人,人的位置變成空
  地,原先的空地變成箱子,箱子(2)變成人(3)需要減
  3,空地變成人*/
  x--;
 }else if(screen[x-2][y]==1){
  return ;
 }else if(screen[x-2][y]==2){
 return;//如果箱子的前面是墻或者其他的箱子,則箱子推不動
 }else if(screen[x-2][y]==4){
  screen[x-2][y]+=2;
  screen[x-1][y]+=1;
  screen[x][y]-=3;
  x--;
 }//這個情況別漏了
 }
 }
}

其他三個方向的代碼思路和這個是一樣的

向下移動

void moves(){
 if(x<9){
 if(screen[x+1][y]==1){
 return ;
 }else if(screen[x+1][y]==0){
 screen[x+1][y]+=3;
 screen[x][y]-=3;
 x++;
 }else if(screen[x+1][y]==4){
 screen [x+1][y]+=3;
 screen[x][y]-=3;
 x++;
 }
 else if(screen[x+1][y]==2||screen[x+1][y]==6){ 
 if(screen[x+2][y]==1){
  return;
 }else if(screen[x+2][y]==0){
  screen[x+2][y]+=2;
  screen[x+1][y]+=1;
  screen[x][y]-=3;
  x++;
 }else if(screen[x+2][y]==2){
  return ;
 }else if(screen[x+2][y]==4){
  screen[x+2][y]+=2;
  screen[x+1][y]+=1;
  screen[x][y]-=3;
  x++;
  }
 }
 }
}

向左移動

void movea(){
 if(y>0){
 if(screen[x][y-1]==1){
 return;
 }else if(screen[x][y-1]==4){
 screen[x][y-1]+=3;
 screen[x][y]-=3;
 y--;
 }
 else if(screen[x][y-1]==0){
 screen[x][y-1]+=3;
 screen[x][y]-=3;
 y--;
 }else if(screen[x][y-1]==2||screen[x][y-1]==6){
 if(screen[x][y-2]==0){
 screen[x][y-2]+=2;
 screen[x][y-1]+=1;
 screen[x][y]-=3;
 y--;
 }else if(screen[x][y-2]==1){
 return;
 }else if(screen[x][y-2]==2){
 return;
 }else if(screen[x][y-2]=4){
 screen[x][y-2]+=2;
 screen[x][y-1]+=1;
 screen[x][y]-=3;
 y--;
 }
 }
}
}

向右移動

void moved(){
 if(y<9){
 if(screen[x][y+1]==1){
 return;
 }else if(screen[x][y+1]==4){
 screen[x][y+1]+=3;
 screen[x][y]-=3;
 y++;
 }
 else if(screen[x][y+1]==0){
 screen[x][y+1]+=3;
 screen[x][y]-=3;
 y++;
 }else 
 if(screen[x][y+1]==2||screen[x][y+1]==6){
 if(screen[x][y+2]==0){
  screen[x][y+2]+=2;
  screen[x][y+1]+=1;
  screen[x][y]-=3;
  y++;
 }else if(screen[x][y+2]==4){
  screen[x][y+2]+=2;
  screen[x][y+1]+=1;
  screen[x][y]-=3;
  y++;
 }else if(screen[x][y+2]==2){
  return;
 }else if(screen[x][y+2]==1){
  return;
 }
 }
 
 }
}

主函數(shù)

這個主函數(shù)寫的有點亂,直接看注釋吧

int main(){
 int n,t;
 int j,k;
 int b=1;
 here:
 system("cls");//
 printf("開始游戲請按1\n退出游戲請按2\n"); 
 scanf("%d",&j);
 if(j==1){
 printf("請用wsad代表上下左右來進行游戲\n");//這個就引導進入游戲
 while(1){
 system("cls");/*在每一次移動過后都清除上一個地圖,不然就會每走
 一步生成一個圖*/
 print();//先打印地圖
 scanf("%c",&n);//讀入用戶的操作
 switch(n){
 case 'w':
 movew();
 break;
 case 's':
 moves();
 break;
 case 'a':
 movea();
 break;
 case 'd':
 moved();
 break;
 } //控制人移動
 t=win(); 
 if(t==1){
 goto there;
 }//每次操作完先判斷游戲是否勝利,如果勝利了直接跳到函數(shù)最后
 if(b == lose()){
 system("cls");
 print();
 printf("游戲失敗");
 return 0;
 } //游戲失敗提示
}
}else {
 system("cls");
 printf("您確認要退出游戲嗎\n確認退出按1\t返回上一層按2\n"); 
 scanf("%d",&k);
 if(k==1){
 printf("你已退出游戲,期待你的再次到來,謝謝"); 
 return 0;
 }else {
 goto here;
 }
}//這一塊是最前面用戶進入游戲那里的,如果用戶選擇退出游戲執(zhí)行的操作
 there:
 printf("恭喜你通過了游戲!");
 return 0;
}//主函數(shù) 

所有的代碼就到這里了,如果需要完整代碼可以留言

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

相關文章

  • C++中高性能內存池的實現(xiàn)詳解

    C++中高性能內存池的實現(xiàn)詳解

    在 C/C++ 中,內存管理是一個非常棘手的問題,我們在編寫一個程序的時候幾乎不可避免的要遇到內存的分配邏輯。本文將通過C++實現(xiàn)高性能內存池,感興趣的可以了解一下
    2022-10-10
  • C語言新手入門速通手冊

    C語言新手入門速通手冊

    C 語言是一種通用的、面向過程式的計算機程序設計語言。1972 年,為了移植與開發(fā) UNIX 操作系統(tǒng),丹尼斯·里奇在貝爾電話實驗室設計開發(fā)了 C 語言。C 語言是一種廣泛使用的計算機語言,它與 Java 編程語言一樣普及,二者在現(xiàn)代軟件程序員之間都得到廣泛使用
    2022-04-04
  • C語言實現(xiàn)的統(tǒng)計php代碼行數(shù)功能源碼(支持文件夾、多目錄)

    C語言實現(xiàn)的統(tǒng)計php代碼行數(shù)功能源碼(支持文件夾、多目錄)

    這篇文章主要介紹了C語言實現(xiàn)的統(tǒng)計php代碼行數(shù)功能源碼,支持文件夾、多級目錄的統(tǒng)計,在一些環(huán)境中會用到這個功能,需要的朋友可以參考下
    2014-08-08
  • C++實現(xiàn)對回收站里的文件進行操作的示例代碼

    C++實現(xiàn)對回收站里的文件進行操作的示例代碼

    這篇文章主要為大家詳細介紹了C++如何使用代碼對回收站里的文件進行操作,譬如文件的刪除與恢復等,文中的示例代碼講解詳細,具有一定的學習價值,感興趣的小伙伴快跟隨小編一起學習學習吧
    2023-06-06
  • 基于VS2019配置opencv4.0的方法步驟

    基于VS2019配置opencv4.0的方法步驟

    這篇文章主要介紹了基于VS2019配置opencv4.0的方法步驟,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2020-08-08
  • C++ 將一個文件讀入數(shù)組再讀出數(shù)組的方法

    C++ 將一個文件讀入數(shù)組再讀出數(shù)組的方法

    今天小編就為大家分享一篇C++ 將一個文件讀入數(shù)組再讀出數(shù)組的方法,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2018-07-07
  • OpenCV實現(xiàn)簡單攝像頭視頻監(jiān)控程序

    OpenCV實現(xiàn)簡單攝像頭視頻監(jiān)控程序

    這篇文章主要為大家詳細介紹了OpenCV實現(xiàn)簡單攝像頭視頻監(jiān)控程序,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2019-08-08
  • C/C++經(jīng)典實例之模擬計算器示例代碼

    C/C++經(jīng)典實例之模擬計算器示例代碼

    最近在看到的一個需求,本以為比較簡單,但花了不少時間,所以下面這篇文章主要給大家介紹了關于C/C++經(jīng)典實例之模擬計算器的相關資料,文中通過示例代碼介紹的非常詳細,需要的朋友可以參考借鑒,下面來一起看看吧。
    2017-10-10
  • c++中的單例類模板的實現(xiàn)方法詳解

    c++中的單例類模板的實現(xiàn)方法詳解

    這篇文章主要介紹了c++中的單例類模板的實現(xiàn)方法詳解,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2020-03-03
  • 深入了解C++11中promise和future的使用

    深入了解C++11中promise和future的使用

    C++11中promise和future機制是用于并發(fā)編程的一種解決方案,用于在不同線程完成數(shù)據(jù)傳遞(異步操作)。Promise和Future提供了訪問異步操作結果的機制,可以在線程之間傳遞數(shù)據(jù)和異常消息。本文就來聊聊二者的使用,希望對大家有所幫助
    2022-11-11

最新評論