家庭作业:避免魔术数字

时间:2011-10-12 01:09:56

标签: c++ constants naming

对于我的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╚═╧═╧═╝

3 个答案:

答案 0 :(得分:1)

"偏移"是一个相当常见的术语[12],用于过去用于"调整"一个事物的位置。至于你的模数(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