欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

C語(yǔ)言實(shí)現(xiàn)簡(jiǎn)易版掃雷小游戲

 更新時(shí)間:2020年07月17日 11:46:55   作者:浪漫不死  
這篇文章主要為大家詳細(xì)介紹了C語(yǔ)言實(shí)現(xiàn)簡(jiǎn)易版掃雷小游戲,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下

本文實(shí)例為大家分享了C語(yǔ)言實(shí)現(xiàn)簡(jiǎn)易版掃雷的具體代碼,供大家參考,具體內(nèi)容如下

聲明

本次掃雷小游戲用多文件來(lái)編寫(xiě)。首先,要自定義的一個(gè)頭文件 mine.h,里面有掃雷程序里面所需要的頭文件、常量和所有函數(shù)的聲明。其次,創(chuàng)建主函數(shù) test.c,用自己喜歡的方式構(gòu)建一個(gè)游戲的框架,最后,創(chuàng)建自定義函數(shù) mine.c,編寫(xiě)各項(xiàng)功能。

設(shè)計(jì)思路

1、先寫(xiě)主函數(shù),理清整個(gè)游戲流程。

int main()
{
 int quit = 0;
 do{
 int select = 0;
 Menu();
 scanf("%d", &select);
 switch (select){
 case 1:
 Game();
 printf("Game Over ... Again?\n");
 break;
 case 2:
 quit = 1;
 printf("Bye ... \n");
 break;
 default:
 printf("Error ... Please Select Again!\n");
 break;
 }
 } while (!quit);
 system("pause");
 return 0;
}

2、根據(jù)主函數(shù)的需要,先寫(xiě)菜單函數(shù) Menu(),這個(gè)函數(shù)很簡(jiǎn)單,只需要 printf 就好,菜單的樣子也是自主設(shè)計(jì)。

static void Menu()
{
 printf("===========================\n");
 printf("|   掃雷   |\n");
 printf("|   1.Play   |\n");
 printf("|   2.Exit   |\n");
 printf("===========================\n");
 printf(" Please Select:");
}

3、編寫(xiě)Game()函數(shù),在這個(gè)函數(shù)里我們將要實(shí)現(xiàn)掃雷游戲的全部?jī)?nèi)容。也是一樣的,在這個(gè)函數(shù)里先寫(xiě)一個(gè)大的框架,構(gòu)建需要的函數(shù),然后再根據(jù)我們的需求在 mine.c 里設(shè)計(jì)所有我們需要的自定義函數(shù)。

void Game()
{
 srand((unsigned long)time(NULL));

 char board[ROW][COL];
 char mine[ROW][COL];

 InitBoard(board, ROW, COL, ' '); //' '
 InitBoard(mine, ROW, COL, '0'); //'0'

 SetMine(mine, ROW, COL);
 //ShowBoard(board, ROW, COL);
 //ShowBoard(mine, ROW, COL);

 int count = (ROW - 2)*(COL - 2) - NUM;
 do{
 system("cls");
 int x = 0;
 int y = 0;
 ShowBoard(board, ROW, COL);
 printf("請(qǐng)輸入你要掃的位置-> ");
 scanf("%d %d", &x, &y);
 if (x < 1 || x > 10 || y < 1 || y > 10){//[1,10]
 printf("你輸入的位置是錯(cuò)誤的,請(qǐng)重新輸入...\n");
 Sleep(1000);
 continue;
 }
 if (board[x][y] != ' '){
 printf("你輸入的位置已經(jīng)被掃過(guò),請(qǐng)重新輸入...\n");
 Sleep(1000);
 continue;
 }
 if (mine[x][y] == '0'){
 count--;
 char num = GetNum(mine, x, y);
 board[x][y] = num;
 }
 else{
 printf("你輸入的位置(%d, %d),有雷!\n", x, y);
 break;
 }
 } while (count > 0);

 char *result = NULL;
 if (count > 0){
 result = "** 掃雷結(jié)束, 你被炸死了! **\n";
 }
 else{
 result = "**掃雷結(jié)束,恭喜你,成功啦! **\n";
 }

 printf("-------------------------------\n");
 printf("%s", result);
 printf("-------------------------------\n");
 ShowBoard(mine, ROW, COL);
}

