目錄
推薦閱讀順序(不建議跳過)
輔助閱讀:
掃雷小游戲的游戲規則
游戲規則:
小游戲界面:
程式實作的步驟:
game.h(頭檔案)
test.c(源檔案)
選單函式
游戲實作函式
主函式(main)
game.c(源檔案)
初始化陣列函式
列印棋盤
電腦隨機布置雷
找雷
推薦閱讀順序(不建議跳過)
掃雷小游戲的游戲規則——> 程式實作的步驟 ——> test.c部分 ——> 在test.c中找到main()函式 ——> 從main函式的第一步開始看 ——> 遇到自定義函式到game.h源檔案中找到相應函式的詳情,
輔助閱讀:
game.h檔案中 —— 函式的宣告(參考頭檔案)
game.c檔案中 —— 函式的詳情(怎么用代碼實作相應步驟的)
test.c檔案中 —— 整體的大致思路
用不同檔案分裝代碼是為了:能夠讓自己的代碼更有條理,思路更加的清晰,別人也更容易看懂
如果覺得翻來翻去太過于麻煩:請打開自己現在的編譯器 —— 把代碼先拷貝一份(按照不同的檔案進行分裝,也可以放在同一個檔案中(test.c)) —— 遇到自定義函式時(把滑鼠放在函式名上面、右擊、轉到定義)(這樣編譯器可以直接轉到game.c檔案中的函式詳情)
掃雷小游戲的游戲規則
我所實作的掃雷小游戲是比較簡單的版本(利用基礎的C語言來實作的),其中會涉及陣列,回圈陳述句,選擇陳述句,函式的基礎知識,不會太難,目的就是為了讓每個看這個文章的人都能理解掃雷小游戲實作的計算機思想是什么樣的:
游戲規則:
界面上會出現一個都是字符 * 的正方形界面 —— 輸入坐標 —— 如果輸入的坐標放的是雷就是被炸死(如果放的不是雷,就會顯示坐標周圍有幾個雷) —— 如果71個不是雷的坐標被全部排完就贏了(否則就會被炸死)
小游戲界面:

