[C] Problemi con la creazione di un videogame banalissimo

di il
10 risposte

[C] Problemi con la creazione di un videogame banalissimo

Salve a tutti!
Vi dico subito che sono nuovo di questo forum e che non sono ancora praticissimo di programmazione,
in particolare di C sotto Linux. Volevo realizzare il seguente programmino per realizzare un videogame elementare in cui, ad intervalli di tempo casuali, compaiono icone aventi come titolo lettere casuali. Un’icona viene poi eliminata battendo la corrispondente lettera sulla tastiera. Il gioco termina se sullo schermo compaiono 10 icone.
Questo è quello che ho realizzato ma non funziona proprio benissimo anzi.

#include <stdio.h>
#include <stdlib.h>
#include <signal.h>
#include <sys/wait.h>
#include <sys/types.h>
#include <string.h>
#include <unistd.h>
#include <time.h>

// creo la struttura icone1 che appunto rapprensenta l'icone che vengono create
struct icone1 {
       int ipid;
       int titolo;
};

int main() {


char tasto[20];
int time;
int icone = 0;
char car [20];

int i;
int pid;

// definisco la struttura fin per la creazione delle icone
typedef struct icone1 fin[10];

// in questo ciclo creo le 10 icone che devono apparire sullo schermo
while (icone<10){

       // creo un processo figlio che esegue execlp per la visualizzazione delle icone 
       pid = fork();


       icone++;

       // qui ottengo il tempo casuale passato il quale si genera l'icona
       time = rand() % 10;

       // qui prendo il tempo casuale ottenuto prima e lo trasformo in una stringa che uso   come titolo dell'icona
       sprintf(car,"%i",time);

      // visualizzo praticamente il titolo dell'icona anche se non serve a molto questa cosa
      printf("lettera %s\n", car);

      // qui metto nella struttura il pid del processo creato e il titolo dell'icona
      fin[icone].ipid = pid;
      fin[icone].titolo = car;

       // metto un ritardo generico per dare un pò di tempo al giocatore di premere il tasto giusto ed eliminare un'icona
       sleep(rand() % 15);

       // all'interno del processo figlio creo l'icona tramite xterm
       if (pid==0){
          execlp("xterm","xterm","-iconic", "-n",time,0);
          exit(0);
         }

      // nel processo padre verifico se è stato spinto il tasto giusto ed elimino la         corrispondente icona
      if (pid > 0){
         scanf("%s", tasto);

        for (i=0;i<=icone;i++){

        printf("titolo %s\n", fin[i].titolo);

        if (strcmp(tasto,fin[i].titolo) == 0){

        kill(fin[i].ipid, SIGINT);

        icone--;
       }
    }
   }
  }
}

Allora i punti non chiari sono i seguenti:

- prima di tutto non ho trovato in giro un metodo per creare lettere casuali, quindi ho creato numeri casuali e ho usato quelli come titolo delle icone, ovviamente una schifezza sicuramente! Se qualcuno mi sapesse dire come si fà a generare lettere casuali gliene sarei grato

- altra cosa uso l'opzione -iconic per xterm per fare un'icona ma non me la crea, mi apre sempre una finestrella del nuovo terminale e non mi rimane sul terminale principale da cui ho lanciato il programma, quindi non posso premere la corrispondente lettera(che poi nel mio caso sarebbe un numero) per chiudere la finestrella appena aperta, spero di essermi spiegato

- poi scanf va bene per acquisire il fatidico tasto che dovrebbe chiudere l'icona oppure è meglio fgets o qualche altro comando?

Vi ringrazio moltissimo per la vostra disponibilità spero possiate darmi una mano, e mi scuso ancora per come scrivo codice ma come vi ho detto sto alla prime armi.
Un saluto a tutti!

