Consiglio nello sviluppo di semplice applicazione

di il
11 risposte

Consiglio nello sviluppo di semplice applicazione

Salve a tutti,
scusate per: Il titolo del topic; non sapevo proprio che titolo dare!
la lunghezza dell'introduzione
la terminologia insufficiente e soprattutto SCORRETTA, sto cercando di imparare.

Quando ero un bambino mi divertivo a programmare su un Olivetti PC128 (Basic). Ora che sono "vecchio" preso dalla nostalgia, la settimana scorsa, ho scaricato tonnellate di guide di Objective C e di C++ provando ad imparare qualcosa.

Ho deciso di imparare cercando di realizzare un semplice e basilare "Giochino" che per ora,
NON HA interfaccia grafica. Si tratta del banale gioco "Sasso, Forbici, Carta". Naturalmente per le istruzioni eccetera faccio riferimento alle guide e ad Internet ... solo che credo che realizzare qualcosa "di mio" possa meglio aiutarmi a comprendere quei concetti spiegati.

Ho creato una classe "Mano", definito le variabili e due metodi:

un METODO che scelga a caso un numero tra 0 e 3 (che poi in un elenco NSArray andrà a pescare appunto "Sasso, Forbici e Carta")
ed un METODO che chieda e riceva dalla tastiera un numero tra 0 e 3 (che pescherà dal solito NSArray).

Ho creato su main.m "due mani" una per "La CPU" (ossia, che scelga con arc4random() % 2) ed una che con scanf chieda all'utente. (A proposito, avrò altre domande a proposito di scanf, printf e NSLog ). Ho potuto constatare che il programma genera correttamente il numero casuale e richiama correttamente il valore in NSArray. Ho potuto constatare che il numero da 0 a 2 è correttamente rilevato da scanf (con un Do / while ed un IF ho controllato che si inserissero solo valori <2 ... azz ho appena pensato che devo fare in modo che siano solo valori positivi)

Ed arriviamo finalmente alla domanda del topic!!
Ho pensato che per il calcolo dei risultati potrei creare un nuovo metodo ma mi chiedo:

Come potrei fare secondo voi? Insomma ....

mano1 = carta
mano2 = sasso
vince sasso

E' impossibile che l'unica soluzione sia definire tutte le combinazioni. A parte l'array, naturalmente 0,1,2 è come dire sasso, forbici e carta e quindi potrei lavorare su questi tre interi ... ma come potrei creare una serie, una tabella di combinazioni vincenti/perdenti a prescindere dalla posizione? (intendo che "sasso-forbici" ha lo stesso risultato di "forbici-sasso"... vince sempre sasso).

Naturalmente if (m1 == m2) allora è pareggio ma per le altre combinazioni, voi che fareste?

Grazie a tutti, soprattutto per essere arrivati fino in fondo!

Giovanni

