C語(yǔ)言掃雷游戲的簡(jiǎn)單實(shí)現(xiàn)
今天來(lái)用c語(yǔ)言做一個(gè)掃雷功能的簡(jiǎn)單實(shí)現(xiàn),首先創(chuàng)建一個(gè)test.c來(lái)用于在寫代碼的途中測(cè)試掃雷代碼,game.h來(lái)存放實(shí)現(xiàn)掃雷函數(shù)需要用到的頭文件,game.c來(lái)存放最終的成品。
首先用函數(shù)打印一個(gè)菜單,讓玩家選擇進(jìn)行游玩掃雷游戲或者退出,考慮到玩家會(huì)輸入1和2以外的數(shù)字,我們加上一個(gè)fefault,將菜單放入do-while循環(huán)中,while的結(jié)束條件為choose為0,玩家在結(jié)束一場(chǎng)游戲后可以重新走一邊循環(huán),保證用戶在結(jié)束一把掃雷之后可以選擇繼續(xù)進(jìn)行下一局或是退出游戲。
void menu() { printf("**********\n"); printf("**1.play**\n"); printf("**0.quit**\n"); printf("**********\n"); } void test() { int choose; do { menu(); printf("請(qǐng)進(jìn)行你的選擇"); scanf("%d", &choose); switch (choose) { case 1: printf("游戲開始\n"); break; case 2: printf("游戲退出\n"); default: printf("選擇錯(cuò)誤,請(qǐng)重新選擇\n"); } } while (choose); }
在case1中加入game()函數(shù)來(lái)進(jìn)行掃雷游戲的實(shí)現(xiàn)。掃雷有雷的布置和雷的掃,首先來(lái)實(shí)現(xiàn)雷的布置,用二維數(shù)組實(shí)現(xiàn)一個(gè)9x9的棋盤,通過(guò)建立兩個(gè)棋盤來(lái)實(shí)現(xiàn)信息的交互,一個(gè)棋盤hid放雷的布置情況,還有一個(gè)棋盤show來(lái)將信息呈現(xiàn)給玩家。因?yàn)閟how棋盤需要將用戶掃過(guò)區(qū)域周圍八個(gè)格子雷的數(shù)量寫出來(lái),如果定義一個(gè)【9】【9】的數(shù)組就會(huì)發(fā)生越界,因此兩個(gè)數(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"); } }
接下來(lái)實(shí)現(xiàn)雷的隨機(jī)插入,隨機(jī)生成兩個(gè)一到九的整數(shù)下x,y,添加一個(gè)count計(jì)數(shù)器,如果當(dāng)前hid[x][y]為字符0 則hid[x][y]為字符0,count計(jì)數(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; } } }
這樣雷就布置好了,接下來(lái)是玩家排雷的過(guò)程。
用while(1)做一個(gè)一直重復(fù)的循環(huán),玩家輸入行和列x,y,程序?qū)id[x][y]與字符‘1'對(duì)比,若踩雷則跳出循環(huán)顯示游戲結(jié)束并打印hid棋盤讓玩家看到雷的位置,若沒(méi)踩雷show[x][y]變成周圍八個(gè)格子的地雷個(gè)數(shù)并打印show棋盤。因?yàn)橥婕铱赡茌斎?~9之外的數(shù),因此要用if函數(shù)限制x,y的大小。
統(tǒng)計(jì)hid【x】【y】周圍的雷的個(gè)數(shù)可以通過(guò)將周圍的字符全部相加再減去八個(gè)字符0來(lái)實(shí)現(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("請(qǐng)輸入行和列"); 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("輸入錯(cuò)誤坐標(biāo)請(qǐng)重新輸入"); } } }
后期我在掃雷過(guò)程中加入了一個(gè)計(jì)數(shù)器count,每掃一個(gè)無(wú)雷區(qū)域則count加一當(dāng)count等于71時(shí)打印游戲勝利并展示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("請(qǐng)進(jìn)行你的選擇"); scanf("%d", &choose); switch (choose) { case 1: printf("游戲開始\n"); game(); break; case 0: printf("游戲退出\n"); break; default: printf("選擇錯(cuò)誤,請(qǐng)重新選擇\n"); } } while (choose); }
掃雷是如若周圍沒(méi)有雷,可以實(shí)現(xiàn)棋盤的展開,這個(gè)因?yàn)闀r(shí)間問(wèn)題只能進(jìn)行后期補(bǔ)充。
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
- C語(yǔ)言實(shí)現(xiàn)自定義掃雷游戲(遞歸版)
- C語(yǔ)言實(shí)現(xiàn)第一次防死版掃雷游戲
- C語(yǔ)言實(shí)現(xiàn)遞歸版掃雷游戲?qū)嵗?/a>
- C語(yǔ)言實(shí)現(xiàn)掃雷游戲詳解(附源碼)
- 基于C語(yǔ)言實(shí)現(xiàn)簡(jiǎn)易掃雷游戲
- 基于C語(yǔ)言掃雷游戲的設(shè)計(jì)與實(shí)現(xiàn)
- C語(yǔ)言實(shí)現(xiàn)掃雷游戲小項(xiàng)目
- 基于C語(yǔ)言實(shí)現(xiàn)簡(jiǎn)單的掃雷小游戲
- C語(yǔ)言實(shí)現(xiàn)掃雷游戲詳細(xì)流程
相關(guān)文章
Cocos2d-x Schedule定時(shí)器的使用實(shí)例
這篇文章主要介紹了Cocos2d-x Schedule定時(shí)器的使用實(shí)例,本文的講解內(nèi)容包含在代碼注釋中,需要的朋友可以參考下2014-09-09C++11/14如何使用typedef和using定義類型別名和別名模版
這篇文章主要介紹了C++11/14如何使用typedef和using定義類型別名和別名模版2023-04-04C語(yǔ)言中字符串常用函數(shù)strcat與strcpy的用法介紹
以下是對(duì)C語(yǔ)言中字符串常用函數(shù)strcat與strcpy的使用方法進(jìn)行了詳細(xì)的分析介紹,需要的朋友可以參考下2013-07-07C語(yǔ)言中g(shù)etchar()的原理以及易錯(cuò)點(diǎn)解析
用getchar()函數(shù)讀取字符串時(shí),字符串會(huì)存儲(chǔ)在輸入緩沖區(qū)中,包括輸入的回車字符,下面這篇文章主要給大家介紹了關(guān)于C語(yǔ)言中g(shù)etchar()的原理以及易錯(cuò)點(diǎn)解析的相關(guān)資料,需要的朋友可以參考下2022-03-03C++實(shí)現(xiàn)設(shè)計(jì)模式之裝飾者模式詳解
這篇文章主要介紹了C++設(shè)計(jì)模式之裝飾模式,裝飾模式能夠?qū)崿F(xiàn)動(dòng)態(tài)的為對(duì)象添加功能,是從一個(gè)對(duì)象外部來(lái)給對(duì)象添加功能,需要的朋友可以參考下2021-09-09