Consiglio per inizio di un gioco in c++

di il
8 risposte

Consiglio per inizio di un gioco in c++

Buonasera a tutti. Stavo provando a fare per scuola una versione semplice del gioco "Space Invaders" in c++. Il problema è che ogni volta che
l'utente preme il tasto per decidere la in che posizione spostarsi (a destra o a sinistra dell' ultima riga), non ho trovato altro modo che pulire
ogni volta lo schermo con la funzione system("cls"). Questo però quando il programma è in esecuzione si nota(delle parti spariscono per millesimi
di secondo e quindi viene tutto un po' offuscato) in quanto la mappa è formata da un vettore con 1200 caratteri in totale (questo per creare la
mappa di gioco 60 X 20). Quindi la mia domanda è: come potrei fare risolvere il problema?
Grazie in anticipo se qualcuno mi aiuta.
Vi lascio il codice se vi può servire.(Scusate se non è scritto bene).

#include <iostream>
#include <conio.h>
#include <windows.h>
#include <time.h>
#include <string>

/* size struttura --> */ int x = 20, y = 60;
char posti[1200];
int k = 0;


char key = 0; //tasto premuto per posizione oggetto


void struttura(){

int kz = 0; //variabile non più utile
int kx = 0; //variabile non più utile

std::cout << "      sssss    ppppp   aaaaaa    ccccc   eeeee               " << '\n';
std::cout << "    ss         pp  p   a    a   cc       e                   " << '\n';
std::cout << "      sssss    ppppp   aaaaaa   c        eeeee               " << '\n';
std::cout << "           ss  pp      a    a   cc       e                   " << '\n';
std::cout << "      sssss    pp      a    a    ccccc   eeeee               " << '\n';
std::cout << "                                                             " << '\n' << '\n' << '\n';

//sistemazione di variabile posti nella mappa
while(kz < 1200){


  for (kx = 0; kx < 60; ++kx){
    std::cout << posti[kz + kx];
  }
    kz = kz + 60;
    std::cout << '\n';
}

}



int posto_occupato(){
int i = 1081; //indice del posto occupato
int mem = 0;
while (i<=1139){
    if (posti[i] == 'O'){
            mem = i;
    break;
    }
    else
    ++i;
}
return mem;
}





int main(){

while(k<1200){
    if ((k<60) || (k>1140) ){
        posti[k] = '-';
    }
    else if (k>=1){
       if (k % 60 == 0){
        posti[k] = '|';
        posti[k-1] = '|';
    }
        else{
            posti[k] = ' ';
        }
    }

    ++k;
}


/* correzioni alla mappa  --> */ posti[59] = '-'; posti[1140] = '-';

/* posizione iniziale */ posti[1081] = 'O';

struttura();


while (1 != 0){

    int i_occ = 0;
    i_occ = posto_occupato();
    //individuazione posto occupato della prima riga
    key = getch();

   if ((key == 102) && (i_occ <= 1138 )){
    posti[i_occ] = ' ';
    posti[i_occ+ 1] = ' ';
    posti[i_occ + 2] = 'O';
}
    if ((key == 115) && (i_occ >= 1083)){
        posti[i_occ] = ' ';
        posti[i_occ-1] = ' ';
        posti[i_occ-2] = 'O';
    }
    system("cls");
    struttura();
}

return 0;
}