11 Risposte

  • Re: Consiglio nello sviluppo di semplice applicazione

    La tua logica non è molto complessa. Devi pensare che qualunque sia la giocata, perderà contro una giocata e vincerà a contro un'altra. Quindi devi associare ad ogni giocata quella con cui vince (o perde), così con un semplice if controlli la giocata
  • Re: Consiglio nello sviluppo di semplice applicazione

    Ciao!! Si alla fine ho risolto con dei controlli switch... Ora sono invece impantanato in un altro problema:

    -IBAction!

    Ho 3 pulsanti che impostano il valore della variabile giocatore... Ma non so poi, come far leggere queste variabili da un altro oggetto che farebbe poi i controlli switch! Sarebbero oggetti tipo classe->sottoclasse o al limite della medesima classe... non so come fare accedere ai valori delle variabili di altre classi!
  • Re: Consiglio nello sviluppo di semplice applicazione

    Ciao Funesto,

    premetto che anche io sto imparando obj-c e quindi il mio consiglio potrebbe avere qualche piccola inesattezza, ma secondo me puoi fare così.

    nel metodo ibaction button puoi assegnare il valore alla variabile (esempio x)
    nello stesso metodo richiamare un altro metodo che esegua lo switch
    in quello switch metterai i vari casi, essendo poche combinazioni date dalle sole 3 variabili forse è il metodo migliore.

    in realtà non so se creerei un oggetto "mano", se tu fai 3 pulsanti che assegnano 3 valori diversi ad x,
    poi nello switch case fai tu tutti i casi possibili (sono solo 9 in questo caso...)

    da li poi è abbastanza semplice, volendo, riportare il vincitore in una label sullo schermo...
    dichiari la proprietà label e poi la modifichi nei vari casi
    self.label.text = @"hai vinto"; oppure @"hai perso";

    se ho detto qualche castroneria "corigetemi" pure...
  • Re: Consiglio nello sviluppo di semplice applicazione

    Ciao Toti!!! grazie per la risposta!
    Macché castronerie ...anzi ... fa piacere trovare un altro principiante (... anche se secondo me, tu sei moolto meno principiante di me!!)

    Come già detto sto seguendo varie guide disponibili su internet e l'idea di creare il semplice giochino, non è tanto per il gioco in se, ma per entrare nell'ottica della programmazione ad oggetti, cosa per me decisamente nuova ma ... interessante, se ho capito bene il concetto!

    Il fatto di avere diversi oggetti, in questo caso, potrebbe essere interessante a livello "funzionale" ed educativo. Ti faccio il mio ragionamento che forse sarà anche sbagliato concettualmente o logico, proprio a causa della mia ignoranza!

    Avendo tre IBAction (sasso, forbici e carta) avrei tutto nella stessa "classe" sia la scelta del giocatore che la scelta del computer (una funzione random per ogni pulsante), e quindi un po' perderei quello che è il concetto di "oggetti".

    Creando invece un oggetto "mano giocatore" ed un oggetto "mano computer" ... IN TEORIA (la mia strampalata teoria) il metodo (o la classe?) di controllo potrebbe valutare risultati che provengono da "due mani" (due oggetti) che poi potrebbero essere due umani, due computer oppure un computer e un giocatore ...

    Questo permetterebbe a livello ludico (?!) di giocare contro il telefono o contro un giocatore indifferentemente (creando gli oggetti giusti) ma soprattutto insegnerebbe a me come far comunicare i diversi oggetti!! (giocatore, computer e controllo) ... cosa interessantissima ed importante a mio avviso!

    Io sto ancora ai livelli che "copio" gli esempi dalle guide, ma piano piano sto capendo IL PERCHE' ... ma non ancora sono ai livelli di imparare le procedure e riutilizzarle per i miei scopi senza rileggere suddette guide! :-\

    Ad esempio il "giochino" funziona (non chiedermi come!!!) con un main, e con due oggetti, ma .... non so ancora come trasportarlo su Iphone! ... sto leggendo a proposito!

    A presto! e grazie!!
  • Re: Consiglio nello sviluppo di semplice applicazione

    Ciao Funesto,

    comprendo il tuo ragionamento, anche io spesso faccio la strada più tortuosa per comprendere come funziona una cosa, per poi applicare eventuali scorciatoie.

    allora, diciamo che tu abbia questi 2 oggetti, che avranno delle proprietà, queste proprietà avranno un valore, 0, 1 o 2 in base alla scelta dell'utente e del pc.
    quindi ti troverai 2 oggetti nel file manager che dovranno essere implementati nel viewcontrolelr principale.
    a questo punto assegnerai alla proprietà della classe "manoUmana" il valore del uibutton relativo

    quindi in ogni azione dei tre bottoni metterai un qualcosa del tipo
    nomeOggetto.proprietà = 0; (oppure 1, oppure 2, in base al tasto premuto.

    sostanzialmente è come creare un int x in ogni oggetto, che assumerà l'importanza di una proprietà per quell'oggetto, questo ti permette di portare quel valore tra diversi view controller, cioè tra diverse schermate del tuo iphone, (vedi SINGLETON)

    per portare il tutto su iphone devi:

    nello storyboard inserire i tre tasti ed una uilabel
    collegarli nel viewcontroller.m nell'interface
    solo i bottoni collegarli anche nell'implementation
    nelle 3 azioni/metodi scrivere il codice che assegna alla proprietà dell'oggetto manoUmana e manoCPU il valore
    richiamare lo switch-case
    assegnare alla proprietà label la nsstring "hai vinto/hai perso" (self.uilabel.text = @"testo";)

    questo dovrebbe fare quello che chiedi tu, e visualizzare il risultato
  • Re: Consiglio nello sviluppo di semplice applicazione

    Sapevo che non eri un vero principiante!! "Singleton" non ho ancora il piacere di conoscerlo! Tu che testi stai utilizzando?
  • Re: Consiglio nello sviluppo di semplice applicazione

    Per quanto ne so il singleton è un po' quello che stai cercando di fare tu, ovvero creare un oggetto che contenga dei valori di diverso tipo richiamabili in diversi controller...

    per quanto riguarda lo studio, ho fatto un corso a pagamento che mi ha dato delle basi, poi girando su internet per risolvere i singoli problemi che mi capitano nel realizzare la prima app sto imparando cose nuove... ma penso di essere tra il 5 e il 10% di quello che c'è da sapere...
  • Re: Consiglio nello sviluppo di semplice applicazione

    Nella vostra discussione, un po' arzigogolata (ma essendo alle prime armi, non potrebbe essere altrimenti) ho notato una debolezza concettuale di base:

    voi parlate di 'manoUmana' e 'manoComputer' (ed altri esempi del genere) come degli oggetti distinti.

    Dal punto di vista della programmazione ad oggetti, questa non e' una gran scelta: porta a diverse problematiche di modellazione, abbastanza complicate da descivere in un singolo post. Inoltre mescola concetti che non hanno nulla a che fare tra di loro:

    1) i giocatori (umano, computer)
    2) i valori giocati (mano, ...)
    3) la parte visiva e di interazione con la tastiera o l'interfaccia utente)



    Vi propongo un diverso approccio:

    vi serve una 'classe' 'giocatore', quindi due 'istanze' di tale classe: una per il giocatore 1 (l'essere umano, ma non necessariamente ) ed una per il giocatore 2 (il computer ?)

    la classe 'giocatore' avra' il metodo 'gioco()' che ritorna 'sasso', 'forbice', 'carta' (oppure 0,1,2)

    ora vi serve una classe 'arbitro' e la relativa 'istanza' (una sola).

    La classe 'arbitro' che cosa fa?

    1) chiede chi sono i due giocatori
    2) decide quando iniziare la partita e quanto deve essere lunga (n di giocate)
    3.1) chiede al primo giocatore di giocare (chiama il metodo 'gioco()' del primo giocatore)
    3.2) chiede al secondo giocatore di giocare (chiama il metodo 'gioco()' del secondo giocatore)
    3.3) confronta le giocate e decide il vincitore
    4) mostra l'andamento della partita

    Ovviamente esistera' un'unico arbitro, quindi un 'singleton' (e 'design pattern' )

    Ed ora la parte un pochino piu' complicata.

    La classe 'giocatore' e' generica, nel senso che non e' suo compito sapere come varra' fatta la giocata
    (come sara' 'implementato' il metodo 'gioco()')

    In questo caso ci sono due tipi di 'giocatori':

    1) il 'giocatore' 'umano' (classe 'giocatoreUmano') in cui il metodo 'gioco()' viene implementato leggendo la giocata da tastiera o mediante un pulsante
    2) il 'giocatore' 'computer' (classe 'giocatoreComputer') in cui il metodo 'gioco()' viene implementato mediante un generatore di numeri casuali che ritorna 0,1 o 2

    La classe 'giocatoreUmano' e 'giocatoreComputer' sono delle 'sottoclassi' di 'giocatore'.

    La classe 'arbitro' non ha nessuna necessita' di sapere come sono fatti i due giocatori !

    Ed infatti, potreste inventare anche il 'giocatoreCostante' (sempre sottoclasse di 'giocatore') in cui il metodo 'gioco()' ritorna SEMPRE la stessa giocata (se ci pensate un po', non vi sevono 3 classi distinte, cioe' una per 'sasso', una per 'forbice' ed una per 'carta')



    Nota: questo gioco ha una proprieta' molto particolare
    Le regole del gioco dicono che:

    a) sasso vince su forbice
    b) forbice vince su carta
    c) carta vince su sasso

    supponendo di rappresentare i tre elementi con dei numeri, con la regola che:

    A vince su B se A e' maggiore di B

    allora vi trovate in una situazione IMPOSSIBILE DA RAPPRESENTARE CON I NUMERI: partiamo con 'sasso' rappresentato dal numero 2, cosi' da partire dalla regola a)

    sasso -> 2
    forbice -> 1
    carta -> 0

    con questa assegnazione di valori, risolvete le regole a) e b), ma non la c) (0 NON E' MAGGIORE DI 2)

    Il problema e' evidentemente la 'circolarita' ' delle vincite che non e' rappresentabile con i numeri interi.
    Quindi lo switch e' l'unica soluzione possibile.


    Nota: piu' che il 5/10%, direi lo 0.00005/0.00010% .

    Ma finche' non si trova il modo di 'nascere imparati' o acquisire la conoscenza mediante iniezione per endovena, l'unico modo per imparare e': studiare/fare/sbagliare/studiare/fare/sbagliare/...

    In modo 'circolare', come per il gioco
  • Re: Consiglio nello sviluppo di semplice applicazione

    Grazie Migliorabile per l'esauriente risposta!
    L'Objective-C mi sembra così complesso e ampio che credo non lo imparerò mai e alla fine cederò... ci sono così tante sfumature che immagino sarà impossibile (per me), "programmare" senza far mai ricorso ad un manuale!!! Qui è questione di logica, fantasia e razionalizzazione insieme, prima ancora di conoscere il linguaggio in se!

    Per ora però ... ci provo!
  • Re: Consiglio nello sviluppo di semplice applicazione

    Assioma: non si impara a programmare solo con qualche tutorial pescato qua e la su internet.
    Chi pensa di riuscirci o e' un genio o uno sciocco.

    Per gli altri, servono i cari, obsoleti, inutili libri.
  • Re: Consiglio nello sviluppo di semplice applicazione

    Naturalmente, tuttavia con un libro non ci puoi parlare. Un forum è a mio avviso un validissimo apporto. Ho svariati testi in formato digitale, da quelli free a quelli a pagamento e tuttavia la questione è sempre complicata, almeno per me!
Devi accedere o registrarti per scrivere nel forum
11 risposte