前言:這次的掃雷游戲的實作,是對前面所有所學內容的總結,
目錄
一.開局頁面的書寫,
二.棋盤的創建,
1.創建陣列
2.列印棋盤
3.布置雷
三.玩家掃雷行為的實作
一.開局頁面的書寫
作為模擬游戲的代碼,在我們的程式開始時,首先必須有個開局的頁面,同時在頁面開始時,我希望玩家用有選擇是否要玩的的權利,所以前面的開局界面的代碼我是這樣寫的:
#include <stdio.h>
void menu()
{
printf("***************************\n");
printf("***************************\n");
printf("********* 1.play ********\n");
printf("********* 0.exit ********\n");
printf("***************************\n");
printf("***************************\n");
}
void test()
{
int input = 0;
do
{
menu();
printf("請選擇:>");
scanf("%d", &input);
switch (input)
{
case 1:
//掃雷
//游戲框架的實作區域
break;
case 0:
printf("退出游戲\n");
default:
{
printf("選擇錯誤\n");
break;
}
}
} while (input);
}
int main()
{
test();
return 0;
}
現在展示開局頁面的代碼已經就緒,讓我們來看一下效果

注:下面是都當前代碼的主要標釋

二.棋盤的創建
這里是整個博客里面最主要的地方,在接下來的創建棋盤程序中,由于代碼過多,我會把代碼全部分開,創建三個檔案
1.game.h檔案:存放頭檔案,函式的宣告,符號的宣告
2.game.c檔案:存放函式的定義,
3.test.c檔案:進行函式的除錯
這里的分檔案撰寫代碼,我在上一次的博客中有過講述以Add加法函式來介紹代碼的分割_m0_62812354的博客-CSDN博客不太了解的同學可以看看,同時別忘了給他點個贊,謝謝,

1.創建陣列

由這個圖我們很明顯可以感受到要列印出棋盤,應該是用二維陣列,
首先我們來講一下,如何實作藏有地雷的掃雷棋盤,在我的代碼中,我的思想是創建兩個棋盤,一個是底層的,可以清楚的看到哪里有地雷的棋盤,一個是展示給玩家看的,經過加工的棋盤,玩家通過顯露在外面的棋盤所線路的資訊,來推測底層棋盤中地雷存放的位置,

這里使用0 1來表示有無地雷的原因我后面會提到,用 * 是為了遮住地雷的位置,
因為在表層棋盤里,我們要用 * 來表示位置,而底層棋盤與表層棋盤我希望它們可以相互照應,所以,兩個期盼的列印都是用char型別

2.列印棋盤
但這里還有個問題,我們知道掃雷游戲有提示你,你所點擊的區域周圍有幾個地雷,當這個區域在中間還好說,但是如果在邊上的話,如果你想要排查雷的個數時勢必會有陣列越界的問題,那我們應該怎樣解決這個問題呢?
這里有個辦法就是擴大棋盤(或者是限制區域),也就是說,我可以通過你擴大我棋盤的面積,我只給你列印了9*9的棋盤讓你進行玩耍,但實際上,我真正的棋盤應該是11*11的大小,你所進行操作的范圍始終在我棋盤的中間,

所以有下面的代碼
//這是在test.c里的代碼
void menu()
{
printf("***************************\n");
printf("***************************\n");
printf("********* 1.play ********\n");
printf("********* 0.exit ********\n");
printf("***************************\n");
printf("***************************\n");
}
void game()
{
//創建陣列
char mine[ROWS][COLS] = { 0 };//存放布置好的雷的資訊
char show[ROWS][COLS] = { 0 };//存放排查出的資訊
//初始化mine陣列為全字符‘0’
Initboard(mine, ROWS, COLS, '0');
//初始化show陣列為全字符‘*’
Initboard(show, ROWS, COLS, '*');
//列印棋盤
Displayboard(mine, ROW, COL);
Displayboard(show, ROW, COL);
}
void test()
{
int input = 0;
do
{
menu();
printf("請選擇:>");
scanf("%d", &input);
switch (input)
{
case 1:
//掃雷
game();
break;
case 0:
printf("退出游戲\n");
default:
{
printf("選擇錯誤\n");
break;
}
}
} while (input);
}
int main()
{
test();
return 0;
}

