?目錄
1. 掃雷游戲?qū)崿F(xiàn)的思路
注意點1?
注意點2?
2. 函數(shù)實現(xiàn)掃雷功能
2.1 初始化棋盤
2.2 顯示棋盤
2.3 設(shè)置雷
2.4 排查雷
2.5 返回附近雷的個數(shù)
3.源碼
3.1 game.h
3.2 game.c?
3.3 test.c
1. 掃雷游戲?qū)崿F(xiàn)的思路
注意點1?
我們這里拿9*9的棋盤(其中包含10個雷)來實現(xiàn)(這里也可以自定義棋盤大小和雷的個數(shù)
》我們這里使用“ 0 ”表示不是雷,“ 1 ”表示雷《
?。?!——>這樣設(shè)置其實是有好處的,在 2.5 (返回雷的個數(shù)函數(shù)中體現(xiàn))
注意點1:我們在玩的時候,我們隨機(jī)點一個位子,就顯示出這個位置附近的8個位置有幾個是雷,如果這時那一個二維數(shù)組去實現(xiàn),這時就有以下問題:
1. 假如我們點的這個位置不是雷,附近8個位置又剛好只有一個位置是雷,那我們要表示這個位置附近就一個雷,我們就要把這個位置賦值成1
2. 但是這時就有這樣的問題,我們在顯示掃一次雷過后的棋盤時,由于這個位置賦值成1了,玩家這時不能判斷這個位置是雷呢還是雷的個數(shù)
這時我們用以下方法來解決? :使用兩個二維數(shù)組來實現(xiàn)
1個二維數(shù)組存放雷? ? ? ? ? ? ? ? ? ? ? ?另一個二維數(shù)組存放排查出來的信息
注意點2?
我們這里拿的9*9的二維數(shù)組去顯示數(shù)組,但是這時我們?nèi)绻挪槎S數(shù)組最邊緣的兩行和兩列位置時,我們?nèi)ピL問的時候就會出現(xiàn)數(shù)組下標(biāo)越界的情況
?> 這時我們就直接去定義11*11的二維數(shù)組就能很好的解決
2. 函數(shù)實現(xiàn)掃雷功能
2.1 初始化棋盤
注意:這里要初始化兩個數(shù)組
? ? ? ? ? ?》我們將mine數(shù)組——存放雷——全部初始化為 “0”
? ? ? ? ? ?》我們將show數(shù)組——存放排查出雷的信息——全部初始化為 “ ? ”,保持棋盤神秘? ? ? ? ? ? ? ? ? ?感
void InitBoard(char board[ROWS][COLS], int rows, int cols, char set)//這里的set可以自定義
{
int i = 0;
for (i = 0; i < rows; i++)
{
int j = 0;
for (j = 0; j < cols; j++)
{
board[i][j] = set;
}
}
}
2.2 顯示棋盤
優(yōu)化棋盤顯示:
將棋盤的上面一行—>打印出列序號
將棋盤的前面一行—>打印出行序號
void DisplayBoard(char board[ROWS][COLS], int row, int col)
{
int i = 0;
printf("--------掃雷游戲-------\n");
for (i = 0; i <= col; i++)
{
printf("%d ", i);
}
printf("\n");
for (i = 1; i <= row; i++)
{
printf("%d ", i);
int j = 0;
for (j = 1; j <= col; j++)
{
printf("%c ", board[i][j]);
}
printf("\n");
}
}
2.3 設(shè)置雷
生成隨機(jī)二維數(shù)組下標(biāo),布置10個雷
這里我們又要使用生成隨機(jī)數(shù)的三個函數(shù)——rand、srand、time
void SetMine(char board[ROWS][COLS], int row, int col)
{
//布置10個雷
//生成隨機(jī)的坐標(biāo),布置雷
int count = EASY_COUNT;
while (count)
{
int x = rand() % row + 1;
int y = rand() % col + 1;
if (board[x][y] == '0')
{
board[x][y] = '1';
count--;
}
}
}
2.4 排查雷
在排查雷的函數(shù)中,我們需要實現(xiàn)一個返回這個位置有幾個雷的函數(shù)—GetMineCount
返回數(shù)值后,在排查雷后,把這個位置附近雷的個數(shù)顯示出來
void FindMine(char mine[ROWS][COLS], char show[ROWS][COLS], int row, int col)
{
int x = 0;
int y = 0;
int win = 0;
while (win <row*col- EASY_COUNT)
{
printf("請輸入要排查的坐標(biāo):>");
scanf("%d %d", &x, &y);
if (x >= 1 && x <= row && y >= 1 && y <= col)
{
if (mine[x][y] == '1')
{
printf("很遺憾,你被炸死了\n");
DisplayBoard(mine, ROW, COL);
break;
}
else
{
//該位置不是雷,就統(tǒng)計這個坐標(biāo)周圍有幾個雷
int count = GetMineCount(mine, x, y);
show[x][y] = count + '0';
DisplayBoard(show, ROW, COL);
win++;
}
}
else
{
printf("坐標(biāo)非法,重新輸入\n");
}
}
if (win == row * col - EASY_COUNT)
{
printf("恭喜你,排雷成功\n");
DisplayBoard(mine, ROW, COL);
}
}
2.5 返回附近雷的個數(shù)
補(bǔ)充一個知識:字符在內(nèi)存中是以ASCII值存儲的
》“ 0 ” 、 “ 1 ” 、 “ 2 ”? 對應(yīng)的ASCII分別是 48 、49、 50《
這時有數(shù)字和字符之間的相互轉(zhuǎn)換
1. >? 數(shù)字2 + “0” = 2+48=50——>“2”? ? ? ? ? ?數(shù)字轉(zhuǎn)字符
2. >? “2” - “0” =2? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 字符轉(zhuǎn)數(shù)字
int GetMineCount(char mine[ROWS][COLS], int x, int y)
{
return (mine[x-1][y]+mine[x-1][y-1]+mine[x][y - 1]+mine[x+1][y-1]+mine[x+1][y]+
mine[x+1][y+1]+mine[x][y+1]+mine[x-1][y+1] - 8 * '0');
}
3.源碼
3.1 game.h
#pragma once
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#define EASY_COUNT 10
#define ROW 9
#define COL 9
#define ROWS ROW+2
#define COLS COL+2
//初始化棋盤
void InitBoard(char board[ROWS][COLS], int rows, int cols, char set);
//打印棋盤
void DisplayBoard(char board[ROWS][COLS], int row, int col);
//布置雷
void SetMine(char board[ROWS][COLS], int row, int col);
//排查雷
void FindMine(char mine[ROWS][COLS], char show[ROWS][COLS], int row, int col);
3.2 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;
for (i = 0; i < rows; i++)
{
int j = 0;
for (j = 0; j < cols; j++)
{
board[i][j] = set;
}
}
}
void DisplayBoard(char board[ROWS][COLS], int row, int col)
{
int i = 0;
printf("--------掃雷游戲-------\n");
for (i = 0; i <= col; i++)
{
printf("%d ", i);
}
printf("\n");
for (i = 1; i <= row; i++)
{
printf("%d ", i);
int j = 0;
for (j = 1; j <= col; j++)
{
printf("%c ", board[i][j]);
}
printf("\n");
}
}
void SetMine(char board[ROWS][COLS], int row, int col)
{
//布置10個雷
//生成隨機(jī)的坐標(biāo),布置雷
int count = EASY_COUNT;
while (count)
{
int x = rand() % row + 1;
int y = rand() % col + 1;
if (board[x][y] == '0')
{
board[x][y] = '1';
count--;
}
}
}
int GetMineCount(char mine[ROWS][COLS], int x, int y)
{
return (mine[x-1][y]+mine[x-1][y-1]+mine[x][y - 1]+mine[x+1][y-1]+mine[x+1][y]+
mine[x+1][y+1]+mine[x][y+1]+mine[x-1][y+1] - 8 * '0');
}
void FindMine(char mine[ROWS][COLS], char show[ROWS][COLS], int row, int col)
{
int x = 0;
int y = 0;
int win = 0;
while (win <row*col- EASY_COUNT)
{
printf("請輸入要排查的坐標(biāo):>");
scanf("%d %d", &x, &y);
if (x >= 1 && x <= row && y >= 1 && y <= col)
{
if (mine[x][y] == '1')
{
printf("很遺憾,你被炸死了\n");
DisplayBoard(mine, ROW, COL);
break;
}
else
{
//該位置不是雷,就統(tǒng)計這個坐標(biāo)周圍有幾個雷
int count = GetMineCount(mine, x, y);
show[x][y] = count + '0';
DisplayBoard(show, ROW, COL);
win++;
}
}
else
{
printf("坐標(biāo)非法,重新輸入\n");
}
}
if (win == row * col - EASY_COUNT)
{
printf("恭喜你,排雷成功\n");
DisplayBoard(mine, ROW, COL);
}
}
3.3 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");
}
void game()
{
char mine[ROWS][COLS];//存放布置好的雷
char show[ROWS][COLS];//存放排查出的雷的信息
//初始化棋盤
//1. mine數(shù)組最開始是全'0'
//2. show數(shù)組最開始是全'*'
InitBoard(mine, ROWS, COLS, '0');
InitBoard(show, ROWS, COLS, '*');
//打印棋盤
//DisplayBoard(mine, ROW, COL);
DisplayBoard(show, ROW, COL);
//1. 布置雷
SetMine(mine, ROW, COL);
//DisplayBoard(mine, ROW, COL);
//2. 排查雷
FindMine(mine, show, ROW, COL);
}
int main()
{
int input = 0;
srand((unsigned int)time(NULL));
do
{
menu();
printf("請選擇:>");
scanf("%d", &input);
switch (input)
{
case 1:
game();
break;
case 0:
printf("退出游戲\n");
break;
default:
printf("選擇錯誤,重新選擇\n");
break;
}
} while (input);
return 0;
}
小余這里實現(xiàn)的是簡易版的掃雷,沒有實現(xiàn)遞歸功能,等之后小余學(xué)習(xí)了后在來完善!文章來源:http://www.zghlxwxcb.cn/news/detail-447256.html
如果覺得文章不錯,期待你的一鍵三連哦,你個鼓勵是我創(chuàng)作的動力之源,讓我們一起加油,頂峰相見?。?!文章來源地址http://www.zghlxwxcb.cn/news/detail-447256.html
到了這里,關(guān)于帶你實現(xiàn)初階掃雷小游戲—【C語言】的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!