C言語 - マインスイーパ
この資料では、このゲームは、このコードの一般的な概要は、vs2017を使用してソフトウェアを書くことが、初心者に適しているでしょう。
コードは、以下の機能を実現することができます。
1.ユーザーは3つの難易度を選択することができる、鉱山の異なる数が配置されています。
2.乱数は、鉱山の位置を設定します。
(私は0で表され、約1膨張しない)鉱山の座標を入力します。
雷のための座標を入力します、彼はゲーム終了を殺されました。
5.すべての鉱山を除外し、ゲームは経過時間を表示する、以上です。
以下に示したソースコード:
ヘッダーgame.h
彼は、その後の変更を容易にするために、いくつかの必要なヘッダファイル、マクロ定義行と列の数、ならびに鉱山を引用します。
1つ の#define _CRT_SECURE_NO_WARNINGS 1 2 3の#include <stdio.hの> 4の#include <STDLIB.H> 5の#include <TIME.H> 6の#include <WINDOWS.H> 7 の#define ROW 9 8 の#define COL 9 9 10 #define行ROW + 2 11 の#define COLS COL + 2 12 13 の#define EASY_COUNT 10 14 15 空隙 Initboard(チャーボード[ROWS] [COLS]、int型の列、INT colsの、チャー セット)。 16 ボイド displayboard(チャーボード[ROWS] [COLS]、int型の行、INT COL)。 17 ボイド setmine(チャー鉱山[ROWS] [COLS]、int型の行、INT COL、INT カウント)。 18 ボイド findmine(チャー鉱山[ROWS] [COLS]、チャーショー[ROWS] [COLS]、int型の 行、INT COL、INTカウント)。
テストモジュールtext.c
このモジュールは、コンソールウィンドウの色とサイズのために主にあり、関数を呼び出します。
_CRT_SECURE_NO_WARNINGS 1つの#define の#include "game.h" ボイドMENU() { のprintf(「******************************* **** \ N- "); のprintf(" *************** 1.play ************** \ N- "); のprintf ( "*************** 0.exit ************** \ N-"); のprintf(「******** *************************** \ N- "); } 無効ゲーム() { int型のINPUT = 0; のprintf("難易度を選択してください: 。\ N1簡単\ N2難しい\ N3の煉獄\ N - "); .. scanfの(" %のD "およびINPUT); int型COUNT = INPUT * EASY_COUNT; //のsprintf(stcmd、"モードCONのCOLS =%D行=% D」、B); //システム(stcmd); CHAR鉱山[ROWS] [COLS]; //店舗情報レイ チャーショー[ROWS] [COLS] ; // 調査情報格納されている鉱山 Initboard(ショー、ROWS、COLS、 '*'); // '*' int型、A = 35。 // displayboard(鉱山、ROW、COL)。 setmine(鉱山、ROW、COL、カウント数)。 // displayboard(鉱山、ROW、COL)。 displayboard(ショー、ROW、COL)。 findmine(鉱山、ショー、ROW、COL、カウント数)。 } ボイド試験() { にsrand((unsigned int型)時間(NULL))。 INT入力= 0。 やる { メニューを(); printf( "\ nは请选择ます:\ n"); scanf関数( "%dの"と入力)。 スイッチ(入力){ ケース1:ゲーム(); ブレーク; ケース0:のprintf( "退出游戏\ n"); ブレーク; デフォルト:のprintf( "输入有误、请重新输入\ N"); ブレーク; } }一方(入力)。 } int型のmain() { CHAR stCmd [128]。 システム(「カラー4A」)。 システム( "モードCON:ラインのCOLS = 30 = 12"); のprintf( "\ N- \ n \ N- ------掃海へようこそ----- \ N- \ N- \ N-"); (のprintf " ---------- ---------- \ N- \ N- \ N- ");お待ちください スリープ(1000); システム(" CLS "); システム("カラー1A」。 ); sprintfの(stcmd、 "COLS = CONモード%D%= D線"、A、B); システム(stcmd); 試験(); 戻り0; }
ゲームモジュールgame.c
このモジュールは、さまざまな機能を実装します。
#define _CRT_SECURE_NO_WARNINGS 1 の#include "game.h" ボイドInitboard(チャーボード[ROWS] [COLS]、INT行、INT colsの、文字セット) { intはI = 0。 int型J = 0; (I ++; I <行I = 0)するための { ため(J = 0; J <COLS; J ++) { ボード[I] [J] =セット。 } } } ボイドdisplayboard(CHARショー[ROWS] [COLS]、INT列、int型COL) { int型I = 0。 int型J = 0; printf( "\ n"は); 以下のために(私は= 0; I <=行; I ++) { のprintf( "%dの"、I)。 } のprintf( "\ n"); printf( "=========================== \ N"); 以下のための式(I = 1; I <=行。 { printf( "%のD ||"、I)。 用(J = 1; J <= COL; J ++) { のprintf( "%のC"、ショー[I] [J])。 } のprintf( "||")。 printf( "\ n"は); } のprintf( "============================ \ n"); } ボイドsetmine(チャー鉱山[ROWS] [COLS]、INT行、INT COL、INTカウント) { システム( "CLS")。 一方、(カウント) { int型のx =ランド()%行+ 1。 INT Y =ランド()%COL + 1。 IF(鉱山[X] [Y] == '0') { 鉱山[X] [Y] = '0' + 1。 カウント - ; } } } 静的INT judgemine(CHAR鉱山[ROWS] [COLS]、int型のx、int型Y、 INT * COUNT1) { (* COUNT1) - 。 リターン ((鉱山[X - 1] [Y] +鉱山[X - 1] [Y - 1] + 鉱山[X] [Y - 1] +鉱山[X + 1] [Y - 1] + 鉱山[X + 1] [Y] +鉱山[X + 1] [Y + 1] + 鉱山[X] [Y + 1] +鉱山[X - 1] [Y + 1]) - 8 * '0')。 } ボイド再帰(チャー鉱山[ROWS] [COLS]、チャーショー[ROWS] [COLS]、int型のx、int型Y、INT * COUNT1) { int型RES = judgemine(鉱山、X、Y、COUNT1)。 IF(RES == 0 &&ショー[X] [Y] == '*') { ショー[X] [Y] = '0'; int型ARR [8] [2] = {{-1、-1}、{ - 1,0}、{ - 1,1}、{0、-1}、{0,1}、{1、-1 }、{1,0}、{1,1}}。 以下のために(INT I = 0; I <8; ++ I) { IF(X + ARR [i]が[0]> = 1 && X + ARR [i]が[0] <= ROW && Y + ARR [I] [1]> = 1 && Y +のARR [I] [1] <= COL && } } そうでなければ 表示[X] [Y] = RES + '0'; } ボイドfindmine(CHARマイン[ROWS] [COLS]、CHARショー[ROWS] [COLS]、INT行、INT COL、INT COUNT) { int型X = 0; int型Y = 0; int型COUNT1がある= ROW * COL-COUNT; ;開始、終了のtime_t スタート=時間(NULL); しばらく(COUNT1がある) { のprintf( "座標のトラブルシューティングを入力してください:\ nは"); scanf関数( "%D%D"、&X&Y); システム( "CLS"); IF(!ショー[X] [Y] = '*') { のprintf(「この、あまりにも捜査を持って再入力してくださいコーディネート! \ N- "); displayBoard(表示、ROW、COL); 続行; } IF(X> = 1 && X <=行&& Y> = 1 && Y <。= COL) { IF(鉱山[X] [Y] == '0' + 1) { printf( "ごめんなさい、あなたが\ N-を殺している"); displayBoard(鉱山、ROW、COL); BREAK; } 他 { 再帰(鉱山、ショー、X、Y、&COUNT1); // displayBoard(鉱山、ROW 、COL); displayBoard(ショー、ROW、COL); } } 他 { のprintf( "入力エラーが、\ N-再入力してください"); }エンド=時間(NULL); } (difftime(エンド、スタートIF)< 60 COUNT1が&& =)== 0である { のprintf( "!あなたの成功鉱山おめでとうございます\ N-"); のprintf( "使用時:%d秒\ N-"、(int型)difftime(エンド、スタート)); } }
この目的のために、より多くの地雷を完了するための簡単なゲームよりも、紙はありがとう完結します!