//這是在game.c里的代碼
#include <stdio.h>
#include "game.h"
void Initboard(char board[ROWS][COLS], int rows, int cols, char set)
{
int i = 0, j = 0;
for (i = 0; i < rows; i++)
{
for (j = 0; j < cols; j++)
{
board[i][j] = set;
}
}
}
void Displayboard(char board[ROWS][COLS], int row, int col)
{
//1-9
int i = 0;
int j = 0;
for (i = 0; i <= col; i++)
{
printf("%d ", i);
}
printf("\n");
for (i = 1; i <= row; i++)
{
printf("%d ", i);
for (j = 1; j <= col; j++)
{
printf("%c ", board[i][j]);
}
printf("\n");
}
}
//這是game.h里的代碼
#include <stdio.h>
#define ROW 9
#define COL 9
#define EASY_COUNT 10
#define ROWS ROW+2
#define COLS COL+2
//3.函式的宣告
//初始化棋盤
void Initboard(char board[ROWS][COLS], int rows, int cols, char set);
//列印棋盤
void Displayboard(char board[ROWS][COLS],int row,int col);

這三份代碼組合的效果如下

3.布置雷
這一塊涉及到一些其他知識由于篇幅過長,我將會在下一次的博客中進行講述,在這里大家只要知道,這里是通過產生隨機坐標來存放地雷的
#define _CRT_SECURE_NO_WARNINGS 1
//這是在test.c里的代碼
#include "x.h"
void menu()
{
printf("***************************\n");
printf("***************************\n");
printf("********* 1.play ********\n");
printf("********* 0.exit ********\n");
printf("***************************\n");
printf("***************************\n");
}
void game()
{
//創建陣列
char mine[ROWS][COLS] = { 0 };//存放布置好的雷的資訊
char show[ROWS][COLS] = { 0 };//存放排查出的資訊
//初始化mine陣列為全字符‘0’
Initboard(mine, ROWS, COLS, '0');
//初始化show陣列為全字符‘*’
Initboard(show, ROWS, COLS, '*');
//列印棋盤
//Displayboard(mine, ROW, COL);
//Displayboard(show, ROW, COL);
//布置雷
Setmine(mine, ROW, COL);
Displayboard(show, ROW, COL);
Displayboard(mine, ROW, COL);
}
void test()
{
int input = 0;
srand((unsigned int)time(NULL));
do
{
menu();
printf("請選擇:>");
scanf("%d", &input);
switch (input)
{
case 1:
//掃雷
game();
break;
case 0:
printf("退出游戲\n");
default:
{
printf("選擇錯誤\n");
break;
}
}
} while (input);
}
int main()
{
test();
return 0;
}

#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
//這是game.c里的代碼
#include "x.h"//x.h是我隨意命名的頭檔案的名字
void Initboard(char board[ROWS][COLS], int rows, int cols, char set)
{
int i = 0, j = 0;
for (i = 0; i < rows; i++)
{
for (j = 0; j < cols; j++)
{
board[i][j] = set;
}
}
}
void Displayboard(char board[ROWS][COLS], int row, int col)
{
//1-9
int i = 0;
int j = 0;
for (i = 0; i <= col; i++)
{
printf("%d ", i);
}
printf("\n");
for (i = 1; i <= row; i++)
{
printf("%d ", i);
for (j = 1; j <= col; j++)
{
printf("%c ", board[i][j]);
}
printf("\n");
}
}
void Setmine(char mine[ROWS][COLS], int row, int col)
{
int count = EASY_COUNT;
//隨機 橫1-9 縱1-9
while (count)
{
int x = rand() % row + 1;
int y = rand() % col + 1;
if (mine[x][y] == '0')
{
mine[x][y] = '1';
count--;
}
}
}

