提示:文章寫完后,目錄可以自動生成,如何生成可參考右邊的幫助檔案
目錄
前言
一.游戲規則介紹
二.基本流程介紹
三.效果展示
四.詳細代碼
1.main()函式
2.game()函式
3.Initboard()函式
4.Displayboard()函式
5.Setmine()函式
6.Findmine()函式
7.Showmine()函式和findemine()函式
五.代碼
1.minegame.c
2.body.c
3.mine.h
總結
前言
一.游戲規則介紹
掃雷是一個十分經典的游戲,一張棋盤中有很多個不確定是雷還是安全區域的格子,當點擊之后若沒有雷則會在該區域顯示周圍八個格子雷的數目,若有雷則游戲結束,今天我就跟大家分享一下如何用c語言實作初階版掃雷,
二.基本流程介紹
1.創建一個用戶互動選單
2.創建一個mine棋盤用來埋雷并初始化
3.創建一個show棋盤用來和用戶互動并初始化
4.玩家選擇想要掃描的坐標
5.判定游戲是否結束
6.若沒有踩雷則在剛掃描的區域上顯示周圍八個坐標的地雷數目并以這八個坐標為中心繼續顯示坐標周圍雷數并繼續游戲
7.繼續掃雷
8.判定游戲是否結束
…
9.若全部掃描完非雷區域則游戲結束
三.效果展示


