Skocz do zawartości

Zarchiwizowany

Ten temat jest archiwizowany i nie można dodawać nowych odpowiedzi.

wichniar24

Prosta gierka C++ (dla poczatkujacych)

Polecane posty

Jakby ktos nie wiedzial jak cos dziala to pisac - postaram sie wytlumaczyc.

Nowe levele mozna bardzo latwo tworzyc - wystarczy skopiowac cala funkcje gra1() lub gra2() i zmienic kilka zmiennych.

#include <iostream>
#include <conio.h>

using namespace std;

int pozycja_x = 0;
int pozycja_y = 0;
bool koniec = false;
char ruch;
char gracz = 'x';

char mapa[10][10]=        //mapa[y-liczba "wersow"][x-liczba znakow w kazdym wersie]        Przykladowa mapa
{
    ' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',    //y=0
    ' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',    //y=1
    ' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',    //y=2
    ' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',    //y=3
    ' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',    //y=4
    ' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',    //y=5
    ' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',    //y=6
    ' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',    //y=7
    ' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',    //y=8
    ' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',    //y=9
};

char mapa1[10][10]=
{
    ' ' , ' ' , ' ' , '|' , '|' , '-' , '-' , '-' , '-' , '\\' ,
    '|' , '-' , ' ' , '-' , '-' , ' ' , ' ' , '=' , ' ' , '|' ,
    '|' , ' ' , ' ' , ' ' , '|' , ' ' , '=' , ' ' , ' ' , '|' ,
    '|' , ' ' , '-' , ' ' , '|' , '=' , ' ' , ' ' , ' ' , '|' ,
    '|' , ' ' , '|' , ' ' , '|' , '-' , ' ' , ' ' , ' ' , '|' ,
    '|' , ' ' , '|' , ' ' , ' ' , ' ' , ' ' , ' ' , '-' , '|' ,
    '|' , ' ' , '|' , ' ' , ' ' , '|' , ' ' , ' ' , ' ' , '|' ,
    '|' , ' ' , '-' , ' ' , '-' , ' ' , ' ' , '-' , ' ' , '|' ,
    '|' , ' ' , ' ' , ' ' , ' ' , ' ' , '-' , ' ' , ' ' , 'O' ,
    '\\' , '-' , '-' , '-' , '-' , '-' , '-' , '-' , '-' , '/'
};
char mapa2[20][20]=
{
    ' ',' ','-','-','-','-','-','-','-','-','-','-','O','-','-','-','-','-','-','\\',
    '|',' ',' ','=',' ',' ',' ',' ',' ',' ',' ',' ',' ','/','/','/',' ',' ',' ','|',
    '|','=',' ','=',' ',' ','=','=','=','=',' ','/',' ',' ',' ',' ','/',' ',' ','|',
    '|',' ',' ',' ','/',' ',' ',' ',' ',' ','/','/','/',' ','/','/',' ','/',' ','|',
    '|',' ','=',' ','/',' ',' ','=',' ',' ',' ',' ',' ','/',' ',' ','/',' ',' ','|',
    '|',' ','=',' ','/',' ',' ','=','/',' ',' ','=',' ','/',' ',' ','/',' ',' ','|',
    '|',' ','=',' ','/','=','/',' ',' ','/',' ','=','=',' ',' ',' ',' ',' ',' ','|',
    '|',' ','=',' ',' ',' ','=',' ','/',' ',' ','=',' ',' ','/',' ','/',' ','=','|',
    '|',' ','=','/',' ',' ','=','=',' ','=',' ',' ',' ','=',' ','/',' ',' ',' ','|',
    '|',' ',' ','/','/',' ',' ','=',' ','=','=',' ','=',' ','=',' ','=',' ',' ','|',
    '|','=',' ',' ','/','/',' ','=',' ',' ',' ',' ',' ','|','|',' ',' ',' ',' ','|',
    '|','=',' ',' ',' ','/',' ','=','=',' ','|','\\',' ',' ',' ',' ',' ',' ',' ','|',
    '|',' ','=',' ',' ','/',' ',' ','/','|',' ',' ','|',' ',' ','|','=',' ',' ','|',
    '|',' ','=',' ',' ','/','/','/','/',' ',' ','|',' ',' ',' ',' ',' ',' ',' ','|',
    '|',' ',' ','=',' ',' ','|','|',' ',' ','+',' ',' ','|',' ',' ','|','=',' ','|',
    '|','|','|',' ','=',' ',' ','|',' ',' ',' ',' ',' ',' ','=',' ',' ',' ',' ','|',
    '|',' ',' ',' ','|',' ',' ',' ',' ','+',' ','|',' ',' ',' ',' ','=',' ','=','|',
    '|','|','|',' ','|','|','|','+','+',' ','+',' ','|',' ','=','=',' ',' ',' ','|',
    '|',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ','|',' ',' ',' ',' ',' ',' ',' ','|',
    '\\','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','/',
};

