掃雷
- 游戲介紹
- 基本流程
- 代碼實作
- 創建用戶互動選單
- 創建地圖并初始化
- 地圖列印
- 地圖更新
- game()函式
- 總代碼
游戲介紹
??掃雷,顧名思義,就是排除所有的雷,游戲目標是在最短的時間內根據點擊格子出現的數字找出所有非雷格子,同時避免踩雷,踩到一個雷即全盤皆輸,
基本流程
1.創建用戶互動選單;
2.創建地圖并初始化;
3.列印地圖;
4.程式讀取玩家要翻的坐標并校驗;
5.判斷該位置的坐標是否有地雷,如果有地雷,則游戲結束;
6.如果不是地雷, 統計當前位置周圍雷的個數, 并顯示到地圖上;
7.判定游戲是否勝利,
代碼實作
創建用戶互動選單
int menu(){//用戶互動選單
printf("======================\n");
printf("1.開始游戲\n");
printf("0.結束游戲\n");
printf("======================\n");
printf("請輸入您的選擇:");
int choice = 0;
scanf("%d", &choice);
return choice;
}
??這里我們最開始創建一個用戶選單供用戶選擇游戲的開始和結束,(這里小小的吐槽一下,每次我敲完代碼,都會出現錯誤,而且大多數情況下都是scanf沒有&,所以大家也要注意啦)
創建地圖并初始化
void init(char ShowMap[MAX_ROW][MAX_COL], char MineMap[MAX_ROW][MAX_COL]){//初始化地圖
//先初始化showmap
for (int row = 0; row < MAX_ROW; row++){
for (int col = 0; col < MAX_COL; col++){
ShowMap[row][col] = '*';//ShowMap的初始化我們用‘*’表示
}
}
for (int row = 0; row < MAX_ROW; row++){
for (int col = 0; col < MAX_COL; col++){
MineMap[row][col] = '0';//MineMap的初始化我們用‘ ’表示
}
}
int n = DEFAULT_MINE_COUNT;
while (n > 0) {
// 生成雷的隨機位置.
int row = rand() % MAX_ROW;
int col = rand() % MAX_COL;
if (MineMap[row][col] == '1') {
// 如果當前位置已經有雷了, 就直接進入下次回圈, 重新
// 產生隨機位置.
continue;
}
MineMap[row][col] = '1';
n--;
}
}
??這里要注意的是我們列印地圖的時候要列印兩個地圖,一個是供用戶選擇坐標翻的地圖,另外一個是我們地雷隨機出現的地圖,在MineMap中,我們地雷隨機出現采用srand亂數,同時定義宏地雷的總數,
??我們初始化ShowMap一開始所有格子為’*’,MineMap一開始所有格子為‘0’,地雷我們用’1’來表示,
地圖列印
void printMap(char theMap[MAX_ROW][MAX_COL]){//列印地圖
printf(" |");
for (int col = 0; col < MAX_COL; col++) {
printf("%d ", col);
}
printf("\n");
printf("--+------------------\n");
for (int row = 0; row < MAX_ROW; row++) {
printf(" %d|", row);
for (int col = 0; col < MAX_COL; col++) {
printf("%c ", theMap[row][col]);
}
printf("\n");
}
}
??這里我們是列印一個地圖的邊框和每個格子的分隔線,陣列是用%c來表示的,
地圖更新
void updateShowMap(char showMap[MAX_ROW][MAX_COL],//地圖更新
char mineMap[MAX_ROW][MAX_COL], int row, int col) {
int count = 0;
for (int r = row - 1; r <= row + 1; r++) {
for (int c = col - 1; c <= col + 1; c++) {
if (r < 0 || r >= MAX_ROW
|| c < 0 || c >= MAX_COL) {
continue;
}
if (mineMap[r][c] == '1') {
count++;
}
}
}
showMap[row][col] = count + '0';
}
??這里我們寫的是當用戶每翻一個坐標的時候,這個坐標就要顯示出以這個坐標為中心,與它相鄰的坐標內,一共有多少個雷,
game()函式
void game() {
//1.創建地圖并初始化;
//2.列印地圖;
//3.程式讀取玩家要翻的坐標并校驗
//4.判斷該位置的坐標是否有地雷,如果有地雷,則游戲結束
//5.如果不是地雷, 統計當前位置周圍雷的個數, 并顯示到地圖上.
//6.判定游戲是否勝利
char ShowMap[MAX_ROW][MAX_COL] = { 0 };
char MineMap[MAX_ROW][MAX_COL] = { 0 };
init(ShowMap, MineMap);
int openedBlockCount = 0;
while (1){
printMap(MineMap);//測驗
printf("===================\n");
printMap(ShowMap);
int row = 0;
int col = 0;
printf("請輸入要翻開的坐標(row,col):");
scanf("%d %d", &row, &col);
if (row < 0 || row >= MAX_ROW || col < 0 || col >= MAX_COL){
printf("您輸入的坐標有誤!\n");
continue;
}
if (ShowMap[row][col] != '*'){
printf("當前位置已經翻開!\n");
continue;
}
if (MineMap[row][col] == '1'){
printf("您踩到雷了,游戲結束!\n");
printMap(MineMap);
break;
}
updateShowMap(ShowMap, MineMap, row, col);
openedBlockCount++;
if (openedBlockCount == MAX_ROW * MAX_COL - DEFAULT_MINE_COUNT) {
printf("游戲勝利!\n");
printMap(MineMap);
break;
}
}
}
??在game()函式中,我們在whlie回圈中的第一個撰寫的就是雷的分布的printMap(MineMap),這個是為了方便我們測驗我們所寫的程式會不會出現問題,
總代碼
#include<stdio.h>
#include<windows.h>
#include<time.h>
#pragma warning(disable:4996)
#define MAX_ROW 9
#define MAX_COL 9
#define DEFAULT_MINE_COUNT 10
int menu(){//用戶互動選單
printf("======================\n");
printf("1.開始游戲\n");
printf("0.結束游戲\n");
printf("======================\n");
printf("請輸入您的選擇:");
int choice = 0;
scanf("%d", &choice);
return choice;
}
void printMap(char theMap[MAX_ROW][MAX_COL]){//列印地圖
printf(" |");
for (int col = 0; col < MAX_COL; col++) {
printf("%d ", col);
}
printf("\n");
printf("--+------------------\n");
for (int row = 0; row < MAX_ROW; row++) {
printf(" %d|", row);
for (int col = 0; col < MAX_COL; col++) {
printf("%c ", theMap[row][col]);
}
printf("\n");
}
}
void init(char ShowMap[MAX_ROW][MAX_COL], char MineMap[MAX_ROW][MAX_COL]){//初始化地圖
//先初始化showmap
for (int row = 0; row < MAX_ROW; row++){
for (int col = 0; col < MAX_COL; col++){
ShowMap[row][col] = '*';//ShowMap的初始化我們用‘*’表示
}
}
for (int row = 0; row < MAX_ROW; row++){
for (int col = 0; col < MAX_COL; col++){
MineMap[row][col] = '0';//MineMap的初始化我們用‘ ’表示
}
}
int n = DEFAULT_MINE_COUNT;
while (n > 0) {
// 生成雷的隨機位置.
int row = rand() % MAX_ROW;
int col = rand() % MAX_COL;
if (MineMap[row][col] == '1') {
// 如果當前位置已經有雷了, 就直接進入下次回圈, 重新
// 產生隨機位置.
continue;
}
MineMap[row][col] = '1';
n--;
}
}
void updateShowMap(char showMap[MAX_ROW][MAX_COL],//地圖更新
char mineMap[MAX_ROW][MAX_COL], int row, int col) {
int count = 0;
for (int r = row - 1; r <= row + 1; r++) {
for (int c = col - 1; c <= col + 1; c++) {
if (r < 0 || r >= MAX_ROW
|| c < 0 || c >= MAX_COL) {
continue;
}
if (mineMap[r][c] == '1') {
count++;
}
}
}
showMap[row][col] = count + '0';
}
void game() {
//1.創建地圖并初始化;
//2.列印地圖;
//3.程式讀取玩家要翻的坐標并校驗
//4.判斷該位置的坐標是否有地雷,如果有地雷,則游戲結束
//5.如果不是地雷, 統計當前位置周圍雷的個數, 并顯示到地圖上.
//6.判定游戲是否勝利
char ShowMap[MAX_ROW][MAX_COL] = { 0 };
char MineMap[MAX_ROW][MAX_COL] = { 0 };
init(ShowMap, MineMap);
int openedBlockCount = 0;
while (1){
printMap(MineMap);
printf("===================\n");
printMap(ShowMap);
int row = 0;
int col = 0;
printf("請輸入要翻開的坐標(row,col):");
scanf("%d %d", &row, &col);
if (row < 0 || row >= MAX_ROW || col < 0 || col >= MAX_COL){
printf("您輸入的坐標有誤!\n");
continue;
}
if (ShowMap[row][col] != '*'){
printf("當前位置已經翻開!\n");
continue;
}
if (MineMap[row][col] == '1'){
printf("您踩到雷了,游戲結束!\n");
printMap(MineMap);
break;
}
updateShowMap(ShowMap, MineMap, row, col);
openedBlockCount++;
if (openedBlockCount == MAX_ROW * MAX_COL - DEFAULT_MINE_COUNT) {
printf("游戲勝利!\n");
printMap(MineMap);
break;
}
}
}
int main(){
srand((unsigned int)time(0));
while (1){
int choice = menu();
if (choice == 1){
game();
}
else if (choice == 0){
printf("GoodBye!\n");
}
else{
printf("您的輸入有誤,請重新輸入!\n");
}
}
system("pause");
return 0;
}
??ok ,文章就先到這里了,希望這篇文章能夠幫助到你對指標的認識,若有不足或者不正之處,希望諒解并歡迎批評指正!
??如果本文章對你有幫助,哪怕一點點,那就請點一個贊唄,謝謝~~
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/204184.html
標籤:其他
上一篇:演算法入門競賽經典 動態規劃
下一篇:C語言水果忍者修改器(入門版)
