通過陣列可以做到很多的事情,你甚至可以使用陣列來做一款簡易的游戲,下面教大家使用二維陣列實作一款簡易的迷宮游戲,
專案代碼放在了碼云(gitee)上,有興趣的可以下載看看,
https://gitee.com/YHF_200623/C_mazeGame
迷宮游戲
先簡單介紹一下游戲,游戲玩法和傳統的走迷宮一樣,控制角色走到出口游戲結束,
玩家操作的角色用 @ 表示,墻壁用 # 表示,道路用空格表示,

定義并初始化資料
需要的定義的資料有:
- 迷宮陣列
- 角色當前坐標
- 終點坐標
角色當前坐標和終點坐標沒啥好說的直接定義就可以了
int x = 3,y = 1; // 角色當前坐標(根據迷宮地圖初始化)
int final_x = 3, final_y =9; // 終點坐標(根據迷宮地圖初始化)
主要是迷宮陣列的定義,因為已經確定了玩家操作的角色用 @ 表示,墻壁用 # 表示,道路用空格表示,
可以有兩種表現方式:
????第一種是直接在迷宮陣列中寫字符的ASCII碼,使用 %c 的格式符輸出對應字符,
????第二種是在迷宮陣列中用0、1、2指代各種符號,在列印時判斷輸出對應的字符,
這里為了便于在代碼中觀察地圖,我使用第二種方法,
//迷宮陣列 墻壁=0 路=1 角色=2
int arr[10][10] = {
{0,0,0,0,0,0,0,0,0,0},
{0,1,0,0,0,0,0,0,1,0},
{0,1,0,0,0,0,0,0,1,0},
{0,2,0,0,0,0,0,0,1,1},
{0,1,0,0,0,0,0,0,1,0},
{0,1,1,1,1,1,1,0,1,0},
{0,1,1,0,0,0,1,0,1,0},
{0,1,1,0,0,0,1,1,1,0},
{0,0,0,0,0,0,0,0,0,0},
{0,0,0,0,0,0,0,0,0,0}
};
下面寫一下顯示地圖陳述句,
顯示地圖
顯示地圖其實就是遍歷迷宮陣列,在列印時判斷輸出對應的字符,用兩層for回圈加switch陳述句即可
//顯示迷宮
for(int i=0;i<10;i++)
{
for(int j=0;j<10;j++)
{
switch(arr[i][j])
{
case 0: printf("# ");break;
case 1: printf(" ");break;
case 2: printf("@ ");break;
}
}
printf("\n");
}
將上述代碼組合在一起,我們就有了如下代碼,并可以通過運行,顯示出迷宮地圖,
#include<stdio.h>
int main(int argc,const char* argv[])
{
//迷宮陣列 墻壁=0 路=1 角色=2
int arr[10][10] = {
{0,0,0,0,0,0,0,0,0,0},
{0,1,0,0,0,0,0,0,1,0},
{0,1,0,0,0,0,0,0,1,0},
{0,2,0,0,0,0,0,0,1,1},
{0,1,0,0,0,0,0,0,1,0},
{0,1,1,1,1,1,1,0,1,0},
{0,1,1,0,0,0,1,0,1,0},
{0,1,1,0,0,0,1,1,1,0},
{0,0,0,0,0,0,0,0,0,0},
{0,0,0,0,0,0,0,0,0,0}
};
int x = 3,y = 1; // 角色當前坐標(根據迷宮地圖初始化)
int final_x = 3, final_y =9; // 終點坐標(根據迷宮地圖初始化)
//顯示迷宮
for(int i=0;i<10;i++)
{
for(int j=0;j<10;j++)
{
switch(arr[i][j])
{
case 0: printf("# ");break;
case 1: printf(" ");break;
case 2: printf("@ ");break;
}
}
printf("\n");
}
}
運行結果:

