tris's People
tris's Issues
UI: convertire tutti i messaggi in inglese
Al momento sono un mix di italiano e inglese.
Evitare che i due player possano scegliere lo stesso nome
@gvnnz Sembrera' una banalita' ma bisognerebbe fare in modo che se il player1 immette un nome, il player2 non puo' inserire lo stesso nome; quindi in quel caso il programma stamperebbe un messaggio di errore del tipo: "player name alredy exist!"
Refactoring: spostare la funzione `print_matrix` in un nuovo modulo `view`
All'inizio avevamo messo print_matrix
nel modulo model. In realtà quella funzione è relativa alla grafica, quindi va messa in un nuovo modulo che chiameremo view
. @Ace-Miky crea un nuovo modulo e sposta quella funzione lì dentro.
Nuova funzione `get_matrix_column`
@Ace-Miky scrivi una funzione get_matrix_column
per ottenere la colonna di una matrice.
La funzione prende in input una matrice e un intero che indica la colonna che ti interessa. La funzione poi ritorna una lista con tutti i valori della colonna.
Nuova feature: partenza random del giocatore
All'inizio il programma sceglie a random il giocatore che fa la prima mossa.
Refactoring: spostare tutto quello che riguarda la grafica nel modulo view
Tutto quello che riguarda la grafica dovrebbe stare nel modulo view
: i messaggi di input, di errore, di vittoria eccetera.
Evitare che i giocatori inseriscano un nome vuoto
Se premo enter senza scrivere niente, il nome al momento è considerato valido.
Nuova funzione `all_equal` per verificare che una lista abbia tutti valori uguali
@Ace-Miky crea una funzione all_equal
che prende in input una lista numerica e un intero symbol_value
(che può essere 1 o 2 e che corrisponde al valore del simbolo o
o x
). La funzione ritorna True
se la lista contiene tutti valori uguali a symbol_value
. Esempio:
list_one = [1,1,1,1,1]
list_two = [1,2,0,0,1]
all_equal(list_one, 1) # True
all_equal(list_one, 2) # False
all_equal(list_two, 1) # False
all_equal(list_two, 2) # False
La useremo per capire se c'è una vittoria con la issue #9.
Refactoring: nuova classe `Matrix`
Al posto delle funzioni libere sparse dentro il modulo model
.
Impossibile uscire dal programma
@Ace-Miky fai in modo che premendo q
il gioco finisca.
Nuova funzione `make_matrix` per generare una matrice
@Ace-Miky crea la funzione make_matrix
che prende in input due valori: num_rows
e num_columns
e ritorna una matrice numerica con tutti i valori settati a 0. Esempio:
make_matrix(4, 4) # [[0, 0, 0, 0], [0, 0, 0, 0], [0, 0, 0, 0], [0, 0, 0, 0]]
L'input dell'utente non è sanificato
Abbiamo la funzione sanitize_input ma non la stiamo usando. Al momento se inserisco x00
è considerato invalido e non dovrebbe.
Refactoring: creare la matrice dinamicamente con `make_matrix`
Nuova funzione `parse_input`
@Ace-Miky scrivi una funzione che trasforma la stringa inserita dall'utente in qualcosa da passare alla funzione set_matrix_element
che abbiamo già fatto.
Nel dettaglio, la funzione prende in input la stringa tipo XNM
, la analizza e ritorna tre valori:
1
o2
(come interi) per il simboloX
(avevamo detto che0
è per le celle vuote)- un intero che corrisponde alla riga
N
- un intero che corrisponde alla colonna
M
Ad esempio per la stringa "x12"
la funzione ritorna 1
, 1
e 2
. Per ritornare valori multipli da una funzione puoi usare una lista o una tupla. La tupla forse è meglio perché è immutabile (è più sensato).
Ovviamente diamo per scontato che la stringa in input sia già stata validata da is_valid_input
che abbiamo fatto nella issue #1 . Anzi ci mettiamo anche un assert all'inizio di parse_input
per essere sicuri al 100%.
Inserimento nome giocatori (nome vuoto del player2 accettato)
Occhio @gvnnz ,
che se il player1 inserisce il nome, poi il player2 inserisce lo stesso nome del player1 e poi lo inserisce ancora ma vuoto il programma continua accentando il nome vuoto invece di stampare il messaggio di errore per poi richiedere il nome, MANNAIVEN!!!
Quindi sintetizzando se il player2 dopo avere inserito lo stesso nome del player1 inserisce un nome vuoto, quel nome vuoto viene erroneamente accettato
Refactoring: cicli while per nome vuoto o invalido (già esistente/già inserito dal player1)
Cambiare alredy in already e togliere l' else ed il continue finale
Possibilità di definire il nome del giocatore
Prima di iniziare una partita, il programma chiede i nomi dei giocatori e li usa poi per stampare il vincitore e anche per #21.
La funzione `is_valid_input` può ritornare None
Definita in main.py. Se nessuna condizione è soddisfatta, la funzione arriva alla fine e ritorna None
(o non ritorna niente). Invece deve sempre ritornare un valore booleano.
Nuova funzione `is_valid_input`
@Ace-Miky prepara la funzione is_valid_input
che prende in input la stringa inserita dall'utente (quella ottenuta da input(...)
) e verifica se è valida, ritornando un valore booleano.
Abbiamo definito la stringa in input del tipo XNM
dove:
- I caratteri sono sempre e solo tre
X
può essere solox
oo
(vedi tu se deve essere per forza minuscolo)N
eM
possono essere solo di tipo numerico interoN
deve essere inferiore al numero di righe della matriceM
deve essere inferiore al numero di colonne della matrice
Quindi ad esempio x11
è un input valido, o99
e rax
non lo sono.
Refactoring: classe Player
Al momento abbiamo un po' di variabili relative al giocatore sparse in giro per il codice. @Ace-Miky introduciamo una nuova classe Player con due proprietà: il nome del giocatore il suo simbolo associato. In questo modo raggruppiamo le variabili relative al giocatore in una classe, così da rendere il tutto più chiaro/leggibile.
Evitare di sovrascrivere i simboli nella parte random iniziale
Quando si assegnano i simboli nelle celle
Cambio automatico del giocatore
Al momento sono i due giocatori che si alternano manualmente. Facciamo in modo che sia il programma ad alternare i turni. Questo semplifica l'input, perché non serve più inserire il simbolo x
oppure o
: bastano le coordinate.
Evitare di sovascrivere i simboli
Al momento è possibile sovrascriverli, tipo mettere una X dove già c'era una O. Anche sovrascrivere il proprio simbolo, perdendo così il turno. @Ace-Miky dovrebbe bastare un controllo: si possono inserire simboli solo nelle celle della matrice vuote.
Refactoring: usare costanti per i valori 0, 1, 2
Al momento è un casino capire a cosa corrisponde 0 (cella vuota), 1 (X) o 2 (O). Usiamo delle costanti nel model per chiarezza.
Nuova funzione `is_winner`
@Ace-Miky Crea una nuova funzione is_winner
che prende in input la solita matrice e un intero symbol_value
(che può essere 1 o 2 e che corrisponde al valore del simbolo o
o x
). La funzione ritorna un booleano che dice se il player con un certo simbolo è vincitore o meno. Esempio:
matrix = [
[0, 1, 2],
[1, 1, 1],
[2, 0, 2]
]
is_winner(matrix, 1) # True
is_winner(matrix, 2) # False
Questa funzione usa internamente all_equal
che abbiamo discusso nella issue #7 e anche le varie funzioni per prendere le righe, le colonne e le diagonali della matrice.
Nuova funzione `get_matrix_row`
@Ace-Miky scrivi una funzione get_matrix_row
per ottenere la riga di una matrice.
La funzione prende in input una matrice e un intero che indica la riga che ti interessa. La funzione poi ritorna una lista con tutti i valori della riga.
Il player che inserisce la 'q' perde
Chi digita la 'q' e quitta viene automaticamente dichiarato sconfitto
def is_valid_input
def is_valid_input(input_string):
if (
input_string[0] != "o"
and input_string[0] != "x"
or input_string[1] != "0"
and input_string[1] != "1"
and input_string[1] != "2"
or input_string[2] != "0"
and input_string[2] != "1"
and input_string[2] != "2"
):
print(False)
else:
print(True)
Nuova modalità di gioco: si parte con un simbolo già presente, messo a random
Il simbolo può essere x
o o
ed è piazzato a caso nella griglia prima di iniziare la partita.
Per questo dobbiamo introdurre una specie di setup del gioco, dove si abilita o meno questa funzione. Io lo farei con un file di configurazione così per imparare a leggere i file da disco.
Stampare elenco coordinate sugli assi X e Y
Esempio:
0
1
2
0 1 2
Nuova funzione `get_matrix_diagonal`
@Ace-Miky scrivi una funzione get_matrix_diagonal
per ottenere la diagonale di una matrice.
La funzione prende in input una matrice e un valore booleano che indica la direzione della diagonale. Puoi fare che True
ritorna quella in un verso, False
quella in un altro (vedi tu come preferisci). La funzione poi ritorna una lista con tutti i valori della diagonale.
Edit: ho trovato i nomi ufficiali di queste diagonali: main diagonal e antidiagonal: https://en.wikipedia.org/wiki/Main_diagonal
Mettere il ciclo while del player_name vuoto ed uguale in una funzione
Come da titolo: inserirlo in una funzione
L'input del nome utente non è sanificato
Al momento se inserisco Giovy
non rimuove gli spazi.
Salvare i risultati delle partire su file
Salviamo ogni partita su un file a parte, tipo una tabella del genere:
data, ora, vincitore
Possiamo anche aggiungere la durata della partita.
Nuova feature: file di configurazione
Dove abilitare o disabilitare le varie funzioni di gioco.
Recommend Projects
-
React
A declarative, efficient, and flexible JavaScript library for building user interfaces.
-
Vue.js
🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.
-
Typescript
TypeScript is a superset of JavaScript that compiles to clean JavaScript output.
-
TensorFlow
An Open Source Machine Learning Framework for Everyone
-
Django
The Web framework for perfectionists with deadlines.
-
Laravel
A PHP framework for web artisans
-
D3
Bring data to life with SVG, Canvas and HTML. 📊📈🎉
-
Recommend Topics
-
javascript
JavaScript (JS) is a lightweight interpreted programming language with first-class functions.
-
web
Some thing interesting about web. New door for the world.
-
server
A server is a program made to process requests and deliver data to clients.
-
Machine learning
Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.
-
Visualization
Some thing interesting about visualization, use data art
-
Game
Some thing interesting about game, make everyone happy.
Recommend Org
-
Facebook
We are working to build community through open source technology. NB: members must have two-factor auth.
-
Microsoft
Open source projects and samples from Microsoft.
-
Google
Google ❤️ Open Source for everyone.
-
Alibaba
Alibaba Open Source for everyone
-
D3
Data-Driven Documents codes.
-
Tencent
China tencent open source team.