推箱子遊戲C語言實現代碼
今天我來分享一道對於初學C語言的同學非常有啟發作用的編程例題,是用C語言實現單張地圖推箱子的小遊戲。
這個遊戲是基於Linux環境下編程的,所用工具為ubuntu、和gcc編譯器。
首先推箱子的地圖,我們根據經典遊戲推箱子中的其中一幅地圖來自做,圖片如下。
用圖片形式實現這張圖片對於初學編程的同學來說,難以實現,所以我們選擇用字符代替的形式來實現這張地圖。
我們采用2為數組的方式來存儲這張地圖,具體的數字與字符含義轉換如下:
0 printf(” “); 路
2 printf(“@”); 人
3 printf(“#”); 墻
4 printf(“$”); 箱子
5 printf(“O”); 目標點
7 printf(“@”); 人
9 printf(“$”); 箱子
代碼如下:
#include <stdio.h> #include <stdlib.h> #include <stdbool.h> #include <getch.h> int mx = 0; int my = 0; int step = 0; char map[8][8] = { {0,0,3,3,3,3,0,0}, {0,0,3,5,5,3,0,0}, {0,3,3,0,5,3,3,0}, {0,3,0,0,4,5,3,0}, {3,3,0,4,0,0,3,3}, {3,0,0,3,4,4,0,3}, {3,0,0,2,0,0,0,3}, {3,3,3,3,3,3,3,3} }; void show_map(void) { for(int i=0;i<8;i++) { for(int j=0;j<8;j++) { if(0 == map[i][j]) { printf(" "); } else if(2 == map[i][j]) { printf("@ "); } else if(3 == map[i][j]) { printf("# "); } else if(4 == map[i][j]) { printf("$ "); } else if(5 == map[i][j]) { printf("O "); } else if(7 == map[i][j]) { printf("@ "); } else if(9 == map[i][j]) { printf("$ "); } } printf("\n"); } } void up(void) { for(int i=0; i<8;i++) { for(int j=0; j<8;j++) { if(2 == map[i][j] || 7 == map[i][j]) { mx =i; my =j; } } } if(3 == map[mx-1][my]) { return; } else if(0 == map[mx-1][my] || 5 == map[mx-1][my]) { map[mx-1][my] += 2; map[mx][my] -= 2; step++; } else if(4 == map[mx-1][my] || 9 == map[mx-1][my]) { if(0 == map[mx-2][my]) { map[mx-2][my] += 4; map[mx-1][my] -= 2; map[mx][my] -= 2; step++; } else if(5 == map[mx-2][my]) { map[mx-2][my] += 4; map[mx-1][my] -= 2; map[mx][my] -= 2; step++; } else { return; } } } void down(void) { for(int i=0; i<8;i++) { for(int j=0; j<8;j++) { if(2 == map[i][j] || 7 == map[i][j]) { mx =i; my =j; } } } if(3 == map[mx+1][my]) { return; } else if(0 == map[mx+1][my] || 5 == map[mx+1][my]) { map[mx+1][my] += 2; map[mx][my] -= 2; step++; } else if(4 == map[mx+1][my] || 9 == map[mx+1][my]) { if(0 == map[mx+2][my]) { map[mx+2][my] += 4; map[mx+1][my] -= 2; map[mx][my] -= 2; step++; } else if(5 == map[mx+2][my]) { map[mx+2][my] += 4; map[mx+1][my] -= 2; map[mx][my] -= 2; step++; } else { return; } } } void left(void) { for(int i=0; i<8;i++) { for(int j=0; j<8;j++) { if(2 == map[i][j] || 7 == map[i][j]) { mx =i; my =j; } } } if(3 == map[mx][my-1]) { return; } else if(0 == map[mx][my-1] || 5 == map[mx][my-1]) { map[mx][my-1] += 2; map[mx][my] -= 2; step++; } else if(4 == map[mx][my-1] || 9 == map[mx][my-1]) { if(0 == map[mx][my-2]) { map[mx][my-2] += 4; map[mx][my-1] -= 2; map[mx][my] -= 2; step++; } else if(5 == map[mx][my-2]) { map[mx][my-2] += 4; map[mx][my-1] -= 2; map[mx][my] -= 2; step++; } else { return; } } } void right(void) { for(int i=0; i<8;i++) { for(int j=0; j<8;j++) { if(2 == map[i][j] || 7 == map[i][j]) { mx =i; my =j; } } } if(3 == map[mx][my+1]) { return; } else if(0 == map[mx][my+1] || 5 == map[mx][my+1]) { map[mx][my+1] += 2; map[mx][my] -= 2; step++; } else if(4 == map[mx][my+1] || 9 == map[mx][my+1]) { if(0 == map[mx][my+2]) { map[mx][my+2] += 4; map[mx][my+1] -= 2; map[mx][my] -= 2; step++; } else if(5 == map[mx][my+2]) { map[mx][my+2] += 4; map[mx][my+1] -= 2; map[mx][my] -= 2; step++; } else { return; } } } void start_soko(void) { FILE* frp = fopen("soko.bin","r"); if(NULL == frp) { printf("數據加載錯誤!\n"); return; } fread(map,1,64,frp); fclose(frp); } void exit_soko(void) { FILE* fwp = fopen("soko.bin","w"); printf("____"); if(NULL == fwp) { printf("數據保存錯誤!\n"); } fwrite(map,1,64,fwp); fclose(fwp); } int main() { start_soko(); while(true) { system("clear"); //顯示地圖 show_map(); //判定是否遊戲結束 int cnt = 0; for(int i=0; i<8; i++) { for(int j=0; j<8;j++) { if(9 == map[i][j]) { cnt++; } } } if(4 == cnt) { printf("遊戲結束,共使用%d步!\n",step); return 0; } printf("%d\n",cnt); //獲取方向鍵 switch(getch()) { case 'w':up();break; case 's':down();break; case 'a':left();break; case 'd':right();break; case 'q':exit_soko();return 0; default: puts("輸入指令有誤!"); } } exit_soko(); }
更多有趣的經典小遊戲實現專題,分享給大傢:
C++經典小遊戲匯總
python經典小遊戲匯總
python俄羅斯方塊遊戲集合
JavaScript經典遊戲 玩不停
java經典小遊戲匯總
javascript經典小遊戲匯總
以上就是本文的全部內容,希望對大傢的學習有所幫助,也希望大傢多多支持WalkonNet。