venerdì 6 dicembre 2019

Gioco dell'orso - Parte 2


Qui di seguito qualche riga di commento sulla seconda versione a caratteri del gioco che potete trovare qui:
Il gioco è sempre giocabile con un po' di sforzo ma quello che conta qui è la trasformazione delle istruzioni al paradigma Object Oriented, ovvero ad oggetti.
Tutto sarà più chiaro quando Maria Teresa lo spiegherà.

Viene creata una sola classe Board, che nel costruttore definisce le posizioni iniziale e alcune "costanti" utili per il gioco; tutti gli attributi sono privati (per questo hanno il prefisso __ ) e  dall'esterno possono essere acceduti tramite metodi "getters" come ad esempio (get_bear_moves()get_bear_position() ma anche is_hunter_turn() )

I metodi display(), possible_moves(posizione), update(pos_iniziale, pos_finale) e is_winner() servono rispettivamente a mostrare la tavola di gioco (a caratteri), a restituire le mosse possibili data una posizione, ad aggiornare le posizioni del gioco e a controllare se c'è un vincitore.

La logica del gioco è implementata nella parte di codice "main" (ovvero fuori dalla classe) tramite un ciclo while.

La gestione degli input, che potrebbero essere errati, è "protetta" dal costrutto:
try:

    inserisci la mossa
    se non valida, rilancia eccezione
except:
    messaggio all'utente richiedendo una mossa valida

Sicuramente anche questo tema sarà oggetto di un prossimo approfondimento di Maria Teresa.

giovedì 5 dicembre 2019

Produzione di tutti i modi in cui posso riporre in due borse tre oggetti

def power_set (it):
    for i in range(2**len(it)):
        yield [it[j] for j in range (len(it)) if (i>>j) & 1]
def yieldAllCombos(items):
    """ use power_set to generate its set of all two bags, then for each bag
        take the remaining items &split them into a set of all two remainder bags
        for each set of two remainder bags return the first + the two bags
        """
    for bag1 in power_set(items):
        remain =[i for i in items if i not in bag1]
        for bag2 in power_set(remain):
            yield bag1, bag2
ls=['a','b','c']
ps=power_set(ls)
for p in ps:
   print(p)
ps=yieldAllCombos(ls)
for p in ps:
    print(p)

codice Python propedeutico per affrontare il problema dello zainetto detto knapsack

#programma che produce tutti i sottoinsiemi di un insieme dato in input
def Powerset(myset):
    subsets=[]
    noComb=2**len(myset) #numero di combinazioni di 2 oggetti su n posti 2^n
    #https://it.wikipedia.org/wiki/Insieme_delle_parti
    for ci in range (0,noComb):
        subset=[]
        for ei in range (0,len(myset)):
           if ci & 1 << ei:   #operazione di and sui bit -spostamento a sinistra dei bit
               subset.append(myset[ei])
        subsets.append(subset)
    return subsets
print (Powerset(['a','b','c']) ) 

domenica 1 dicembre 2019

Gioco dell'orso - Parte 1

Realizzare il "Gioco dell'Orso" in Python è stato per me un esercizio divertente, tanto che l'ho realizzato in diverse versioni.
La storia, la descrizione e le regole del gioco potete trovarle al link che aveva fornito Maria Teresa:
https://vallecervobiella.wordpress.com/il-gioco-dellorso

Questo primo articolo descrive la versione "procedurale" classica, con interfaccia utente semplicissima, a caratteri. Nei prossimi articoli descriverò la versione ad oggetti, quella grafica e se ci riuscirò, quella giocabile contro l'intelligenza artificiale.

Il codice sorgente commentato può essere trovato a questo link:
https://bitbucket.org/Burlesco/bear-and-hunter-s-board-game/src/master/Procedural/bear2players.py

La prima decisione che ho dovuto affrontare, decisione che poi è rimasta inalterata in tutte le versioni successive, era quella di come modellare la "scacchiera"/la tavola del gioco:


La mia scelta è stata quella di assegnare dei numeri da 0 a 20 (dall'alto verso il basso e poi da sinistra a destra) per ogni punto di intersezione dove le pedine potevano essere posizionate.
Per ogni posizione poi il carattere "_" indica l'assenza di pedine; "1" indica la presenza di un "cacciatore", "2" la presenza dell'orso.

Fatta questa premessa penso possiate capire il codice e attendo i vostri suggerimenti.

Burlesco (PythonGroupBiella)