程式實作的步驟:
1、在螢屏上列印選單(提示你要選擇的內容)
2、定義兩個陣列,初始化陣列( 一個陣列替換成‘ * ’,另一個陣列替換成‘ 0 ’)
解釋:為什么要定義兩個陣列,并且陣列是11*11二維陣列的
第一個陣列中放 0(坐標放的不是炸彈) 和 1(坐標放的是炸彈),第二個陣列中放 ‘ * ’和坐標周圍炸彈的個數(炸彈的個數是利用第一個陣列中坐標周圍數字相加所得)
定義兩個陣列是能夠對數字 1 做出區分:如果使用一個陣列,就無法判斷 1 表示的是周圍雷的個數,還是1本身就是雷
陣列是11*11二維陣列是為了不讓陣列越界:這個掃雷小游戲是簡單版的(9*9),但是為了計算周圍雷的個數要把坐標周圍的數字相加,如果選擇的坐標是(1.1),計算坐標周雷的個數,就會出現陣列越界的情況,所以我定義了比9*9大一圈的陣列11*11的(只在中間9*9的陣列上創建 雷(1)),
3、把掃雷小游戲的棋盤列印出來,
4、系統隨機放置10個炸彈,在初始化全是0的陣列中放入10個 1 (1 就表示炸彈)
5、玩家排雷
6、判斷輸入坐標是否是炸彈(如果是被炸死,如果不是就在全放‘ * ’的陣列中顯示周圍有幾個雷),判斷周圍雷的個數,用陣列初始化全是0的陣列,周圍的數字相加就得到了,周圍雷的個數,
7、然后重復上述的程序,直到游戲結束,
8、可以多次玩這個游戲,
game.h(頭檔案)
頭檔案是用來宣告函式的,函式放在主函式main的后面就要先宣告函式,然后才能使用函式,
#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
#define Hangs 11 //define定義的識別符號常量
#define Lies 11
#define Hang Hangs - 2
#define Lie Lies - 2
#define easy_count 10
#include<stdlib.h>
#include<time.h>
//初始化陣列
void init_board(char board[Hangs][Lies], int hangs, int lies, char set);
//列印棋盤
void display_board(char board[Hangs][Lies], int hang, int lie);
//布置雷
void set_hide(char board[Hangs][Lies], int hang, int lie);
//找到坐標周圍有幾個雷
void find_hide(char hide[Hangs][Lies], char show[Hangs][Lies], int hang, int lie);
test.c(源檔案)
整體的大致思路 —— game()函式中的函式放在了game.c檔案中
選單函式
—— 列印簡易選單供你選擇:
void menu()
{
printf("###############################\n");
printf("######### 1、玩游戲 #########\n");
printf("######### 0、退出游戲 #########\n");
printf("###############################\n");
}
游戲實作函式
—— 實作掃雷的主要功能
#define _CRT_SECURE_NO_WARNINGS 1
#include"game.h"
void game()
{
//定義陣列
//Hangs —— 請翻到頭檔案 —— 表示數字11
//同理,Lies —— 11,Hang —— 9, Lie —— 9
char hide[Hangs][Lies] = { 0 }; //存放雷的資訊
char show[Hangs][Lies] = { 0 }; //排查雷的資訊
//初始化陣列
//一個陣列放0(表示無雷的坐標)和1(表示雷的坐標) —— 這個陣列不顯示不列印
init_board(hide, Hangs, Lies, '0');
//下面這個陣列放數字 —— 這個數字表示坐標周圍有幾個雷 —— 顯示列印這個數字
init_board(show, Hangs, Lies, '*');
//列印棋盤 —— 除錯的時候可以用到
//display_board(hide, Hang, Lie);
//display_board(show, Hang, Lie);
//電腦隨機布置雷
set_hide(hide, Hang, Lie);
//display_board(hide, Hang, Lie);
display_board(show, Hang, Lie);
//找雷
find_hide(hide, show, Hang, Lie);
}
主函式(main)
—— 程式的入口,實作選單選擇界面的回圈
int main()
{
int input = 0;
srand((unsigned int)time(NULL));
//生成亂數要用到rand()
//用rand()要呼叫srand()
//srand()其中()中要用到不斷變化的量 —— 用時間戳來做不斷變化的量 —— 時間戳可以用time()函式來展現
//(unsigned int) —— 是強制型別轉換
//srand()函式不用參考多次,所以放在回圈的前面就可以了
do
{
menu();
printf("請選擇:");
scanf("%d", &input);
switch (input)
{
case 1:
game();
break;
case 0:
printf("退出游戲\n");
break;
default:
printf("輸入錯誤,請重新輸入\n");
break;
}
} while (input); //輸入1開始游戲,輸入0退出游戲
return 0;
}
game.c(源檔案)
實作前面程序中用的函式
初始化陣列函式
#define _CRT_SECURE_NO_WARNINGS 1
#include"game.h"
//初始化陣列
void init_board(char board[Hangs][Lies], int hangs, int lies, char set)
//傳入四個變數,陣列,行數,列數,和要初始化成的字母
{
int i = 0;
for (i = 0; i < hangs; i++)
{
int j = 0;
for (j = 0; j < lies; j++)
{
board[i][j] = set;
}
}
}
列印棋盤
—— 把棋盤中現在的狀態列印出來
//列印陣列
void display_board(char board[Hangs][Lies], int hang, int lie)
{
int i = 0;
printf("--------------------\n");
for (i = 0; i <= hang; i++) //列印周圍的第一行0 1 2 3 4 5 6 7 8 9
{
printf("%d ", i);
}
printf("\n");
for (i = 1; i <= hang; i++)
{
printf("%d ", i); //列印第一列 1 2 3 4 5 6 7 8 9
int j = 0;
for (j = 1; j <= lie; j++)
{
printf("%c ", board[i][j]); //列印中間9*9陣列中的內容
}
printf("\n");
}
printf("--------------------\n");
}
電腦隨機布置雷
—— 利用生成亂數來實作
void set_hide(char board[Hangs][Lies], int hang, int lie)
{
int x = 0;
int y = 0;
int count = 0;
while (count < easy_count)
{
x = rand() % hang + 1; //生成1到9的隨機下標
y = rand() % lie + 1;
if (board[x][y] != '1')
{
board[x][y] = '1'; //把生成的隨機坐標放上雷(1)
count++;
}
}
}
找雷
void find_hide(char hide[Hangs][Lies], char show[Hangs][Lies], int hang, int lie)
{
int x = 0;
int y = 0;
int count = 0;
while (count < hang * lie - easy_count) //如果回圈了71次就跳出回圈(贏了)
//easy_count —— 請翻到頭檔案 —— 表示數字10
{
printf("請輸入:");
scanf("%d %d", &x, &y);
if (x>0 && x<=hang && y>0 && y<=lie)
{
if (hide[x][y] != '1') //計算坐標周圍雷的個數
{
show[x][y] = hide[x][y - 1] +
hide[x + 1][y - 1] +
hide[x + 1][y] +
hide[x + 1][y + 1] +
hide[x][y + 1] +
hide[x - 1][y + 1] +
hide[x - 1][y] +
hide[x - 1][y - 1] - 8 * '0' + '0'; //因為是字符1,所以要減去字符0
display_board(show, Hang, Lie); //得到數字1
count++;
}
else
{
printf("很遺憾,你輸了:");
display_board(hide, Hang, Lie);
break;
}
}
else
{
printf("輸入錯誤請重新輸入:");
}
}
if (count == hang * lie - easy_count)
{
printf("恭喜你,排完了所有雷");
}
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/292139.html
標籤:其他
上一篇:C語言實作小游戲:掃雷
下一篇:什么是人工智能?