10 Risposte

  • Re: [C] Problemi con la creazione di un videogame banalissimo

    Per il primo punto puoi generare numeri casuali che vanno da 97 a 122 che sono i ripsettivi codici ascii delle lettere dell'alfabeto (a,b,c.... z).
    Per il terzo punto va bene la scanf(), il secondo punto non l'ho capito.
  • Re: [C] Problemi con la creazione di un videogame banalissimo

    Grazie moltissimo per avermi risposto Overflow.

    Ma quei numeri poi come li converto in lettere? Mi pare ci sia un apposito comando o sbaglio?

    Per quanto riguarda il secondo punto, quello che intendevo è che con xterm normalmente si apre una finestra, cioè un altro terminale.
    Se però ho capito bene con l'opzione -iconic si dovrebbe attivare xterm in forma iconizzata ma non lo fà, dato che mi apre comunque una finestra e non mi appare in forma di icona. Spero di essere stato più chiaro.
    Grazie ancora per la tua disponibilità.
  • Re: [C] Problemi con la creazione di un videogame banalissimo

    Allora una volta generato il numero compreso tra 97 e 122, lo assegni ad una variabile di tipo char.
    Ad esempio
    char car =97;
    printf("%c",car); //stampa la lettera a

    per l'altro quesito: ma la finestra con il parametro -iconic viene avviata ridotta ad icona, non ho capito invece come vuoi che venga visualizzata...
  • Re: [C] Problemi con la creazione di un videogame banalissimo

    Scusami Overflow è che in effetti non riesco a spiegarmi bene.
    Io non voglio visualizzarla in nessun modo. Vorrei solo capire se con iconic mi devo aspettare che mi appaia un'icona sulla barra in fondo alla schermo, come per xp quando si riducono a icone le finestre, perchè a me si apre comunque una finestra come quando apri un normalissimo terminale. Spero ora di aver chiarito un pò.

    Rinvio poi il codice che gli ho dato una sistemata:
    
    #include <stdio.h>
    #include <stdlib.h>
    #include <signal.h>
    #include <sys/wait.h>
    #include <sys/types.h>
    #include <string.h>
    #include <unistd.h>
    #include <time.h>
    
    // creo la struttura icone1 che appunto rappresenta l'icone che vengono create
    struct icone1 {
           int ipid;
           int titolo;
    };
    
    int main() {
    int ritardo;
    char tasto[20];
    int icone = 0;
    char lettera;
    int i;
    int pid;
    
    // definisco la struttura fin per la creazione delle icone
    typedef struct icone1 fin[10];
    
    // in questo ciclo creo le 10 icone che devono apparire sullo schermo
    while (icone<10){
           srand(time(NULL));
           
         // Creo ritardo e lettera prima della fork altrimenti ogni figlio mi stampa tempo e lettera
         // qui ottengo il tempo casuale per creare le icone
           ritardo = rand() % 10;
           printf("ritardo= %d \n", ritardo);
          
          // Creo la lettera
           int l = 97 + rand() % (122 - 97);
           char lettera = l;
           printf("lettera = %c \n", lettera);
    
           // creo un processo figlio che esegue execlp per la visualizzazione delle icone 
           pid = fork();
    
           icone++;
    
          // qui metto nella struttura il pid del processo creato e il titolo dell'icona
          fin[icone].ipid = pid;
          fin[icone].titolo = ;
    
           // metto un ritardo generico per dare un pò di tempo al giocatore di premere il tasto giusto ed eliminare un'icona
           sleep(ritardo);
    
           // all'interno del processo figlio creo l'icona tramite xterm
           if (pid==0){
              execlp("xterm","xterm","-iconic", "-n",lettera,0);
              exit(0);
             }
    
          // nel processo padre verifico se è stato spinto il tasto giusto ed elimino la         corrispondente icona
          if (pid > 0){
             scanf("%s", tasto);
    
            for (i=0;i<=icone;i++){
    
            printf("titolo %s\n", fin[i].titolo);
    
            if (strcmp(tasto,fin[i].titolo) == 0){
    
            kill(fin[i].ipid, SIGINT);
    
            icone--;
           }
        }
       }
      }
    }
    
    Per quanto concerne la lettera ti ringrazio molto ora me la genera, però mi da problemi perchè in fase di compilazione con strcmp non riconosce "lettera", che prima ho messo dentro fin[icone].titolo, come stringa e mi da errore. E comunque se disabilito lo strcmp mi da problemi ancora prima quando tento di aprire un xterm a cui passo sempre "lettera" come titolo e mi sa che non la vede come una stringa e si blocca l'esecuzione e non va più avanti.
    Scusami ancora se sono così rompi scatole ma su alcune cose sono mooooooolto legnoso!!
  • Re: [C] Problemi con la creazione di un videogame banalissimo

    Allora lettera deve essere un array di caratteri, esempio:

    char lettera[2];
    lettera[0]=97;
    lettera[1]='\0';

    in questo modo utilizzi la stringa. Però ho visto che nella struttura hai definito titolo come int quindi va aggiustato.
  • Re: [C] Problemi con la creazione di un videogame banalissimo

    Ti ringrazio per avermi fatto notare la svista.

    Scusa se abuso ancora della tua disponibilità.
    Allora io faccio :
    
    ...
    struct icone1 {
           int ipid;
           char titolo[2];
    };
    
    char lettera[2];
    ...
    
           int l = 97 + rand() % (122 - 97);
           lettera[0] = l;
           lettera[1] = '\0';
           printf("lettera = %c \n", lettera);
    ...
    
           fin[icone].titolo = lettera;
    
    
    
    ma così facendo mi da errore nell'assegnazione fin[icone].titolo = lettera; perchè mi dice "incompatible types in assignment" e comunque prima quando voglio stampare la lettera mi appare il "?".

    Ho fatto varie prove tipo char lettera[0] = l; e altre ma vado sempre peggio.

    Porca miseria ma possibile che non riesca a capire come C gestisca queste assegnazioni!!!
    Sono un pò complicate o sono io che sono una zappa?

    Sempre grazie Overflow!!
  • Re: [C] Problemi con la creazione di un videogame banalissimo

    Lettera definiscilo un array di char, quindi:

    char lettera[2];
    lettera[0]=97 //gli sto passando il codice ascii di a, sarebbe come scrivere 'a'
    lettera[1]='\0' //inserisco il carattere di terminazione della stringa, volendo si puo omettere.

    tu assegnerai a lettera[0] il numero casuale ottenuto (compreso tra 97 e 122). Questo è il modo per gestire lettera come stringa. Ti avevo detto precedentemente che il campo titolo della struttuta è un int, quindi o lo sostituisci con un char, oppure li passi il codice ascii della lettera (lettera[0]).

    Nella printf() però stavolta devi cambiare il carattere che indica il formato:
    printf("%s",lettera); //utilizzi %s

    Spero di essere stato chiaro.
  • Re: [C] Problemi con la creazione di un videogame banalissimo

    Grazie tantissime Overflow ora va tutto!
    Solo che scanf siccome è una funzione bloccante, finchè non premo la lettera corrispondente all'icona creata non me ne crea delle altre.
    Devo risistemare un pò il codice perchè così ovviamente non va bene.
  • Re: [C] Problemi con la creazione di un videogame banalissimo

    Prova ad utilizzare un thread.
  • Re: [C] Problemi con la creazione di un videogame banalissimo

    Purtroppo è un esercizio sui processi quindi con l'uso di fork.

    Ai thread ancora ci devo ancora arrivare
Devi accedere o registrarti per scrivere nel forum
10 risposte