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)的統(tǒng)計php代碼行數(shù)功能源碼(支持文件夾、多目錄)
這篇文章主要介紹了C語言實現(xiàn)的統(tǒng)計php代碼行數(shù)功能源碼,支持文件夾、多級目錄的統(tǒng)計,在一些環(huán)境中會用到這個功能,需要的朋友可以參考下2014-08-08C++ 將一個文件讀入數(shù)組再讀出數(shù)組的方法
今天小編就為大家分享一篇C++ 將一個文件讀入數(shù)組再讀出數(shù)組的方法,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2018-07-07OpenCV實現(xiàn)簡單攝像頭視頻監(jiān)控程序
這篇文章主要為大家詳細介紹了OpenCV實現(xiàn)簡單攝像頭視頻監(jiān)控程序,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下2019-08-08