C++を使って迷宮ゲームを実現します。

5646 ワード

迷路ゲームはプレイヤーが地図の中を移動し、ゴールに移動するとゲームが終了します。
自分で文書ドキュメントで小さな地図を作りました。0は空白を表しています。1は壁を表しています。ファイル名は自由自在で、map.MapDataに変えました。そしてプログラムでグローバル変数char Map[MapLenX][MapLenY]を定義します。長い幅のカスタム)挙動XをYとします。char型定数RoadSymbol='0'を定義し、WallSymbol='1、Player Symbol='+'を定義します。
このゲームは対象に向けて作成されていますので、クラスを設計します。データは座標とブール型の保存が終点に達するかどうかを必要とします。構造体の保存座標をカスタマイズしました。

struct point
{
 int x, y;
};
コンストラクタ、コンストラクタが必要です。そして移動の関数PlayerMove()を書いて、終点に到達するかどうかを判断する関数CheckIfWin()を書きます。一歩歩くごとにスクリーンを更新しますので、関数Refsh()も書いて、Player Actor類が完成します。

class PlayerActor
{
public:
 point m_Location;
 bool m_IfWin;
 PlayerActor();
 ~PlayerActor();
 void PlayerMove(int _Direc);
 void Refresh(void);
 void CheckIfWin(void);
};
コンストラクタのコンストラクタは、まずPlayerMoveを定義します。考えは先に移動可能かどうかを判断することです。可能であれば、現在位置の地図マークはRoadSymbolとして設定され、移動は座標を更新し、新しい座標位置は地図上でPlayer Symbolとしてマークされ、画面を更新して勝ち負けを判定します。Refresh()構想は先にsystem(cls)を使ってスクリーンを整理して、それからプログレッシブに印刷します。地図上のポイントがRoadSymbolの場合はスペースを出力し、WallSymbol出力'*、Player Symbol出力'+'を出力します。
次にプレイヤーの開始位置と終点PlayerStartとPlayerEndを定義して初期化します。main関数の大まかな流れは以下の通りです。地図を読み込んで、Player Actorを実行します。m_IfWinはキーボードボタンを受信して移動します。m_IfWInは、メッセージボックスをポップアップして終了します。したがって、グローバル関数PlayerControlがキーを受信してPlayerMoveを呼び出す必要があります。
これにより,構造関数の流れも明らかになった。初期化m_IfWinとm_Locationは、地図上でプレイヤーの位置と重点位置を表示し、画面を更新します。そして常数として定義されているのは定位常数です。細部を修正すれば、簡単な迷路遊びが得られます。

#include<iostream>
#include<cstdio>
#include"conio.h"
#include"windows.h"
/////////////////////////
struct point
{
 int x, y;
};
 
///////////////////////
 
const point PlayerStart = {10, 2};
const point PlayerEnd = {2, 10};
 
const int MapLenX = 11, MapLenY = 10;
const char EndSymbol = '#', PlayerSymbol = '+', WallSymbol = '1', RoadSymbol = '0';
char Map[MapLenX][MapLenY];
 
const int MoveX[4] = {-1, 1, 0, 0}, MoveY[4] = {0, 0, -1, 1};  //// UP, DOWN, LEFT, RIGHT
const int _UP = 0, _DOWN = 1, _LEFT = 2, _RIGHT = 3;
 
///////// CLASS ///////////////
 
class PlayerActor
{
public:
 point m_Location;
 bool m_IfWin;
 PlayerActor();
 ~PlayerActor();
 void PlayerMove(int _Direc);
 void Refresh(void);
 void CheckIfWin(void);
};
 
/////////// MEMBER FUNCTIONS /////////////
 
PlayerActor::PlayerActor()
{
 m_IfWin = false;
 this-> m_Location.x = PlayerStart.x;
 this-> m_Location.y = PlayerStart.y;
 Map[this-> m_Location.x][this-> m_Location.y] = PlayerSymbol;
 Map[PlayerEnd.x][PlayerEnd.y] = EndSymbol;
 PlayerActor::Refresh();
}
 
PlayerActor::~PlayerActor()
{
 
}
 
void PlayerActor::PlayerMove(int _Direct)
{
 if ( Map[this-> m_Location.x+MoveX[_Direct]][this-> m_Location.y+MoveY[_Direct]] == RoadSymbol
 || Map[this-> m_Location.x+MoveX[_Direct]][this-> m_Location.y+MoveY[_Direct]] == EndSymbol )/////// JUDGE IF CAN MOVE
 {
  Map[this-> m_Location.x][this-> m_Location.y] = RoadSymbol;
  this-> m_Location.x += MoveX[_Direct];
  this-> m_Location.y += MoveY[_Direct];
  Map[this-> m_Location.x][this-> m_Location.y] = PlayerSymbol;
  PlayerActor::Refresh();
  PlayerActor::CheckIfWin();
 }
}
 
void PlayerActor::Refresh(void)
{
 system("cls");  //////CLEAR SCREEN
 for (int i=1; i<=MapLenX; i++)
 {
  for (int j=1; j<=MapLenY; j++)
  {
   if (Map[i][j] == RoadSymbol)
    printf(" ");
   else if (Map[i][j] == WallSymbol)
    printf("* ");
   else if (Map[i][j] == '+')
    printf("%c ", PlayerSymbol);
   else if (Map[i][j] == EndSymbol)
    printf("%c ",EndSymbol);
  }
  printf("
"); } } void PlayerActor::CheckIfWin(void) { if (this-> m_Location.x == PlayerEnd.x && this-> m_Location.y == PlayerEnd.y) m_IfWin = true; } ///////////// GLOBAL FUNCTION //////////////// void PlayerControl(PlayerActor* Player, int _KEY) { switch (_KEY) { case 119 : Player->PlayerMove(_UP); //// w 119 break; case 115 : Player->PlayerMove(_DOWN); ///////s 115 break; case 97 : Player->PlayerMove(_LEFT); //// a 97 break; case 100 : Player->PlayerMove(_RIGHT); //// d 100 break; default: break; } } //////// MAIN FUNCTION /////////// int main() { ///////// READ MAP ///////////// freopen("map.MapData", "r", stdin); for (int i=1; i<=MapLenX; i++) { for (int j=1; j<=MapLenY; j++) { std::cin >> Map[i][j]; } } //// CREATE PLAYERACTOR //// PlayerActor* Player = new PlayerActor; while (!Player->m_IfWin) { PlayerControl(Player, _getch()); } system("cls"); MessageBox(NULL, "You Win!", "Congratulations!", MB_OK); delete Player; return 0; }
地図map.MapData:
1111111111
100000万01
10111111
101000001
1011111101
100000,101
1111110101
10001010101
1011110101
100000万01
1111111111
以上が本文の全部です。皆さんの勉強に役に立つように、私たちを応援してください。