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

用C語言實現(xiàn)掃雷游戲

 更新時間:2021年06月06日 09:34:19   作者:Enthusiastic_boy  
這篇文章主要為大家詳細(xì)介紹了用C語言實現(xiàn)掃雷游戲,文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下

用C語言實現(xiàn)掃雷游戲,因為代碼會比較多,所以采用多文件的方式,使代碼看起來更好。

一.main.c

在主調(diào)函數(shù)中首先要提供一個給用戶選擇的界面,在這里我們假定選擇1為開始游戲,0為退出游戲,代碼如下:

函數(shù)執(zhí)行開始,會在顯示框中提示用戶輸入數(shù)字,1為進(jìn)入游戲,此時會調(diào)用Game()函數(shù);0為退出游戲。其中while循環(huán)的作用是當(dāng)用戶進(jìn)入界面輸入錯誤(非01)或者完成一把游戲后繼續(xù)彈出選項,只有當(dāng)輸入0才將num置為0,退出循環(huán)。

二.test.h

此為頭文件,其中包含宏定義和函數(shù)的聲明,代碼如下:

#ifndef __TEST_H__//防止頭文件被重復(fù)包含
#define __TEST_H__
#define _CRT_SECURE_NO_WARNINGS 1
 
#include <stdio.h>
#include <windows.h>
#define HORI 6//控制數(shù)組大小
#define VERT 6//控制數(shù)組大小
#define NUM 7//埋雷數(shù)量
#define STYLE '#'//初始化時顯示的字符
extern void  Game();
 
#endif

三.test.c

1.有關(guān)于掃雷的主要代碼都會寫在這個文件里。test.c當(dāng)中必須包含頭文件test.h(因為代碼分塊問題,這里我沒有寫)。Game()函數(shù)調(diào)用其他函數(shù),實現(xiàn)整個掃雷過程,不使用二維數(shù)組的邊框,原因是如果使用邊框就不好計算周圍雷的個數(shù)。system("cls")為清屏操作,加上以后的效果就是看起來是在一張圖上掃雷。見以下代碼:

void Game(){
 srand((unsigned long)time(NULL));//生成隨機(jī)數(shù)種子
 char fake[HORI][VERT];//定義一個二維數(shù)組用于顯示給用戶
 char mine[HORI][VERT];//定義一個和上邊大小相同的二維數(shù)組用來埋雷
 memset(fake,STYLE , sizeof(fake));//初始化為STYLE
 memset(mine, '0', sizeof(mine));//初始化為字符0
 int count = (HORI - 2)*(VERT - 2) - NUM;//不使用數(shù)組邊框,計算出剩余大小
 Bray(mine,HORI,VERT);//調(diào)用函數(shù)實現(xiàn)埋雷
 while (count){//一直做循環(huán)直到用戶掃雷完成
  Display(fake,HORI,VERT);//顯示二維數(shù)組fake
  int x = 0;
  int y = 0;
  printf("Please Enter Your Postion<x,y>#:\n");
  scanf("%d%d", &x, &y);//輸入掃雷坐標(biāo)
  if (x<1 || x>10 || y<1 || y>10){//輸入非法跳出本次循環(huán)繼續(xù)下一次
   printf("Please try again:\n");
   continue;
  }
  if (fake[x][y] != STYLE){//輸入非法跳出本次循環(huán)繼續(xù)下一次
   printf("Please try again:\n");
   continue;
  }
  if (mine[x][y] =='1'){//掃到雷了,游戲結(jié)束,跳出while循環(huán),返回到選擇界面
   printf("Game over\n");
   Display(mine, HORI, VERT);
   break;
  }
  fake[x][y] = Digital(mine,x,y);//把數(shù)組mine[x][y]旁邊的雷的數(shù)量算出來,賦值給fake[x][y];
  count--;//沒碰到雷時,count減一,離成功又近一步
  system("cls");//清屏
 }
}

2..埋雷函數(shù)Bray()的實現(xiàn),把雷設(shè)置為字符‘1',目的是方便計算周圍雷的個數(shù);count此時為埋雷數(shù)量,控制while循環(huán)次數(shù),可能出現(xiàn)生成隨機(jī)數(shù)相同,所以將count--放在if語句中,用來防止生成的隨機(jī)數(shù)位置相同。代碼如下:

void Bray(char arr[][VERT],int hori,int vert){//埋雷,雷為1字符
 int count = NUM;
 while (count){
  int x = rand() % (hori - 2) + 1;
  int y= rand() % (vert - 2) + 1;
  if (arr[x][y] == '0'){
   arr[x][y]='1';
   count--;
  }
 }
};

3..計算周圍雷個數(shù)的函數(shù)Digital()如下,假如返回值為int型表示雷的個數(shù)則:因為數(shù)組mine中存放的是字符‘0'(Ascllc碼為48)和字符‘1'(Ascllc碼為49),把以x,y為下標(biāo)的字符一圈加起來在減去8乘以‘0'(字符0)為想要的雷的數(shù)量;但是返回值卻是char類型,所以再給式子加上‘0'(字符0)就轉(zhuǎn)化為所對應(yīng)的char類型了;所以總體為減去7乘以‘0'(字符0)。代碼如下:

char Digital(char arr[][VERT],int x,int y){//返回字符
 return arr[x - 1][y - 1] + arr[x - 1][y] + arr[x - 1][y + 1] + arr[x][y - 1] + \
  arr[x][y + 1] + arr[x + 1][y - 1] + arr[x + 1][y] + arr[x + 1][y + 1] - 7 * '0';
};