4、創(chuàng)建雷盤(pán),還需要記錄掃描雷盤(pán)。掃雷的面板是通過(guò)定義的宏來(lái)自定義大小。需要注意的是在算某個(gè)坐標(biāo)的周?chē)卸嗌賯€(gè)地雷的時(shí)候需要掃描他周?chē)?個(gè)格子,所以給二維數(shù)組多定義一圈,讓它們初始化跟內(nèi)圈一樣為‘0',這樣掃描的時(shí)候就不算那些格子了。

void InitBoard(char board[][COL], int row, int col, char elem)
{
 int i = 0;
 for (; i < row; i++){
 int j = 0;
 for (; j < col; j++){
 board[i][j] = elem;
 }
 }
}

void ShowBoard(char board[][COL], int row, int col)
{
 int i = 1;
 printf(" ");
 for (; i <= col - 2; i++){
 printf(" %-2d|", i);
 }
 printf("\n");
 for (i = 1; i <= col - 2; i++){
 printf("%3s", "----");
 }
 printf("---\n");

 for (i = 1; i <= row - 2; i++){
 printf("%2d|", i);
 int j = 1;
 for (; j <= col - 2; j++){
 printf(" %-2c|", board[i][j]);
 }
 printf("\n");
 for (j = 1; j <= col - 2; j++){
 printf("%3s", "----");
 }
 printf("---\n");
 }
}

char GetNum(char mine[][COL], int x, int y)
{
 return mine[x - 1][y - 1] + mine[x - 1][y] + 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] - 7 * '0';
}

5、最后我們要一個(gè)函數(shù)來(lái)隨機(jī)擺放地雷的位置,那么就有了SetMine函數(shù)。

void SetMine(char mine[][COL], int row, int col)
{
 int n = NUM;
 while (n){
 int x = rand() % (row - 2) + 1;
 int y = rand() % (col - 2) + 1;
 if (mine[x][y] == '1'){
 continue;
 }

 mine[x][y] = '1';
 n--;
 }
}

這里說(shuō)一下,因?yàn)殡S機(jī)所以需要 rand()庫(kù)函數(shù),但是調(diào)用rand之前,要在 Game()中寫(xiě)一句

srand((unsigned long)time(NULL));

源代碼

mine.h

#ifndef _MINE_H_
#define _MINE_H_

#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include <windows.h>

#pragma warning(disable:4996)

#define ROW 10
#define COL 10

#define NUM 10

void Game();
void InitBoard(char board[][COL], int row, int col, char elem);
void SetMine(char mine[][COL], int row, int col);
void ShowBoard(char board[][COL], int row, int col);
char GetNum(char mine[][COL], int x, int y); 

#endif

mine.c

#include "mine.h"

void InitBoard(char board[][COL], int row, int col, char elem)
{
 int i = 0;
 for (; i < row; i++){
 int j = 0;
 for (; j < col; j++){
 board[i][j] = elem;
 }
 }
}
void SetMine(char mine[][COL], int row, int col)
{
 int n = NUM;
 while (n){
 int x = rand() % (row - 2) + 1;
 int y = rand() % (col - 2) + 1;
 if (mine[x][y] == '1'){
 continue;
 }

 mine[x][y] = '1';
 n--;
 }
}
void ShowBoard(char board[][COL], int row, int col)
{
 int i = 1;
 printf(" ");
 for (; i <= col - 2; i++){
 printf(" %-2d|", i);
 }
 printf("\n");
 for (i = 1; i <= col - 2; i++){
 printf("%3s", "----");
 }
 printf("---\n");

 for (i = 1; i <= row - 2; i++){
 printf("%2d|", i);
 int j = 1;
 for (; j <= col - 2; j++){
 printf(" %-2c|", board[i][j]);
 }
 printf("\n");
 for (j = 1; j <= col - 2; j++){
 printf("%3s", "----");
 }
 printf("---\n");
 }
}
char GetNum(char mine[][COL], int x, int y)
{
 return mine[x - 1][y - 1] + mine[x - 1][y] + 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] - 7 * '0';
}