void gra1();
void gra2();

//================================================================================

int main()
{
    system("cls");
    int wybor;
    cout<<"       Labirynt      \n\n 1.Start\n 2.Wybierz gracza\n 3.Sterowanie\n 4.Wyjscie\n";
    cin>>wybor;
    switch(wybor)
    {
    case 1: system("cls"); gra1(); break;
    case 2: system("cls"); cout<<"Podaj znak gracza\n"; gracz=_getch(); system ("cls"); main(); break;
    case 3: system("cls"); cout<<"w,s,a,d - poruszanie sie\nq - wyjscie\n\n\
Wcisnij dowolny znak aby powrocic do menu";_getch();main();
    case 4: exit(1);
    default: cout<<"Nie ma takiej opcji";_getch();main();
    }
}

void gra1()
{
    pozycja_x=0;
    pozycja_y=0;
    koniec=false;
    while(!koniec)
    {
        system("cls");
        for(int y=0; y<10; y++)
        {
            for(int x=0; x<10; x++)
            {
                if(x==pozycja_x && y==pozycja_y)
                {
                    cout<<gracz;
                }//if
                else
                {
                    cout<<mapa1[y][x];
                }//else
            }//for
            cout<<"\n";
        }//for
        ruch=_getch();
        switch(ruch)
        {
        case 'a': if(mapa1[pozycja_y][pozycja_x - 1]==' ' || mapa1[pozycja_y][pozycja_x - 1]=='O')\
                      --pozycja_x; break;
        case 'd': if(mapa1[pozycja_y][pozycja_x + 1]==' ' || mapa1[pozycja_y][pozycja_x + 1]=='O')\
                      ++pozycja_x; break;
        case 'w': if(mapa1[pozycja_y - 1][pozycja_x]==' ' || mapa1[pozycja_y - 1][pozycja_x]=='O')\
                      --pozycja_y; break;
        case 's': if(mapa1[pozycja_y + 1][pozycja_x]==' ' || mapa1[pozycja_y + 1][pozycja_x]=='O')\
                      ++pozycja_y; break;
        case 'q': main(); break;
        }//switch
        if(mapa1[pozycja_y][pozycja_x]=='O')
        {
        koniec = true;
        }//if
    }//while
    gra2();
}

