C++미로 게임 구현 코드

12301 단어 C++미로 게임
C++미로 게임 구현 코드
제목 은 게임 캐릭터 가 자동 으로 미로 출구 를 찾 아 미로 에서 벗 어 나 C++대상 을 대상 으로 하 는 패 키 징 에 대한 기초 지식 을 연습 하도록 한다.미궁 도 는 다음 과 같다.그 중에서 X 는 벽 을 나타 낸다.
迷宫图  
1.절차 분석
나 가 는 원리:오른손 규칙 이나 왼손 규칙 을 따른다.오른손 으로 벽 을 짚 고 가면 미로 에서 벗 어 나 고 반대로 도 마찬가지다.
step 1 미궁 류 를 만 들 고 미궁 지 도 를 출력 합 니 다.
MazeMap类  
step 2 미로 에 빠 진 사람의 클래스 를 만 듭 니 다.
MazeMan类  
2.절차 실현
MazeMap.h

#ifndef MAZEMAP_H
#define MAZEMAP_H

#include <iostream>
#include <Windows.h>  //COORD

//      ,1   ,0   
#define WALL 1
#define ROAD 0

class MazeMap
{
public:
  MazeMap(char wall = 'X');
  ~MazeMap();
  /*      */
  void setMazeMap(int *mazemap, int row, int col);
  void pintMazeMap();
  int** getMap();             //          
  const char m_cRoad;           //     : 
  void setExitPosition(int x,int y);   //      
  COORD m_COORDExitPostion;  //     
private:
  const char m_cWall;     //     : 
  int** m_pMap;        //               
  int m_iMapRow;       //       
  int m_iMapCol;       //       
};

#endif
MazeMap.cpp

#include "MazeMap.h"

/**************************
*    :MazeMap()
*    :    ,     
*    :wall       
*    :2016.7.18
***************************/
MazeMap::MazeMap(char wall):m_cWall(wall),m_cRoad(' ')
{
  m_pMap = NULL;
}
/*************************
*    :~MazeMap()
*    :    ,           
*    :2016.7.18
**************************/
MazeMap::~MazeMap()
{
  if(m_pMap)
  {
    for(int i = 0; i < m_iMapRow; i++)
    {
      delete m_pMap[i];
      m_pMap[i] = NULL;
    }
    delete m_pMap;
  }
}
/********************************
*    :setMazeMap()
*    :      ,    
*    :*mazemap               
*      row          
*      col          
*    :2016.7.18
**********************************/
void MazeMap::setMazeMap(int *mazemap, int row, int col)
{
  m_iMapRow = row;
  m_iMapCol = col;
  //                    
  m_pMap = new int*[m_iMapRow];    //  m_iMapRow   int         
  for(int i = 0; i < m_iMapRow; i++) 
    m_pMap[i] = new int[m_iMapCol]; //  m_iMapCol   int       

  //                   
  for(int i = 0; i < m_iMapRow; i++)
  {
    for(int j = 0; j < m_iMapCol; j++)
    {
      m_pMap[i][j] = *mazemap;
      mazemap++;
    }
  }
}
/************************************************
*    :pintMazeMap()
*    :      
*    :2016.7.18
*************************************************/
void MazeMap::pintMazeMap()
{
  system("cls");
  for(int i = 0; i < m_iMapRow; i++) 
  {
    for(int j = 0; j < m_iMapCol; j++)
    {
      if(m_pMap[i][j])      //     1,         
        std::cout << m_cWall;
      else            //  ,        
        std::cout << m_cRoad;
    }
    std::cout << std::endl;
  }
}

/************************************************
*    :getMap()
*    :          
*     :    
*    :2016.7.18
*************************************************/
int** MazeMap::getMap()
{
  return m_pMap;
}
/************************************************
*    :setExitPosition()
*    :       
*    :x           
      y           
*    :2016.7.18
*************************************************/
void MazeMap::setExitPosition(int x, int y)
{
  m_COORDExitPostion.X = x;
  m_COORDExitPostion.Y = y;
}
MazeMan.h

