掃雷游戲是一款經典的益智游戲,玩家需要在一個由方塊組成的網格中找出所有沒有地雷的方塊,同時避免觸雷。本文將詳細介紹如何使用C語言中的數組來實現一個簡單的掃雷游戲。我們將從游戲的基本規則、數據結構設計、核心算法實現等方面進行講解,并附上完整的代碼示例。
在開始編寫代碼之前,我們需要了解掃雷游戲的基本規則:
游戲棋盤:游戲棋盤是一個由方塊組成的網格,通常是一個二維數組。每個方塊可以是以下幾種狀態之一:
地雷分布:在游戲開始時,地雷隨機分布在棋盤的某些方塊中。地雷的數量和棋盤的大小可以根據難度進行調整。
數字提示:當一個方塊被翻開后,如果該方塊周圍8個方塊中有地雷,則顯示一個數字,表示周圍地雷的數量。如果周圍沒有地雷,則顯示空白。
游戲勝利:當所有沒有地雷的方塊都被翻開,且所有地雷都被正確標記時,游戲勝利。
游戲失敗:如果玩家翻開的方塊下有地雷,則游戲失敗。
為了實現掃雷游戲,我們需要設計合適的數據結構來表示棋盤和方塊的狀態。我們可以使用二維數組來表示棋盤,每個數組元素表示一個方塊的狀態。
我們可以使用兩個二維數組來表示棋盤:
mine[][]
:表示地雷的分布。mine[i][j]
為1表示該方塊下有地雷,為0表示沒有地雷。show[][]
:表示玩家看到的棋盤狀態。show[i][j]
為*
表示未翻開,為數字表示已翻開且周圍有地雷,為空格表示已翻開且周圍沒有地雷。每個方塊的狀態可以通過show[][]
數組來表示:
*
:未翻開。數字
:已翻開,且周圍有地雷。F
:標記為地雷。接下來,我們將逐步實現掃雷游戲的核心算法。
在游戲開始時,我們需要初始化兩個棋盤:mine[][]
和show[][]
。
mine[][]
:隨機生成地雷的位置。show[][]
:初始化為未翻開狀態(*
)。#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#define ROW 9
#define COL 9
#define MINES 10
void initBoard(char board[ROW][COL], char ch) {
for (int i = 0; i < ROW; i++) {
for (int j = 0; j < COL; j++) {
board[i][j] = ch;
}
}
}
void setMines(char mine[ROW][COL], int mines) {
srand((unsigned int)time(NULL));
int count = 0;
while (count < mines) {
int x = rand() % ROW;
int y = rand() % COL;
if (mine[x][y] == '0') {
mine[x][y] = '1';
count++;
}
}
}
為了方便玩家查看棋盤狀態,我們需要編寫一個函數來顯示棋盤。
void displayBoard(char board[ROW][COL]) {
printf(" ");
for (int i = 0; i < COL; i++) {
printf("%d ", i);
}
printf("\n");
for (int i = 0; i < ROW; i++) {
printf("%d ", i);
for (int j = 0; j < COL; j++) {
printf("%c ", board[i][j]);
}
printf("\n");
}
}
當一個方塊被翻開時,我們需要計算其周圍8個方塊中有多少地雷,并在show[][]
數組中顯示相應的數字。
int getMineCount(char mine[ROW][COL], 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 (i >= 0 && i < ROW && j >= 0 && j < COL && mine[i][j] == '1') {
count++;
}
}
}
return count;
}
當玩家點擊一個方塊時,我們需要根據方塊的狀態進行相應的處理:
void expand(char mine[ROW][COL], char show[ROW][COL], int x, int y) {
if (x < 0 || x >= ROW || y < 0 || y >= COL || show[x][y] != '*') {
return;
}
int count = getMineCount(mine, x, y);
if (count > 0) {
show[x][y] = count + '0';
} else {
show[x][y] = ' ';
for (int i = x - 1; i <= x + 1; i++) {
for (int j = y - 1; j <= y + 1; j++) {
expand(mine, show, i, j);
}
}
}
}
玩家可以標記他們認為有地雷的方塊。標記后的方塊顯示為F
。
void markMine(char show[ROW][COL], int x, int y) {
if (show[x][y] == '*') {
show[x][y] = 'F';
} else if (show[x][y] == 'F') {
show[x][y] = '*';
}
}
當玩家翻開所有沒有地雷的方塊時,游戲勝利。我們可以通過遍歷show[][]
數組來檢查是否所有非地雷方塊都被翻開。
int checkWin(char mine[ROW][COL], char show[ROW][COL]) {
for (int i = 0; i < ROW; i++) {
for (int j = 0; j < COL; j++) {
if (mine[i][j] == '0' && show[i][j] == '*') {
return 0;
}
}
}
return 1;
}
最后,我們需要編寫游戲的主循環,處理玩家的輸入并更新游戲狀態。
void game() {
char mine[ROW][COL] = {0};
char show[ROW][COL] = {0};
initBoard(mine, '0');
initBoard(show, '*');
setMines(mine, MINES);
int x, y;
int win = 0;
while (1) {
displayBoard(show);
printf("請輸入坐標(x y): ");
scanf("%d %d", &x, &y);
if (x < 0 || x >= ROW || y < 0 || y >= COL) {
printf("坐標超出范圍,請重新輸入!\n");
continue;
}
if (show[x][y] != '*' && show[x][y] != 'F') {
printf("該方塊已翻開,請重新輸入!\n");
continue;
}
if (mine[x][y] == '1') {
printf("你踩到地雷了,游戲結束!\n");
displayBoard(mine);
break;
}
expand(mine, show, x, y);
if (checkWin(mine, show)) {
printf("恭喜你,游戲勝利!\n");
displayBoard(mine);
win = 1;
break;
}
}
if (!win) {
printf("很遺憾,游戲失??!\n");
}
}
以下是完整的掃雷游戲代碼:
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#define ROW 9
#define COL 9
#define MINES 10
void initBoard(char board[ROW][COL], char ch) {
for (int i = 0; i < ROW; i++) {
for (int j = 0; j < COL; j++) {
board[i][j] = ch;
}
}
}
void setMines(char mine[ROW][COL], int mines) {
srand((unsigned int)time(NULL));
int count = 0;
while (count < mines) {
int x = rand() % ROW;
int y = rand() % COL;
if (mine[x][y] == '0') {
mine[x][y] = '1';
count++;
}
}
}
void displayBoard(char board[ROW][COL]) {
printf(" ");
for (int i = 0; i < COL; i++) {
printf("%d ", i);
}
printf("\n");
for (int i = 0; i < ROW; i++) {
printf("%d ", i);
for (int j = 0; j < COL; j++) {
printf("%c ", board[i][j]);
}
printf("\n");
}
}
int getMineCount(char mine[ROW][COL], 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 (i >= 0 && i < ROW && j >= 0 && j < COL && mine[i][j] == '1') {
count++;
}
}
}
return count;
}
void expand(char mine[ROW][COL], char show[ROW][COL], int x, int y) {
if (x < 0 || x >= ROW || y < 0 || y >= COL || show[x][y] != '*') {
return;
}
int count = getMineCount(mine, x, y);
if (count > 0) {
show[x][y] = count + '0';
} else {
show[x][y] = ' ';
for (int i = x - 1; i <= x + 1; i++) {
for (int j = y - 1; j <= y + 1; j++) {
expand(mine, show, i, j);
}
}
}
}
void markMine(char show[ROW][COL], int x, int y) {
if (show[x][y] == '*') {
show[x][y] = 'F';
} else if (show[x][y] == 'F') {
show[x][y] = '*';
}
}
int checkWin(char mine[ROW][COL], char show[ROW][COL]) {
for (int i = 0; i < ROW; i++) {
for (int j = 0; j < COL; j++) {
if (mine[i][j] == '0' && show[i][j] == '*') {
return 0;
}
}
}
return 1;
}
void game() {
char mine[ROW][COL] = {0};
char show[ROW][COL] = {0};
initBoard(mine, '0');
initBoard(show, '*');
setMines(mine, MINES);
int x, y;
int win = 0;
while (1) {
displayBoard(show);
printf("請輸入坐標(x y): ");
scanf("%d %d", &x, &y);
if (x < 0 || x >= ROW || y < 0 || y >= COL) {
printf("坐標超出范圍,請重新輸入!\n");
continue;
}
if (show[x][y] != '*' && show[x][y] != 'F') {
printf("該方塊已翻開,請重新輸入!\n");
continue;
}
if (mine[x][y] == '1') {
printf("你踩到地雷了,游戲結束!\n");
displayBoard(mine);
break;
}
expand(mine, show, x, y);
if (checkWin(mine, show)) {
printf("恭喜你,游戲勝利!\n");
displayBoard(mine);
win = 1;
break;
}
}
if (!win) {
printf("很遺憾,游戲失??!\n");
}
}
int main() {
game();
return 0;
}
通過本文的介紹,我們學習了如何使用C語言中的數組來實現一個簡單的掃雷游戲。我們從游戲的基本規則出發,設計了合適的數據結構,并逐步實現了游戲的各個核心功能。希望本文能幫助你理解如何使用C語言進行游戲開發,并為你的編程學習提供一些啟發。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。