目錄
- 掃雷游戲介紹
- 掃雷的基本流程
- 用戶互動頁面
- 游戲回圈設定(一局不過癮,可以選擇一直玩)
- 建立棋盤
- 初始化棋盤
- 列印棋盤
- 布置雷局
- 統計(i,j)坐標周圍有幾個雷
- 排查雷
- 總代碼
- 博主總結
掃雷游戲介紹
《掃雷》是一款大眾類的益智小游戲,于1992年發行,游戲目標是在最短的時間內根據點擊格子出現的數字找出所有非雷格子,同時避免踩雷,踩到一個雷即全盤皆輸,

掃雷的基本流程
用戶互動頁面
首先我們需要創建一個選單欄函式,實作于用戶互動
//用戶互動頁面
void Menu()
{
printf("游戲規則:輸入行和列來排查雷區,如果踩中雷,被炸死,哈哈哈~~~\n");
printf("如果沒有踩中,會顯示當前格子周圍雷的數目,當所有不是雷的格子被排查光時,游戲獲勝\n");
printf("********************************\n");
printf("********** 1.play *********\n");
printf("********** 2.exit *********\n");
printf("********************************\n");
printf("輸入 1 開始游戲;輸入 0 退出游戲\n");
}
效果如圖

游戲回圈設定(一局不過癮,可以選擇一直玩)
這里我們需要用到一個學過的回圈陳述句:do-while回圈
int main()
{
srand((unsigned int)time(NULL));//用于產生亂數
int input;
do
{
Menu();//列印用戶互動頁面
scanf("%d", &input);
switch (input)
{
case 1:
printf("游戲開始->\n");
Game();
break;
case 0:
printf("退出游戲\n");
break;
default:
printf("輸入錯誤!請重新輸入\n");
break;
}
} while (input);
return 0;
}
建立棋盤
這里需要建立兩個陣列,一個用來存放布置好的雷的資訊,另一個用來存放查出雷的資訊,我們要建立的是9 * 9的棋盤,但是我們需要建立11 * 11的二維陣列,為什么吶,因為當我們判斷一個在角落的棋格周圍雷的數目時,如果僅僅只是一個9 * 9的陣列,判斷時會越界,因此我們需要陣列向外開大一格,但只在里面9 * 9的部分建立棋盤
如圖

//創建陣列
char mine[ROWS][COLS] = { 0 };//存放布置好的雷的資訊
char show[ROWS][COLS] = { 0 };//存放查出雷的資訊
初始化棋盤
我們將存放布置好的雷的資訊的陣列全部初始化為‘0’
將存放查出雷的資訊的陣列全部初始化為‘#’
//初始化棋盤
void InitBoard(char board[ROWS][COLS], int rows, int cols, char c)
{
for (int i = 0; i <rows; i++)
{
for (int j = 0; j < cols; j++)
board[i][j] = c;
}
}
列印棋盤
剛剛我們說了,我們建立的是一個11 * 11的陣列,但我們用到的只是9 * 9,周圍的一圈就浪費了呀,為了弘揚中華民族勤儉節約的良好美德,我們將周圍一圈存放棋盤的行和列,利用了陣列,又讓下棋時更加直接看出行和列,
//列印棋盤
void PrintBoard(char board[][COLS],int row, int col)
{
printf("-----------掃雷游戲----------\n");
for (int i = 0; i <=col; i++)
{
printf("%d ", i);
}
printf("\n");
for (int i = 1; i <= row; i++)
{
printf("%d ", i);
for (int j = 1; j <= col; j++)
{
printf("%c ", board[i][j]);
}
printf("\n");
}
printf("-----------掃雷游戲----------\n");
}
效果如圖

布置雷局
我們將‘1’作為雷,安放到棋盤中
//布置雷
void SetMine(char board[ROWS][COLS])
{
int count = COUNT;
while (count)
{
int i = rand() % ROW + 1;
int j = rand() % COL + 1;
if (board[i][j] == '0')
{
board[i][j] = '1';
count--;
}
}
}
效果如圖

