C語(yǔ)言版簡(jiǎn)單掃雷游戲
本文實(shí)例為大家分享了C語(yǔ)言版的簡(jiǎn)單掃雷游戲,供大家參考,具體內(nèi)容如下
思想
我們?cè)谠O(shè)計(jì)的時(shí)候,首先將其分為三個(gè)部分,分別為頭文件game.h游戲界面及主要實(shí)現(xiàn)的功能函數(shù)部分test.c,還有就是最重要的游戲?qū)崿F(xiàn)部分game.c。
一、頭文件構(gòu)建;
我們通過(guò)game.h將所有用到的頭文件引用進(jìn)去,目的是更加直觀的讓讀者看懂我們的結(jié)構(gòu),另外我們思路也會(huì)通暢一些。
#include <stdio.h> #include <stdlib.h> #include <time.h> #define ROW 9 #define COL 9 #define ROWS ROW+2 #define COLS COL+2 #define EASY_COUNT 10 //初始化棋盤 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);
當(dāng)我們這么做了之后以后只需要在game.c和time.c中引用就行了(通過(guò)#include "game.h")
二、test.c菜單模塊構(gòu)建;
我們要想當(dāng)我們需要做一個(gè)游戲,怎樣才可以讓玩家清楚的知道自己該怎么做呢,我們只有通過(guò)菜單,才可以清楚的表達(dá)。當(dāng)建立好這個(gè)菜單后我們要想,通過(guò)什么函數(shù)可以實(shí)現(xiàn)呢,我們要分幾步去進(jìn)行,然后劃分模塊,構(gòu)建函數(shù)。
#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] = {0};//存放雷的信息 char show[ROWS][COLS] = {0};//存放排查出雷的信息 //初始化棋盤 InitBoard(mine,ROWS,COLS,'0'); InitBoard(show,ROWS,COLS,'*'); //布置雷 SetMine(mine, ROW, COL); //DisPlayBoard(mine, ROW, COL); DisplayBoard(show, ROW, COL); //排查雷 FindMine(mine,show,ROW,COL); } int main() { int input = 0; srand((unsigned)time(NULL));//生成隨機(jī)數(shù) do { menu(); printf("請(qǐng)選擇:>"); scanf("%d",&input); switch (input) { case 1: game(); break; case 0: printf("退出游戲\n"); break; default: printf("選擇錯(cuò)誤,請(qǐng)重新選擇\n"); break; } } while (input); return 0; }
三、函數(shù)構(gòu)建;
1.InitBoard函數(shù)
下面的代碼是初始化棋盤部分,我們用了兩個(gè)簡(jiǎn)單的for循環(huán)就可以實(shí)現(xiàn)。
棋盤初始化完成之后,就到了打印棋盤部分了:
void InitBoard(char board[ROWS][COLS], int rows, int cols) { int i = 0; for(i = 0; i < rows; i++) { int j = 0; for (j = 0; j < cols; j++) { board[i][j] = '*'; } }
2.DisplayBoard函數(shù)
這里也是用了兩個(gè)簡(jiǎn)單的for循環(huán)實(shí)現(xiàn)的,不過(guò)我們?cè)谄灞P的上面一行加上了一行數(shù)字,并用printf弄了兩行-------的分界限,這樣的話就可以快速的看出棋盤上的位置,使玩家體驗(yàn)感更佳。
void DisplayBoard(char board[ROWS][COLS], int row, int col) { int i = 0; printf("------------------------\n"); for (i = 0; i <= 9; i++) { printf("%d ", i); } printf("\n"); for (i = 1; i <= row; i++) { int j = 0; printf("%d ", i); for (j = 1; j <= col; j++) { printf("%c ", board[i][j]); } printf("\n"); } printf("------------------------\n"); }
3.SetMine函數(shù)
這個(gè)函數(shù)是我們的放雷函數(shù)
這里我們是用了一個(gè)隨機(jī)函數(shù)rand來(lái)使雷的位置隨機(jī)生成。
void SetMine(char board[ROWS][COLS], int row, int col) { int count = EASY_COUNT; while (count) { //生成隨機(jī)下標(biāo) int x = rand() % row + 1; int y = rand() % col + 1; if (board[x][y] != '1') { board[x][y] = '1'; count--; } } }
4.GetMineCount函數(shù)
這個(gè)函數(shù)是用了9宮格的周圍八個(gè)格子
例如(x,y)為中心坐標(biāo)進(jìn)行計(jì)算。根據(jù)ASCII碼字符1減去字符0就是整形1,所以我們就應(yīng)用此方法把周圍的雷全部加起來(lái)減去字符零就可以得到周圍雷的個(gè)數(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'); }
5.FindMine函數(shù)
該函數(shù)是找雷的,
如果排雷失敗將會(huì)退出游戲,如果沒(méi)有失敗就會(huì)一直循環(huán)。直到失敗
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("請(qǐng)輸入要排查的坐標(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 { 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); } }
接下來(lái)我們按ctrl+f5就可以運(yùn)行了結(jié)果如下圖所示
我們就可以玩啦,愉快的掃雷之路就此開(kāi)始
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
C語(yǔ)言利用模板實(shí)現(xiàn)簡(jiǎn)單的棧類
這篇文章主要為大家詳細(xì)介紹了C語(yǔ)言利用模板實(shí)現(xiàn)簡(jiǎn)單的棧類,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2018-12-12基于C++實(shí)現(xiàn)的各種內(nèi)部排序算法匯總
這篇文章主要介紹了基于C++實(shí)現(xiàn)的各種內(nèi)部排序算法,非常經(jīng)典,需要的朋友可以參考下2014-08-08C++程序的五大內(nèi)存分區(qū)實(shí)例詳解
C++內(nèi)存區(qū)域,一般可分為棧內(nèi)存區(qū)、堆內(nèi)存區(qū)、全局/靜態(tài)內(nèi)存區(qū)、文字常量?jī)?nèi)存區(qū)及程序代碼區(qū)5大分區(qū),本文就帶大家深刻的理解這5大內(nèi)存分區(qū),感興趣的可以了解一下2021-10-10