家庭作业:避免神奇数字 对于我的C++作业分配,我必须编写一个TIC Tac ToIP Win32控制台应用程序。
我使用坐标系在屏幕上创建了一个网格,我使用家庭作业:避免神奇数字 对于我的C++作业分配,我必须编写一个TIC Tac ToIP Win32控制台应用程序。,c++,constants,naming,C++,Constants,Naming,我使用坐标系在屏幕上创建了一个网格,我使用\u getch()和设置控制台或位置(…)在用户按下箭头键时移动光标,并在用户按下其中一个键时绘制X或O 我问题的关键部分 栅格坐标的格式为(x,y),1,1表示左上角,5,5表示右下角。每次按箭头键都会移动光标+/-2。例如,如果光标位于1,1,用户按下向上箭头,光标将移动到1,5,如果再次按下向上箭头,光标将移动到1,3,以此类推 使用以下算术表达式处理移动: switch ( keyPress ) { case UP : posi
\u getch()
和设置控制台或位置(…)
在用户按下箭头键时移动光标,并在用户按下其中一个键时绘制X或O
我问题的关键部分
栅格坐标的格式为(x,y),1,1表示左上角,5,5表示右下角。每次按箭头键都会移动光标+/-2。例如,如果光标位于1,1,用户按下向上箭头,光标将移动到1,5,如果再次按下向上箭头,光标将移动到1,3,以此类推
使用以下算术表达式处理移动:
switch ( keyPress ) {
case UP :
position.Y = (12 + position.Y - 2) % 6;
SetConsoleCursorPosition(screen, position);
break;
case DOWN :
position.Y = (12 + position.Y + 2) % 6;
SetConsoleCursorPosition(screen, position);
break;
case LEFT :
position.X = (12 + position.X - 2) % 6;
SetConsoleCursorPosition(screen, position);
break;
case RIGHT :
position.X = (12 + position.X + 2) % 6;
SetConsoleCursorPosition(screen, position);
break;
}
问题
我不允许在赋值中使用幻数,因此,在12、2和6中,需要用有意义的变量名替换。这些值的合适名称是什么
更新
根据评论,以下是游戏板在屏幕上的显示方式:
x和y轴上的数字是绘制x或O的光标位置
0123456
0╔═╤═╤═╗
1║X│ │ ║
2╟─┼─┼─╢
3║ │O│ ║
4╟─┼─┼─╢
5║ │ │X║
6╚═╧═╧═╝
“偏移量”是一个相当常见的术语[,]用于“调整”物体位置的数字。至于你的模数(6
),我不太确定。可能是“boardExtent
”(因为它描述了电路板坐标系的“范围”)?同义词可能是“limit”、“bounds”、“boundary”或“size”
我不是一个C/++程序员,所以考虑这个伪代码,但是类似的东西对我来说是有意义的:
baseXOffset = 12
baseYOffset = baseXOffset
upOffset = baseYOffset - 2
downOffset = baseYOffset + 2
leftOffset = baseXOffset - 2
rightOffset = baseXOffset + 2
boardExtent = 6
switch ( keyPress ) {
case UP :
position.Y = ( upOffset + position.Y ) % boardExtent;
SetConsoleCursorPosition(screen, position);
break;
case DOWN :
position.Y = ( downOffset + position.Y ) % boardExtent;
SetConsoleCursorPosition(screen, position);
break;
case LEFT :
position.X = ( leftOffset + position.X ) % boardExtent;
SetConsoleCursorPosition(screen, position);
break;
case RIGHT :
position.X = ( rightOffset + position.X ) % boardExtent;
SetConsoleCursorPosition(screen, position);
break;
}
您可以使用任何您想要的,最好是坚持一个共同的命名约定。例如,让你的#定义所有大写字母以避免混淆 也许:
#define MODULO_POSITION 6
#define OFFSET_1 12
#define OFFSET_2 2
#define OFFSET_3 6
这一切都与您的初始设置有关,它们可能看起来像:
const int CELLWIDTH = 1; // how big one cell is (space in it)
const int BORDERWIDTH = 1; // width of the border
const int GAMESIZE = 5; // size of game field like 5x5
const int CELLSIZE = CELLWIDTH + BORDERWIDTH;
const int MAXOFFSET = GAMESIZE*CELLSIZE + BORDERWIDTH;
switch ( keyPress ) {
case UP :
position.Y = (MAXOFFSET+1 + position.Y - CELLSIZE + GAMESIZE + 1) % (GAMESIZE+1);
SetConsoleCursorPosition(screen, position);
break;
case DOWN :
position.Y = (MAXOFFSET+1 + position.Y + CELLSIZE + GAMESIZE+1) % (GAMESIZE+1);
SetConsoleCursorPosition(screen, position);
break;
case LEFT :
position.X = (MAXOFFSET+1 + position.X - CELLSIZE - (GAMESIZE+1)) % (GAMESIZE+1);
SetConsoleCursorPosition(screen, position);
break;
case RIGHT :
position.X = (MAXOFFSET+1 + position.X + CELLSIZE - (GAMESIZE+1)) % (GAMESIZE+1);
SetConsoleCursorPosition(screen, position);
break;
}
请确保使用偶数值;)如果单元格更宽,如果你想跳到单元格的中间,情况会变得复杂。为什么坐标系会变为6?tic tac toe不是3x3吗?X,O数据在3x3网格中,但是,屏幕上的板是7x7,这就是为什么光标位于1,3或5