void Game()
{
 srand((unsigned long)time(NULL));

 char board[ROW][COL];
 char mine[ROW][COL];

 InitBoard(board, ROW, COL, ' '); //' '
 InitBoard(mine, ROW, COL, '0'); //'0'

 SetMine(mine, ROW, COL);
 //ShowBoard(board, ROW, COL);
 //ShowBoard(mine, ROW, COL);

 int count = (ROW - 2)*(COL - 2) - NUM;
 do{
 system("cls");
 int x = 0;
 int y = 0;
 ShowBoard(board, ROW, COL);
 printf("請(qǐng)輸入你要掃的位置-> ");
 scanf("%d %d", &x, &y);
 if (x < 1 || x > 10 || y < 1 || y > 10){//[1,10]
 printf("你輸入的位置是錯(cuò)誤的,請(qǐng)重新輸入...\n");
 Sleep(1000);
 continue;
 }
 if (board[x][y] != ' '){
 printf("你輸入的位置已經(jīng)被掃過(guò),請(qǐng)重新輸入...\n");
 Sleep(1000);
 continue;
 }
 if (mine[x][y] == '0'){
 count--;
 char num = GetNum(mine, x, y);
 board[x][y] = num;
 }
 else{
 printf("你輸入的位置(%d, %d),有雷!\n", x, y);
 break;
 }
 } while (count > 0);

 char *result = NULL;
 if (count > 0){
 result = "** 掃雷結(jié)束, 你被炸死了! **\n";
 }
 else{
 result = "**掃雷結(jié)束,恭喜你,成功啦! **\n";
 }

 printf("-------------------------------\n");
 printf("%s", result);
 printf("-------------------------------\n");
 ShowBoard(mine, ROW, COL);
}

test.c

#include "mine.h"

static void Menu()
{
 printf("===========================\n");
 printf("|   掃雷   |\n");
 printf("|   1.Play   |\n");
 printf("|   2.Exit   |\n");
 printf("===========================\n");
 printf(" Please Select:");
}

int main()
{
 int quit = 0;
 do{
 int select = 0;
 Menu();
 scanf("%d", &select);
 switch (select){
 case 1:
 Game();
 printf("Game Over ... Again?\n");
 break;
 case 2:
 quit = 1;
 printf("Bye ... \n");
 break;
 default:
 printf("Error ... Please Select Again!\n");
 break;
 }
 } while (!quit);
 system("pause");
 return 0;
}

總結(jié)

總的來(lái)說(shuō),在編寫(xiě)代碼的時(shí)候還是得有一個(gè)清晰的思路,搭建框架,再細(xì)分其中細(xì)節(jié),需要什么就去編寫(xiě)什么。代碼很簡(jiǎn)單,但很經(jīng)典,希望對(duì)你有所幫助。

更多有趣的經(jīng)典小游戲?qū)崿F(xiàn)專(zhuān)題,分享給大家:

C++經(jīng)典小游戲匯總

python經(jīng)典小游戲匯總

python俄羅斯方塊游戲集合

JavaScript經(jīng)典游戲 玩不停

java經(jīng)典小游戲匯總

javascript經(jīng)典小游戲匯總

