首先在寫掃雷前我們需要理清邏輯,整個程式運行都需要哪些步驟,
1 我們需要準備一塊初始化的棋盤 這里我寫的是9*9的掃雷,所以需要準備11*11的棋盤,因為在計算周邊雷個數時 四個角和四條邊是特殊的,所以我在這里擴大棋盤,,讓它的規律都一樣,
2 有了棋盤后需要埋雷,
3準備好棋盤后,我們在呈現給用戶時需要把棋盤遮住,
4 前面是在游戲開始前需要準備的作業,在游戲開始后 ,用戶輸入坐標,首先要判斷它是不是雷,如果不是雷,計算周邊雷的個數,
5 最后我們需要寫出用戶成功的判斷條件,
接下來開始游戲前的作業
void Initialize_board(int(*ar)[11], int row, int col) //初始化棋盤
{
for (int i = 0; i < col - 1; i++)
{
printf("%d ", i);
}
printf("\n");
for (int j = 2; j < row; j++)
{
printf("%d ", j - 1);
for (int k = 2; k < col; k++)
{
if (ar[j][k] > 0)
{
ar[j][k]--;
}
printf("%2d ", ar[j][k]);
}
printf("\n");
}
}
void lay_mine(int (* ar)[11], int row, int col,int *br,int tomine) //埋地雷
{
const int mine = 10;
srand(time(nullptr));
for (int i = 0; i < mine; i++)
{
int x = (rand() % (row-2)) + 2;
int y = (rand() % (col-2)) + 2;
if (ar[x][y] == 0)
{
ar[x][y] = -1;
*(br+i) = (x * col )+ y ; // 這里用一個一維陣列記錄雷的坐標,方便一會的判斷,
}
else
{
i--;
}
}
}
列印效果
void print_checkerboard(int (*ar)[11], int row, int col) //列印棋盤并覆寫值
{
for (int i = 0; i < col-1; i++)
{
printf("%d ", i);
}
printf("\n");
for (int j = 2; j < row; j++)
{
printf("%d ", j - 1);
for (int k = 2,x=0; k < col; k++,x++)
{
if (ar[j][k]==0||ar[j][k]==-1)
{
printf("* ");
}
else
{
printf("%d ", ar[j][k]-1);
}
}
printf("\n");
}
}
列印效果

接下來開始游戲
我們需要有一個計算周圍雷數量的函式
int count_mine(int(*ar)[11], int row, int col,int a,int b) //計算雷的個數
{
int count = 0;
for (int i = 0; i < 3; i++)
{
for (int j = 0; j < 3; j++)
{
if (ar[a-1+i][b-1+j] == -1)
{
count++;
}
}
}
return count+1;
}

現在我們需要寫出判讀用戶掃雷成功的代碼
bool From_mines(int* br,int mine,int col,int a,int b) //計算排出的地雷
{
int num = 0;
for (int i = 0; i < 3; i++)
{
for (int j = 0; j < 3; j++)
{
for (int k = 0; k < mine; k++)
{
if (*(br + k) == (((a + i-1) * col) + b-1 + j))
{
*(br + k) = 0;
}
}
}
}
for (int i = 0; i < mine; i++)
{
num += br[i];
}
return num;
}
這里的判斷條件是用戶把十個雷的掃出即為成功



最后總代碼如下
#include<stdio.h>
#include<time.h>
#include<stdlib.h>
#include<assert.h>
vvoid Initialize_board(int(*ar)[11], int row, int col) //初始化棋盤
{
for (int i = 0; i < col - 1; i++)
{
printf("%d ", i);
}
printf("\n");
for (int j = 2; j < row; j++)
{
printf("%d ", j - 1);
for (int k = 2; k < col; k++)
{
if (ar[j][k] > 0)
{
ar[j][k]--;
}
printf("%2d ", ar[j][k]);
}
printf("\n");
}
}
void print_checkerboard(int (*ar)[11], int row, int col) //列印棋盤
{
for (int i = 0; i < col-1; i++)
{
printf("%d ", i);
}
printf("\n");
for (int j = 2; j < row; j++)
{
printf("%d ", j - 1);
for (int k = 2,x=0; k < col; k++,x++)
{
if (ar[j][k]==0||ar[j][k]==-1)
{
printf("* ");
}
else
{
printf("%d ", ar[j][k]-1);
}
}
printf("\n");
}
}
void lay_mine(int (* ar)[11], int row, int col,int *br,int tomine) //埋地雷
{
const int mine = 10;
srand(time(nullptr));
for (int i = 0; i < mine; i++)
{
int x = (rand() % (row-2)) + 2;
int y = (rand() % (col-2)) + 2;
if (ar[x][y] == 0)
{
ar[x][y] = -1;
*(br+i) = (x * col )+ y ;
}
else
{
i--;
}
}
}
int count_mine(int(*ar)[11], int row, int col,int a,int b) //計算雷的個數
{
int count = 0;
for (int i = 0; i < 3; i++)
{
for (int j = 0; j < 3; j++)
{
if (ar[a-1+i][b-1+j] == -1)
{
count++;
}
}
}
return count+1;
}
bool From_mines(int* br,int mine,int col,int a,int b) //計算排出的地雷
{
int num = 0;
for (int i = 0; i < 3; i++)
{
for (int j = 0; j < 3; j++)
{
for (int k = 0; k < mine; k++)
{
if (*(br + k) == (((a + i-1) * col) + b-1 + j))
{
*(br + k) = 0;
}
}
}
}
for (int i = 0; i < mine; i++)
{
num += br[i];
}
return num;
}
void play_game(int(* ar)[11], int row, int col) //開始游戲
{
assert(ar != NULL && row>=0 && col>=0);
static int remine = 10;
const int tomine = 10;
int m_arr[tomine] = {};
printf("********1 play******\n");
printf("********0 exit******\n");
int count = 0;
int val = 0;
int x = 0, y = 0;
scanf_s("%d", &val);
if (val == 1)
{
lay_mine(ar, row, col,m_arr, tomine); //埋雷
print_checkerboard(ar, row, col); //列印棋盤
while (1)
{
printf("請輸入坐標 格式為:X Y\n");
scanf_s("%d%d", &x, &y);
if (x < 0 || x>9 || y < 0 || y>9)
{
printf("輸入錯誤,請重新輸入\n");
continue;
}
x = x + 1;
y = y + 1;
if (ar[x][y] == -1)
{
Initialize_board(ar, row, col);
printf("很抱歉你已經踩到地雷,游戲結束\n");
continue;
}
else
{
count = count_mine(ar, row, col, x, y); //計算周圍雷個數
ar[x][y] = count;
print_checkerboard(ar, row, col);
}
if (!From_mines(m_arr, tomine, col, x, y))
{
Initialize_board(ar, row, col);
printf("恭喜你掃雷成功\n");
break;
}
}
}
}
int main()
{
const int n = 11;
int ar[n][n] = { };
play_game(ar, n, n);
return 0;
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/291728.html
標籤:其他
下一篇:Devc++迷宮小游戲1.1
