
寫在前面
我們已經寫過了三子棋小游戲肯定沒玩過癮,我們再寫個掃雷小游戲吧!
目錄
- 寫在前面
- 認識游戲
- 游戲規則
- 游戲框架
- 游戲實作
- 效果展示
- 全部代碼
- `test.c`檔案
- `game.h`檔案
- `game.c`檔案
認識游戲
相信大家對掃雷都不陌生!每臺電腦必備的小游戲!

游戲規則
就是在規定的時間將埋藏的地雷全部找到,即游戲勝利!
勝利條件:你需要在不點錯雷的情況下盡可能快的將所有的雷都標記出來,如果你點錯,就得重新開始,所以掃雷也有一定的運氣成分,
簡單說
就是將所有不是雷的地方全部標記出來,剩下地雷,游戲勝利,如果標記點到了地雷,游戲失敗!
如何找到不是地雷標記出來呢?

每點開一個小格子,如果是雷,就游戲結束,如果不是就會出現數字,出現的數字表示,周圍一圈雷的個數!

2表示周圍一圈的地雷數為2個,
根據這些數字即可將地雷全部排除走向勝利!
游戲框架
游戲框架和三子棋一樣!
//游戲框架
int input = 0;
do
{
menu();//選單
scanf("%d", &input); //選擇
switch (input)
{
case 1:game();
break;
case 0:printf("退出游戲\n");
break;
default:printf("輸入錯誤,請重新輸入\n");
break;
}
} while (input);
我們寫小游戲的框架基本上都是這樣!
游戲實作
游戲的實作是我們這個游戲的重點內容!
我們如何才能將游戲實作呢?
先從原理入手!
-
埋雷
如何買雷呢?
我們所玩的掃雷都是由許多小格子組成的矩陣!
所以我們可以利用二維陣列埋地雷! -
顯示該點周圍雷的個數
周圍雷數的計算,就是判斷改點周圍是非為雷,并且計算個數顯示給玩家! -
判斷游戲狀態
點到地雷說明游戲結束,將所有地雷找到,游戲勝利,
實作思想
用一個二維陣列埋雷
另一個二維陣列顯示給玩家
當我們將雷弄成AxA的雷陣藏雷,會發現如果我們進行周圍雷數的查找是會發生陣列越界,所以我們可以創建(A+2)x(A+2)的雷陣,然后埋雷在AxA中!
void game()
{
//初始化布雷陣列—— > 初始化棋盤陣列—— >
//設定地雷—— > 顯示棋盤—— > 玩家掃雷
//埋雷
char mine[ROWS][COLS] = { 0 }; //雷區圖
char show[ROWS][COLS] = { 0 }; //玩家圖
//初始化棋盤
InitBoard(mine, ROWS, COLS,'0');
InitBoard(show, ROWS, COLS, '*');
//設定地雷
SetMine(mine, ROW, COL,MineCount);
PrintBoard(show, ROW, COL);
//玩家掃雷
int count = ROW*COL-MineCount;
while (CheckMine(mine,show, ROW, COL))
{
count--;
PrintBoard(show, ROW, COL);
if (count == 0)
{
printf("恭喜你,游戲勝利\n");
PrintBoard(mine, ROW, COL);
break;
}
}
}
//初始化棋盤
void InitBoard(char board[ROW][COL], int row, int col, char x)
{
int i = 0;
for (i = 0; i < row; i++)
{
int j = 0;
for (j = 0; j < col; j++)
{
board[i][j] = x;
}
}
return ;
}
//列印棋盤
void PrintBoard(char board[ROW][COL], int row, int col)
{
int i = 0;
//列印列號
for (i = 0; i <= col; i++)
printf(" %d ", i);
printf("\n");
for (i = 0; i < row; i++)
{
printf(" %d ", i+1);
int j = 0;
for (j = 0; j <col; j++)
{
printf(" %c ", board[i][j]);
}
printf("\n");
}
return;
}
//埋雷
void SetMine(char board[ROW][COL], int row, int col, int count)
{
while (count)
{
int i = rand() % row;
int j = rand() % col;
if (board[i][j] == '0')
{
board[i][j] = '1';
count--;
}
}
}
核心代碼
//查雷
int CheckMine(char mine[ROW][COL],char show[ROW][COL], int row, int col)
{
printf("請輸入你要掃雷的坐標:>");
while (1)
{
int i = 0, j = 0;
scanf("%d%d", &i, &j);
if (i >=1 && i <= row && j >=1 && j <= col)
{
if (mine[i-1][j-1] != '1')
{
int count=IsMineCount(mine,i-1,j-1);
show[i-1][j-1] = count+'0';
return 1;
}
else
{
printf("很遺憾,你被炸死了\n");
PrintBoard(mine, ROW, COL);
return 0;
}
}
}
}
int IsMineCount(char mine[ROW][COL], int x, int y)
{
int count = 0;
int i= 0;
for (i = x - 1; i <= x + 1; i++)
{
int j = 0;
for (j = y - 1; j <=y + 1; j++)
{
if (mine[i][j] == '1')
{
count++;
}
}
}
return count;
}
效果展示