四.詳細代碼
1.main()函式
主要實作功能是呼叫選單函式并實作選單選項選擇功能,
int main()
{
int input = 0;
do {
mune();
srand((unsigned int)time(NULL));
scanf_s("%d", &input);
switch(input){
case 1:
game();
break;
case 2:
break;
case 3:
printf("輸入錯誤,請從新輸入:\n");
break;
}
} while (input!=2);
return 0;
}
2.game()函式
創建兩個陣列一個用于埋雷一個用于顯示,然后呼叫游戲程序中需要用到的函式,
//玩游戲
void game() {
//兩個二維陣列
char mine[hangs][lies] = { 0 };
char show[hangs][lies] = { 0 };
//初始化棋盤
Initboard(mine, hangs, lies,'0');
Initboard(show, hangs, lies,'*');
//列印棋盤
Displayboard(show, hangs, lies);
//Displayboard(mine, hangs, lies);
//布雷
Setmine(mine, hang, lie);
//Displayboard(mine, hangs, lies);
//掃雷
Findmines(show,mine, hang, lie);
}
3.Initboard()函式
對兩個棋盤進行初始化,mine棋盤初始化為0,show棋盤初始化為*,便于后續埋雷和列印,
//初始化棋盤
void Initboard(char board[hangs][lies], int Hangs, int Lies,char set) {
int i = 0;
int j = 0;
for (i = 0; i <Hangs; i++) {
for (j = 0; j < Lies; j++) {
board[i][j] = set;
}
}
}
4.Displayboard()函式
這里列印的棋盤是show棋盤,供玩家選擇坐標和顯示的,
//列印棋盤
void Displayboard(char board[hangs][lies], int Hangs, int Lies) {
int i = 0;
int j = 0;
for (i = 0; i <Lies-1; i++) {
printf("%d ", i);
}
printf("\n");
for (i = 1; i <Hangs-1; i++) {
printf("%d ", i);
for (j = 1; j < Lies-1; j++) {
printf("%c ", board[i][j]);
}
printf("\n");
}
}
5.Setmine()函式
在mine棋盤上布雷,雷的數目可調整,調整setmine,利用srand()函式,時間戳為種子生成隨機值,進而獲得隨機的雷的坐標,
//布雷
void Setmine(char board[hangs][lies], int Hang, int Lie) {
int x = 0;
int y = 0;
int setm = setmine;
while (setm) {
x = rand() % Hang + 1;
y = rand() % Lie+ 1;
if (board[x][y] == '0') {
board[x][y] = '1';
setm--;
}
}
}
6.Findmine()函式
首先輸入要排查的坐標,在Mine棋盤上找,如果為1則游戲失敗,如果為零說明該坐標周圍無雷,顯示該處坐標,需要呼叫showmine函式,
//掃雷
void Findmines(char show[hangs][lies], char mine[hangs][lies], int Hang, int Lie) {
int x = 0;
int y = 0;
while (1) {
int sum = 0;
printf("請輸入:");
scanf_s("%d%d", &x, &y);
if (x > 0 && x <= Hang && y > 0 && y <= Lie) {
if (mine[x][y] == '1') {
printf("被炸死!\n");
break;
}
else if (show[x][y] != '*') {
printf("坐標重復!\n");
continue;
}
else {
showmine(show,mine, x, y);
Displayboard(show, hangs, lies);
}
}
else {
printf("坐標非法\n");
}
for (x = 1; x <= 9; x++) {
for (y = 1; y <= 9; y++) {
if (show[x][y] == '*') {
sum++;
}
}
}
if (sum == setmine) {
printf("已通關\n");
Displayboard(mine, hangs, lies);
break;
}
}
}
7.Showmine()函式和findemine()函式
showmine函式要先呼叫findmine函式找出該坐標周圍的雷數,如果無雷就以該坐標周圍八個坐標為中心利用遞回實作連環查找,
void showmine(char show[hangs][lies],char mine[hangs][lies], int Hang, int Lie){
int a = 0, b = 0;
int k = 0;
k = findemine(mine, Hang, Lie);
if (k == 0) {
show[Hang][Lie] = '0';
for (a = Hang - 1; a <= Hang + 1; a++) {
for (b = Lie - 1; b <= Lie + 1; b++) {
if (show[a][b] == '*' && a > 0 && a <= hang && b > 0 && b <= lie)
showmine(show, mine, a, b);
}
}
}
else {
show[Hang][Lie] = k + '0';
}
}
//找坐標周圍雷數
int findemine(char board[hangs][lies], int Hang, int Lie) {
int i = 0;
int j = 0;
int count = 0;
for (i = Hang - 1; i <= Hang + 1; i++) {
for (j = Lie - 1; j <= Lie + 1; j++) {
if (board[i][j] == '1')
count++;
}
}
return count;
}
至此主要函式就介紹完了,下面我將所有代碼分為三個部分1,minegame.c檔案2,body.c檔案3,mine.h檔案,代碼如下,
五.代碼
1.minegame.c
#define _CRT_SECURE_NO_WARNINGS
#include "mine.h"
//列印選單
void mune() {
printf("********************\n");
printf("******1. play *****\n");
printf("******2. exit *****\n");
printf("********************\n");
}
//玩游戲
void game() {
//兩個二維陣列
char mine[hangs][lies] = { 0 };
char show[hangs][lies] = { 0 };
//初始化棋盤
Initboard(mine, hangs, lies,'0');
Initboard(show, hangs, lies,'*');
//列印棋盤
Displayboard(show, hangs, lies);
//Displayboard(mine, hangs, lies);
//布雷
Setmine(mine, hang, lie);
//Displayboard(mine, hangs, lies);
//掃雷
Findmines(show,mine, hang, lie);
}
int main()
{
int input = 0;
do {
mune();
srand((unsigned int)time(NULL));
scanf_s("%d", &input);
switch(input){
case 1:
game();
break;
case 2:
break;
case 3:
printf("輸入錯誤,請從新輸入:\n");
break;
}
} while (input!=2);
return 0;
}
2.body.c
#define _CRT_SECURE_NO_WARNINGS
#include "mine.h"
//初始化棋盤
void Initboard(char board[hangs][lies], int Hangs, int Lies,char set) {
int i = 0;
int j = 0;
for (i = 0; i <Hangs; i++) {
for (j = 0; j < Lies; j++) {
board[i][j] = set;
}
}
}
//列印棋盤
void Displayboard(char board[hangs][lies], int Hangs, int Lies) {
int i = 0;
int j = 0;
for (i = 0; i <Lies-1; i++) {
printf("%d ", i);
}
printf("\n");
for (i = 1; i <Hangs-1; i++) {
printf("%d ", i);
for (j = 1; j < Lies-1; j++) {
printf("%c ", board[i][j]);
}
printf("\n");
}
}
//布雷
void Setmine(char board[hangs][lies], int Hang, int Lie) {
int x = 0;
int y = 0;
int setm = setmine;
while (setm) {
x = rand() % Hang + 1;
y = rand() % Lie+ 1;
if (board[x][y] == '0') {
board[x][y] = '1';
setm--;
}
}
}
//掃雷
void Findmines(char show[hangs][lies], char mine[hangs][lies], int Hang, int Lie) {
int x = 0;
int y = 0;
while (1) {
int sum = 0;
printf("請輸入:");
scanf_s("%d%d", &x, &y);
if (x > 0 && x <= Hang && y > 0 && y <= Lie) {
if (mine[x][y] == '1') {
printf("被炸死!\n");
break;
}
else if (show[x][y] != '*') {
printf("坐標重復!\n");
continue;
}
else {
showmine(show,mine, x, y);
Displayboard(show, hangs, lies);
}
}
else {
printf("坐標非法\n");
}
for (x = 1; x <= 9; x++) {
for (y = 1; y <= 9; y++) {
if (show[x][y] == '*') {
sum++;
}
}
}
if (sum == setmine) {
printf("已通關\n");
Displayboard(mine, hangs, lies);
break;
}
}
}
//找坐標周圍雷數
int findemine(char board[hangs][lies], int Hang, int Lie) {
int i = 0;
int j = 0;
int count = 0;
for (i = Hang - 1; i <= Hang + 1; i++) {
for (j = Lie - 1; j <= Lie + 1; j++) {
if (board[i][j] == '1')
count++;
}
}
return count;
}
//顯示坐標周圍沒有雷的坐標
void showmine(char show[hangs][lies],char mine[hangs][lies], int Hang, int Lie){
int a = 0, b = 0;
int k = 0;
k = findemine(mine, Hang, Lie);
if (k == 0) {
show[Hang][Lie] = '0';
for (a = Hang - 1; a <= Hang + 1; a++) {
for (b = Lie - 1; b <= Lie + 1; b++) {
if (show[a][b] == '*' && a > 0 && a <= hang && b > 0 && b <= lie)
showmine(show, mine, a, b);
}
}
}
else {
show[Hang][Lie] = k + '0';
}
}
3.mine.h
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
//
#define setmine 10
#define hang 9
#define lie 9
#define hangs 11
#define lies 11
//初始化棋盤
void Initboard(char board[hangs][lies], int Hangs, int Lies,char set);
//列印棋盤
void Displayboard(char board[hangs][lies], int Hangs, int Lies);
//布雷
void Setmine(char board[hangs][lies], int Hang, int Lie);
//掃雷
void Findmines(char board[hangs][lies], int Hang, int Lie);
//
void showmine(char show[hangs][lies], char mine[hangs][lies], int Hang, int Lie);
總結
制作不易啊,點個贊吧,后續還會更新c語言,資料結構,c++,sql,linux的一些常見問題和題目,所以點個關注吧,
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/292272.html
標籤:其他
上一篇:C語言之亂數的獲取與妙用
下一篇:我的第一篇博客,開啟新的成長之路