void gra2()
{
    pozycja_x=0;
    pozycja_y=0;
    koniec=false;
    while(!koniec)
    {
        system("cls");
        for(int y=0; y<20; y++)
        {
            for(int x=0; x<20; x++)
            {
                if(x==pozycja_x && y==pozycja_y)
                {
                    cout<<gracz;
                }//if
                else
                {
                    cout<<mapa2[y][x];
                }//else
            }//for
            cout<<"\n";
        }//for
        ruch=_getch();
        switch(ruch)
        {
        case 'a': if(mapa2[pozycja_y][pozycja_x - 1]==' ' || mapa2[pozycja_y][pozycja_x - 1]=='O')\
                      --pozycja_x; break;
        case 'd': if(mapa2[pozycja_y][pozycja_x + 1]==' ' || mapa2[pozycja_y][pozycja_x + 1]=='O')\
                      ++pozycja_x; break;
        case 'w': if(mapa2[pozycja_y - 1][pozycja_x]==' ' || mapa2[pozycja_y - 1][pozycja_x]=='O')\
                      --pozycja_y; break;
        case 's': if(mapa2[pozycja_y + 1][pozycja_x]==' ' || mapa2[pozycja_y + 1][pozycja_x]=='O')\
                      ++pozycja_y; break;
        case 'q': main(); break;
        }//switch
        if(mapa2[pozycja_y][pozycja_x]=='O')
        {
        koniec = true;
        }//if
    }//while
    main();
}

Link do komentarza
Udostępnij na innych stronach

wichniar24 -> Proponuję zmienić program tak, że będzie jedna funkcja do gry, niezależna od wielkości labiryntu.

Zamiast przerysowywać cały ekran w czasie gry, mógłbyś aktualizować tylko potrzebne punkty ekranu - metoda gotoxy się przyda:

void gotoxy(int x, int y)
{
COORD c;
c.X = x - 1;
c.Y = y - 1;
SetConsoleCursorPosition (GetStdHandle (STD_OUTPUT_HANDLE), c);

}

Zamiast odwoływać się do systemu, może lepiej napisać własną funkcję czyszczącą konsolę?

void cls()
{
    HANDLE hStdout;
    hStdout = GetStdHandle(STD_OUTPUT_HANDLE);
    COORD coordScreen = { 0, 0 };     // home for the cursor
    DWORD cCharsWritten;
    CONSOLE_SCREEN_BUFFER_INFO csbi;
    DWORD dwConSize;

// Get the number of character cells in the current buffer.

    if( !GetConsoleScreenBufferInfo( hStdout, &csbi ))
        return;
    dwConSize = csbi.dwSize.X * csbi.dwSize.Y;

    // Fill the entire screen with blanks.

    if( !FillConsoleOutputCharacter( hStdout, (TCHAR) ' ',
        dwConSize, coordScreen, &cCharsWritten ))
        return;

    // Get the current text attribute.

    if( !GetConsoleScreenBufferInfo( hStdout, &csbi ))
        return;

    // Set the buffer's attributes accordingly.

    if( !FillConsoleOutputAttribute( hStdout, csbi.wAttributes,
        dwConSize, coordScreen, &cCharsWritten ))
        return;

    // Put the cursor at its home coordinates.

    SetConsoleCursorPosition( hStdout, coordScreen );
}

Obie funkcje wymagają biblioteki windows.h.

PS. Zmienne globalne też są "be" :-)

Link do komentarza
Udostępnij na innych stronach

wies.niak - zmienne globalne moge usunac a co do tych pomyslow wyzej to raczej zaden poczatkujacy ich nie ogarnie ale sprobuje sie tym pobawic

zizou666 -

caly program dziala na zasadzie petli

pozycja_x - pozycja x "gracza"
pozycja_y - pozycja y "gracza"

char ruch;

while(!koniec) - petla wykonuje sie zawsze gdy koniec = 0 / false
{

system("cls"); - czyszczenie calego ekranu (ekran jest wtedy pusty ale program dziala na tyle szybko ze tego nie widac) - dzieje sie to po kazdym ruchu

       for(int y = 0; y<10; y++) - przesuwanie sie po osi y
       {
               for(int x = 0; x<10; x++) - przesuwanie sie po osi x
                {
                        if(y == pozycja_y && x== pozycja_x)   - sprawdzenie czy pozycja gracza zgadza sie z miejscem w ktory teraz jest petla
                        {
                               cout<<gracz;  - jesli tak to rysowany jest znak gracza
                         }//if
                        else
                         {
                           cout<<mapa[y][x];  - w kazdym innym wypadku program wyswietla odpowiednie pole na mapie
                          }//else
                }//for
         cout<<"\n"; - musimy dac znak nowej lini gdy skoncza sie wszystkie x bo inaczej wszystko wyswietlilo by sie jakby w  jednej lini.
        }//for
}//while

