2011-10-12 2 views
3

Pour mon devoir de C++, je dois écrire une application console Tic-Tac-Toe Win32. J'ai créé une grille sur l'écran en utilisant un système de coordonnées et j'utilise _getch() et SetConsoleCursorPosition(...) pour déplacer le curseur lorsque l'utilisateur appuie sur les touches fléchées et pour dessiner un X et et O lorsque l'utilisateur appuie sur l'un de ces clés.Devoir: éviter les nombres magiques

partie clé de ma question

Les coordonnées de la grille sont dans le format sont (x, y) et 1,1 représente la partie supérieure gauche et 5,5 représente la partie inférieure droite. Chaque touche fléchée déplace le curseur +/- 2. Par exemple, si le curseur est à 1,1 et que l'utilisateur appuie sur la flèche vers le haut, le curseur est déplacé sur 1,5, si la flèche vers le haut est à nouveau enfoncée, le curseur se déplace 1,3, etc.

le mouvement est manipulé avec cette expression arithmétique:

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; 
} 

question

Je ne suis pas autorisé à utiliser des numéros magiques pour l'affectation et, par conséquent, dans la 12, 2 et 6 doivent être remplacés par des noms de variables qui ont un sens. Quels seraient les noms appropriés pour ces valeurs?

MISE À JOUR

Sur la base des commentaires, voici comment le plateau de jeu est affiché à l'écran: Les chiffres sur l'axe x et y sont les positions de curseur où X ou et O est tiré.


0╔═╤═╤═╗ 
1║X│ │ ║ 
2╟─┼─┼─╢ 
3║ │O│ ║ 
4╟─┼─┼─╢ 
5║ │ │X║ 
6╚═╧═╧═╝ 
+0

Pourquoi le système de coordonnées passe-t-il à 6? Est-ce que tic-tac-toe n'est pas 3x3? –

+0

Les données X, O sont dans une grille 3x3, cependant, la carte sur l'écran est 7x7, c'est pourquoi le curseur est à 1,3, ou 5 –

Répondre

1

il est tout par rapport à vos réglages initiaux, ils pourraient ressembler à:

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; 
} 

S'il vous plaît assurez-vous d'utiliser même des valeurs;) il se complique si la cellule est plus large et si vous voulez sauter au milieu de la cellule.

1

"Offset" est un terme assez commun [1, 2] utilisée pour les nombres utilisés pour "ajuster" la position d'une chose. En ce qui concerne votre module (6), je suis moins sûr. Peut-être "boardExtent" (puisqu'il décrit la "mesure" du système de coordonnées de la carte)? Les synonymes peuvent être "limite", "limites", "limite" ou simplement "taille".

Je ne suis pas un programmeur C/++ donc considérer cette pseudo-code, mais quelque chose comme cela a du sens pour moi:

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; 
} 
0

Vous pouvez utiliser ce que vous voulez, le mieux est de rester avec une dénomination commune convention. Avoir votre #defines tous les capitaux par exemple pour éviter la confusion.

Peut-être:

#define MODULO_POSITION 6 
#define OFFSET_1 12 
#define OFFSET_2 2 
#define OFFSET_3 6 
Questions connexes