#pragma once
//這是game.h里的代碼
#include <stdio.h>
#include <time.h>
#include <stdlib.h>
#define ROW 9
#define COL 9
#define EASY_COUNT 10
#define ROWS ROW+2
#define COLS COL+2
//3.函式的宣告
//初始化棋盤
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 mine[ROWS][COLS], int row, int col);
效果如下
三.玩家掃雷行為的實作
,由前面的圖看,我已經為每個數字的坐標做好了注釋,那么接下來玩家就可以通過輸入坐標的形式進行掃雷,
#pragma once
//game.h里面包含的東西
//1.頭檔案的包含
#include <stdio.h>
#include <time.h>
#include <stdlib.h>
//2.符號的宣告
#define ROW 9
#define COL 9
#define EASY_COUNT 10
#define ROWS ROW+2
#define COLS COL+2
//3.函式的宣告
//初始化棋盤
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 mine[ROWS][COLS],int row,int col);
//排雷
void Findmine(char mine[ROWS][COLS], char show[ROWS][COLS], int row, int col);
#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
#include "game.h"
void Initboard(char board[ROWS][COLS], int rows, int cols, char set)
{
int i = 0, j = 0;
for (i = 0; i < rows; i++)
{
for (j = 0; j < cols; j++)
{
board[i][j] = set;
}
}
}
void Displayboard(char board[ROWS][COLS], int row, int col)
{
//1-9
int i = 0;
int j = 0;
for (i = 0; i <= col; i++)
{
printf("%d ", i);
}
printf("\n");
for (i = 1; i <= row; i++)
{
printf("%d ", i);
for (j = 1; j <= col; j++)
{
printf("%c ", board[i][j]);
}
printf("\n");
}
}
void Setmine(char mine[ROWS][COLS], int row, int col)
{
int count = EASY_COUNT;
//隨機 橫1-9 縱1-9
while (count)
{
int x = rand() % row + 1;
int y = rand() % col + 1;
if (mine[x][y] == '0')
{
mine[x][y] = '1';
count--;
}
}
}
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("請輸入要排查的坐標:>");
scanf("%d %d", &x, &y);
if (x >= 1 && x <= ROW && y >= 1 && y <= COL)
{
if (mine[x][y] == '1')
{
printf("很遺憾你被炸死了\n");
Findmine(mine, show, ROW, COL);
break;
}
else
{
//計算x,y坐標周圍有幾個雷
int n = get_mine_count(mine, x, y);
show[x][y] = n + '0';
Displayboard(show, ROW, COL);
win++;
}
}
else
{
printf("請輸入合法的坐標\n");
}
}
if (win == row * col - EASY_COUNT)
{
printf("恭喜你");
Displayboard(mine, ROW, COL);
}
}
int get_mine_count(char mine[ROWS][COLS],int x,int y)
{
return mine[x - 1][y - 1] + mine[x - 1][y] + mine[x - 1][y + 1] + mine[x][y - 1] + mine[x][y + 1] + mine[x + 1][y - 1] + mine[x + 1][y] + mine[x + 1][y + 1] - 8 * '0';
}
#define _CRT_SECURE_NO_WARNINGS 1
#include "game.h"
void menu()
{
printf("***************************\n");
printf("***************************\n");
printf("********* 1.play ********\n");
printf("********* 0.exit ********\n");
printf("***************************\n");
printf("***************************\n");
}
void game()
{
//創建陣列
char mine[ROWS][COLS] = { 0 };//存放布置好的雷的資訊
char show[ROWS][COLS] = { 0 };//存放排查出的資訊
//初始化mine陣列為全字符‘0’
Initboard(mine, ROWS, COLS, '0');
//初始化show陣列為全字符‘*’
Initboard(show, ROWS, COLS, '*');
//列印棋盤
/*Displayboard(mine, ROW, COL);
Displayboard(show, ROW, COL);*/
//布置雷
Setmine(mine,ROW,COL);
Displayboard(show, ROW, COL);
//Displayboard(mine, ROW, COL);
//排雷
Findmine(mine, show, ROW, COL);
}
void test()
{
int input = 0;
srand((unsigned int)time(NULL));
do
{
menu();
printf("請選擇:>");
scanf("%d", &input);
switch (input)
{
case 1:
//掃雷
game();
break;
case 0:
printf("退出游戲\n");
default:
{
printf("選擇錯誤\n");
break;
}
}
} while (input);
}
int main()
{
test();
return 0;
}
效果如下:

這樣我們就完成了一個并不成熟的掃雷,
最后,喜歡的記得點一個贊,謝謝
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/356193.html
標籤:其他
上一篇:敲三字棋的思路
下一篇:三子棋小游戲
