Commit 559a0c2a authored by andreia.oliveira's avatar andreia.oliveira
Browse files

v1

parent 4081ad2a
OPTIONS = --filter=pandoc-numbering
OPTIONS += --filter=pandoc-crossref
PDFOPTIONS = --highlight-style kate
PDFOPTIONS += --pdf-engine xelatex
PDFOPTIONS += --number-sections
PDFOPTIONS += --template=./default.latex
HTMLOPTIONS += -t html5
HTMLOPTIONS += -c tufte-css/tufte.css
HTMLOPTIONS += --self-contained
MD=$(wildcard *.md)
HTML=$(MD:%.md=%.html)
PDF=$(MD:%.md=%.pdf)
all: $(HTML) $(PDF)
%.pdf: %.md Makefile
pandoc -s $(OPTIONS) $(PDFOPTIONS) -o $@ $<
%.html: %.md Makefile
pandoc -s $(OPTIONS) $(HTMLOPTIONS) -o $@ $<
deploy: all
mkdir -p prog_seq_c_tp/puissance4
cp puissance4.html prog_seq_c_tp/puissance4/index.html
cp puissance4.pdf prog_seq_c_tp/puissance4/puissance4.pdf
tar czvf skeleton_for_students.tar.gz skeleton_for_students && mv skeleton_for_students.tar.gz prog_seq_c_tp/puissance4/
clean:
rm -rf *.html *.pdf prog_seq_c_tp
---
author:
- Puissance 4
title: Cours de programmation séquentielle
autoSectionLabels: false
autoEqnLabels: true
eqnPrefix:
- "éq."
- "éqs."
chapters: true
numberSections: false
chaptersDepth: 1
sectionsDepth: 3
lang: fr
documentclass: article
papersize: A4
cref: false
urlcolor: blue
toc: false
...
# But du travail pratique
Le but de ce travail pratique est de réaliser un jeu de puissance 4. Le jeu doit implémenter trois modes différents :
- un mode deux joueurs ;
- un mode un joueur où l’ordinateur joue aléatoirement ;
- un mode un joueur "intelligent" où l’ordinateur essaie de gagner ou de ne pas perdre.
Le rendu visuel du jeu sera réalisé en mode texte "ASCII Art" tel qu’illustré
ci-dessous (vous pouvez copier-coller les symboles depuis la version HTML de
cet énoncé ou depuis le [repo git](https://gitedu.hesge.ch/programmation_sequentielle/travaux_pratiques/c_lang/puissance4/enonce):
```
Column number? (starts at 1):
4
┌─┬─┬─┬─┬─┬─┬─┐
│ │ │ │ │ │ │ │
├─┼─┼─┼─┼─┼─┼─┤
│ │ │ │ │ │ │ │
├─┼─┼─┼─┼─┼─┼─┤
│ │ │ │X│ │ │ │
├─┼─┼─┼─┼─┼─┼─┤
│ │ │X│O│ │ │ │
├─┼─┼─┼─┼─┼─┼─┤
│O│X│X│O│ │ │ │
├─┼─┼─┼─┼─┼─┼─┤
│X│O│X│O│ │ │ │
└─┴─┴─┴─┴─┴─┴─┘
1 2 3 4 5 6 7
Player one won!
```
En outre, une batterie de tests (`testbed`) permettant de valider que votre implémentation est correcte vous est fournie, de même que le programme fonctionnel. Ainsi, vous pourrez vous assurez que votre implémentation produit exactement l’affichage souhaité. Ce dernier point est particulièrement important, car si l’affichage exact n’est pas respecté, tous les tests de validation échoueront.
# Syntaxe du programme à implémenter
Le programme à implémenter doit impérativement respecter la syntaxe suivante :
```
Usage: puissance4 <mode> <row> <col>
mode specifies the mode: 1 = single player game (random),
2 = single player game (AI), 3 = two players game
row specifies the number of rows (>= 4)
col specifies the number of columns (>= 4)
```
A noter que l’ordre des arguments est fixé et que le dernier argument est
optionnel.
Voici un exemple d’exécution avec le mode deux joueurs sur une grille de 6x7 (lignes x colonnes) :
```
./puissance4 3 6 7
```
Un autre exemple avec une partie contre l’ordinateur "intelligent" sur une grille de 11x9 :
```
./puissance4 2 11 9
```
# Règles du jeu
Le jeu se joue à deux. Chacun leur tour, les joueurs choisissent une colonne. Quand le choix est fait, une pastille "tombe" au bas de la colonne spécifiée. Le premier joueur qui aligne quatre pastilles soit verticalement, soit horizontalement, soit en diagonale a gagné.
- Le plateau de jeu est composé d’un nombre arbitraire de lignes et colonnes ; le nombre de lignes ou colonnes doit être supérieur ou égal à quatre.
- A chaque joueur correspond une pastille ; celle-ci est représentée par le
caractère `X` pour le premier joueur et `O` pour le deuxième.
- Chacun leur tour les joueurs choisissent une colonne à l’aide du clavier ; la
première colonne est numérotée `1`.
- Si une colonne invalide est spécifiée, le programme doit re-demander à l’utilisateur d’entrer une colonne (valide).
- Une fois une colonne sélectionnée, la pastille du joueur va se placer en bas de la colonne sur la première case non-occupée (si toute la colonne est occupée il est impossible de poser la pastille).
- Le premier joueur à avoir aligné quatre pastilles horizontalement, verticalement, ou en diagonale, a gagné.
- Si toutes les cases sont remplies et qu'aucun joueur n'a gagné la partie se termine par un match nul.
## Mode ordinateur aléatoire
Programmer le jeu pour une seule personne face à l’ordinateur. Dans la première version de cette variante l’ordinateur jouera toujours au hasard.
## Mode ordinateur "intelligent"
Dans une version plus sophistiquée l’ordinateur sera en mesure d’empêcher la victoire de son adversaire s’il gagne au prochain coup, ou gagnera s’il est en mesure de gagner au prochain coup. Dans tous les autres cas l’ordinateur jouera au hasard.
# Cahier des charges
1. Programmer le jeu entre un humain et un ordinateur :
- L'ordinateur jouera toujours un coup au hasard.
2. Programmer une "intelligence artificielle" un peu plus évoluée :
- L'ordinateur gagnera s'il le peut au prochain coup.
- L'ordinateur empêchera le joueur de gagner au prochain coup s'il le peut.
3. Programmer le jeu à deux joueurs humains :
- Afficher l'état de la partie à l'écran où une case libre est représenté
par un `\ ` (espace), et les cases de chacun des joueurs par un `X` ou un
`O` respectivement. Le tableau de jeu sera affiché comme dans l'exemple fourni.
- La victoire doit être vérifiée après chaque coup.
- Un match nul est possible si aucun des joueurs n'a gagné et qu'il n'y a plus de case libre.
4. Les paramètres du jeu sont lus sur la ligne de commande selon la syntaxe
définie au paragraphe *Syntaxe du programme à implémenter*.
# Tests automatisés
## Paramètres d'entrée
Il est très important de respecter le format de la ligne de commande comme indiquées ci-dessus.
Le joueur doit rentrer une colonne à la fois. On supposera qu'il rentrera toujours un nombre entre 1 et le nombre de colonnes (pour simplifier).
## Début de la partie
1. Si `M` et `N` correspondent au `row` et `col` des paramètres d'entrée. Vous devez afficher la taille du plateau de jeu sur la première ligne
```
Board size is MxN (rows x col)
```
2. Vous devez afficher en "ASCII Art" l'état du tableau au début de la partie :
```
┌─┬─┬─┬─┬─┬─┬─┐
│ │ │ │ │ │ │ │
├─┼─┼─┼─┼─┼─┼─┤
│ │ │ │ │ │ │ │
├─┼─┼─┼─┼─┼─┼─┤
│ │ │ │ │ │ │ │
├─┼─┼─┼─┼─┼─┼─┤
│ │ │ │ │ │ │ │
├─┼─┼─┼─┼─┼─┼─┤
│ │ │ │ │ │ │ │
├─┼─┼─┼─┼─┼─┼─┤
│ │ │ │ │ │ │ │
└─┴─┴─┴─┴─┴─┴─┘
1 2 3 4 5 6 7
```
## En cours de partie
1. Lorsqu'un joueur doit jouer, la chaine de caractères suivante doit être affichée :
```
Column number? (starts at 1):
```
2. Après chaque coup (que ce soit d'un joueur ou de l'ordinateur), le tableau de jeu doit aussi être affiché :
```
┌─┬─┬─┬─┬─┬─┬─┐
│ │ │ │ │ │ │ │
├─┼─┼─┼─┼─┼─┼─┤
│ │ │ │ │ │ │ │
├─┼─┼─┼─┼─┼─┼─┤
│ │ │ │ │ │ │ │
├─┼─┼─┼─┼─┼─┼─┤
│ │ │ │ │ │ │ │
├─┼─┼─┼─┼─┼─┼─┤
│ │ │ │ │ │ │ │
├─┼─┼─┼─┼─┼─┼─┤
│X│O│ │ │ │ │ │
└─┴─┴─┴─┴─┴─┴─┘
1 2 3 4 5 6 7
```
## Victoire/défaite/match nul
Un certain nombre de tests automatisés sont fournis avec le code. Il est impératif que le format de sortie soit scrupuleusement respecté pour pouvoir passer les tests.
En d'autres termes:
- Lorsque le joueur 1 a gagné, le programme affichera :
```
Player one won!"
```
- Lorsque le joueur 2 a gagné, le programme affichera :
```
Player two won!
```
- Lorsque l'ordinateur a gagné, le programme affichera :
```
Computer won!
```
- Lorsque le résultat est un match nul, le programme affichera :
```
It is a draw.
```
## Tests automatisés fournis
Un squelette comprenant les tests automatisés vous est fourni sur la page dans l'archive
[skeleton_for_students.tar.gz](https://malaspinas.academy/prog_seq_c_tp/puissance4/skeleton_for_students.tar.gz).
A l'intérieur du répertoire se trouve un `Makefile`. Celui-ci sera utilisé pour compiler votre programme et nettoyer les fichiers finaux et intermédiaires générés.
Ce `Makefile` doit contenir les cibles suivantes :
- `puissance4` : cible par défaut permettant de générer l'exécutable du jeu ;
le nom de l'exécutable doit impérativement être "puissance4".
- `clean` : cible permettant de supprimer l'exécutable et les fichiers
intermédiaires générés (et aussi les fichiers candidats du `testbed`).
- `tests` : cible permettant d'exécuter la batterie de tests ; vous ne devriez pas avoir à modifier les règles de cette cible (c'est déjà fait pour vous).
**Important:** Il est impératif d'initialiser la graine de votre générateur de
nombre aléatoire à `0` pour que les tests passent avec succès (`srand(0)`).
Il est **impératif que votre programme passe tous les tests !** Vous pouvez vérifier simplement ceci en exécutant "make tests" dans le répertoire racine du travail pratique. En cas d'exécution sans erreur, vous devriez obtenir un affichage similaire à ceci :
```
$ make tests
make -C testbed
make[1]: Entering directory '/home/orestis/git/projects/puissance4/testbed'
make -C 2players
make[2]: Entering directory '/home/orestis/git/projects/puissance4/testbed/2players'
=============[2 player tests]=============
test1
-----------------------------
test2
-----------------------------
test3
-----------------------------
test4
-----------------------------
test5
-----------------------------
make[2]: Leaving directory '/home/orestis/git/projects/puissance4/testbed/2players'
make -C rand_ai
make[2]: Entering directory '/home/orestis/git/projects/puissance4/testbed/rand_ai'
=============[random AI tests]=============
test1
-----------------------------
test2
-----------------------------
test3
-----------------------------
test4
-----------------------------
make[2]: Leaving directory '/home/orestis/git/projects/puissance4/testbed/rand_ai'
make -C smart_ai
make[2]: Entering directory '/home/orestis/git/projects/puissance4/testbed/smart_ai'
=============[smart AI tests]=============
test1
-----------------------------
test2
-----------------------------
test3
-----------------------------
test4
-----------------------------
test5
-----------------------------
make[2]: Leaving directory '/home/orestis/git/projects/puissance4/testbed/smart_ai'
make[1]: Leaving directory '/home/orestis/git/projects/puissance4/testbed'
```
# Notes importantes
- Vous trouverez sur dans l'archive `skeleton_for_students.tar.gz` un
exécutable (`puissance4`) qui devrait être conforme au standard que nous avons défini dans ce document. N'hésitez pas à l'exécuter pour vérifier le format de sortie.
- Écrivez un code aussi modulaire et réutilisable que possible.
- Mettez votre code dans plusieurs fichiers séparés ; le projet sera compilé
avec le `Makefile` fourni dans le squelette.
- Essayez d'écrire vos propres tests pour chacune des fonctions que vous concevez.
puissance4:
@echo "first rule which must create the puissance4 executable"
clean:
@echo "this rule must clean everything up (including candidate files in testbed)"
$(MAKE) -C testbed clean
tests: puissance4
$(MAKE) -C testbed
\ No newline at end of file
include ../common.mk
EXE=../../puissance4 3 6 7
title:
@echo "=============[2 player tests]============="
Board size is 6x7 (rows x col)
┌─┬─┬─┬─┬─┬─┬─┐
│ │ │ │ │ │ │ │
├─┼─┼─┼─┼─┼─┼─┤
│ │ │ │ │ │ │ │
├─┼─┼─┼─┼─┼─┼─┤
│ │ │ │ │ │ │ │
├─┼─┼─┼─┼─┼─┼─┤
│ │ │ │ │ │ │ │
├─┼─┼─┼─┼─┼─┼─┤
│ │ │ │ │ │ │ │
├─┼─┼─┼─┼─┼─┼─┤
│ │ │ │ │ │ │ │
└─┴─┴─┴─┴─┴─┴─┘
1 2 3 4 5 6 7
Column number? (starts at 1):
┌─┬─┬─┬─┬─┬─┬─┐
│ │ │ │ │ │ │ │
├─┼─┼─┼─┼─┼─┼─┤
│ │ │ │ │ │ │ │
├─┼─┼─┼─┼─┼─┼─┤
│ │ │ │ │ │ │ │
├─┼─┼─┼─┼─┼─┼─┤
│ │ │ │ │ │ │ │
├─┼─┼─┼─┼─┼─┼─┤
│ │ │ │ │ │ │ │
├─┼─┼─┼─┼─┼─┼─┤
│ │ │ │X│ │ │ │
└─┴─┴─┴─┴─┴─┴─┘
1 2 3 4 5 6 7
Column number? (starts at 1):
┌─┬─┬─┬─┬─┬─┬─┐
│ │ │ │ │ │ │ │
├─┼─┼─┼─┼─┼─┼─┤
│ │ │ │ │ │ │ │
├─┼─┼─┼─┼─┼─┼─┤
│ │ │ │ │ │ │ │
├─┼─┼─┼─┼─┼─┼─┤
│ │ │ │ │ │ │ │
├─┼─┼─┼─┼─┼─┼─┤
│ │ │ │ │ │ │ │
├─┼─┼─┼─┼─┼─┼─┤
│O│ │ │X│ │ │ │
└─┴─┴─┴─┴─┴─┴─┘
1 2 3 4 5 6 7
Column number? (starts at 1):
┌─┬─┬─┬─┬─┬─┬─┐
│ │ │ │ │ │ │ │
├─┼─┼─┼─┼─┼─┼─┤
│ │ │ │ │ │ │ │
├─┼─┼─┼─┼─┼─┼─┤
│ │ │ │ │ │ │ │
├─┼─┼─┼─┼─┼─┼─┤
│ │ │ │ │ │ │ │
├─┼─┼─┼─┼─┼─┼─┤
│ │ │ │X│ │ │ │
├─┼─┼─┼─┼─┼─┼─┤
│O│ │ │X│ │ │ │
└─┴─┴─┴─┴─┴─┴─┘
1 2 3 4 5 6 7
Column number? (starts at 1):
┌─┬─┬─┬─┬─┬─┬─┐
│ │ │ │ │ │ │ │
├─┼─┼─┼─┼─┼─┼─┤
│ │ │ │ │ │ │ │
├─┼─┼─┼─┼─┼─┼─┤
│ │ │ │ │ │ │ │
├─┼─┼─┼─┼─┼─┼─┤
│ │ │ │ │ │ │ │
├─┼─┼─┼─┼─┼─┼─┤
│O│ │ │X│ │ │ │
├─┼─┼─┼─┼─┼─┼─┤
│O│ │ │X│ │ │ │
└─┴─┴─┴─┴─┴─┴─┘
1 2 3 4 5 6 7
Column number? (starts at 1):
┌─┬─┬─┬─┬─┬─┬─┐
│ │ │ │ │ │ │ │
├─┼─┼─┼─┼─┼─┼─┤
│ │ │ │ │ │ │ │
├─┼─┼─┼─┼─┼─┼─┤
│ │ │ │ │ │ │ │
├─┼─┼─┼─┼─┼─┼─┤
│ │ │ │X│ │ │ │
├─┼─┼─┼─┼─┼─┼─┤
│O│ │ │X│ │ │ │
├─┼─┼─┼─┼─┼─┼─┤
│O│ │ │X│ │ │ │
└─┴─┴─┴─┴─┴─┴─┘
1 2 3 4 5 6 7
Column number? (starts at 1):
┌─┬─┬─┬─┬─┬─┬─┐
│ │ │ │ │ │ │ │
├─┼─┼─┼─┼─┼─┼─┤
│ │ │ │ │ │ │ │
├─┼─┼─┼─┼─┼─┼─┤
│ │ │ │ │ │ │ │
├─┼─┼─┼─┼─┼─┼─┤
│O│ │ │X│ │ │ │
├─┼─┼─┼─┼─┼─┼─┤
│O│ │ │X│ │ │ │
├─┼─┼─┼─┼─┼─┼─┤
│O│ │ │X│ │ │ │
└─┴─┴─┴─┴─┴─┴─┘
1 2 3 4 5 6 7
Column number? (starts at 1):
┌─┬─┬─┬─┬─┬─┬─┐
│ │ │ │ │ │ │ │
├─┼─┼─┼─┼─┼─┼─┤
│ │ │ │ │ │ │ │
├─┼─┼─┼─┼─┼─┼─┤
│ │ │ │X│ │ │ │
├─┼─┼─┼─┼─┼─┼─┤
│O│ │ │X│ │ │ │
├─┼─┼─┼─┼─┼─┼─┤
│O│ │ │X│ │ │ │
├─┼─┼─┼─┼─┼─┼─┤
│O│ │ │X│ │ │ │
└─┴─┴─┴─┴─┴─┴─┘
1 2 3 4 5 6 7
Player one won!
Board size is 6x7 (rows x col)
┌─┬─┬─┬─┬─┬─┬─┐
│ │ │ │ │ │ │ │
├─┼─┼─┼─┼─┼─┼─┤
│ │ │ │ │ │ │ │
├─┼─┼─┼─┼─┼─┼─┤
│ │ │ │ │ │ │ │
├─┼─┼─┼─┼─┼─┼─┤
│ │ │ │ │ │ │ │
├─┼─┼─┼─┼─┼─┼─┤
│ │ │ │ │ │ │ │
├─┼─┼─┼─┼─┼─┼─┤
│ │ │ │ │ │ │ │
└─┴─┴─┴─┴─┴─┴─┘
1 2 3 4 5 6 7
Column number? (starts at 1):
┌─┬─┬─┬─┬─┬─┬─┐
│ │ │ │ │ │ │ │
├─┼─┼─┼─┼─┼─┼─┤
│ │ │ │ │ │ │ │
├─┼─┼─┼─┼─┼─┼─┤
│ │ │ │ │ │ │ │
├─┼─┼─┼─┼─┼─┼─┤
│ │ │ │ │ │ │ │
├─┼─┼─┼─┼─┼─┼─┤
│ │ │ │ │ │ │ │
├─┼─┼─┼─┼─┼─┼─┤
│X│ │ │ │ │ │ │
└─┴─┴─┴─┴─┴─┴─┘
1 2 3 4 5 6 7
Column number? (starts at 1):
┌─┬─┬─┬─┬─┬─┬─┐
│ │ │ │ │ │ │ │
├─┼─┼─┼─┼─┼─┼─┤
│ │ │ │ │ │ │ │
├─┼─┼─┼─┼─┼─┼─┤
│ │ │ │ │ │ │ │
├─┼─┼─┼─┼─┼─┼─┤
│ │ │ │ │ │ │ │
├─┼─┼─┼─┼─┼─┼─┤
│O│ │ │ │ │ │ │
├─┼─┼─┼─┼─┼─┼─┤
│X│ │ │ │ │ │ │
└─┴─┴─┴─┴─┴─┴─┘
1 2 3 4 5 6 7
Column number? (starts at 1):
┌─┬─┬─┬─┬─┬─┬─┐
│ │ │ │ │ │ │ │
├─┼─┼─┼─┼─┼─┼─┤
│ │ │ │ │ │ │ │
├─┼─┼─┼─┼─┼─┼─┤
│ │ │ │ │ │ │ │
├─┼─┼─┼─┼─┼─┼─┤
│ │ │ │ │ │ │ │
├─┼─┼─┼─┼─┼─┼─┤
│O│ │ │ │ │ │ │
├─┼─┼─┼─┼─┼─┼─┤
│X│X│ │ │ │ │ │
└─┴─┴─┴─┴─┴─┴─┘
1 2 3 4 5 6 7
Column number? (starts at 1):
┌─┬─┬─┬─┬─┬─┬─┐
│ │ │ │ │ │ │ │
├─┼─┼─┼─┼─┼─┼─┤
│ │ │ │ │ │ │ │
├─┼─┼─┼─┼─┼─┼─┤
│ │ │ │ │ │ │ │
├─┼─┼─┼─┼─┼─┼─┤
│ │ │ │ │ │ │ │
├─┼─┼─┼─┼─┼─┼─┤
│O│O│ │ │ │ │ │
├─┼─┼─┼─┼─┼─┼─┤
│X│X│ │ │ │ │ │
└─┴─┴─┴─┴─┴─┴─┘
1 2 3 4 5 6 7
Column number? (starts at 1):
┌─┬─┬─┬─┬─┬─┬─┐
│ │ │ │ │ │ │ │
├─┼─┼─┼─┼─┼─┼─┤
│ │ │ │ │ │ │ │
├─┼─┼─┼─┼─┼─┼─┤
│ │ │ │ │ │ │ │
├─┼─┼─┼─┼─┼─┼─┤
│ │ │ │ │ │ │ │
├─┼─┼─┼─┼─┼─┼─┤
│O│O│ │ │ │ │ │
├─┼─┼─┼─┼─┼─┼─┤
│X│X│X│ │ │ │ │
└─┴─┴─┴─┴─┴─┴─┘
1 2 3 4 5 6 7
Column number? (starts at 1):
┌─┬─┬─┬─┬─┬─┬─┐
│ │ │ │ │ │ │ │
├─┼─┼─┼─┼─┼─┼─┤
│ │ │ │ │ │ │ │
├─┼─┼─┼─┼─┼─┼─┤
│ │ │ │ │ │ │ │
├─┼─┼─┼─┼─┼─┼─┤
│ │ │ │ │ │ │ │
├─┼─┼─┼─┼─┼─┼─┤
│O│O│O│ │ │ │ │
├─┼─┼─┼─┼─┼─┼─┤
│X│X│X│ │ │ │ │
└─┴─┴─┴─┴─┴─┴─┘
1 2 3 4 5 6 7
Column number? (starts at 1):
┌─┬─┬─┬─┬─┬─┬─┐
│ │ │ │ │ │ │ │
├─┼─┼─┼─┼─┼─┼─┤
│ │ │ │ │ │ │ │
├─┼─┼─┼─┼─┼─┼─┤
│ │ │ │ │ │ │ │
├─┼─┼─┼─┼─┼─┼─┤
│ │ │ │ │ │ │ │
├─┼─┼─┼─┼─┼─┼─┤
│O│O│O│ │ │ │ │
├─┼─┼─┼─┼─┼─┼─┤
│X│X│X│X│ │ │ │
└─┴─┴─┴─┴─┴─┴─┘
1 2 3 4 5 6 7
Player one won!
Board size is 6x7 (rows x col)
┌─┬─┬─┬─┬─┬─┬─┐
│ │ │ │ │ │ │ │
├─┼─┼─┼─┼─┼─┼─┤
│ │ │ │ │ │ │ │
├─┼─┼─┼─┼─┼─┼─┤
│ │ │ │ │ │ │ │
├─┼─┼─┼─┼─┼─┼─┤
│ │ │ │ │ │ │ │
├─┼─┼─┼─┼─┼─┼─┤
│ │ │ │ │ │ │ │
├─┼─┼─┼─┼─┼─┼─┤
│ │ │ │ │ │ │ │
└─┴─┴─┴─┴─┴─┴─┘
1 2 3 4 5 6 7
Column number? (starts at 1):
┌─┬─┬─┬─┬─┬─┬─┐
│ │ │ │ │ │ │ │
├─┼─┼─┼─┼─┼─┼─┤
│ │ │ │ │ │ │ │
├─┼─┼─┼─┼─┼─┼─┤
│ │ │ │ │ │ │ │
├─┼─┼─┼─┼─┼─┼─┤
│ │ │ │ │ │ │ │
├─┼─┼─┼─┼─┼─┼─┤
│ │ │ │ │ │ │ │
├─┼─┼─┼─┼─┼─┼─┤
│X│ │ │ │ │ │ │
└─┴─┴─┴─┴─┴─┴─┘
1 2 3 4 5 6 7
Column number? (starts at 1):
┌─┬─┬─┬─┬─┬─┬─┐
│ │ │ │ │ │ │ │
├─┼─┼─┼─┼─┼─┼─┤
│ │ │ │ │ │ │ │
├─┼─┼─┼─┼─┼─┼─┤
│ │ │ │ │ │ │ │
├─┼─┼─┼─┼─┼─┼─┤
│ │ │ │ │ │ │ │