C言語で掃海ゲームを実現する(コメント詳細を含む)


本論文の実例はC言語による掃海ゲームの具体的なコードを共有しています。参考にしてください。具体的な内容は以下の通りです。
前言
一、ゲームのルール紹介
雷除去は非常に古典的なゲームで、1枚の碁盤の中には雷かそれとも安全なエリアの格子がたくさんあります。クリックした後に雷がないとこのエリアに周りの8つの格子雷の数が表示されます。雷があればゲームは終わります。今日は皆さんとc言語で初歩版の落雷を達成する方法を共有します。
二、基本的な考え方の流れの紹介
1.ユーザーインタラクティブメニューを作成する
2.Show_を作成するMinesボードは雷を埋めて初期化します。
3.Show_を作成するテーブルボードはユーザーと対話して初期化します。
4.プレイヤーはスキャンしたい座標を選択します。
5.ゲームが終了したかどうかを判定する
6.地雷が踏まれていない場合は、スキャンした直後のエリアに地雷の数を表示し、ゲームを続けます。
7.引き続き機雷除去
8.ゲームが終了したかどうかを判定する

9.全部スキャンしたらゲーム終了です。
効果の展示




三、コード実現
1.ユーザーインタラクティブメニュー(Menu関数)

Menu(){
 printf("########################
"); printf("# 1. Play 0.Exit #
"); printf("########################
"); }
2.Game関数

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

 char show_board[ROW][COL];   
 char mines_board[ROW][COL];

 memset(show_board, WHAT, sizeof(show_board));//             
 memset(mines_board, '0', sizeof(mines_board));//           

 SetMines(mines_board, ROW, COL);//  

 int count = (ROW - 2)*(COL - 2) - NUM;    //             

 while (count){
  system("cls");
  ShowBoard(show_board, ROW, COL);
  printf("             ");
  int x = 0;
  int y = 0;
  scanf("%d %d", &x, &y);
  if (x < 1 || x > ROW-2 || y < 1 || y > COL-2){ //       
   printf("    !
"); continue; } if (show_board[x][y] != WHAT){ printf(" ,
"); continue; } if (mines_board[x][y] == '1'){ system("cls"); ShowBoard(mines_board, ROW, COL); printf(" ! !
"); break; } show_board[x][y] = CountMines(mines_board, x, y); count--; } }
1.memset関数直接定義show_board関数は、二次元配列を全WHATマクロによって定義された*に初期化する。
2.まずユーザーにボードを展示し、ユーザーが座標を入力して非合法的に判断する。
3.ユーザーが入力した座標を雷を置いたボードに持っていき、このエリアに雷があればゲームは終了し、逆に続けます。
4.ゲームの勝利条件はすべての非雷エリアをスキャンすることです。
3.雷放出関数(SetMines関数)

void SetMines(char board[][COL], int row, int col){ //    
 int count = NUM;
 while (count){
  int x = rand() % (row - 2) + 1;
  int y = rand() % (col - 2) + 1;
  if (board[x][y] == '0'){
   board[x][y] = '1';
   count--;
  }
 }
}
乱数の種を使って、1から碁盤の大きさまでの長い乱数、2までの乱数を生成します。これらの乱数からなる座標の落雷は、サイクル数が雷の数です。乱数は同じように発生する可能性がありますので、一度不法な判断を行います。盤の位置に雷がないと中に雷が入ります。
4.機雷除去展示パネル(ShowBoard関数とShowLine関数)

void ShowBoard(char board[][COL], int row, int col){//      
 printf("     ");
 for (int i = 1; i <= (col - 2); i++){  //      
  printf("%d   ", i);
 }
 printf("
"); ShowLine(col);// for (int i = 1; i <= (row - 2); i++){ printf("%-3d|", i); for (int j = 1; j <= (col - 2); j++){ printf(" %c |", board[i][j]); } printf("
"); ShowLine(col); } } void ShowLine(int col){ // , for (int i = 0; i <= (col - 2); i++){ printf("----"); } printf("
"); }
5.周囲の雷の個数を統計する(CountMines関数)

CountMines(char board[][COL], int x, int y){ //        
 return board[x - 1][y - 1] + board[x - 1][y] + board[x - 1][y + 1] + \
  board[x][y + 1] + board[x + 1][y + 1] + board[x + 1][y] + \
  board[x + 1][y - 1] + board[x][y - 1] - 7 * '0';//      ,          ‘0'
}
配列には文字'0'が格納されていますので、周りは8つの数字です。だから-8*'0'は雷の数のint値に戻ります。数字をプリントできるようにするために+0'を印刷します。そうでなければ、数字としてのASCLLコードの値を印刷します。最終的な結果は-7*'0'です。
6.mine関数

int main()
{
 int quit = 0;
 int select = 0;
 while (!quit){
  Menu();
  printf("    ");
  scanf("%d", &select);
  switch (select){
  case 1:
   Game();
   break;
  case 0:
   quit = 1;
   break;
  default:
   printf("    ,   !
"); break; } } printf("byebye!
"); system("pause"); return 0; }
四、総コード

#ifndef __Test_H__
#define __Test_H__

#include<stdio.h>
#include<Windows.h>
#include <stdlib.h>
#include <time.h>
#define WHAT '*'
#define NUM  20
#define COL  10
#define ROW  10
void Game();
#pragma warning(disable:4996)
#endif       //       

int main()
{
 int quit = 0;
 int select = 0;
 while (!quit){
  Menu();
  printf("    ");
  scanf("%d", &select);
  switch (select){
  case 1:
   Game();
   break;
  case 0:
   quit = 1;
   break;
  default:
   printf("    ,   !
"); break; } } printf("byebye!
"); system("pause"); return 0; } void Game() { srand((unsigned long)time(NULL)); // char show_board[ROW][COL]; char mines_board[ROW][COL]; memset(show_board, WHAT, sizeof(show_board)); memset(mines_board, '0', sizeof(mines_board)); SetMines(mines_board, ROW, COL); int count = (ROW - 2)*(COL - 2) - NUM; // while (count){ system("cls"); ShowBoard(show_board, ROW, COL); printf(" "); int x = 0; int y = 0; scanf("%d %d", &x, &y); if (x < 1 || x > ROW-2 || y < 1 || y > COL-2){ // printf(" !
"); continue; } if (show_board[x][y] != WHAT){ printf(" ,
"); continue; } if (mines_board[x][y] == '1'){ system("cls"); ShowBoard(mines_board, ROW, COL); printf(" ! !
"); break; } show_board[x][y] = CountMines(mines_board, x, y); count--; } } CountMines(char board[][COL], int x, int y){ // return board[x - 1][y - 1] + board[x - 1][y] + board[x - 1][y + 1] + \ board[x][y + 1] + board[x + 1][y + 1] + board[x + 1][y] + \ board[x + 1][y - 1] + board[x][y - 1] - 7 * '0';// , ‘0' } void ShowBoard(char board[][COL], int row, int col){// printf(" "); for (int i = 1; i <= (col - 2); i++){ printf("%d ", i); } printf("
"); ShowLine(col);// for (int i = 1; i <= (row - 2); i++){ printf("%-3d|", i); for (int j = 1; j <= (col - 2); j++){ printf(" %c |", board[i][j]); } printf("
"); ShowLine(col); } } oid SetMines(char board[][COL], int row, int col){ // int count = NUM; while (count){ int x = rand() % (row - 2) + 1; int y = rand() % (col - 2) + 1; if (board[x][y] == '0'){ board[x][y] = '1'; count--; } } } void ShowLine(int col){ for (int i = 0; i <= (col - 2); i++){ printf("----"); } printf("
"); } Menu(){ // printf("########################
"); printf("# 1. Play 0.Exit #
"); printf("########################
"); }
以上が本文の全部です。皆さんの勉強に役に立つように、私たちを応援してください。