前言
閱讀水平條件:
C語言的基本語法:
- 條件陳述句if,switch;
- 回圈陳述句for ,while, do while,
- 函式
- 陣列
文章目錄
- 前言
- 一 掃雷游戲的需求
- 二 掃雷游戲的需求分析
- 三 掃雷的代碼實作
- 1 掃雷的選單和互動邏輯的實作
- 2 掃雷游戲的功能
- 1)掃雷的初始化功能
- 2)掃雷的顯示功能
- 3)掃雷的設定雷資訊
- 4)掃雷的排雷功能
一 掃雷游戲的需求
我們實作一個 9 * 9 的宮格掃雷,有81 個格子,在 81個格子隨機放入 10個雷;當輸入格子對應坐標時候,開始掃雷,掃到雷游戲結束,沒掃到雷,則繼續游戲,直到掃完為止;
二 掃雷游戲的需求分析
- 9*9的九宮格:可以用一個二維陣串列示;
- 隨機放入10個雷:使用隨機種子函式,用 字符 1 表示 雷,字符 0表示無雷,回圈實作;
- 開始掃雷:計算坐標的周圍雷的個數,并且顯示出另一個二維陣列中;
三 掃雷的代碼實作
前提準備檔案:(筆者用vs2013創建的檔案)
game.c 檔案:用于實作掃雷游戲的功能函式;
game.h 檔案:用于宣告函式,和宣告一些頭檔案;
text.c 檔案:用于主函式測驗游戲檔案;

game.h 頭檔案代碼:
# pragma once
# define _CRT_SECURE_NO_WARNINGS 1
# include<stdio.h>
# include<stdlib.h> //亂數種子 srand()的頭檔案
# include<time.h> //時間函式time 的頭檔案
# define ROW 9 //實際行號
# define COL 9 //實際列號
# define ROWS ROW+2 //虛擬行號,防止越界
# define COLS COL+2 //虛擬行號,防止越界
# define EASY_COUNT 10 //雷的個數
//初始化宮格
void InitBoard(char board[ROWS][COLS], int rows, int cols, char set);
//顯示宮格
void ShowBoard(char board[ROWS][COLS], int row, int col);
//設定宮格
void SetBoard(char board[ROWS][COLS], int row, int col);
//排雷功能
void FindMine(char mine[ROWS][COLS], char show[ROWS][COLS], int row, int col);
game.c 檔案代碼就是 掃雷游戲功能函式的集合;
1 掃雷的選單和互動邏輯的實作
首先:我們需要一個簡易的選單函式:顯示游戲界面的選單;
其次:我們需要選擇游戲開始的按鍵和游戲結束的按鍵;
接著:選擇游戲時候可以用 do while 回圈,switch 陳述句實作;
最后:設定選擇 1開始游戲,選擇 0 退出游戲;
主函式基本代碼邏輯:
int main()
{
int input = 0;
srand((unsigned int)time(NULL));
do
{
menu();
printf("請選擇:》");
scanf("%d", &input);
switch (input)
{
case 1:
game();
break;
case 0:
printf("退出游戲!\n");
break;
default:
printf("選擇有誤,重寫選擇:\n\n");
break;
}
} while (input);
system("pause");
return 0;
}
2 掃雷游戲的功能
- 需要 2 個二維陣列,一個用于存放雷的資訊陣列,一個用于玩家界面看到的陣列;
- 陣列的大小設定為 11 * 11的大小,因為,在排雷的程序中,可能會發生排雷在陣列的邊界,假如9 * 9的話,會造成越界,但是,實際使用的是9*9的陣列,如下圖:

