C語言掃雷游戲的簡單實現(xiàn)
今天來用c語言做一個掃雷功能的簡單實現(xiàn),首先創(chuàng)建一個test.c來用于在寫代碼的途中測試掃雷代碼,game.h來存放實現(xiàn)掃雷函數(shù)需要用到的頭文件,game.c來存放最終的成品。
首先用函數(shù)打印一個菜單,讓玩家選擇進行游玩掃雷游戲或者退出,考慮到玩家會輸入1和2以外的數(shù)字,我們加上一個fefault,將菜單放入do-while循環(huán)中,while的結(jié)束條件為choose為0,玩家在結(jié)束一場游戲后可以重新走一邊循環(huán),保證用戶在結(jié)束一把掃雷之后可以選擇繼續(xù)進行下一局或是退出游戲。
void menu()
{
printf("**********\n");
printf("**1.play**\n");
printf("**0.quit**\n");
printf("**********\n");
}
void test()
{
int choose;
do
{
menu();
printf("請進行你的選擇");
scanf("%d", &choose);
switch (choose)
{
case 1:
printf("游戲開始\n");
break;
case 2:
printf("游戲退出\n");
default:
printf("選擇錯誤,請重新選擇\n");
}
} while (choose);
}
在case1中加入game()函數(shù)來進行掃雷游戲的實現(xiàn)。掃雷有雷的布置和雷的掃,首先來實現(xiàn)雷的布置,用二維數(shù)組實現(xiàn)一個9x9的棋盤,通過建立兩個棋盤來實現(xiàn)信息的交互,一個棋盤hid放雷的布置情況,還有一個棋盤show來將信息呈現(xiàn)給玩家。因為show棋盤需要將用戶掃過區(qū)域周圍八個格子雷的數(shù)量寫出來,如果定義一個【9】【9】的數(shù)組就會發(fā)生越界,因此兩個數(shù)組都定位為11x11,為了方便寫,宏定義col=9 row=9 COL=col+2 ROW=row+2。初始化show數(shù)組全為*,hid數(shù)組全為0
void SetBoard(char board[ROW][COL], int r, int c, char set)
{
for (int i = 0; i < r; i++)
{
for (int j = 0; j < c; j++)
{
board[i][j] = set;
}
}
}
void ShowBoard(char board[ROW][COL],int r,int c)
{
for (int a = 0; a <= r; a++)
{
printf("%d ", a);
}
printf("\n");
for (int i = 1; i <= r; i++)
{
printf("%d ", i);
for (int j = 1; j <= c; j++)
{
printf("%c ", board[i][j]);
}
printf("\n");
}
}
接下來實現(xiàn)雷的隨機插入,隨機生成兩個一到九的整數(shù)下x,y,添加一個count計數(shù)器,如果當(dāng)前hid[x][y]為字符0 則hid[x][y]為字符0,count計數(shù)器加一
srand((unsigned int)time(NULL));
void SetBoob(char hid[ROW][COL],int rw,int c)
{
int count = 0;
for (int i = 0; count <= 9; i++)
{
int x = rand() % row + 1;
int y = rand() % col + 1;
if (hid[x][y] == '0')
{
hid[x][y] = '1';
count = count + 1;
}
}
}
這樣雷就布置好了,接下來是玩家排雷的過程。
用while(1)做一個一直重復(fù)的循環(huán),玩家輸入行和列x,y,程序?qū)id[x][y]與字符‘1'對比,若踩雷則跳出循環(huán)顯示游戲結(jié)束并打印hid棋盤讓玩家看到雷的位置,若沒踩雷show[x][y]變成周圍八個格子的地雷個數(shù)并打印show棋盤。因為玩家可能輸入1~9之外的數(shù),因此要用if函數(shù)限制x,y的大小。
統(tǒng)計hid【x】【y】周圍的雷的個數(shù)可以通過將周圍的字符全部相加再減去八個字符0來實現(xiàn)
void CountBoob(char hid[ROW][COL], int x, int y)
{
int count;
count = hid[x - 1][y - 1] + hid[x][y - 1] + hid[x + 1][y - 1] + hid[x - 1][y] + hid[x + 1][y] + hid[x - 1][y + 1] + hid[x][y + 1] + hid[x + 1][y + 1] - 8 * '0';
return count;
}
void FindBoob(char hid[ROW][COL], char show[ROW][COL], int r, int c)
{
int x, y;
while (1)
{
printf("請輸入行和列");
scanf("%d %d", &x, &y);
if (x >= 1 && x <= row && y >= 1 && y <= col)
{
if (hid[x][y] == '1')
{
printf("游戲結(jié)束\n");
ShowBoard(hid, row, col);
break;
}
else
{
int n = CountBoob(hid, x, y);
show[x][y] = n+'0';
ShowBoard(show, row, col);
}
}
else
{
printf("輸入錯誤坐標請重新輸入");
}
}
}
后期我在掃雷過程中加入了一個計數(shù)器count,每掃一個無雷區(qū)域則count加一當(dāng)count等于71時打印游戲勝利并展示hid棋盤跳出循環(huán)。
將所有的函數(shù)放入頭文件,.c程序如下
#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
#include <time.h>
#include <stdlib.h>
#include "game.h"
int main()
{
int choose;
srand((unsigned int)time(NULL));
do
{
menu();
printf("請進行你的選擇");
scanf("%d", &choose);
switch (choose)
{
case 1:
printf("游戲開始\n");
game();
break;
case 0:
printf("游戲退出\n");
break;
default:
printf("選擇錯誤,請重新選擇\n");
}
} while (choose);
}
掃雷是如若周圍沒有雷,可以實現(xiàn)棋盤的展開,這個因為時間問題只能進行后期補充。
以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
C++11/14如何使用typedef和using定義類型別名和別名模版
這篇文章主要介紹了C++11/14如何使用typedef和using定義類型別名和別名模版2023-04-04
C語言中字符串常用函數(shù)strcat與strcpy的用法介紹
以下是對C語言中字符串常用函數(shù)strcat與strcpy的使用方法進行了詳細的分析介紹,需要的朋友可以參考下2013-07-07