全部代碼
test.c檔案
#define _CRT_SECURE_NO_WARNINGS 1
#include"game.h"
void menu()
{
printf("******************************\n");
printf("********** 1.play ******\n");
printf("********** 0.exit ******\n");
printf("******************************\n");
printf("Input(1/0):>");
}
void game()
{
//初始化布雷陣列—— > 初始化棋盤陣列—— > 設定地雷
//—— > 顯示棋盤—— > 玩家掃雷
//埋雷
char mine[ROWS][COLS] = { 0 }; //雷區圖
char show[ROWS][COLS] = { 0 }; //玩家圖
//初始化棋盤
InitBoard(mine, ROWS, COLS,'0');
InitBoard(show, ROWS, COLS, '*');
//設定地雷
SetMine(mine, ROW, COL,MineCount);
PrintBoard(show, ROW, COL);
//玩家掃雷
int count = ROW*COL-MineCount;
while (CheckMine(mine,show, ROW, COL))
{
count--;
PrintBoard(show, ROW, COL);
if (count == 0)
{
printf("恭喜你,游戲勝利\n");
break;
}
}
}
game.h檔案
#pragma once
#include<stdio.h>
#include<stdlib.h>
#include<time.h>
#define ROW 9
#define COL 9
#define ROWS ROW+2
#define COLS COL+2
#define MineCount 6
void InitBoard(char board[ROWS][COLS],int row,int col,char x);
void SetMine(char board[ROWS][COLS], int row, int col,int count);
void PrintBoard(char board[ROW][COL], int row, int col);
int CheckMine (char mine[ROWS][COLS], char show[ROW][COL], int row, int col);
int IsMineCount(char mine[ROWS][COLS],int i, int j);
game.c檔案
#include"game.h"
void InitBoard(char board[ROW][COL], int row, int col, char x)
{
int i = 0;
for (i = 0; i < row; i++)
{
int j = 0;
for (j = 0; j < col; j++)
{
board[i][j] = x;
}
}
return ;
}
void SetMine(char board[ROW][COL], int row, int col, int count)
{
while (count)
{
int i = rand() % row;
int j = rand() % col;
if (board[i][j] == '0')
{
board[i][j] = '1';
count--;
}
}
}
void PrintBoard(char board[ROW][COL], int row, int col)
{
int i = 0;
//列印列號
for (i = 0; i <= col; i++)
printf(" %d ", i);
printf("\n");
for (i = 0; i < row; i++)
{
printf(" %d ", i+1);
int j = 0;
for (j = 0; j <col; j++)
{
printf(" %c ", board[i][j]);
}
printf("\n");
}
return;
}
int CheckMine(char mine[ROW][COL],char show[ROW][COL], int row, int col)
{
printf("請輸入你要掃雷的坐標:>");
while (1)
{
int i = 0, j = 0;
scanf("%d%d", &i, &j);
if (i >=1 && i <= row && j >=1 && j <= col)
{
if (mine[i-1][j-1] != '1')
{
int count=IsMineCount(mine,i-1,j-1);
show[i-1][j-1] = count+'0';
return 1;
}
else
{
printf("很遺憾,你被炸死了\n");
return 0;
}
}
}
}
int IsMineCount(char mine[ROW][COL], int x, int y)
{
int count = 0;
int i= 0;
for (i = x - 1; i <= x + 1; i++)
{
int j = 0;
for (j = y - 1; j <=y + 1; j++)
{
if (mine[i][j] == '1')
{
count++;
}
}
}
return count;
}
持續更新.....

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

