我做了一些关于如何用C ++制作坐标系的研究,但我没有得到任何好的答案,这就是为什么我要发表一篇关于它的新帖子。
我想创建一个国际象棋游戏,你是农民,可以向前移动一两步,向任何方向进攻。我不明白的是如何在计算和打印特定位置的每个角色时创建一种正确的方法。例如;如果我希望Farmer 1位于B5,我该如何跳过" blanksteps"在实际位置之前?
编辑:这篇文章最初是关于如何创建一个坐标系,它仍然是。我的观点是问我如何制作一个基于控制台的坐标系统,如下例所示。
1 2 3 4 5 6 7
A
B ¤
C
D
答案 0 :(得分:2)
我的意思是A1是(0,0)而B5应该是(5,2)
将坐标存储为int, int
对,从零到宽度/高度。例如,它可以用于直接索引2D数组,因此更容易使用这种范围。
constexpr int board_width = 15;
constexpr int board_height = 15;
struct coordinate
{
int _x; // from `0` to `board_width`
int _y; // from `0` to `board_height`
};
制作你的"字母+ int"表示,提供一些转换实用程序:
char x_coordinate_representation(int x)
{
// see http://www.asciitable.com/
return 'A' + x;
}
int y_coordinate_representation(int y)
{
return y + 1;
}
std::string to_string(const coordinate& c)
{
std::string result;
result.reserve(2);
result += x_coordinate_representation(c._x);
result += std::to_string(y_coordinate_representation(c._y));
return result;
}
答案 1 :(得分:0)
从长远来看,这完全取决于你想做什么。几个角色可以在一个位置吗?董事会本身不是那么大吗?你有整数位置还是你需要一个数字可以放在像(4.5,3.5)?
我建议首先,你做一些基本的教程。不确定你是否做过那些。其次,您将学习面向对象编程。您需要确定您的案例中需要哪些类。你不需要什么课程。
Go的示例:
在Go中,只有一种形象,没有复杂的行为。因此,您不需要一个数字类。你可以为Go游戏建模,就像
一样using std::array;
enum class FieldState : unsigned char { empty, black, white};
enum class Player : unsiged char { black, white};
class Go {
private:
array< array<FieldState, 19> , 19> board;
Player active_player;
unsigned int pieces_captured_by_black;
unsigned int pieces_captured_by_white;
//insert methods here
//maybe some logic parts that enforce Ko
}
如你所见,这些数字并不存在,它们只是董事会的地位。但在这里,我们不需要更多,所以这对我们来说是完美的。不存储任何坐标,董事会为我们做了这个。
但是,如果一个数字具有单独的枚举无法描述的复杂行为和状态,您可能希望切换到存储指向存储所需数据的类Figure
的指针的板。 。仍然没有需要坐标,你现在需要一块板场* 64而不是板场* 8的内存。这仍然没什么,所以完全没问题,会继续这样。
然而,只要你不能使用整数位置,或者如果电路板尺寸可以随意增长(例如,因为电路板是程序生成的世界的一部分),你可以选择一些坐标存储像
struct Coordinates {
double x, y;
}
class Figure {
private:
Coordinates coordinates;
//other properties
}
using std::vector;
class Game {
private:
vector<Figure> figures;
//other things
}
我特别关注棋盘游戏这个帖子,觉得这就是你想要的。另外,我使用了一些东西,如果你是初学者,你还不熟悉,给你一些新东西,希望这不会让你感到困惑。
我真正建议您尝试自行建模,然后将其发布在CodeReview上。让其他人把它拆开,直到它完美。