To jest wlasciwie wszystko wystarczy jeszcze dodac sterowanie za pomoca funkcji _getch()

ruch=_getch() - wywolanie funkcji getch  - znak jest od razu zapisywany do zmiennej ruch

switch(ruch) - funkcja switch przyjmujaca za argument znak ruch
{
case 'a' : --pozycja_x; break;  - jesli znak ruch to 'a' zmienjszamy pozycje_x o 1
case 'd': ++pozycja_x; break; - jesli znak ruch to 'd' zwiekszamy pozycje_x o 1
case 'w': --pozycja_y;break; - jesli znak ruch to 'w' zmniejszamy pozycje_y o 1
case 's': ++pozycja_y;break; - jesli znak ruch to 's' zwiekszamy pozycje_y o 1
case 'q': main(); break; - powrot do funkcji main

Wyzej dodalem jeszcze sprawdzenie czy pole na ktore chcemy wejsc jes puste lub 'O'
Jesli jest 'O' to koniec = true wiec nasza petla while sie juz wiecej nie wykona i program przechodzi do funkcji gra2();

}

Gra jest wzorowana na tej z youtube - http://www.youtube.com/watch?v=t_hXpIG_k0w

Link do komentarza
Udostępnij na innych stronach

Kolejna gierka tym razem oparta na klasach: (kompilowana w MSVC++ 2008 Express)

Plik main.cpp


#include<conio.h>
#include<windows.h>
#include<stdlib.h>
#include "gra.h"
#include "gracz.h"
#include "beczka.h"

extern int start();

using namespace std;

extern char box [15][15]={
    '/','#','-','-','-','-','-','-','-','-','-','-','-','#','\\',
    '#',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ','#',
    '|',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ','|',
    '|',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ','|',
    '|',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ','|',
    '|',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ','|',
    '|',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ','|',
    '|',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ','|',
    '|',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ','|',
    '|',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ','|',
    '|',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ','|',
    '|',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ','|',
    '|',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ','|',
    '#',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ','#',
    '\\','#','-','-','-','-','-','-','-','-','-','-','-','#','/'};



extern gra *gra1 = new gra;
extern gracz *gracz1 = new gracz;
extern beczka *beczka1 = new beczka;

int main()
{
    gra1->menu();
};
#include<iostream>

Plik gra.h



class gra
{
public:
    int koniec;
    int punkty;
    void wysw_pkt();
    void menu();
    void start();
    gra(void)
    {
        punkty = 0;
        koniec = 0;
    };
};
#pragma once

Plik gra.cpp


#include <iostream>
#include <conio.h>
#include <windows.h>
#include "gra.h"
#include "beczka.h"
#include "gracz.h"

using namespace std;

extern char box[15][15];
extern gra *gra1;
extern beczka *beczka1;
extern gracz *gracz1;

void gra::wysw_pkt()
{
    std::cout<<"  Punkty:"<<gra1->punkty;
};

void gra::menu()
{
    system ( "cls");
    char wybor;
    cout<<"      Interaktywna Plansza \n ---------------------------\n\n 1. Start \n 2. Wybierz znak \
gracza \n 3. Wybierz\ znak beczki \n 4. Wyjscie";
    wybor = _getch();

    switch(wybor)
    {
    case '1': gra::start();break;
    case '2': system( "cls" ); cout<<"Wpisz znak gracza"; gracz1->znak_gracza = _getch(); gra::menu(); break;
    case '3': system( "cls" ); cout<<"Wpisz znak beczki"; beczka1->znak_beczki = _getch(); gra::menu(); break;
    case '4': exit(1);break;
    default: break;
    };
};

