Pagina 1 di 2 1 2 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 11
  1. #1

    [c] Problemi nel creare un videogame stupido

    Salve a tutti! Prima di tutto vi dico che sono nuovo ed è la prima volta che scrivo in un forum quindi vogliate scusarmi se sbaglierò qualcosa.
    Dunque il mio problema è che non sono ancora praticissimo di C sotto Linux e 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>

    struct icone1 {
    int ipid;
    int titolo;
    };

    int main() {

    char tasto[20];
    int time;
    int icone = 0;
    char car [20];
    printf("tempo %d\n", time);
    int i;
    int pid;

    typedef struct icone1 fin;
    fin finestre[10];

    while (icone<10){

    pid = fork();
    icone++;
    time = rand() % 10;
    sprintf(car,"%i",time);

    printf("lettera %s\n", car);
    finestre[icone].ipid = pid;
    finestre[icone].titolo = time;
    sleep(rand() % 15);

    if (pid==0){
    execlp("xterm","xterm","-iconic", "-n",time,0);
    exit(0);
    }

    if (pid > 0){
    scanf("%s", tasto);
    for (i=0;i<=icone;i++){
    printf("titolo %s\n", finestre[i].titolo);
    if (strcmp(tasto,finestre[i].titolo) == 0){
    kill(finestre[i].ipid, SIGINT);
    icone--;
    }
    }
    }
    }
    }

    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!
    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.
    Poi non capisco bene perchè quando faccio l'assegnazione finestre[icone].ipid = pid; e finestre[icone].titolo = time; mi da un errore perchè praticamente se ho capito bene non corrispondono i tipi.
    E poi scanf va bene per acquisire il fatidico tasto che dovrebbe chiudere l'icona oppure è meglio fgets o qualche altro comando?
    Ringrazio tutti quelli che mi aiuteranno per la pazienza dimostrata, e mi scuso ancora per come scrivo codice ma come vi ho detto sto alla prime armi.
    Un saluto a tutti!

  2. #2

  3. #3
    Grazie menphisx per la risposta.
    Però come ho scritto non praticissimo di C potresti essere un pò più preciso per favore?
    Grazie moltissime e scusa la mia ignoranza!
    E poi per creare le lettere casuali come faccio?

  4. #4
    La mia "richiesta", col C non ha niente a che fare, riguarda le regole del forum ed una misteriosa tecnica di programmazione chiamata indentazione


  5. #5
    Ecco qua! Scusa menphisx spero di aver capito cosa intendessi spero che così vada un pò meglio.
    Comunque mi sono accorto che nell'assegnazione di fin[icone].titolo = car; avevo messo time invece di car.

    codice:
    #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;
    fin finestre[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--;
           }
        }
       }
      }
    }

  6. #6

  7. #7
    Grazie per la risposta menphisx.

    Scusa se ti rompo ancora ma invece per quanto riguarda la creazione di lettere casuali come potrei fare? Perchè ho provato a convertire i numeri casuali creati in lettere tipo con
    char c = (char)time ma non funziona proprio.

    Poi con l'opzione -iconic di xterm non mi appare l'icona ma proprio la finestra del terminale, deve fare proprio così perchè ho mal interpretato il comando o sbaglio o non funziona questa opzione?

    Grazie ancora!

  8. #8
    Per creare una lettera casuale, prova con:
    codice:
    lettera = 'a' + rand() % ('z' - 'a')

  9. #9
    Ho provato come mi hai consigliato tu ma mi genera sempre numeri casuali tipo 121, 114 etc.. e li vede come numeri e non come char o string.
    Ma non capisco possibile sia così difficile generare lettere casuali!!

    Che dovrei fare un array con tutte le lettere dell'alfabeto e poi generando numeri casuali andarmi a pescare la lettera corrispondente in quell'array?
    Penso che ci sia una soluzione migliore che dici?

  10. #10
    Certo che ti genera un numero ... è il valore binario rappresentato in decimale della lettera ASCII.
    Un'esempio:
    codice:
    #include <stdio.h>
    #include <stdlib.h>
    #include <time.h>
    
    int main(void){
    
       int i = 0;
    
       srand((unsigned)time(NULL));
    
       for(; i < 10; i++)
          putchar('a' + rand() % ('z' - 'a'));
    
       putchar('\n');
    
       return 0;
    
    }

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2024 vBulletin Solutions, Inc. All rights reserved.