简单的控制台象棋游戏

时间:2017-11-30 05:03:47

标签: c++ arrays multidimensional-array chess

我目前正在开发一款小型C ++游戏机游戏。我遇到的第一个问题是棋盘显示不良(字符串8x8数组)。但首先,让我简短地介绍一下。

我的想法是将每一个国际象棋形象视为一个单独的对象 - 因此白色和黑色棋子都有自己的实例 - 对于pawn它是16个实例(白色和黑色同样是8个),对于4个人来说是4个等等。等

然后我创建了另一个名为 ChessBoard 的类,它存储诸如被杀数字,特定玩家结果等信息,并且用于监督其他类。最重要的是,它存储上面提到的字符串数组,其中包含每个图形的图形表示( std :: string pic 行)。现在,回到问题:当我尝试打印出这个数组以检查它的完整性和顺序时,它会显示它的所有单元格都是垂直显示的。我想以这种方式显示它(P字段代表特定的数字,空字段位于较低的位置):

***** ***** ***** ***** ***** ***** ***** *****
* P * * P * * P * * P * * P * * P * * P * * P *
***** ***** ***** ***** ***** ***** ***** *****
----- ----- ----- ----- ----- ----- ----- -----
|   | |   | |   | |   | |   | |   | |   | |   |
----- ----- ----- ----- ----- ----- ----- -----

这就是实际发生的事情: enter image description here

我知道这个主题在这个网站上被多次提出,但是我尝试了其他用户提供的所有可能的解决方案,但它不起作用 - 唯一的区别是一些单一标志的位置,但整体数组的显示是还是不好。

项目的依赖项:

BoardLogic.h - > BoardComponents.h

main.cpp - > BoardLogic.cpp - > BoardComponents.cpp

我会给你一个项目文件的小视图。 这是我工作的一个开始,所以我只投入了Pawn的实例,并试图在船上正确显示它们。

BoardComponents.h

#ifndef BOARDCOMPONENTS_H_
#define BOARDCOMPONENTS_H_
#include "BoardLogic.h"
#include <string>

class Pawn {
public:
    bool isAlive;
    std::string pic = "*****\n* P *\n*****";
    struct currentPosition {
        int x;
        int y;
    };
    Pawn::currentPosition pPos;
private:

};

class Rook {
public:
    bool isAlive;
    std::string pic = "*****\n* R *\n*****";
    struct currentPosition {
        int x;
        int y;
    };
    Rook::currentPosition rPos;
private:

};

class Knight {
public:
    bool isAlive;
    std::string pic = "*****\n* k *\n*****";
    struct currentPosition {
        int x;
        int y;
    };
    Knight::currentPosition kPos;
private:

};

class Bishop {
public:
    bool isAlive;
    std::string pic = "*****\n* B *\n*****";
    struct currentPosition {
        int x;
        int y;
    };
    Bishop::currentPosition bPos;
private:

};

class Queen {
public:
    bool isAlive;
    std::string pic = "*****\n* Q *\n*****";
    struct currentPosition {
        int x;
        int y;
    };
    Queen::currentPosition qPos;
private:

};

class King {
public:
    bool isAlive;
    std::string pic = "*****\n* K *\n*****";
    struct currentPosition {
        int x;
        int y;
    };
    King::currentPosition kingPos;
private:

};

class ChessBoard {
public:
    std::string chessBoard[8][8];
    int wChessKilled;
    int bChessKilled;
    int wPlayerResult;
    int bPlayerResult;
    bool winner;
private:

};

#endif

BoardLogic.cpp - 此文件创建游戏的新实例及其组件类

#include "BoardLogic.h"
#include "BoardComponents.h"
#include <iostream>
#include <stdio.h>
#include <stdlib.h>

using namespace std;

void ChessGame::NewGameInstance() {

    ChessBoard * cBoard = new ChessBoard;
    Pawn * wPawn = new Pawn[8];
    Pawn * bPawn = new Pawn[8];
    Rook * wRook = new Rook[2];
    Rook * bRook = new Rook[2];
    Knight * wKnight = new Knight[2];
    Knight * bKnight = new Knight[2];
    Bishop *wBishop = new Bishop[2];
    Bishop *bBishop = new Bishop[2];
    Queen *wQueen = new Queen;
    Queen *bQueen = new Queen;
    King * wKing = new King;
    King *bKing = new King;

    for (int i = 0; i < 8; i++) {
        for (int j = 0; j < 8; j++) {
            cBoard->chessBoard[i][j] = "-----\n|   |\n-----";
        }
    }

    for (int i = 0; i < 8; i++) {
        wPawn[i].pPos.x = i;
        wPawn[i].pPos.y = 1;
        bPawn[i].pPos.x = i;
        bPawn[i].pPos.y = 6;
        wPawn[i].isAlive = true;
        bPawn[i].isAlive = true;
        cBoard->chessBoard[wPawn[i].pPos.x][wPawn[i].pPos.y] = wPawn[i].pic;
        cBoard->chessBoard[bPawn[i].pPos.x][bPawn[i].pPos.y] = bPawn[i].pic;
    }

    for (int i = 0; i < 8; i++) {
        for (int j = 7; j >= 0; j--) {
            cout << cBoard->chessBoard[i][j];
        }
    }

2 个答案:

答案 0 :(得分:0)

您的ChessBoard必须具有行的概念,并且必须先渲染行中的所有项目,然后再转到下一行。字符串的集合并不是理想的。

你使用&#34; \ n&#34;渲染内部是个问题。你需要绘制所有&#34;第一行&#34;行中的项目,然后是所有第二行,依此类推。一个简单的方法,至少要开始使用每个部分只使用一个字符:&#39; K&#39;,&#39; Q&#39; ......&#39; p&#39;

别忘了你还需要画一些东西&#34; (空格)表示每行中的空位置。

答案 1 :(得分:0)

你可以做的是拥有一个2D字符数组(31 * 47)。由于每个网格都是3x5阵列,因此电路板的宽度为5 * 8 + 7(两者之间的间隙)。高度为3 * 8 + 7。

当您想要打印棋盘时,您从棋子中取出图片,将其分成3行,然后相应地将其放在2D char数组上。完成将棋子放在棋盘上后,您可以将整个2D阵列放在一起。

关于如何将3x5阵列放置在电路板阵列上的一个示例:

//row and col are physical position on the board, both ranging from 0 to 7
void PlaceOnBoard(char[][47] board, char[][5] pattern, int row, int col)
{
    int start_row = row * 4;
    int start_col = col * 6;
    for (int i = 0; i < 3; ++i)
        for (int j = 0; j < 5; ++j)
            board[start_row + i][start_col + j] = pattern[i][j];

}

另一个替代方案是每次在国际象棋棋盘上打印出一行时,你会在3次迭代中进行,第一次迭代将打印每一行的第一行,第二次迭代将打印第二行......