我目前正在开发一款小型C ++游戏机游戏。我遇到的第一个问题是棋盘显示不良(字符串8x8数组)。但首先,让我简短地介绍一下。
我的想法是将每一个国际象棋形象视为一个单独的对象 - 因此白色和黑色棋子都有自己的实例 - 对于pawn它是16个实例(白色和黑色同样是8个),对于4个人来说是4个等等。等
然后我创建了另一个名为 ChessBoard 的类,它存储诸如被杀数字,特定玩家结果等信息,并且用于监督其他类。最重要的是,它存储上面提到的字符串数组,其中包含每个图形的图形表示( std :: string pic 行)。现在,回到问题:当我尝试打印出这个数组以检查它的完整性和顺序时,它会显示它的所有单元格都是垂直显示的。我想以这种方式显示它(P字段代表特定的数字,空字段位于较低的位置):
***** ***** ***** ***** ***** ***** ***** *****
* P * * P * * P * * P * * P * * P * * P * * P *
***** ***** ***** ***** ***** ***** ***** *****
----- ----- ----- ----- ----- ----- ----- -----
| | | | | | | | | | | | | | | |
----- ----- ----- ----- ----- ----- ----- -----
我知道这个主题在这个网站上被多次提出,但是我尝试了其他用户提供的所有可能的解决方案,但它不起作用 - 唯一的区别是一些单一标志的位置,但整体数组的显示是还是不好。
项目的依赖项:
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];
}
}
答案 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次迭代中进行,第一次迭代将打印每一行的第一行,第二次迭代将打印第二行......