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
//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
//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
//zaktualizowanie danych i narysowanie planszy
update();
draw();
}
}
void Engine::draw()
{
window->clear(Color::White);
// jeśli gra się nie skończyła rysujemy plansze
// 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
//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
//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=0; i<20; i++)
{
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