統計(i,j)坐標周圍有幾個雷
這里我們用到了ASCII表的知識,‘0’在ASCII表上的值為48,‘1’為49,我們將(i,j)周圍八個字符的ASCII值想加,減去8 * ‘0’的ASCII的值,就可以得到周圍有幾個‘1’,即得到周圍有幾個雷
//判斷周圍有幾個雷
int GetMineCount(char mine[ROWS][COLS], int i,int j)
{
return mine[i - 1][j - 1] +
mine[i - 1][j] +
mine[i - 1][j + 1] +
mine[i][j - 1] +
mine[i][j + 1] +
mine[i + 1][j - 1] +
mine[i + 1][j] +
mine[i + 1][j + 1] - 8 * '0';
}
排查雷
//排雷
void FintMine(char mine[ROWS][COLS], char show[ROWS][COLS],int row,int col)
{
int i, j;
int win = 0;
while (win<col*row-COUNT)
{
printf("請輸入需要排查的行和列:");
scanf("%d%d", &i, &j);
if (i >= 1 && j >= 1 && i <= row && j <= col)//判斷輸入的行與列是否合法
{
if (mine[i][j] == '1')
{
printf("很不幸,你被炸死了\n");
PrintBoard(mine, ROW, COL);
break;
}
else
{
int count = GetMineCount(mine, i, j);
show[i][j] =count+'0';
win++;
PrintBoard(show, ROW, COL);//顯示該格子周圍有幾個雷
}
}
else
{
printf("輸入錯誤!請重新輸入\n");
}
}
if (win == col * row - COUNT)
{
printf("恭喜你獲勝了!\n");
}
}
總代碼
為了方便代碼的管理與測驗,我將全部代碼分為了三部分
1.頭檔案:用于函式的申明
2.game.c檔案:用于函式的實作
3.text.c檔案:代碼的測驗
頭檔案
#pragma once
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#define ROW 9
#define COL 9
#define ROWS 11
#define COLS 11
#define COUNT 10
//用戶互動頁面
void Menu();
//游戲實作
void Game();
//初始化棋盤
void InitBoard(char board[ROWS][COLS],int rows,int cols,char c);
//列印棋盤
void PrintBoard(char board[ROWS][COLS],int row,int col);
//布置雷
void SetMine(char board[ROWS][COLS]);
//排雷
void FintMine(char mine[ROWS][COLS], char[ROW][COL],int row,int col);
game.c檔案
#include "game.h"
//用戶互動頁面
void Menu()
{
printf("游戲規則:輸入行和列來排查雷區,如果踩中雷,被炸死,哈哈哈~~~\n");
printf("如果沒有踩中,會顯示當前格子周圍雷的數目,當所有不是雷的格子被排查光時,游戲獲勝\n");
printf("********************************\n");
printf("********** 1.play *********\n");
printf("********** 2.exit *********\n");
printf("********************************\n");
printf("輸入 1 開始游戲;輸入 0 退出游戲\n");
}
//游戲實作
void Game()
{
char mine[ROWS][COLS] = { 0 };//存放布置好的雷的資訊
char show[ROWS][COLS] = { 0 };//存放查出雷的資訊
InitBoard(mine, ROWS, COLS, '0');
InitBoard(show, ROWS, COLS, '#');
//PrintBoard(mine, ROW, COL);
PrintBoard(show, ROW, COL);
SetMine(mine, ROW, COL);
//PrintBoard(mine, ROW, COL);
FintMine(mine, show, ROW, COL);
}
//初始化棋盤
void InitBoard(char board[ROWS][COLS], int rows, int cols, char c)
{
for (int i = 0; i <rows; i++)
{
for (int j = 0; j < cols; j++)
board[i][j] = c;
}
}
//列印棋盤
void PrintBoard(char board[][COLS],int row, int col)
{
printf("-----------掃雷游戲----------\n");
for (int i = 0; i <=col; i++)
{
printf("%d ", i);
}
printf("\n");
for (int i = 1; i <= row; i++)
{
printf("%d ", i);
for (int j = 1; j <= col; j++)
{
printf("%c ", board[i][j]);
}
printf("\n");
}
printf("-----------掃雷游戲----------\n");
}
//布置雷
void SetMine(char board[ROWS][COLS])
{
int count = COUNT;
while (count)
{
int i = rand() % ROW + 1;
int j = rand() % COL + 1;
if (board[i][j] == '0')
{
board[i][j] = '1';
count--;
}
}
}
//判斷周圍有幾個雷
int GetMineCount(char mine[ROWS][COLS], int i,int j)
{
return mine[i - 1][j - 1] +
mine[i - 1][j] +
mine[i - 1][j + 1] +
mine[i][j - 1] +
mine[i][j + 1] +
mine[i + 1][j - 1] +
mine[i + 1][j] +
mine[i + 1][j + 1] - 8 * '0';
}
//排雷
void FintMine(char mine[ROWS][COLS], char show[ROWS][COLS],int row,int col)
{
int i, j;
int win = 0;
while (win<col*row-COUNT)
{
printf("請輸入需要排查的行和列:");
scanf("%d%d", &i, &j);
if (i >= 1 && j >= 1 && i <= row && j <= col)//判斷輸入的行與列是否合法
{
if (mine[i][j] == '1')
{
printf("很不幸,你被炸死了\n");
PrintBoard(mine, ROW, COL);
break;
}
else
{
int count = GetMineCount(mine, i, j);
show[i][j] =count+'0';
win++;
PrintBoard(show, ROW, COL);//顯示該格子周圍有幾個雷
}
}
else
{
printf("輸入錯誤!請重新輸入\n");
}
}
if (win == col * row - COUNT)
{
printf("恭喜你獲勝了!\n");
}
}
text.c檔案
#include "game.h"
int main()
{
srand((unsigned int)time(NULL));//用于產生亂數
int input;
do
{
Menu();//列印用戶互動頁面
scanf("%d", &input);
switch (input)
{
case 1:
printf("游戲開始->\n");
Game();
break;
case 0:
printf("退出游戲\n");
break;
default:
printf("輸入錯誤!請重新輸入\n");
break;
}
} while (input);
return 0;
}
博主總結
好了,這次的小游戲分享就到這了,但是掃雷這個游戲不僅僅是這么一點點東西,其實它還可以繼續優化,比如:周圍無雷展開一盤(用遞回實作)、可以標記認為是雷的格子等等,這些就交給各位讀者朋友了去發現和創造了,
最后,如果本文章對你有一點點的幫助,那請點上一個小贊,您的支持與鼓勵,將是我繼續寫作的不竭動力,非常感謝~~
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/281731.html
標籤:其他