void gra::start()
{
    
    if(beczka1->pierw == 0){ beczka1->beczka_losuj();};
while(koniec==0)
{
    system ("cls");
for (int y=0;y<15;y++)
{
    for (int x=0;x<15;x++)
    {
        if(y == gracz1->pozycja_gracza_y && x == gracz1->pozycja_gracza_x) { cout<<gracz1->znak_gracza;}
        else if( y == beczka1->pozycja_beczki_y && x == beczka1->pozycja_beczki_x) {beczka1->beczka_pokaz();
        box[beczka1->pozycja_beczki_y][beczka1->pozycja_beczki_x] = beczka1->znak_beczki;}
        else{cout<<box[y][x];};
    };
    cout<<"\n";
};
wysw_pkt();
cout<<"\n\n Przesun beczke do bramki '#'\n\n w - ruch do gory \n s - ruch w dol \n a - ruch w lewo\
\n d - ruch w prawo \n q - wyjscie do menu";
gracz1->ruch_ = _getch();
gracz1->ruch(gracz1->ruch_);
};
};
#pragma once

Plik gracz.h


{
public:

    char znak_gracza;
    char ruch_;
    int pozycja_gracza_y;
    int pozycja_gracza_x;;

    void ruch(char kk);

gracz(void)
{
    znak_gracza = 'x';
    ruch_ = ' ';
    pozycja_gracza_y = 1;
    pozycja_gracza_x = 1;
};
};
class gracz

Plik gracz.cpp


#include "gracz.h"
#include "gra.h"
#include "beczka.h"

extern char box[15][15];
extern gra *gra1;
extern beczka *beczka1;

void gracz::ruch(char kk)
{
    int bb =0;
    switch(kk)
    {
    case 'a': if(box[pozycja_gracza_y][pozycja_gracza_x - 1] == ' ') {pozycja_gracza_x -= 1;}
              else if(box[pozycja_gracza_y][pozycja_gracza_x - 1] == beczka1->znak_beczki &&
box[pozycja_gracza_y][pozycja_gracza_x - 2] == ' '){beczka1->pozycja_beczki_x -=1;bb=1;}
              else if(box[pozycja_gracza_y][pozycja_gracza_x - 1] == beczka1->znak_beczki &&
box[pozycja_gracza_y][pozycja_gracza_x - 2] == '#'){gra1->punkty += 1;beczka1->skasuj_beczke();
gra1->start();}
              break;
    case 'd': if(box[pozycja_gracza_y][pozycja_gracza_x + 1] == ' ') {pozycja_gracza_x += 1;}
              else if(box[pozycja_gracza_y][pozycja_gracza_x + 1] == beczka1->znak_beczki &&
box[pozycja_gracza_y][pozycja_gracza_x + 2] == ' '){beczka1->pozycja_beczki_x +=1;bb=1;}
              else if(box[pozycja_gracza_y][pozycja_gracza_x + 1] == beczka1->znak_beczki &&
box[pozycja_gracza_y][pozycja_gracza_x + 2] == '#'){gra1->punkty += 1;beczka1->skasuj_beczke();
gra1->start();}
              break;
    case 'w': if(box[pozycja_gracza_y - 1][pozycja_gracza_x] == ' ') {pozycja_gracza_y -= 1;}
              else if(box[pozycja_gracza_y - 1][pozycja_gracza_x] == beczka1->znak_beczki &&
box[pozycja_gracza_y - 2][pozycja_gracza_x] == ' '){beczka1->pozycja_beczki_y -=1;bb=1;}
              else if(box[pozycja_gracza_y - 1][pozycja_gracza_x] == beczka1->znak_beczki &&
box[pozycja_gracza_y - 2][pozycja_gracza_x] == '#'){gra1->punkty += 1;beczka1->skasuj_beczke();
gra1->start();}
              break;
    case 's': if(box[pozycja_gracza_y + 1][pozycja_gracza_x] == ' ') {pozycja_gracza_y += 1;}
              else if(box[pozycja_gracza_y + 1][pozycja_gracza_x] == beczka1->znak_beczki &&
box[pozycja_gracza_y + 2][pozycja_gracza_x] == ' '){beczka1->pozycja_beczki_y +=1;bb=1;}
              else if(box[pozycja_gracza_y + 1][pozycja_gracza_x] == beczka1->znak_beczki &&
box[pozycja_gracza_y + 2][pozycja_gracza_x] == '#'){gra1->punkty += 1;beczka1->skasuj_beczke();
gra1->start();}
              break;
    case 'q': gra1->menu();break;
    default: break;
    };
    if(bb==1)
    {
    if(beczka1->pierw == 1) { beczka1->pierw = 0;}
    else if(beczka1->pierw == 0)
    {
        if(kk == 'a')
        {
            beczka1->s_poz_becz_y = beczka1->pozycja_beczki_y;
            beczka1->s_poz_becz_x = beczka1->pozycja_beczki_x + 1;
        }
        else if (kk == 'd')
        {
            beczka1->s_poz_becz_y = beczka1->pozycja_beczki_y;
            beczka1->s_poz_becz_x = beczka1->pozycja_beczki_x - 1;
        }
        else if (kk == 'w')
        {
            beczka1->s_poz_becz_y = beczka1->pozycja_beczki_y + 1;
            beczka1->s_poz_becz_x = beczka1->pozycja_beczki_x;
        }
        else if (kk == 's')
        {
            beczka1->s_poz_becz_y = beczka1->pozycja_beczki_y - 1;
            beczka1->s_poz_becz_x = beczka1->pozycja_beczki_x;
        };
    };
    beczka1->beczka_box();
    };
};
#include <iostream>