清屏
每次顯示地圖時,上一次的地圖會殘留在終端上,看著很難受,linux系統可以使用函式system呼叫系統命令clear,實作清屏效果,需要呼叫頭檔案stdlib.h,windows系統可以使用windows.h頭檔案也可以使用stdlib.h,但里面的清屏命令需要改成cls,
system("clear");
獲取鍵盤輸入
可以使用getchar等函式獲取鍵盤的輸入,但是為了界面美觀,使用了一個getch.h的頭檔案,用來獲取鍵盤輸入,并隱藏視窗的輸入資訊,
百度網盤鏈接(getch.h)
提取碼:1111
如果是windows系統,可以使用自帶的 conio.h 中的,getch()方法,但是因為方向鍵會回傳兩個值,所以需要呼叫兩次,
#include<stdio.h>
#include<conio.h>
int main(int argc,const char* argv[])
{
while(1)
{
printf("%d\n",getch()+getch());
}
}
使用 linux 系統的朋友,只需要把getch.h頭檔案與程式代碼放在同一個目錄下即可,可以通過#include"getch.h"方式呼叫,也可將getch.h的內容復制到程式中,
#include<stdio.h>
#include"getch.h"
int main(int argc,const char* argv[])
{
while(1)
{
printf("%d\n",getch());
}
}
windows系統中回傳值與linux系統中的略有不同,建議使用前自己測驗一下方向鍵的回傳值,
| 方向鍵 | window | linux |
|---|---|---|
| 向上 | 296 | 183 |
| 向下 | 304 | 184 |
| 向左 | 299 | 186 |
| 向右 | 301 | 185 |
順便提一下#include""與#include<>的區別:
- #include<> 是從系統指定的路徑下加載頭檔案(作業系統是通過設定環境變數來指定加載頭檔案的路徑)
- #include “” 先從當前路徑(檔案路徑)下加載頭檔案,如果找不到,再去系統指定的路徑下加載
使用虛擬機的朋友可以放在共享檔案夾中(程式+頭檔案)
玩法實作
地圖有了,輸入也有了,如何把通過輸入控制角色(@)移動呢?角色移動其實就是通過對二維陣列中的內容進行操作,
打個比方,當我按向上鍵時,getch函式回傳給我一個值,我通過對這個回傳值進行判斷,執行角色向上走的操作,這個時候需要思考如何什么情況下角色可以往上走?當遇到上方是墻的時候,角色是不能移動的,只有當上方是路的時候,角色才能向上移動,這時把上方的值設為角色,把下方的值設為路,并且更新角色坐標,就實作了角色的移動,其他的操作也是如此,
代碼如下
//玩法實作
switch(getch())
{
case 183:
if(arr[x-1][y] == 1)
{
arr[x-1][y] = 2;
arr[x][y] = 1;
x--;
}
break;
case 184:
if(arr[x+1][y] == 1)
{
arr[x+1][y] =2;
arr[x][y] = 1;
x++;
}
break;
case 185:
if(arr[x][y+1] == 1)
{
arr[x][y+1] = 2;
arr[x][y] = 1;
y++;
}
break;
case 186:
if(arr[x][y-1] == 1)
{
arr[x][y-1] = 2;
arr[x][y] = 1;
y--;
}
break;
}
確定獲勝條件
什么時候游戲算結束了呢,當角色到達出口時,游戲就結束了,在程式中就是角色坐標等于終點坐標,因此可以寫出游戲結束的條件:
//結束判斷
if(x == final_x && y == final_y)
{
printf("游戲結束\n");
return 0;
}
組合代碼
我們現在已經實作的功能有:
- 顯示地圖
- 清屏
- 獲取鍵盤輸入
- 玩法實作
- 確定獲勝條件
一個游戲大部分的代碼都在這里了,我們需要對它們進行組裝使用即可,先捋一捋游戲流程:
- 清屏
- 顯示地圖
- 判斷獲勝條件
- 獲取鍵盤輸入
- 控制角色移動
- 回到第一步
根據游戲流程,可以看出需要使用死回圈,在每次回圈清屏并顯示地圖,然后判斷獲勝條件,如果獲勝就退出,否則游戲繼續,通過獲取鍵盤輸入的回傳值,執行對應的角色移動操作,然后進入下一次回圈,
組合代碼(linux)如下:
#include<stdio.h>
#include<stdlib.h>
#include"getch.h"
int main(int argc,const char* argv[])
{
//迷宮陣列 墻壁=0 路=1 角色=2
int arr[10][10] = {
{0,0,0,0,0,0,0,0,0,0},
{0,1,0,0,0,0,0,0,1,0},
{0,1,0,0,0,0,0,0,1,0},
{0,2,0,0,0,0,0,0,1,1},
{0,1,0,0,0,0,0,0,1,0},
{0,1,1,1,1,1,1,0,1,0},
{0,1,1,0,0,0,1,0,1,0},
{0,1,1,0,0,0,1,1,1,0},
{0,0,0,0,0,0,0,0,0,0},
{0,0,0,0,0,0,0,0,0,0}
};
int x = 3,y = 1; // 角色當前坐標(根據迷宮地圖初始化)
int final_x = 3, final_y =9; // 終點坐標(根據迷宮地圖初始化)
//游戲開始
while(1)
{
//清屏
system("clear");
//顯示迷宮
for(int i=0;i<10;i++)
{
for(int j=0;j<10;j++)
{
switch(arr[i][j])
{
case 0: printf("# ");break;
case 1: printf(" ");break;
case 2: printf("@ ");break;
}
}
printf("\n");
}
//結束判斷
if(x == final_x && y == final_y)
{
printf("游戲結束\n");
return 0;
}
//玩法實作
switch(getch())
{
case 183:
if(arr[x-1][y] == 1)
{
arr[x-1][y] = 2;
arr[x][y] = 1;
x--;
}
break;
case 184:
if(arr[x+1][y] == 1)
{
arr[x+1][y] = 2;
arr[x][y] = 1;
x++;
}
break;
case 185:
if(arr[x][y+1] == 1)
{
arr[x][y+1] = 2;
arr[x][y] = 1;
y++;
}
break;
case 186:
if(arr[x][y-1] == 1)
{
arr[x][y-1] = 2;
arr[x][y] = 1;
y--;
}
break;
}
}
}
windows 需要呼叫conio.h頭檔案,并且呼叫兩次getch()函式,同時,不同系統的鍵值不同,需要修改鍵值,最后,系統命令清屏,里面的清屏命令改成cls,
組合代碼(window)如下:
#include<stdio.h>
#include<conio.h>
#include<windows.h>
int main(int argc,const char* argv[])
{
//迷宮陣列 墻壁=0 路=1 角色=2
int arr[10][10] = {
{0,0,0,0,0,0,0,0,0,0},
{0,1,0,0,0,0,0,0,1,0},
{0,1,0,0,0,0,0,0,1,0},
{0,2,0,0,0,0,0,0,1,1},
{0,1,0,0,0,0,0,0,1,0},
{0,1,1,1,1,1,1,0,1,0},
{0,1,1,0,0,0,1,0,1,0},
{0,1,1,0,0,0,1,1,1,0},
{0,0,0,0,0,0,0,0,0,0},
{0,0,0,0,0,0,0,0,0,0}
};
int x = 3,y = 1; // 角色當前坐標(根據迷宮地圖初始化)
int final_x = 3, final_y =9; // 終點坐標(根據迷宮地圖初始化)
//游戲開始
while(1)
{
//清屏
system("cls");
//顯示迷宮
for(int i=0;i<10;i++)
{
for(int j=0;j<10;j++)
{
switch(arr[i][j])
{
case 0: printf("# ");break;
case 1: printf(" ");break;
case 2: printf("@ ");break;
}
}
printf("\n");
}
//結束判斷
if(x == final_x && y == final_y)
{
printf("游戲結束\n");
return 0;
}
//玩法實作
switch(getch()+getch())
{
case 296:
if(arr[x-1][y] == 1)
{
arr[x-1][y] = 2;
arr[x][y] = 1;
x--;
}
break;
case 304:
if(arr[x+1][y] == 1)
{
arr[x+1][y] = 2;
arr[x][y] = 1;
x++;
}
break;
case 301:
if(arr[x][y+1] == 1)
{
arr[x][y+1] = 2;
arr[x][y] = 1;
y++;
}
break;
case 299:
if(arr[x][y-1] == 1)
{
arr[x][y-1] = 2;
arr[x][y] = 1;
y--;
}
break;
}
}
}
如果需要顯示時間,只需要在記錄下游戲開始的時間以及游戲結束的時間,兩者相減即可,這里就不作演示了,
結語
希望這篇文章對你有所幫助
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/342091.html
標籤:python
