1992年4月6日,掃雷和紙牌、空當(dāng)接龍等小游戲搭載在Windows 3.1系統(tǒng)中與用戶見面,主要目的是讓用戶訓(xùn)練使用鼠標(biāo)。這個(gè)游戲的玩法很簡單,有初級、中級、高級和自定義等模式,雷區(qū)中隨機(jī)布置一定數(shù)量的地雷,玩家需要盡快找出所有不是地雷的方塊,但不許踩到地雷
創(chuàng)新互聯(lián)主要從事成都網(wǎng)站設(shè)計(jì)、做網(wǎng)站、網(wǎng)頁設(shè)計(jì)、企業(yè)做網(wǎng)站、公司建網(wǎng)站等業(yè)務(wù)。立足成都服務(wù)簡陽,十年網(wǎng)站建設(shè)經(jīng)驗(yàn),價(jià)格優(yōu)惠、服務(wù)專業(yè),歡迎來電咨詢建站服務(wù):18980820575掃雷:當(dāng)選擇排除的坐標(biāo)沒有設(shè)置雷,就會(huì)顯示出周圍有幾個(gè)雷,若是周圍八個(gè)方向都沒有雷的話就開始自動(dòng)展開,依次判斷周圍的八個(gè)坐標(biāo)
但這里有一個(gè)邊界問題:如果排除的是如圖的四個(gè)位置,那么往周圍八個(gè)坐標(biāo)進(jìn)行遍歷的時(shí)候就有數(shù)組越界的風(fēng)險(xiǎn),這里有兩個(gè)解決方法:
1:當(dāng)遇上邊界的時(shí)候進(jìn)行判斷
2:把棋盤設(shè)置大一些,加入是一個(gè)9*9的棋盤,那么我們可以開一個(gè)11*11的數(shù)組,超出的部分全部設(shè)置為0,這樣就算遍歷的時(shí)候統(tǒng)計(jì)雷的個(gè)數(shù)也不會(huì)影響結(jié)果,也不會(huì)造成數(shù)組越界
由于我們使用的是 C語言,不能使用typedef pair
但如果是這樣,就無法知道哪里有雷哪里沒有雷了
所以可以開兩個(gè)數(shù)組,一個(gè)存雷的位置,一個(gè)展示給用戶
首先進(jìn)行初始化棋盤:
void InitBoard(char board[ROWS][COLS],int row, int col,char set)
{
int i = 0;
printf("\n");
for (i = 0; i< row; i++)
{
int j = 0;
for (j = 0; j< col; j++)
{
board[i][j] = set;
}
}
}
set就是要在該棋盤要設(shè)置的參數(shù),比如‘*’? ‘0’這些
比較重要的就是如何實(shí)現(xiàn)自動(dòng)排雷,遞歸展開如圖,如果以紅色圈圈為中心的位置,周圍八個(gè)坐標(biāo)圍成的正方形都沒有雷的話,就自動(dòng)展開,并且該位置的元素設(shè)置為 ‘ ’ (空格),這里以展開藍(lán)色位置為例子,藍(lán)色坐標(biāo)可以展開的藍(lán)色框框的區(qū)域,如果使用遞歸實(shí)現(xiàn)展開的話這里就會(huì)有一個(gè)問題,紅色圈圈位置遞歸之后,藍(lán)色圈圈位置遞歸的過程中又遞歸到了紅色圈圈的位置,所以就會(huì)造成遞歸死循環(huán)的情況,所以可以添加一些條件:
if (show[i][j] == '*')//為*則為沒有排查過的,可以展開,防止死遞歸
{
Spread(mine, show, i, j);
}
test.c文件#include"game.h"
void menue() {
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);
printf("\n");
//排查雷
FindMine(mine, show, ROW, COL);
}
void test() {
srand((unsigned int)time(NULL));
int input = 0;
do {
menue();
printf("請選擇:>");
scanf("%d", &input);
switch (input) {
case 1:
game();
break;
case 0:
printf("退出游戲 Success!");
break;
default :
printf("選擇錯(cuò)誤,請重新選擇!\n");
break;
}
} while (input);
}
int main(void) {
test();
return 0;
}
game.c文件#pragma once
#include"game.h"
void InitBoard(char board[ROWS][COLS],int row, int col,char set)
{
int i = 0;
printf("\n");
for (i = 0; i< row; i++)
{
int j = 0;
for (j = 0; j< col; j++)
{
board[i][j] = set;
}
}
}
void DisplayBoard(char board[ROWS][COLS], int row, int col)
{
int i = 0;
int j = 0;
for (int j = 0; j<= col; j++)
{
printf("%d ", j);
}
printf("\n");
for (i = 1; i<= row; i++)
{
printf("%d ", i);
for (j = 1; j<= col; j++)
{
printf("%c ", board[i][j]);
}
printf("\n");
}
}
//設(shè)置雷
void setmine(char mine[ROWS][COLS], int row, int col)
{
//假設(shè)布置10個(gè)雷
int count = EASY_COUNT;
while (count)
{
//生成隨機(jī)下標(biāo)
int x = rand() % row + 1;//1->9
int y = rand() % col + 1;//1->9
if (mine[x][y] == '0')
{
mine[x][y] = '1';
count--;
}
}
}
int get_mine_count(char show[ROWS][COLS], int x, int y)
{
return (show[x - 1][y - 1] + show[x - 1][y] + show[x - 1][y + 1] + show[x][y - 1] +
show[x][y + 1] + show[x + 1][y - 1] + show[x + 1][y] + show[x + 1][y + 1] - 8 * '0');
}
void Spread(char mine[ROWS][COLS], char show[ROWS][COLS], int x, int y)
{
int n = get_mine_count(mine, x, y);
//邊界條件,防止數(shù)組越界
if (x >= 1 && x<= ROW && y >= 1 && y<= COL)
{
if (n == 0)//需要展開
{
show[x][y] = ' ';//該點(diǎn)周圍沒有雷就設(shè)置為空格
for (int i = x - 1; i<= x + 1; i++) {
for (int j = y - 1; j<= y + 1; j++) {
if (show[i][j] == '*')//為*則為沒有排查過的,可以展開,防止死遞歸
{
Spread(mine, show, i, j);
}
}
}
}
else {
show[x][y] = n + '0';//字符轉(zhuǎn)為數(shù)字
}
}
}
void FindMine(char mine[ROWS][COLS], char show[ROWS][COLS], int row, int col)
{
int x = 0, y = 0,win=0;
while (win");
scanf("%d %d", &x, &y);
if (x >= 1 && x<= row && y >= 1 && y<= col)
{
if (show[x][y] != '*')
{
printf("該坐標(biāo)已經(jīng)被排查過了\n");
continue;
}
if (mine[x][y] == '1')
{
printf("很遺憾,你被炸死了!\n");
DisplayBoard(mine, ROW, COL);
break;
}
else
{
Spread(mine, show,x, y);
win++;
DisplayBoard(show, ROW, COL);
}
}
}
if (win == row * col - EASY_COUNT)
{
printf("恭喜你,排雷成功!\n");
}
}
game.h文件#define ROWS 11
#define COLS 11
#define ROW 9
#define COL 9
#define EASY_COUNT 10
#include#include#include//初始化棋盤
void InitBoard(char mine[ROWS][COLS],int row,int col,char set);
//打印棋盤
void DisplayBoard(char board[ROWS][COLS], int row, int col);
//設(shè)置雷
void setmine(char mine[ROWS][COLS],int row, int col);
//獲取雷的個(gè)數(shù)
int get_mine_count(char show[ROWS][COLS], int x, int y);
//展開
void Spread(char mine[ROWS][COLS], char show[ROWS][COLS], int x, int y);
//排查雷
void FindMine(char mine[ROWS][COLS], char show[ROWS][COLS], int row, int col);
你是否還在尋找穩(wěn)定的海外服務(wù)器提供商?創(chuàng)新互聯(lián)www.cdcxhl.cn海外機(jī)房具備T級流量清洗系統(tǒng)配攻擊溯源,準(zhǔn)確流量調(diào)度確保服務(wù)器高可用性,企業(yè)級服務(wù)器適合批量采購,新人活動(dòng)首月15元起,快前往官網(wǎng)查看詳情吧
分享文章:C語言實(shí)現(xiàn)掃雷(自動(dòng)排查),遞歸展開-創(chuàng)新互聯(lián)
分享鏈接:http://m.2m8n56k.cn/article40/dhhpho.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供App開發(fā)、網(wǎng)站維護(hù)、手機(jī)網(wǎng)站建設(shè)、服務(wù)器托管、虛擬主機(jī)、網(wǎng)站制作
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:[email protected]。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來源: 創(chuàng)新互聯(lián)
猜你還喜歡下面的內(nèi)容