#ifndef MAZEMAN_H
#define MAZEMAN_H

#include <Windows.h>
#include "MazeMap.h"

enum direction{U,D,L,R};

class MazeMan
{
public:
  MazeMan(char man = 'T',char manface = R);
  void setPosition(int x, int y);   //        
  void setMap(MazeMap *map);     //      
  bool walkUp();           //   
  bool walkDown();          //   
  bool walkLeft();          //   
  bool walkRight();          //   
  void moveForward(direction direct); //                 
  void start();            //      
private:
  char m_cMan;            //         
  char m_cManFace;          //       
  int m_iSteps;            //            
  COORD m_COORDManCurrentPosition;  //         
  MazeMap *m_pMap;          //    
};
#endif
MazeMan.cpp

#include "MazeMan.h"

/*************************
*    :MazeMan()
*    :    ,       
*    :man          
      manface        
*    :2016.7.18
**************************/
MazeMan::MazeMan(char man,char manface)
{
  m_cMan = man;
  m_cManFace = manface;
  m_iSteps = 0;
}
/*******************************
*    :setMap()
*    :          
*    :*map        
*    :2016.7.18
********************************/
void MazeMan::setMap(MazeMap *map)
{
  m_pMap = map;
}

/******************************
*    :setPosition()
*    :        
*    :x           
      y           
*    :2016.7.18
********************************/
void MazeMan::setPosition(int x, int y)
{
  unsigned long numWritten;
  //            
  HANDLE handle = GetStdHandle(STD_OUTPUT_HANDLE);
  m_COORDManCurrentPosition.X = x;
  m_COORDManCurrentPosition.Y = y;
  //              ,                         ,        
  FillConsoleOutputCharacter(handle,m_cMan,1,m_COORDManCurrentPosition,&numWritten);
  //    :          ,             ;         ;
  //  COORD  ,                     ;
  //                           。
}
/************************************************
*    :moveForward()
*    :                
*    :direct      
*    :2016.7.18
*************************************************/
void MazeMan::moveForward(direction direct)
{
  unsigned long numWritten;
  //            
  HANDLE handle = GetStdHandle(STD_OUTPUT_HANDLE);
  //              ,                  ,       
  FillConsoleOutputCharacter(handle,m_pMap->m_cRoad,1,m_COORDManCurrentPosition,&numWritten);
  switch(direct)
  {
  case U:
    m_COORDManCurrentPosition.Y -= 1;
    break;
  case D:
    m_COORDManCurrentPosition.Y += 1;
    break;
  case L:
    m_COORDManCurrentPosition.X -= 1;
    break;
  case R:
    m_COORDManCurrentPosition.X += 1;
    break;
  default:
    break;
  }
  //        ,     
  FillConsoleOutputCharacter(handle,m_cMan,1,m_COORDManCurrentPosition,&numWritten);
  //              
  m_cManFace = direct;
}

