關于掃雷的簡易實作
該掃雷特性:
- 第一次點擊一定不為雷
- 容易易實作
首先,我們依然是像三子棋游戲一樣,創建兩個源檔案和一個頭檔案:

然后便是我們的主函式部分:
因為是測驗部分,寫一個測驗函式來放置我們的代碼:

接下來是test函式的實作:

此處的menu函式為列印選單函式,也即為提示一下玩家該選什么,由此進入到我們的switch case陳述句中去判斷下一步應該執行什么陳述句
輸入1后進入游戲:(掃雷游戲暫時以列印的方式來代替),這樣的話基本邏輯我們就寫好了,現在重點來寫一下掃雷游戲的實作
將printf陳述句改為game()函式來實作,現在我們要玩掃雷游戲,那掃雷游戲是怎么樣的呢,現拿一個已經寫好的程式來看一下

現在列印的是棋盤,而我們又要存盤資訊,因此,我們需要創建一個二維陣列來實作,但我們現在想把字符1是我們的雷,要怎么辦呢,因此,我們創建兩個陣列,一個用來存放雷,一個用來存放排雷資訊的陣列,但我們排雷的時候,需要向八個方向排雷,但四個角落的坐標怎么辦呢?向8個方向進行判斷很有可能會越界.因此,我們不創建9,9的陣列,而進而創建一個11,11的陣列,但我們所使用的仍然是9*9的陣列,因此我們定義四個識別符號常量,
既然已經在頭檔案中定義了,不然我們干脆把頭檔案的包含全都放進去,

因此,現在來到我們的game函式內部:
首先是我們的初始化函式部分:>

將mine 和 show陣列初始化為我們想要的元素,把布置雷的陣列先初始化為0,把展示的陣列初始化為’*‘,這樣就可以達到我們想要的效果,InitBoard函式定義部分:
既然棋盤已經初始化完成,我們列印出來看看效果如何,撰寫一個DisplayBoard函式來實作,請看下圖

第一個for回圈列印出來的便是每一列的列號,而是在下一個回圈中列印出來的,現在我們來看一下列印效果


既然已經列印好了,那么現在我們要來布置雷了,布置雷,我們用一個SetMine函式來實作,請看下圖

因為我們要放置十個雷,用count = 10 來計數,并產生隨機坐標來放置雷
雷都已經放好了,現在應該開始掃雷了吧,接下來開始我們的掃雷部分,撰寫一個SweepMine函式來實作

此處里層的CountMine函式,是用來計算所排的雷的那個點的坐標周圍雷的個數,我們這樣實作:>

這樣子程式就可以跑起來了,我們來看一下效果:>

下面是對程式的改進:>
為防止第一次是雷,以及我們容易除錯,我們將雷的個數設定為識別符號常量,以下是所增加的代碼:>

將雷的個數定義為識別符號常量
然后我們創建一個安全掃雷函式

這樣就可以避免第一個為雷了,現在我們來看一下效果:


