用C語(yǔ)言實(shí)現(xiàn)簡(jiǎn)單掃雷小游戲
前言
今天學(xué)習(xí)了制作簡(jiǎn)易掃雷游戲,代碼如下
提示:以下是本篇文章正文內(nèi)容,下面案例可供參考
一、函數(shù)頭文件(函數(shù)聲明)
代碼如下(示例):
#pragma once #define ROW 9 #define COL 9 #define ROWS ROW+2 #define COLS COL+2 #define EASY_COUNT 10 #include<stdlib.h> #include<time.h> //初始化棋盤 void initboard(char board[ROWS][COLS], int rows, int cols,char s); //打印棋盤 void displayboard(char board[ROWS][COLS], int row, int col); //布置雷 void setmine(char board[ROWS][COLS], int row, int col); //排查雷 void findmine(char board[ROWS][COLS], char show[ROWS][COLS], int row, int col);
二、函數(shù)文件(函數(shù)定義)
1.引入庫(kù)
ps:game.h即前面的函數(shù)頭文件,引用自己創(chuàng)建的文件用“ ”
代碼如下(示例):
#define _CRT_SECURE_NO_WARNINGS #include"game.h" #include<stdio.h> void initboard(char board[ROWS][COLS], int rows, int cols,char s) { int i = 0; for (i = 0;i < rows;i++) { int j = 0; for (j = 0;j < cols;j++) { board[i][j] = s; } } } 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"); } void setmine(char board[ROWS][COLS], int row, int col) { int count = EASY_COUNT; while (count) { //1.生成隨機(jī)下標(biāo)(1-9) int x = rand() % row + 1; int y = rand() % col + 1; if (board[x][y] != '1')//布置雷要考慮某塊地方是否已經(jīng)被安放過(guò)雷 { board[x][y] = '1'; count--;//判斷雷布置成功(沒(mé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 - 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';//符號(hào)數(shù)字-‘0'=數(shù)字(十進(jìn)制),詳情見(jiàn)ascll碼表 } 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)輸入錯(cuò)誤,請(qǐng)重新輸入:\n"); } } if (win == row * col - EASY_COUNT) { printf("You win!\n"); displayboard(show, ROW, COL); } }
2.主體文件
代碼如下(示例):
#define _CRT_SECURE_NO_WARNINGS #include<stdio.h> #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');//用‘0'覆蓋 initboard(show, ROWS, COLS,'*');//用‘*'覆蓋 /*displayboard(mine,ROW,COL); displayboard(show, ROW, COL);*/ //布置雷 setmine(mine, ROW, COL); displayboard(show, ROW, COL); //displayboard(mine, ROW, COL);//對(duì)檢查能否通關(guān)時(shí),進(jìn)行一次排查要完成一次掃雷游戲,時(shí)間太長(zhǎng),也不方便,可以將9*9的棋盤雷設(shè)置為80個(gè),打印出雷所在位置,再進(jìn)行排查1次即可 //排查雷 findmine(mine,show,ROW,COL); } int main() { int input = 0; srand((unsigned int)time(NULL)); do { menu(); printf("請(qǐng)輸入1進(jìn)行游戲 或0退出游戲\n"); scanf("%d", &input); switch (input) { case 1: game(); break; case 0: printf("退出游戲\n"); break; default: printf("選擇錯(cuò)誤\n"); break; } } while (input); }
總結(jié)
這里的制作的掃雷還有兩個(gè)地方需要酌情改進(jìn),一個(gè)是點(diǎn)擊一個(gè)空白處,可以擴(kuò)散其他空白,減少游戲繁瑣性;另一個(gè)就是確定一個(gè)坐標(biāo)為雷時(shí),可以進(jìn)行“插旗子”將雷區(qū)標(biāo)記出來(lái)。其余的對(duì)雷進(jìn)行隨機(jī)擺放、遍歷出雷的個(gè)數(shù),確定該坐標(biāo)附近有多少雷、踩雷或掃雷成功等問(wèn)題在本文中都已得到解決,希望對(duì)讀者有所幫助。
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
C++實(shí)現(xiàn)LeetCode(39.組合之和)
這篇文章主要介紹了C++實(shí)現(xiàn)LeetCode(39.組合之和),本篇文章通過(guò)簡(jiǎn)要的案例,講解了該項(xiàng)技術(shù)的了解與使用,以下就是詳細(xì)內(nèi)容,需要的朋友可以參考下2021-07-07詳解C++調(diào)用Python腳本中的函數(shù)的實(shí)例代碼
這篇文章主要介紹了C++調(diào)用Python腳本中的函數(shù) ,需要的朋友可以參考下2018-11-11C語(yǔ)言靜態(tài)版通訊錄的設(shè)計(jì)與實(shí)現(xiàn)
靜態(tài)版通訊錄是一種簡(jiǎn)單的通訊錄實(shí)現(xiàn)方式,通過(guò)定義固定的數(shù)組大小來(lái)存儲(chǔ)聯(lián)系人信息。該方法不支持動(dòng)態(tài)增刪聯(lián)系人,但具有實(shí)現(xiàn)簡(jiǎn)單、易于理解的優(yōu)點(diǎn)。在程序設(shè)計(jì)中,需注意數(shù)組邊界溢出等問(wèn)題2023-04-04Qt圖形圖像開(kāi)發(fā)曲線圖表模塊QChart庫(kù)基本用法、各個(gè)類之間的關(guān)系說(shuō)明
這篇文章主要介紹了Qt圖形圖像開(kāi)發(fā)曲線圖表模塊QChart庫(kù)基本用法、各個(gè)類之間的關(guān)系說(shuō)明,需要的朋友可以參考下2020-03-03C++ Boost命令行解析庫(kù)的應(yīng)用詳解
命令行解析庫(kù)是一種用于簡(jiǎn)化處理命令行參數(shù)的工具,它可以幫助開(kāi)發(fā)者更方便地解析命令行參數(shù)并提供適當(dāng)?shù)膸椭畔?本文主要介紹了不同的命令行解析庫(kù)和它們?cè)贑++項(xiàng)目中的應(yīng)用,希望對(duì)大家有所幫助2023-11-11C++輕量級(jí)界面開(kāi)發(fā)框架ImGUI介紹小結(jié)
如果從事過(guò)C++?Windows客戶端開(kāi)發(fā),大家對(duì)MFC、Qt、DuiLib等各種DirectUI應(yīng)該有了解,本篇給大家介紹一個(gè)超級(jí)輕量級(jí)的C++開(kāi)源跨平臺(tái)圖形界面框架ImGUI,感興趣的可以了解一下2021-11-11C/C++浮點(diǎn)數(shù)使用的兩個(gè)注意事項(xiàng)詳解
浮點(diǎn)數(shù)都是有符號(hào)的,沒(méi)有 unsigned 浮點(diǎn)數(shù),下面這篇文章主要給大家介紹了關(guān)于C/C++浮點(diǎn)數(shù)使用的兩個(gè)注意事項(xiàng),文中通過(guò)圖文介紹的非常詳細(xì),需要的朋友可以參考下2023-02-02C++中priority_queue模擬實(shí)現(xiàn)的代碼示例
在c++語(yǔ)言中數(shù)據(jù)結(jié)構(gòu)中的堆結(jié)構(gòu)可以通過(guò)STL庫(kù)中的priority_queue 優(yōu)先隊(duì)列來(lái)實(shí)現(xiàn),這樣做極大地簡(jiǎn)化了我們的工作量,這篇文章主要給大家介紹了關(guān)于C++中priority_queue模擬實(shí)現(xiàn)的相關(guān)資料,需要的朋友可以參考下2021-08-08C++ 風(fēng)靡一時(shí)的連連看游戲的實(shí)現(xiàn)流程詳解
游戲“連連看”是源自臺(tái)灣的桌面小游戲,自從流入大陸以來(lái)風(fēng)靡一時(shí),也吸引眾多程序員開(kāi)發(fā)出多種版本的“連連看”。這其中,顧芳編寫的“阿達(dá)連連看”以其精良的制作廣受好評(píng),這也成為顧方“阿達(dá)系列軟件”的核心產(chǎn)品。并于2004年,取得國(guó)家版權(quán)局的計(jì)算機(jī)軟件登記證書2021-11-11