8 Risposte

  • Re: Consiglio per inizio di un gioco in c++

    Mi sa che non ne vieni fuori senza una libreria che si occupi della grafica.
    In tanti usano SDL:

    https://www.libsdl.org
  • Re: Consiglio per inizio di un gioco in c++

    Se si tratta di un progetto da realizzare a scuola, usare le librerie SDL è esagerato... anche perchè si parte da presupposto che a scuola il 90% dei progetti da realizzare, si devono creare in modalità console.

    tornando al codice scritto fino ad ora...

    vorrei capire una cosa...

    la "o" che si trova in basso a SX dovrebbe essere la navicella che spara i proiettili e che teoricamente con le frecce della tastiera dovrebbe spostarsi verso sinistra oppure destra secondo il tasto che si preme ?

    perchè per il momento il codice non fa niente...

    Insomma, inizia a dare almeno una parvenza di movimenti alla navicella verso DX oppure verso SX utilizzando i tasti appropriati cosi almeno parti con il gioco... che poi la soluzione al lampeggio si può sempre trovare, rielaborando tutto...

    Ps. ai miei tempi universitari, con un collega sviluppammo il gioco del centipede in C++ modalità console, e dopo tanto tempo e un duro lavoro che ci tenne svegli molte notti, riuscimmo a risolvere il problema dello sfarfallamento dello schermo per ogni aggiornamento di posizione del centipede...
    Non ricordo come, ma si trova sempre una soluzione a tutto...
  • Re: Consiglio per inizio di un gioco in c++

    ramcrack ha scritto:


    Se si tratta di un progetto da realizzare a scuola, usare le librerie SDL è esagerato... anche perchè si parte da presupposto che a scuola il 90% dei progetti da realizzare, si devono creare in modalità console.

    tornando al codice scritto fino ad ora...

    vorrei capire una cosa...

    la "o" che si trova in basso a SX dovrebbe essere la navicella che spara i proiettili e che teoricamente con le frecce della tastiera dovrebbe spostarsi verso sinistra oppure destra secondo il tasto che si preme ?

    perchè per il momento il codice non fa niente...

    Insomma, inizia a dare almeno una parvenza di movimenti alla navicella verso DX oppure verso SX utilizzando i tasti appropriati cosi almeno parti con il gioco... che poi la soluzione al lampeggio si può sempre trovare, rielaborando tutto...

    Ps. ai miei tempi universitari, con un collega sviluppammo il gioco del centipede in C++ modalità console, e dopo tanto tempo e un duro lavoro che ci tenne svegli molte notti, riuscimmo a risolvere il problema dello sfarfallamento dello schermo per ogni aggiornamento di posizione del centipede...
    Non ricordo come, ma si trova sempre una soluzione a tutto...
    Intanto grazie per aver risposto. Dopo aver provato in diversi modi miei a sistemare questo problema, ho deciso di seguire un metodo che ho scoperto su youtube e che si è rivelato piuttosto comodo. Se vuoi e se hai tempo, mi farebbe piacere inviarti in privato il codice aggiornato e farti un' altra domanda su una cosa che non capisco.
  • Re: Consiglio per inizio di un gioco in c++

    Felice che tu abbia risolto...
    Puoi tranquillamente postare il codice qui, senza usare i PM.

    Il forum esiste anche per questo... se hai trovato la soluzione ad un tuo problema, è buona norma postare la stessa visibile a tutti, questo perchè la si usa come contributo anche per altri che in futuro potrebbero avere il tuo stesso problema.
  • Re: Consiglio per inizio di un gioco in c++

    Ecco il sistema base che ho trovato e applicato con alcune modifiche al mio programma.
    Mi sembra che sia abbastanza valido e semplice ma non me ne intendo tanto.
    
    #include <iostream>
    #include <string>
    #include <conio.h>
    #include <cstdlib>
    #include <stdlib.h>
    #include <windows.h>
    #include <time.h>
    
    void gotoxy(int x, int y){
    COORD coord;
    coord.X = x;
    coord.Y = y;
    SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE),coord);
    }
    
    
    int main(){
    
    int x = 20, y = 40;
    char tasto;
    
    
    while(1 != 0){
    
    tasto = getch();
    
    if (tasto==75) x--;
    if (tasto==77) x++;
    if (tasto==72) y--;
    if (tasto==80) y++;
    
    gotoxy(x,y);std::cout << "+";
    gotoxy(x-1,y);std::cout << " ";
    gotoxy(x+1,y);std::cout << " ";
    gotoxy(x,y-1);std::cout << " ";
    gotoxy(x,y+1);std::cout << " ";
    
    }
    
  • Re: Consiglio per inizio di un gioco in c++

    Non sarebbe una brutta cosa anche limitare gli spostamenti della "navicella" in modo che non superi mai i limiti del "campo di gioco". Per avere dei dati conosciuti e controllabili ci sono altre funzioni della console in Windows che possono tornare utili. Ad esempio, in C (e non in C++) mi son venute in mente queste "regolazioni" (tutte da verificare, perché io ci gioco, col codice, mica ci lavoro):
    #include <windows.h>
    #include <conio.h>
    #include <stdio.h>
    
    #define W_CONSOLE       50
    #define H_CONSOLE       15
    #define CHAR_NAVICELLA  '+'
    
    HANDLE gHndConsole = GetStdHandle( STD_OUTPUT_HANDLE );
    
    void show_console_cursor( bool show ) {
        CONSOLE_CURSOR_INFO ci;
        GetConsoleCursorInfo( gHndConsole, &ci );
        ci.bVisible = show ? TRUE : FALSE;
        SetConsoleCursorInfo( gHndConsole, &ci );
    }
    
    void set_console_size( SHORT wConsole, SHORT hConsole ) {
        COORD dim = { wConsole, hConsole };
        SMALL_RECT sr = { 0, 0, wConsole, hConsole };
        SetConsoleScreenBufferSize( gHndConsole, dim );
        SetConsoleWindowInfo( gHndConsole, TRUE, &sr );
    }
    
    void set_console_color( WORD color ) {
        SetConsoleTextAttribute( gHndConsole, color );
    }
    
    void init_console( SHORT wConsole, SHORT hConsole ) {
        set_console_size( wConsole, hConsole );
        set_console_color( FOREGROUND_GREEN|FOREGROUND_INTENSITY );
        show_console_cursor( false );
    }
    
    void gotoxy( SHORT x, SHORT y ){
        COORD coord = { x, y };
        SetConsoleCursorPosition( gHndConsole, coord );
    }
    
    void show_char_at( SHORT x, SHORT y, char c ) {
        gotoxy(x,y); putchar(c);
        gotoxy(x-1,y); putchar(' ');
        gotoxy(x+1,y); putchar(' ');
        gotoxy(x,y-1); putchar(' ');
        gotoxy(x,y+1); putchar(' ');
    }
    
    int main(){
        SHORT x = W_CONSOLE/2;
        SHORT y = H_CONSOLE-1;
    
        init_console( W_CONSOLE, H_CONSOLE );
        show_char_at( x, y, CHAR_NAVICELLA );
    
        while(1 != 0){
            char tasto = getch();
    
            switch( tasto ) {
                case 75: x = x-1>=0 ? x-1 : x; break;
                case 77: x = x+1<W_CONSOLE ? x+1 : x; break;
                case 72: y = y-1>=0 ? y-1 : y; break;
                case 80: y = y+1<H_CONSOLE ? y+1 : y; break;
                default: ;
            }
    
            show_char_at( x, y, CHAR_NAVICELLA );
        }
    }
    
  • Re: Consiglio per inizio di un gioco in c++

    Grazie! Funziona benissimo in c++ senza alcuna modifica ed è anche molto più carino. Cercherò di capirlo bene per poterlo riutilizzare anche per altri progetti. Se incontrerò altre difficoltà mi farò risentire sempre qui

    AldoBaldo ha scritto:


    Non sarebbe una brutta cosa anche limitare gli spostamenti della "navicella" in modo che non superi mai i limiti del "campo di gioco". Per avere dei dati conosciuti e controllabili ci sono altre funzioni della console in Windows che possono tornare utili. Ad esempio, in C (e non in C++) mi son venute in mente queste "regolazioni" (tutte da verificare, perché io ci gioco, col codice, mica ci lavoro):
    #include <windows.h>
    #include <conio.h>
    #include <stdio.h>
    
    #define W_CONSOLE       50
    #define H_CONSOLE       15
    #define CHAR_NAVICELLA  '+'
    
    HANDLE gHndConsole = GetStdHandle( STD_OUTPUT_HANDLE );
    
    void show_console_cursor( bool show ) {
        CONSOLE_CURSOR_INFO ci;
        GetConsoleCursorInfo( gHndConsole, &ci );
        ci.bVisible = show ? TRUE : FALSE;
        SetConsoleCursorInfo( gHndConsole, &ci );
    }
    
    void set_console_size( SHORT wConsole, SHORT hConsole ) {
        COORD dim = { wConsole, hConsole };
        SMALL_RECT sr = { 0, 0, wConsole, hConsole };
        SetConsoleScreenBufferSize( gHndConsole, dim );
        SetConsoleWindowInfo( gHndConsole, TRUE, &sr );
    }
    
    void set_console_color( WORD color ) {
        SetConsoleTextAttribute( gHndConsole, color );
    }
    
    void init_console( SHORT wConsole, SHORT hConsole ) {
        set_console_size( wConsole, hConsole );
        set_console_color( FOREGROUND_GREEN|FOREGROUND_INTENSITY );
        show_console_cursor( false );
    }
    
    void gotoxy( SHORT x, SHORT y ){
        COORD coord = { x, y };
        SetConsoleCursorPosition( gHndConsole, coord );
    }
    
    void show_char_at( SHORT x, SHORT y, char c ) {
        gotoxy(x,y); putchar(c);
        gotoxy(x-1,y); putchar(' ');
        gotoxy(x+1,y); putchar(' ');
        gotoxy(x,y-1); putchar(' ');
        gotoxy(x,y+1); putchar(' ');
    }
    
    int main(){
        SHORT x = W_CONSOLE/2;
        SHORT y = H_CONSOLE-1;
    
        init_console( W_CONSOLE, H_CONSOLE );
        show_char_at( x, y, CHAR_NAVICELLA );
    
        while(1 != 0){
            char tasto = getch();
    
            switch( tasto ) {
                case 75: x = x-1>=0 ? x-1 : x; break;
                case 77: x = x+1<W_CONSOLE ? x+1 : x; break;
                case 72: y = y-1>=0 ? y-1 : y; break;
                case 80: y = y+1<H_CONSOLE ? y+1 : y; break;
                default: ;
            }
    
            show_char_at( x, y, CHAR_NAVICELLA );
        }
    }
    
  • Re: Consiglio per inizio di un gioco in c++

    Ciao
    Sono nuovo del forum
    Sto creando un gioco su unity e sto cercando una persona possibilmente programmatore che mi aiuti in questa impresa.chi volesse può contattarmi al cosi spiego bene in cosa consiste il gioco
Devi accedere o registrarti per scrivere nel forum
8 risposte