对于我的c ++家庭作业,我必须编写一个Tic-Tac-Toe Win32控制台应用程序。
我使用坐标系在屏幕上创建了一个网格,当用户按下箭头键并绘制X或O时,我使用_getch()
和SetConsoleCursorPosition(...)
移动光标当用户按下其中一个键时。
我的问题的关键部分
网格坐标的格式为(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╚═╧═╧═╝
答案 0 :(得分:1)
"偏移"是一个相当常见的术语[1,2],用于过去用于"调整"一个事物的位置。至于你的模数(6
),我不太确定。也许" boardExtent
" (因为它描述了董事会坐标系的"范围")?同义词可能是"限制," "边界," "边界,"或者只是"尺寸。"
我不是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;
}
答案 1 :(得分:1)
它们都与您的初始设置相关:
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;
}
请确保使用偶数值;)如果单元格较宽并且您想跳到单元格的中间,则会变得复杂。
答案 2 :(得分:0)
你可以使用你想要的任何东西,最好是坚持一个共同的命名约定。以#defines为例,以避免混淆。
也许:
#define MODULO_POSITION 6
#define OFFSET_1 12
#define OFFSET_2 2
#define OFFSET_3 6