- 對2個 11*11的陣列進行初始化,初始化時候給存放雷的陣列,全為 0;玩家顯示的宮格陣列全是 * ;
- 開始設定 雷的位置,用 1 表示雷,無雷 用 0 表示;
- 顯示玩家宮格排雷的資訊;
- 開始排雷;
如下代碼:
void game()
{
char mine[ROWS][COLS] = { 0 };//存放雷的資訊
char show[ROWS][COLS] = { 0 };//顯示排除出雷的資訊
//初始化棋盤
InitBoard(mine, ROWS, COLS, '0');
InitBoard(show, ROWS, COLS, '*');
//設定雷的位置
SetBoard(mine, ROW, COL);
ShowBoard(mine, ROW, COL);
//顯示棋盤
ShowBoard(show, ROW, COL);
//開始排查雷
FindMine(mine, show,ROW, COL);
}
1)掃雷的初始化功能
初始化,本質就是給二維陣列設定值:
注意傳入的引數:
ROWS 在頭檔案定義的 11
COLS 在頭檔案定義的 11
set 為陣列存放的字符
void InitBoard(char board[ROWS][COLS], int rows, int cols, char set)
{
for (int i = 0; i < rows; i++)
{
for (int j = 0; j < cols; j++)
{
board[i][j] = set;
//printf("%d ", board[i][j]);
}
}
}
2)掃雷的顯示功能
主要控制賦值的地方是在下標【1,9】的地方即可;
其他的都是修飾
void ShowBoard(char board[ROWS][COLS], int row, int col)
{
for (int i = 0; i <=row+1; i++) //顯示棋盤的行號
{
if (i == 0) //第一個下標顯示掃字
{
printf("掃 ");
continue;
}
if (i == row+1) //第10個下標時候顯示雷字
{
printf("雷");
continue;
}
printf("%d ", i); //下標1-9顯示 數字
}
printf("\n");
for (int i = 0; i <= row+1; i++) //分割棋盤的作用
{
printf("__");
}
printf("\n");
for (int i = 1; i <= row+1; i++) //顯示棋盤的內容,下標為為 1-9 二維陣列的范圍
{
if (i != row + 1) //顯示豎列的棋盤數字和分割豎列的棋盤
{
printf("%d ", i);
printf("|");
}
if (i == row + 1) //在棋盤最后一行的下一行列印--符號分割
{
for (int j = 0; j <= col + 1; j++)
{
printf("--");
}
printf(" \n");
continue; //跳過外層回圈,不然其再列印棋盤大小了
}
//顯示棋盤的內容
for (int j = 1; j <= col+1; j++)
{
if (j == col + 1) //顯示棋盤最后1列的下一列的分割符號
{
printf("|");
continue;
}
printf("%c ", board[i][j]);
}
printf("\n");
}
}
顯示效果:

3)掃雷的設定雷資訊
void SetBoard(char board[ROWS][COLS], int row, int col)
{
int count = EASY_COUNT;
while (count)
{
//生成隨機下標插入 雷的資訊
int x = rand() % row + 1;//保持下標在 1 - 9 的位置
int y = rand() % col + 1;
if (board[x][y] != '1') //隨機下標下落點,不能有下落過的地方
{
board[x][y] = '1';
count--;
}
}
}
效果顯示:

4)掃雷的排雷功能
int GetMineCount(char mine[ROWS][COLS], int x, int y) //統雷的個數
{
int count = 0;
for (int i = x - 1; i <= x + 1;i++)
{
for (int j = y - 1; j <= y + 1; j++)
{
if (mine[i][j] == '1') count++;
}
}
return count;
}
void FindMine(char mine[ROWS][COLS], char show[ROWS][COLS], int row, int col)
{
int x = 0;
int y = 0;
int win = 0;
while (win <row*col - EASY_COUNT)
{
printf("請輸入你要排雷的坐標位置:");
scanf("%d %d", &x, &y);
if (x >= 1 && x <= row && y >= 1 && y <= col )//保證坐標合法,且在合適的坐標排雷
{
if (mine[x][y] == '1') //排中雷
{
printf("很遺憾,你排中地雷了,\n!!!游戲結束!!!\n");
SetBoard(mine, ROW, COL);
break;
}
else //排的不是雷
{
int count = GetMineCount(mine, x, y); //統計雷的個數
show[x][y] = count + '0'; //count是數字,要加個字符’0‘,轉化為字符count
ShowBoard(show, ROW, COL);
win++;
}
}
else
{
printf("你輸入的非法坐標,請重新輸入:");
}
}
if (win == row*col - EASY_COUNT)
printf("恭喜你,排雷成功,游戲結束啦\n");
}
最終效果:

轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/291130.html
標籤:其他
