C言語で掃海小ゲームの詳細コードを実現します。


前言
地雷除去はとてもクラシックなコンピュータゲームです。地雷除去はすべての非地雷の格子を勝利にして、地雷の格子に入力して失敗します。ゲームのメインエリアは多くのチェックで構成されています。チェック座標を入力すると、チェックがオンになり、四角い数字が表示されます。四角い数字はその周囲の8つのチェックがいくつかの雷を隠しています。点が開いている格子が0なら、その周りに0つの雷があります。
本記事はVVS 2013を使って、C言語でこのミニゲームを作成します。
一、必要な関数
1.埋雷関数(SetMines)
2.ShowLine
3.ShowBoard
(2、3の関数は横線と縦線を表示します)
4.統計雷の個数関数(CountMines)
5.ゲーム関数(Game)
6.メニュー関数(Menu)
7.メイン関数(main)
二、実現過程
1.アルゴリズム分析
memset関数は、ボードを初期化し、SetMines関数で埋め込み雷を行い、ユーザーが入力した座標を読み取ります。boardの雷「1」の座標が一致した場合、ゲームは終了します。でないと、Count Mines関数で現在の座標の近くに雷の個数を出力します。
私たちは二次元配列でボードを印刷します。もし印刷したいなら、6×6のボードは、私たちが設定した二次元配列要素は8です。×8,私たちはアルゴリズムを設計する時、座標の周りの8つの方位の雷の個数を統計する必要があるので、境界座標の周囲の雷の個数を統計すると、配列の境界を越える問題があります。×6の境界には1周以上の要素があります。つまり8を定義します。×8の配列要素

Cライブラリ関数memsetを用いて二つのボードを初期化し、一つは雷を埋めるためのもので、一つは表示のためのものです。
memsetboard、STYLE、sizefboard);     
memset(mine_)board、'0'は、sizeof(mine_)board); 
memset関数を追加します。
void*memset(void*str,int c,size_t n)
パラメータstrは、充填するメモリブロックを指します。cは設定する値であり、この値はint形式で伝達されるが、関数はメモリブロックを充填する際にその値を使用する符号なし文字である。nはこの値に設定する文字の数です。この値は、記憶領域strを指すポインタを返します。
2.詳細コード

#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include <windows.h>
#define ROW 8
#define COL 8
#define STYLE '?'
#define NUM 10   //     
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--;
  }
 }
}

void ShowLine(int col)        //     
{
 for (int i = 0; i <= (col - 2); i++){
  printf("----");
 }
 printf("
"); } 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); } } char 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'; } void Game() { srand((unsigned long)time(NULL)); char show_board[ROW][COL]; char mine_board[ROW][COL]; memset(show_board, STYLE, sizeof(show_board)); // STYLE sizeof(show_board) memset(mine_board, '0', sizeof(mine_board)); // 0 sizeof(mine_board) SetMines(mine_board, ROW, COL); int count = (ROW - 2)*(COL - 2) - NUM; while (count){ system("cls"); ShowBoard(show_board, ROW, COL); printf("Please Enter Your Postion<x,y>:"); int x = 0; int y = 0; scanf("%d %d", &x, &y); if (x < 1 || x > ROW-2 || y < 1 || y > COL-2){ // printf("Postion Error!
"); continue; } if (show_board[x][y] != STYLE){ // printf("Postion Is not *
"); continue; } if (mine_board[x][y] == '1'){ // printf("game over!
"); ShowBoard(mine_board, ROW, COL); break; } show_board[x][y] = CountMines(mine_board, x, y); count--; } } void Menu() { printf("########################
"); printf("# 1. Play 0.Exit #
"); printf("########################
"); } int main() { int quit = 0; int select = 0; while (!quit){ Menu(); printf("Please Enter 1 or 0 :"); scanf("%d", &select); switch (select){ case 1: Game(); break; case 0: quit = 1; break; default: printf("Postion Error, Try Again!
"); break; } } printf("You are welcomed to come back next time to play!
"); system("pause"); return 0; }
三、まとめ
これは私の本論です。このコードの構想は比較的直接的で、皆さんと私が引き続き討論することを歓迎します。
以上が本文の全部です。皆さんの勉強に役に立つように、私たちを応援してください。