C言語で掃海ゲームを実現する


C言語で掃海ゲームを実現します。コードが多いので、マルチファイルの方式を採用してコードをより良く見せます。
一.メール.
主調関数ではまずユーザーに選択するインターフェースを提供します。ここではスタートゲームとして1を選択すると仮定します。0は終了ゲームとして、コードは以下の通りです。

関数の実行開始は、表示ボックスに数字の入力をユーザに促すことができます。1はゲームに入るために、Game()関数を呼び出します。0はゲームを終了するためです。このうちwhileループの役割は、ユーザーがインターフェースに入力してエラー(非0または1)を入力するか、またはゲームを完了したら引き続きポップアップオプションを選択し、0を入力するとnumを0にし、ループを終了します。
二.test.h
これはヘッダファイルです。マクロ定義と関数を含む宣言コードは以下の通りです。

#ifndef __TEST_H__//          
#define __TEST_H__
#define _CRT_SECURE_NO_WARNINGS 1
 
#include <stdio.h>
#include <windows.h>
#define HORI 6//      
#define VERT 6//      
#define NUM 7//    
#define STYLE '#'//         
extern void  Game();
 
#endif
三.test.
1.機雷除去に関する主要コードはこの書類に書いてあります。test.cには必ずヘッダファイルtest.hが含まれています。Game()関数は,他の関数を呼び出して,掃海過程全体を実現し,二次元配列の枠線を使用しないため,外枠を使用すると周囲の雷の個数が計算されにくいからである。system(「cls」)はクリーンスクリーン操作であり、今後の効果を加えると、一枚の絵の上で機雷を掃きます。以下のコードを参照してください

void Game(){
 srand((unsigned long)time(NULL));//       
 char fake[HORI][VERT];//               
 char mine[HORI][VERT];//                    
 memset(fake,STYLE , sizeof(fake));//    STYLE
 memset(mine, '0', sizeof(mine));//      0
 int count = (HORI - 2)*(VERT - 2) - NUM;//       ,       
 Bray(mine,HORI,VERT);//        
 while (count){//             
  Display(fake,HORI,VERT);//      fake
  int x = 0;
  int y = 0;
  printf("Please Enter Your Postion<x,y>#:
"); scanf("%d%d", &x, &y);// if (x<1 || x>10 || y<1 || y>10){// printf("Please try again:
"); continue; } if (fake[x][y] != STYLE){// printf("Please try again:
"); continue; } if (mine[x][y] =='1'){// , , while , printf("Game over
"); Display(mine, HORI, VERT); break; } fake[x][y] = Digital(mine,x,y);// mine[x][y] , fake[x][y]; count--;// ,count , system("cls");// } }
2.埋め雷関数Bray()の実現は、雷を文字‘1’に設定し、周囲の雷の個数を計算しやすいようにすることです。countはこの時点で埋め雷数であり、whileの循環回数を制御すると、発生乱数が同じになる可能性がありますので、count--if文に置いて、生成された乱数の位置が同じになることを防止します。コードは以下の通りです

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.周囲の雷の個数を計算する関数Digital()は、戻り値がint型であれば雷の個数を表します。配列mineには文字‘0’(Ascllcコードが48)と文字‘1’(Ascllcコードが49)が格納されていますので、x,yを下の文字として一回転して8に‘0’(文字0)を乗じて欲しい雷の数を減算します。しかし、戻り値はcharタイプなので、式子に「0」(文字0)を加えると、対応する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.ゲーム画面を表示する関数はDisplay()で、配列枠は適用されないので、iとjの開始数字は1で、ちょうど配列下付きです。コードは以下の通りです

void Print(hori){
 printf("  ");
 for (int i = 0; i < hori - 2; i++){
  printf("----");
 }
 printf("
");// } void Display(char arr[][VERT],int hori,int vert){// printf(" ");// , for (int i = 1; i < hori - 1; i++){// 1 printf("%4d", i); } printf("
");// 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]); }// | printf("
");// Print(hori);// } };
test.cにはGame関数以外に、他の関数はstaticで修飾され、外部に露出する必要がない。
これらを完成したら雷除去コードが完成しました。運行効果は以下の通りです。

座標を入力すれば、掃海ゲームができます。
以上が本文の全部です。皆さんの勉強に役に立つように、私たちを応援してください。