以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

  • C語(yǔ)言實(shí)現(xiàn)簡(jiǎn)單的井字棋游戲

    C語(yǔ)言實(shí)現(xiàn)簡(jiǎn)單的井字棋游戲

    這篇文章主要為大家詳細(xì)介紹了C語(yǔ)言實(shí)現(xiàn)簡(jiǎn)單的井字棋游戲,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2021-04-04
  • C++ deque/queue/stack的底層原理解析

    C++ deque/queue/stack的底層原理解析

    這篇文章主要介紹了C++ deque/queue/stack的底層原理解析,本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2023-07-07
  • Windows系統(tǒng)下使用C語(yǔ)言編寫(xiě)單線程的文件備份程序

    Windows系統(tǒng)下使用C語(yǔ)言編寫(xiě)單線程的文件備份程序

    這篇文章主要介紹了Windows系統(tǒng)下使用C語(yǔ)言編寫(xiě)單線程的文件備份程序,文中給出了實(shí)現(xiàn)的幾個(gè)關(guān)鍵代碼片段,剩下的只要套上main和線程調(diào)用的相關(guān)函數(shù)即可,非常詳細(xì),需要的朋友可以參考下
    2016-02-02
  • C語(yǔ)言中`||`的短路機(jī)制詳解

    C語(yǔ)言中`||`的短路機(jī)制詳解

    在C語(yǔ)言中,邏輯或運(yùn)算符(||)是一種常用的邏輯運(yùn)算符,用于組合多個(gè)條件表達(dá)式,C語(yǔ)言中的邏輯或運(yùn)算符具有短路機(jī)制,這是一種非常重要的概念,本文將深入解釋C語(yǔ)言中的||短路機(jī)制以及其在編程中的應(yīng)用,感興趣的朋友跟隨小編一起看看吧
    2024-01-01
  • C語(yǔ)言零基礎(chǔ)徹底掌握預(yù)處理上篇

    C語(yǔ)言零基礎(chǔ)徹底掌握預(yù)處理上篇

    在C語(yǔ)言的程序中包括各種以符號(hào)#開(kāi)頭的編譯指令,這些指令稱(chēng)為預(yù)處理命令。預(yù)處理命令屬于C語(yǔ)言編譯器,而不是C語(yǔ)言的組成部分,通過(guò)預(yù)處理命令可擴(kuò)展C語(yǔ)言程序設(shè)計(jì)的環(huán)境
    2022-08-08
  • C++?引用與內(nèi)聯(lián)函數(shù)詳情

    C++?引用與內(nèi)聯(lián)函數(shù)詳情

    這篇文章主要介紹了C++?引用與內(nèi)聯(lián)函數(shù)詳情,主要分享一下關(guān)于引用的知識(shí)點(diǎn),這里都是一些比較基礎(chǔ)的知識(shí),適合初學(xué)者,下文續(xù)航徐介紹需要的小伙伴可以參考一下
    2022-05-05
  • C/C++實(shí)現(xiàn)string和int相互轉(zhuǎn)換的常用方法總結(jié)

    C/C++實(shí)現(xiàn)string和int相互轉(zhuǎn)換的常用方法總結(jié)

    在C++編程中,經(jīng)常需要在字符串(string)和整型(int)之間進(jìn)行轉(zhuǎn)換,本文將詳細(xì)介紹幾種在C和C++中實(shí)現(xiàn)這兩種類(lèi)型轉(zhuǎn)換的常用方法,有需要的可以參考下
    2024-01-01
  • 詳解為什么指針被譽(yù)為C語(yǔ)言靈魂

    詳解為什么指針被譽(yù)為C語(yǔ)言靈魂

    說(shuō)到指針,就不可能脫離開(kāi)內(nèi)存,學(xué)會(huì)指針的人分為兩種,一種是不了解內(nèi)存模型,另外一種則是了解。不了解的對(duì)指針的理解就停留在“指針就是變量的地址”這句話,會(huì)比較害怕使用指針,特別是各種高級(jí)操作。本文將帶你詳細(xì)了解C語(yǔ)言指針
    2021-06-06
  • 介紹C語(yǔ)言中tolower函數(shù)的實(shí)例

    介紹C語(yǔ)言中tolower函數(shù)的實(shí)例

    這篇文章主要介紹了介紹C語(yǔ)言中tolower函數(shù)的實(shí)例,本文列出了該函數(shù)的頭文件,功能說(shuō)明等,以及如何使用,以下就是詳細(xì)內(nèi)容,需要的朋友可以參考下
    2021-07-07
  • C語(yǔ)言代碼實(shí)現(xiàn)掃雷游戲

    C語(yǔ)言代碼實(shí)現(xiàn)掃雷游戲

    這篇文章主要為大家詳細(xì)介紹了C語(yǔ)言代碼實(shí)現(xiàn)掃雷游戲,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2020-02-02

最新評(píng)論