Plik beczka.h


#include <stdlib.h>
#include <ctime>
#include <string.h>

class beczka
{
public:
    void beczka_box();
    void beczka_pokaz();
    void beczka_losuj();
    void skasuj_beczke();
    char znak_beczki;
    int pierw;
    int s_poz_becz_y;
    int s_poz_becz_x;
    int pozycja_beczki_y;
    int pozycja_beczki_x;
    beczka(void)
    {
        srand(static_cast<unsigned> (time(0)));
        pierw=1;
        znak_beczki = 'O';
        pozycja_beczki_y = rand() % 13 + 1;
        pozycja_beczki_x = rand() % 13 + 1;
        s_poz_becz_y = pozycja_beczki_y;
        s_poz_becz_x = pozycja_beczki_x;
    };
};
#pragma once

Plik beczka.cpp


#include "gra.h"
#include <iostream>
#include <conio.h>

extern char box[15][15];
extern beczka *beczka1;


void beczka::beczka_pokaz()
{
    std::cout<<znak_beczki;
};

void beczka::beczka_losuj()
{
        pozycja_beczki_y = rand() % 13 + 1;
        pozycja_beczki_x = rand() % 13 + 1;
        s_poz_becz_y = pozycja_beczki_y;
        s_poz_becz_x = pozycja_beczki_x;
};

void beczka::skasuj_beczke()
{
    box[pozycja_beczki_y][pozycja_beczki_x] = ' ';
    pozycja_beczki_y = 1;
    pozycja_beczki_x = 1;
    s_poz_becz_y = pozycja_beczki_y;
    s_poz_becz_x = pozycja_beczki_x;
};

void beczka::beczka_box()
{
box[s_poz_becz_y][s_poz_becz_x] = ' ';
};
#include "beczka.h"

Wszelkie rady mile widziane ;P

I przy okazji pytanie : Dlaczego nie moge inicjalizować tablicy w konstruktorze klasy ? Przykład :


    {
        char tabl[3][3];
        tablica()//konstruktor
        {
            tabl = { 'a','a','a','a','a','a','a','a','a',}
        };
    };
class tablica

Link do komentarza
Udostępnij na innych stronach



  • Kto przegląda   0 użytkowników

    • Brak zalogowanych użytkowników przeglądających tę stronę.
×
×
  • Utwórz nowe...