4.顯示游戲界面的函數(shù)為Display() ,不適用數(shù)組邊框,所以ij的起始數(shù)字為1,剛好對應(yīng)數(shù)組下標(biāo)。代碼如下:

void Print(hori){
 printf("  ");
 for (int i = 0; i < hori - 2; i++){
  printf("----");
 }
 printf("\n");//每打印一行后換行
}
void Display(char arr[][VERT],int hori,int vert){//顯示窗口
 printf(" ");//首先打印一個空格,根據(jù)具體需要調(diào)整
 for (int i = 1; i < hori - 1; i++){//打印出數(shù)字1到數(shù)組長度減二
  printf("%4d", i);
 }
 printf("\n");//換行
 Print(hori);//首先打印一段橫杠
 for (int i = 1; i < hori - 1; i++){
  printf("%-2d|", i);
  for (int j = 1; j < vert - 1; j++){
   printf("  %c|",arr[i][j]);
  }//打印一行空格加雷的數(shù)量加|
  printf("\n");//每打印一行后換行
  Print(hori);//打印橫杠
 }
};

test.c中除了Game()函數(shù),其他函數(shù)可用static修飾,不用暴露給外部。

做完這些就完成了掃雷的代碼,運行效果如下:

此時輸入坐標(biāo)就可以玩掃雷游戲了。

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

相關(guān)文章

  • 深入理解char *a與char a[]的區(qū)別

    深入理解char *a與char a[]的區(qū)別

    很多人可能或多或少知道char *a與char a[]的一些區(qū)別,但如果詳細(xì)的說出來卻不知如何說去,下面這篇文章就給大家詳細(xì)介紹了關(guān)于C語言中char *a與char a[]的區(qū)別,有需要的朋友們可以參考借鑒,下面來一起學(xué)習(xí)學(xué)習(xí)吧。
    2016-12-12
  • C++單一職責(zé)原則示例代碼淺析

    C++單一職責(zé)原則示例代碼淺析

    我們在設(shè)計一個類時要學(xué)會發(fā)現(xiàn)職責(zé),并把那些職責(zé)相互分離,其實要去判斷是否應(yīng)該分離出一個類來并不難,前面說過,一個類應(yīng)該只有一個引起它變化的原因,如果你能想到其它的原因也能去改變這個類,那么這個類就具有多于1個的職責(zé),就應(yīng)該考慮類的職責(zé)分離
    2023-02-02
  • 從匯編看c++中引用與指針的使用分析

    從匯編看c++中引用與指針的使用分析

    在c++中,引用和指針具有相同的作用,都可以用來在函數(shù)里面給變函數(shù)外面對象或者變量的值,下面就來看他們的原理
    2013-05-05
  • 關(guān)于C++讀入數(shù)字按位取出與進(jìn)制轉(zhuǎn)換問題(典型問題)

    關(guān)于C++讀入數(shù)字按位取出與進(jìn)制轉(zhuǎn)換問題(典型問題)

    這篇文章主要介紹了關(guān)于C++讀入數(shù)字按位取出與進(jìn)制轉(zhuǎn)換問題,是一個非常典型的問題,本文通過實例舉例給大家介紹的非常詳細(xì),需要的朋友可以參考下
    2020-02-02
  • 你知道C++中new和delete為什么要匹配使用嗎

    你知道C++中new和delete為什么要匹配使用嗎

    關(guān)于 new 和 delete 的使用相信大家并不陌生,可是為什么使用 new 的時候要用 delete,使用 new[] 的時候又要用 delete[]呢?本文就來和大家詳細(xì)說說
    2023-01-01
  • C語言數(shù)據(jù)結(jié)構(gòu)之中綴樹轉(zhuǎn)后綴樹的實例

    C語言數(shù)據(jù)結(jié)構(gòu)之中綴樹轉(zhuǎn)后綴樹的實例

    這篇文章主要介紹了C語言數(shù)據(jù)結(jié)構(gòu)之中綴樹轉(zhuǎn)后綴樹的實例的相關(guān)資料,需要的朋友可以參考下
    2017-08-08
  • C++ list的實例詳解

    C++ list的實例詳解

    這篇文章主要介紹了 C++ list的實例詳解的相關(guān)資料,希望通過本文大家能夠理解掌握這部分內(nèi)容,需要的朋友可以參考下
    2017-09-09
  • C++模擬Linux Shell編寫一個自定義命令

    C++模擬Linux Shell編寫一個自定義命令

    這篇文章主要介紹了C++如何模擬Linux Shell實現(xiàn)編寫一個自定義命令,本文通過實例代碼進(jìn)行命令行解析,代碼簡單易懂,對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2022-12-12
  • C++類中的常量介紹

    C++類中的常量介紹

    const數(shù)據(jù)成員只在某個對象生存期內(nèi)是常量,而對于整個類而言卻是可變的,因為類可以創(chuàng)建多個對象,不同的對象其const數(shù)據(jù)成員的值可以不同
    2013-10-10
  • C語言編程題楊氏矩陣算法快速上手示例詳解

    C語言編程題楊氏矩陣算法快速上手示例詳解

    這篇文章主要為大家介紹了C語言編程題楊氏矩陣算法快速上手的示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步早日升職加薪
    2021-10-10

最新評論