sobota, 5 listopada 2016

Główna mechanika gry

Witam 

Dziś zajmiemy się ostatnią częścią naszej gry czyli klasą engine zacznijmy więc od pliku nagłówkowego
#include "pole.h"
#pragma once

class Engine
{
        //wskaźniki do okna i czcionki które otrzymamy z klasy game 
sf::RenderWindow *window;
sf::Font *font;
        //stworze tekstów odnośnie wyniku gry
sf::Text text;
sf::Text info;

 //stworzenie naszej planszy i planszy przeciwnika
    Pole pole[10][10];
    Pole pole_przec[10][10];


    enum Game{MARK,SHOT,OVER}; //zmienna wskazująca na jakim etapie gry jesteśmy
    Game state;
void update(); //aktualizuje informacje
void draw(); //rysuje wszystkie elementy
int mark=0; //wskazuje ile statków zaznaczyliśmy
void IAmark(); //zaznaczanie statków przez komputer
void IAshot(); //zgadywanie naszych statków przez komputer
int points=0,IApoints=0; //zmiene wskazujące ile statków zestrzeliliśmy


public:


// konstruktor i destruktor
    Engine(sf::RenderWindow &win, sf::Font &fon);
    ~Engine();

    void runEngine(); //główna funkcja obsługująca mechanikę

};

Teraz zajmijmy się plikiem engine.cpp

#include "pole.h"
#pragma once

#include "engine.h"
#include <Windows.h>
#include <cstdlib>
#include <ctime>
#include <cstdio>


using namespace sf;

Engine::Engine(sf::RenderWindow &win, sf::Font &fon)
{
    window = &win;
    font=&fon;

//sformatowanie wyświetlanych tekstów
    text.setFont(*font);
    text.setCharacterSize(240);
    text.setColor(Color::Black);
    info.setFont(*font);
    info.setColor(Color::Black);
    info.setCharacterSize(35);
    info.setString("Press ESC");
    info.setPosition(1280/2-info.getGlobalBounds().width/2,720/2-info.getGlobalBounds().height/2+150);

//ustawienie pozycji pól 
    for(int x=0; x<10; x++)
    {
        for(int y=0; y<10; y++)
        {
            pole[x][y].setPosition(x,y,100,100);
            pole_przec[x][y].setPosition(x,y,680,100);
            pole_przec[x][y].setIA(true);
        }
    }
}


Engine::~Engine()
{
}

void Engine::runEngine()
{
    bool menu=false;
    state=MARK;
    IAmark(); //zaznaczenie statków przez komputer



    while(!menu) //główna pętla aplikacji
    {
//ustawienie informacji o wyniku gry
        if(IApoints>19&&points>19)
        {
            state=OVER;
            text.setString("DRAW");

        }
        else if(IApoints>19)
        {
            state=OVER;
            text.setString("LOSE");
        }
        else if(points>19)
        {
            state=OVER;
            text.setString("WIN");
        }


        Event event;
        Vector2f mouse(Mouse::getPosition(*window)); //pobranie pozycji myszki

        while(window->pollEvent(event));
        {
            if (Keyboard::isKeyPressed(Keyboard::Escape))
//powrót do meny po naciśnięciu ESC
                menu=true; //powrót 

            if (event.type == sf::Event::Closed)
                window->close();

//sprawdzenie dla każdego pola przeciwnika czy jesteśmy na etapie zgadywania statków przeciwnika i czy kliknęliśmy dane pole
    for(int x=0; x<10; x++)
    {
        for(int y=0; y<10; y++)
                {
                    if(pole_przec[x][y].getBounds(mouse)&& state==SHOT && pole_przec[x][y].getShot()==false &&
                            (event.type==Event::MouseButtonReleased && event.key.code ==Mouse::Left ))
                    {
                        pole_przec[x][y].setShot(true)
                        if(pole_przec[x][y].getShip()==false||points>19) //jeśli nie trafiliśmy komputer zaznacza swój statek w przeciwnym razie komputer zgaduje 
                            IAshot();
                        else points++;



                    }
                }
            }

//sprawdzenie dla każdego pola gracza czy jesteśmy na etapie zaznaczania naszych statków i czy kliknęliśmy dane pole
          for(int x=0; x<10; x++)
            {
             for(int y=0; y<10; y++)
                {
                    if(pole[x][y].getBounds(mouse)&& state==MARK && pole[x][y].getShip()==false &&
                            (event.type == Event::MouseButtonReleased && event.key.code== Mouse::Left ))
                    {
                        pole[x][y].setShip(true);
                        mark++;
                        if(mark>=20)
                            state=SHOT;

                    }
                }
            }


        }
//zaktualizowanie danych i narysowanie planszy
        update();
        draw();
    }


}

void Engine::draw()
{

    window->clear(Color::White);
// jeśli gra się nie skończyła rysujemy plansze
    if(state!=OVER
    for(int x=0; x<10; x++)
    {
        for(int y=0; y<10; y++)
            {
                window->draw(pole[x][y]);
                window->draw(pole_przec[x][y]);
            }
        }
//jeśli gra się skończyła wyświetlamy informacje o wyniku gry
    if(state==OVER)
    {
        text.setPosition(1280/2-text.getGlobalBounds().width/2,720/2-text.getGlobalBounds().height/2-100);
        window->draw(text);
        window->draw(info);
    }


    window->display();
}

void Engine::update() //aktualizowanie informacji dla każdego pola
{
    for(int x=0; x<10; x++)
    {
        for(int y=0; y<10; y++)
        {
            pole[x][y].update();
            pole_przec[x][y].update();
        }
    }
}

void Engine::IAmark(
{
    int x,y;
    srand(time(NULL ));
//dwadzieścia razy losujemy pole na którym komputer zaznaczy swój statek jeśli pole było zaznaczone wcześniej losujemy drugi raz
    for(int i=0i<20i++)
    {
        do
        {
            x=rand()%10;
            y=rand()%10;
        }
        while(pole_przec[x][y].getShip()==true);

        pole_przec[x][y].setShip(true);
    }
}

void Engine::IAshot()
{
    int x,y;
    srand(time(NULL ));
//losujemy pole w które komputer będzie strzelał jeśli pole było zaznaczone wcześniej losujemy drugi raz
    do
    {
         x=rand()%10;
         y=rand()%10;
    }
    while(pole[x][y].getShot()==true);

    pole[x][y].setShot(true);
    if(pole[x][y].getShip()==true&&IApoints<20) //jeśli trafił wywołujemy funkcje jeszcze raz
    {
        IApoints++;
        IAshot();
    }
}

Teraz wystarczy w pliku game.h włączyć plik engine.h i skompilować i możemy podziwiać działającą grę.

Podsumowanie 

Dziś wreszcie udało nam się skończyć naszą aplikację okienkową. Kod całej aplikacji możecie znaleźć na moim profilu github. Jak zwykle zachęcam do zadawania pytań i zgłaszania propozycji w komentarzach.

Brak komentarzy:

Prześlij komentarz