/************************************************
*    :walkUp()
*    :     ,   ,   ture;   ,   false
*    :2016.7.18
*************************************************/
bool MazeMan::walkUp()
{
  if(m_pMap->getMap()[m_COORDManCurrentPosition.Y - 1][m_COORDManCurrentPosition.X])
    return false;
  else 
    moveForward(U);
    return true;
}
/************************************************
*    :walkDown()
*    :     ,   ,   ture;   ,   false
*    :2016.7.18
*************************************************/
bool MazeMan::walkDown()
{
  if(m_pMap->getMap()[m_COORDManCurrentPosition.Y + 1][m_COORDManCurrentPosition.X])
    return false;
  else 
    moveForward(D);
    return true;
}
/************************************************
*    :walkLeft()
*    :     ,   ,   ture;   ,   false
*    :2016.7.18
*************************************************/
bool MazeMan::walkLeft()
{
  if(m_pMap->getMap()[m_COORDManCurrentPosition.Y][m_COORDManCurrentPosition.X - 1])
    return false;
  else 
    moveForward(L);
    return true;
}
/************************************************
*    :walkRight()
*    :     ,   ,   ture;   ,   false
*    :2016.7.18
*************************************************/
bool MazeMan::walkRight()
{
  if(m_pMap->getMap()[m_COORDManCurrentPosition.Y][m_COORDManCurrentPosition.X + 1])
    return false;
  else 
    moveForward(R);
    return true;
}
/************************************************
*    :start()
*    :      
*    :2016.7.18
*************************************************/
void MazeMan::start()
{
  while(true)
  {
    m_pMap->pintMazeMap();
    switch(m_cManFace)
    {
    case U:
      //       ,   ,   ,   ,    (    )
      walkRight() || walkUp() || walkLeft() || walkDown();
      break;
    case D:
      walkLeft() || walkDown() || walkRight() || walkUp();
      break;
    case L:
      walkUp() || walkLeft() || walkDown() || walkRight();
      break;
    case R:
      walkDown() || walkRight() || walkUp() || walkLeft();
      break;
    default:
      break;
    }
    m_iSteps++;
    if(m_COORDManCurrentPosition.X == m_pMap->m_COORDExitPostion.X && m_COORDManCurrentPosition.Y == m_pMap->m_COORDExitPostion.Y)
      break;
    std::cout << "    " << m_iSteps - 1 << " ";
    Sleep(500);
  }
}
Main.cpp

#include "MazeMap.h"
#include "MazeMan.h"

#define MapRow 11    //       
#define MapCol 11    //       

int main()
{
  //                 
  int map[MapRow][MapCol] = {
    {WALL, WALL, WALL, WALL, WALL, WALL, WALL, WALL, WALL, WALL, WALL},
    {WALL, ROAD, ROAD, ROAD, WALL, ROAD, ROAD, ROAD, ROAD, ROAD, ROAD},
    {WALL, ROAD, WALL, WALL, WALL, ROAD, WALL, WALL, WALL, ROAD, WALL},
    {WALL, ROAD, ROAD, ROAD, WALL, ROAD, ROAD, ROAD, WALL, ROAD, WALL},
    {WALL, ROAD, WALL, ROAD, WALL, ROAD, WALL, ROAD, WALL, WALL, WALL},
    {WALL, ROAD, WALL, ROAD, ROAD, ROAD, WALL, ROAD, WALL, ROAD, WALL},
    {WALL, ROAD, WALL, WALL, WALL, ROAD, WALL, WALL, WALL, ROAD, WALL},
    {WALL, ROAD, WALL, ROAD, WALL, ROAD, ROAD, ROAD, WALL, ROAD, WALL},
    {WALL, WALL, WALL, ROAD, WALL, WALL, WALL, ROAD, WALL, ROAD, WALL},
    {ROAD, ROAD, ROAD, ROAD, ROAD, ROAD, ROAD, ROAD, ROAD, ROAD, WALL},
    {WALL, WALL, WALL, WALL, WALL, WALL, WALL, WALL, WALL, WALL, WALL}
  };
  //          
  MazeMap *mm = new MazeMap();
  mm->setMazeMap(&map[0][0],MapRow,MapCol);
  mm->setExitPosition(10,1);
  mm->pintMazeMap();
  //            
  MazeMan *man = new MazeMan();
  //        
  man->setPosition(0,9);
  //         
  man->setMap(mm);
  // new            ,              
  man->start();
  delete mm;
  mm = NULL;
  delete man;
  man = NULL;
  std::cout << "    !" << std::endl;
  system("pause");
}
3.실행 결과
T 대표
这里写图片描述
这里写图片描述
읽 어 주 셔 서 감사합니다. 여러분 에 게 도움 이 되 기 를 바 랍 니 다.본 사이트 에 대한 여러분 의 지지 에 감 사 드 립 니 다!

좋은 웹페이지 즐겨찾기