下面放出源代碼:
test.c檔案函式代碼:
#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
#include "game.h"
void menu()
{
printf("*********************\n");
printf("**** 1.play ******\n");
printf("**** 0.exit ******\n");
printf("*********************\n");
}
void game()
{
char mine[ROWS][COLS] = { 0 };
char show[ROWS][COLS] = { 0 };
InitBoard(mine, ROWS, COLS, '0');//此處我們將我們想初始化的元素傳進去,這樣就能通過一個函式來簡單初始化,
InitBoard(show, ROWS, COLS, '*');
//DisplayBoard(show, ROW, COL);
SetMine(mine, ROW, COL);
//DisplayBoard(mine, ROW, COL);
DisplayBoard(show, ROW, COL);
SafeMine(mine, show, ROW, COL);
SweepMine(mine, show, ROW, COL);
}
void test()
{
srand((unsigned int)time(NULL));
//游戲至少執行一次,因此用do while回圈
int input = 0;
do
{
menu();//此處的menu函式為自己創建的選單函式,提示一下玩家
printf("請選擇數字:>");//此然是選擇,那必然得輸入一個數把?
scanf("%d", &input);
switch (input)
{
case 1:
game();
break;
case 0:
printf("退出游戲 \n");
break;
default:
printf("輸入錯誤,請重新輸入\n");
break;
}
} while (input);
}
int main()
{
test();
return 0;
}
下面是game.c檔案內容
#define _CRT_SECURE_NO_WARNINGS 1
#include "game.h"
void InitBoard(char board[ROWS][COLS], int rows, int cols, char set)
{
int i = 0;
int j = 0;
for (i = 0; i < rows; i++)
{
for (j = 0; j < cols; j++)
{
board[i][j] = set;
}
}
}
void DisplayBoard(char board[ROWS][COLS], int row, int col)
{
int i = 0;
int j = 0;
for (i = 0; i <= col; i++)
{
printf("%d ", i); //列印列號,以便玩家查看
}
printf("\n");
for (i = 1; i <= row; i++)
{
printf("%d ", i); //列印行號,以便玩家查看
for (j = 1; j <= col; j++)
{
printf("%c ", board[i][j]);
}
printf("\n");
}
}
void SetMine(char mine[ROWS][COLS], int row, int col)
{
int count = EASYCOUNT;
while (count)
{
int x = rand() % row + 1;
int y = rand() % col + 1;
if (mine[x][y] == '0')
{
mine[x][y] = '1';
count--;
}
}
}
int CountMine(char mine[ROWS][COLS], int x, int y)
{
return mine[x - 1][y] +
mine[x + 1][y] +
mine[x - 1][y - 1] +
mine[x][y - 1] +
mine[x + 1][y - 1] +
mine[x - 1][y + 1] +
mine[x][y + 1] +
mine[x + 1][y + 1] - 8 * '0';
}
void SafeMine(char mine[ROWS][COLS], char show[ROWS][COLS], int row, int col)
{
int x = 0;
int y = 0;
int newx = 0;
int newy = 0;
printf("請輸入排查的坐標:>");
scanf("%d%d", &x, &y);
while (1)
{
if (x >= 1 && x <= row && y >= 1 && y <= col && mine[x][y] == '0')
{
int ret = CountMine(mine, x, y);
show[x][y] = ret + '0';
DisplayBoard(show, ROW, COL);
break;
}
newx = rand() % row + 1;
newy = rand() % col + 1;
if (x >= 1 && x <= row && y >= 1 && y <= col && mine[x][y] == '1')
{
if (mine[newx][newy] == '0')
{
mine[newx][newy] = '1';
mine[x][y] = '0';
int ret = CountMine(mine, x, y);
show[x][y] = ret + '0';
DisplayBoard(show, ROW, COL);
DisplayBoard(mine, ROW, COL);
break;
}
}
}
}
void SweepMine(char mine[ROWS][COLS], char show[ROWS][COLS], int row, int col)
{
int x = 0;
int y = 0;
int count = row * col - EASYCOUNT - 1;
while (count)
{
printf("請輸入排查的坐標:>");
scanf("%d%d", &x, &y);
if (x >= 1 && x <= row && y >= 1 && y <= col)
{
if (mine[x][y] == '1')
{
printf("很遺憾,你被炸死了\n");
break;
}
if (mine[x][y] == '0')
{
int ret = CountMine(mine, x, y);
show[x][y] = ret + '0';
DisplayBoard(show, ROW, COL);
count--;
}
}
else
{
printf("輸入有誤,請重新輸入\n");
}
}
if (count == 0)
{
printf("恭喜你,排雷成功\n");
DisplayBoard(mine, ROW, COL);
}
}
game.h中的代碼:
#pragma once
#define ROW 9
#define COL 9
#define ROWS ROW+2
#define COLS COL+2
#define EASYCOUNT 10
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
void InitBoard(char board[ROWS][COLS], int rows, int cols, char set);
void DisplayBoard(char board[ROWS][COLS], int row, int col);
void SweepMine(char mine[ROWS][COLS], char show[ROWS][COLS], int row, int col);
void SetMine(char mine[ROWS][COLS], int row, int col);
void SafeMine(char mine[ROWS][COLS], char show[ROWS][COLS], int row, int col);
本文完
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/356845.html
標籤:其他
上一篇:貪心演算法入門——習題匯總
