Homework 4 - Formula1 - (uso di record allocati dinamicamente)

Vedi anche: PacMan, DomandeHomework4, SoluzioneHomework4, RisultatiHomework4.



ATTENZIONE: ho semplificato leggermente il gioco completando alcuni punti che erano rimasti oscuri:

  • il controllo di arrivo al traguardo é piú semplice
  • e' necessario controllare se la macchinina, ormai a velocita' "warp 4", salta fori dalla martice e si perde nell'iperspazio smile
  • ho spostato del codice utile da PacMan a pista.h (leggiMossa e delta)
    • I file 'pista.h' usati nei test conterranno anche leggiMossa e delta (non li copiate nel vostro programma sennò non compila)

Obiettivo del gioco

Dovrete implementare una corsa di Formula1.

Sarà utile vedere in classe l'implementazione di un rozzo PacMan ...

Descrizione

Il programma deve descrivere l'andamento di N macchinine su una pista.
  • ciascuna macchinina è rappresentata sullo schermo da un carattere ascii alfabetico maiuscolo (A-Z)
  • il numero N è preso dall'input, seguito dalle coordinate x ed y del punto da cui tutte la macchinine partono
  • segue nell'input una successione di N maiuscole, una per ciascuna macchinina, che ne indicano il 'nome'.
    • ciascuno dei caratteri è il carattere che verrà usato per mostrare la corrispondente macchinina sulla pista.
    • piu' macchinine possono avere lo stesso carattere (pensiamo al carattere come se fosse il nome della "scuderia")
  • la forma della pista è definita in un file "pista.h" che definisce la variabile therace (vettore di stringhe)
    • nei miei test io userò sia il file in attachment che altri file da me generati
    • non dovete consegnare pista.h ma SOLO il vostro codice
    • esempio del file pista.h
    • notate che per come il file pista.h è scritto, la coordinata y cresce per indici di riga decrescenti
    • per sapere il numero di righe usate accortamente la funzione sizeof
    • per sapere il numero di colonne contate il numero di caratteri di una riga (con strlen)
    • tutte le righe sono della stessa lunghezza
    • in "pista.h" sono presenti anche le definizioni delle funzioni di PacMan che, identiche, vanno bene per questo esercizio (se non lo facessi rischierei di considerarvi "copioni" perche' usate tutti del codice preso da me)
      • delta: la matrice degli incrementi
      • leggiMossa: la funzione per leggere un carattere tra 1-9 e 'q'
  • ogni macchinina ha associate le seguenti informazioni (usate una struct per definire ogni macchinina)
    • coordinata x
    • coordinata y
    • velocità in direzione x: deltax
    • velocità in direzione y: deltay
    • carattere associato alla macchinina
    • se la macchinina ha sbattuto

Cosa fa il programma

  • dopo aver letto N, le coordinate x,y della partenza ed i N caratteri maiuscoli delle macchinine
  • alloca le struct per le macchinine ( usate la funzione malloc )
  • il programma cicla eseguendo le seguenti operazioni:
    • mostra la situazione della pista con la posizione delle macchinine
      • se una macchinina ha sbattuto non va mostrata
        • una macchinina ha sbattuto se alle coordinate in cui essa si trova c'é un carattere '#' (cancelletto)
        • una macchinina potrebbe finire fuori dalla matrice, in questo caso la macchinina ha sbattuto
        • (i due controlli precedenti sono sufficienti a gestire i casi in cui si é scelta una posizione iniziale delle macchinine in mezzo ad un muro o fuori dalla matrice)
      • se più macchinine occupano la stessa posizione si mostri solo il carattere dell'ultima che sta in quella posizione
    • legge per ogni macchinina rimasta in gioco un carattere tra 1 e 9 che indica in che direzione variano le sue velocità (vedi dopo) oppure il carattere 'q' che indica che si vuol smettere di giocare.
      • qualsiasi altro carattere viene ignorato
      • le velocità variano solo di -1,0 o 1 unità
        • ad esempio da velocità deltax=7 si può passare a velocità deltax=6,7,8
      • si usano i caratteri da 1 a 9 del tastierino numerico per indicare le direzioni
        • es. '8' corrisponde a incrementare di 1 deltay e lasciare deltax invariato
        • es. '3' corrisponde a decrementare di 1 deltay e incrementare di 1 deltax
        • es. '5' corrisponde a lasciare invariate sia deltax che deltay
    • aggiorna la posizione di ciascuna macchinina, essa si muove:
      • in direzione x di una quantità pari alla velocità deltax
      • in direzione y di una quantità pari alla velocità deltay
    • versione normale controlla se macchinina é finita in un muro o é uscita dalla matrice
    • versione opzionale controlla se la diagonale percorsa dalla macchinina urta un muro
      • se la macchinina ha urtato un muro essa non gioca più e scompare dal gioco
      • due macchinine possono occupare lo stesso carattere senza urtare tra loro
      • vedi dopo per come controllare le diagonali
    • controlla se la macchina ha vinto
      • versione opzionale la macchinina ha transitato su un carattere '|'(pipe) o '@'
      • versione normale il carattere sul quale la macchinina é giunta é il carattere '@' (gomme che assorbono l'urto) o '|' (traguardo)
        • ho fatto questa modifica (piú semplice) perché il compito di controllare se la macchinina ha transitato sul carattere '|' avrebbe la stessa difficoltá del controllare se si transita in un muro

Uscita

Il programma termina:
  • se tutte le macchinine hanno sbattuto
  • se una macchinina ha vinto
  • se si preme il carattere 'q' (q minuscola)

Versione opzionale

Chi desidera, esegua il controllo che non ci sia muro in nessuna delle caselle della diagonale percorsa dalla macchinina nel passare dalla posizione (x,y) alla posizione (x---+deltax,y+deltay).
  • per controllare le diagonali esistono due casi, a seconda che sia maggiore l'incremento deltax (oppure deltay) in valore assoluto
    • per tutte le colonne (righe) corrispondenti all'incremento maggiore in valore assoluto
      • si calcoli l'ascissa y (ordinata x) della retta, arrotondando all'intero inferiore cioè verso lo zero (come fa la divisione intera)
      • se la posizione corrispondente è un muro (il carattere '#') la macchina ha sbattuto
      • se la posizione corrispondente è il traguardo (il carattere '|' o '@') la macchina ha vinto
  • allo stesso modo, si controlli se la macchinina ha vinto (uno dei carattri in cui passa la diagonale é '|' oppure '@'
Potete trovare altri commenti su questo argomento su DomandeHomework4.

Esempi

La pista è definita come un array di stringhe tutte della stessa lunghezza in cui il carattere ' ' (spazio) indica pista libera, il carattere '#' (cancelletto) indica muro, il carattere '|' (pipe) indica il traguardo ed il carattere '@' indica la zona del traguardo 'morbido' per la versione 'normale'.

Trovate in pista.h un esempio di percorso.

NOTA: nel file ci sono anche le definizioni di delta e leggiMossa. Non copiatele nel vostro file altrimenti il vostro prog non passerà i test per errore di compilazione.

In attachment ho messo i due file 100.in e 100.out. Il secondo l'ho ottenuto usando il file pista.h e 100.in come segue:

./Formula1 < 100.in > 100.out

Esempio di input/output

(scritto a mano)
  • notate che nell'esempio qua sotto ho inserito degli accapo (ad esempio dopo i caratteri 369) che sono necessari quando si usa il programma da tastiera per il fatto che l'input e' bufferizzato e quindi il programma non li puo' leggere finche' non si e' battuto un accapo.
  • questo non influisce sul funzionamento, ne' sull'output del programma, dato che tutti i caratteri diversi da 1-9 e 'q' vengono ignorati (per essere più precisi: "devono essere ignorati dal vostro programma").
  • quindi potete ottenere un esempio del solo output del programma prendento il testo qua sotto e togliendo tutte le righe rosse (rimangono solo le righe formate da cancelletti spazi e macchinine che rappresentano lo stato del gioco)
  • se preferite che i caratteri vengano letti dall'input mano a mano che li inserite potete usare la funzione setvbuf per eliminare la bufferizzazione dello stream stdin.
3 37 8
ABC
################################################################################
######################                 #########################################
###########                            ##########                 ##############
########                                    #####                 ##############
########                                    #                     ##############
########                    ####                                        ########
##                  ############                         ###            ########
##           ###########################                 ###               #####
##           ###########################            ########               #####
###          ##################################################            #####
###          ##################################################            #####
###            ################################################            #####
###            ################################################               ##
####           ###################################################            ##
#####          #################@@@@|      ########################           ##
#####           ############@@@@@@@@|             #################           ##
#####            ########    @@@@@@@|C             ################           ##
######                        @@@@@@|                                         ##
#######                        @@@@#####                                      ##
########                         ##########                               ######
########                         ##########                               ######
#########                        ##############                       ##########
###############################################                  ###############
################################################################################
################################################################################
369
################################################################################
######################                 #########################################
###########                            ##########                 ##############
########                                    #####                 ##############
########                                    #                     ##############
########                    ####                                        ########
##                  ############                         ###            ########
##           ###########################                 ###               #####
##           ###########################            ########               #####
###          ##################################################            #####
###          ##################################################            #####
###            ################################################            #####
###            ################################################               ##
####           ###################################################            ##
#####          #################@@@@|      ########################           ##
#####           ############@@@@@@@@| C           #################           ##
#####            ########    @@@@@@@| B            ################           ##
######                        @@@@@@| A                                       ##
#######                        @@@@#####                                      ##
########                         ##########                               ######
########                         ##########                               ######
#########                        ##############                       ##########
###############################################                  ###############
################################################################################
################################################################################
369
################################################################################
######################                 #########################################

###########                            ##########                 ##############
########                                    #####                 ##############
########                                    #                     ##############
########                    ####                                        ########
##                  ############                         ###            ########
##           ###########################                 ###               #####
##           ###########################            ########               #####
###          ##################################################            #####
###          ##################################################            #####
###            ################################################            #####
###            ################################################               ##
####           ###################################################            ##
#####          #################@@@@|      ########################           ##
#####           ############@@@@@@@@|             #################           ##
#####            ########    @@@@@@@|   B          ################           ##
######                        @@@@@@|                                         ##
#######                        @@@@#####                                      ##
########                         ##########                               ######
########                         ##########                               ######
#########                        ##############                       ##########
###############################################                  ###############
################################################################################
################################################################################
6
################################################################################
######################                 #########################################
###########                            ##########                 ##############
########                                    #####                 ##############
########                                    #                     ##############
########                    ####                                        ########
##                  ############                         ###            ########
##           ###########################                 ###               #####
##           ###########################            ########               #####
###          ##################################################            #####
###          ##################################################            #####
###            ################################################            #####
###            ################################################               ##
####           ###################################################            ##
#####          #################@@@@|      ########################           ##
#####           ############@@@@@@@@|             #################           ##
#####            ########    @@@@@@@|      B       ################           ##
######                        @@@@@@|                                         ##
#######                        @@@@#####                                      ##
########                         ##########                               ######
########                         ##########                               ######
#########                        ##############                       ##########
###############################################                  ###############
################################################################################
################################################################################
... va avanti così leggendo un carattere e spostando solo B ...

Scadenza

L'esercizio va consegnato entro le 24 di lunedì 1 dicembre.

Consegna degli esercizi

  • Attenzione: viste numerose richieste, ho deciso di prorogare la scadenza dell'homework 4 a mercoledì 22 dicembre sempre alle 23:59.
  • La scadenza dell'Homework 5 è stata (ri)fissatta per venerdì 14 gennaio 2005 sempre alle 23:59.
  • Dovete essere iscritti a twiki
  • Dovete aver mostrato un documento di identità a Ivano Salvo (oppure mandatemene una scansione per email)
  • Vi devo aver abilitato (controllate in StudentiProg1Group o ArchitettureUnoGroup )
  • Gli esercizi vanno consegnati esclusivamente usando la pagina di consegna: ATTENZIONE in questo momento sono attive due pagine, una per l'homework 4 e una per l'homework 5.
Evitate di fare confusione!

    • Io registro/abilito nuovi iscritti e aggiorno password solo fino al venerdì sera
    • quindi fate una prova durante la settimana per controllare che tutto vi funzioni!
  • Non verranno accettati esercizi consegnati per email
  • Ora sono le 17:10

-- AndreaSterbini - 04 Nov 2003

Topic attachments
I AttachmentSorted descending History Action Size Date Who Comment
Header fileh pista.h r4 r3 r2 r1 manage 3.0 K 2003-11-21 - 13:47 AndreaSterbini Esempio di pista (aggiornato)
Unknown file formatout 100.out r1 manage 29.7 K 2003-11-22 - 23:01 AndreaSterbini Esempio di output con 100 macchinine
Unknown file formatin 100.in r1 manage 10.0 K 2003-11-22 - 23:00 AndreaSterbini Esempio di input con 100 macchinine

This topic: Programmazione1/AA0506/PZ > HomeWork4
Topic revision: r52 - 2003-12-02 - AndreaSterbini
 
This site is powered by the TWiki collaboration platform Powered by PerlCopyright © 2008-2024 by the contributing authors. All material on this collaboration platform is the property of the contributing authors.
Ideas, requests, problems regarding TWiki? Send feedback