Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #ifndef GAME_FIELD_CLASS
- #ifdef SPRITE_CLASS
- #define GAME_FIELD_CLASS
- #ifndef BOX_TYPE_ENUM
- #include "enum_BoxType.h"
- #endif
- #ifndef BOX_DIRECTION_STRUCT
- #include "st_BoxDirection.h"
- #endif
- #ifndef BOX_STRUCT
- #include "st_Box.h"
- #endif
- class GameField {
- private:
- SDL_Surface * screen;
- st_Box box[FIELD_BOX_MAX];
- Sprite * sprite[BOX_SPRITES];
- int rankBoxes[9];
- bool collisionUp(int x, int y);
- bool collisionDown(int x, int y);
- bool collisionLeft(int x, int y);
- bool collisionRight(int x, int y);
- bool collisionUpleft(int x, int y);
- bool collisionUpright(int x, int y);
- bool collisionDownleft(int x, int y);
- bool collisionDownright(int x, int y);
- bool ai_turn;
- bool ai_win;
- bool user_win;
- bool game_tied;
- bool game_end;
- public:
- GameField(SDL_Surface * screen);
- void handleEvents(SDL_Event & event);
- bool userWin(void);
- bool AIWin(void);
- bool gameTied(void);
- bool gameIsOver(void);
- void showWinScreen(void);
- void AICheckMove(void);
- void AIRankBoxes(void);
- void AIMove(void);
- void checkWinner(void);
- void draw(void);
- ~GameField(void);
- };
- GameField::GameField(SDL_Surface * screen) {
- st_SpriteGroup boxes = {"Assets/Spritesheets/boxes.png"};
- int x_pos = 0,
- y_pos = 0;
- // 0, 0 = empty
- // 210, 0 = circle
- // 420, 0 = cross
- for (int s = 0; s < BOX_SPRITES; s++) {
- GameField::sprite[s] = new Sprite(x_pos, y_pos, BOX_SPRITE_WIDTH, BOX_SPRITE_HEIGHT, boxes);
- x_pos += BOX_SPRITE_WIDTH;
- }
- int cols = 0,
- rows = 0;
- for (int b = 0; b < FIELD_BOX_MAX; b++) {
- x_pos = (BOX_SPRITE_WIDTH * cols);
- y_pos = (BOX_SPRITE_HEIGHT * rows);
- GameField::box[b].x = x_pos;
- GameField::box[b].y = y_pos;
- GameField::box[b].points = 8;
- GameField::box[b].type = EMPTY;
- GameField::box[b].d.up = true;
- GameField::box[b].d.down = true;
- GameField::box[b].d.left = true;
- GameField::box[b].d.right = true;
- GameField::box[b].d.upleft = true;
- GameField::box[b].d.upright = true;
- GameField::box[b].d.downleft = true;
- GameField::box[b].d.downright = true;
- if (cols == (FIELD_MAX_COLS - 1)) {
- if (rows == (FIELD_MAX_ROWS - 1))
- rows = 0;
- else
- rows++;
- cols = 0;
- } else {
- cols++;
- }
- }
- GameField::screen = screen;
- srand( SDL_GetTicks() );
- int r = (rand() % 500);
- if (r < 100) {
- GameField::ai_turn = false;
- } else if ((r >= 100 && r < 200) || (r >= 300 && r < 400)) {
- GameField::ai_turn = true;
- } else if ((r >= 200 && r < 300) || (r >= 400 && r < 500)) {
- GameField::ai_turn = false;
- }
- GameField::ai_win = false;
- GameField::user_win = false;
- GameField::game_tied = false;
- GameField::game_end = false;
- }
- GameField::~GameField(void) {
- delete [] GameField::sprite;
- }
- void GameField::handleEvents(SDL_Event & event) {
- int x = 0,
- y = 0;
- int x_pos = 0,
- y_pos = 0;
- int cols = 0,
- rows = 0;
- if (event.type == SDL_MOUSEBUTTONDOWN) {
- if (event.button.button == SDL_BUTTON_LEFT) {
- x = event.button.x;
- y = event.button.y;
- for (int b = 0; b < FIELD_BOX_MAX; b++) {
- x_pos = ((BOX_SPRITE_WIDTH * cols) + BOX_SPRITE_WIDTH);
- y_pos = ((BOX_SPRITE_HEIGHT * rows) + BOX_SPRITE_HEIGHT);
- if (x >= GameField::box[b].x && x <= x_pos) {
- if (y >= GameField::box[b].y && y <= y_pos) {
- if (GameField::box[b].type == EMPTY) {
- GameField::box[b].type = CIRCLE;
- GameField::ai_turn = true;
- }
- break;
- }
- }
- if (cols == (FIELD_MAX_COLS - 1)) {
- if (rows == (FIELD_MAX_ROWS - 1))
- rows = 0;
- else
- rows++;
- cols = 0;
- } else {
- cols++;
- }
- }
- }
- }
- }
- bool GameField::userWin(void) {
- return GameField::user_win;
- }
- bool GameField::AIWin(void) {
- return GameField::ai_win;
- }
- bool GameField::gameTied(void) {
- return GameField::game_tied;
- }
- bool GameField::gameIsOver(void) {
- return GameField::game_end;
- }
- void GameField::showWinScreen(void) {
- SDL_Surface * user = SDL_DisplayFormat( IMG_Load("Assets/user_win.png") );
- SDL_Surface * ai = SDL_DisplayFormat( IMG_Load("Assets/ai_win.png") );
- SDL_Surface * tied = SDL_DisplayFormat( IMG_Load("Assets/game_tied.png") );
- SDL_Rect text_spawn;
- text_spawn.x = 200;
- text_spawn.y = 190;
- if (GameField::user_win == true)
- SDL_BlitSurface(user, NULL, GameField::screen, & text_spawn);
- else if (GameField::ai_win == true)
- SDL_BlitSurface(ai, NULL, GameField::screen, & text_spawn);
- else if (GameField::game_tied == true)
- SDL_BlitSurface(tied, NULL, GameField::screen, & text_spawn);
- SDL_FreeSurface(user);
- SDL_FreeSurface(ai);
- SDL_FreeSurface(tied);
- }
- bool GameField::collisionUp(int x, int y) {
- bool collision = false;
- if (y == 0)
- return true;
- for (int b = 0; b < FIELD_BOX_MAX; b++) {
- if (GameField::box[b].type == CIRCLE || GameField::box[b].type == CROSS) {
- st_Box ne = GameField::box[b];
- if (x == ne.x && (y - BOX_SPRITE_HEIGHT) == ne.y) {
- collision = true;
- break;
- }
- }
- }
- return collision;
- }
- bool GameField::collisionDown(int x, int y) {
- bool collision = false;
- if ((y + BOX_SPRITE_HEIGHT) == SCREEN_HEIGHT)
- return true;
- for (int b = 0; b < FIELD_BOX_MAX; b++) {
- if (GameField::box[b].type == CIRCLE || GameField::box[b].type == CROSS) {
- st_Box ne = GameField::box[b];
- if (x == ne.x && (y + BOX_SPRITE_HEIGHT) == ne.y) {
- collision = true;
- break;
- }
- }
- }
- return collision;
- }
- bool GameField::collisionLeft(int x, int y) {
- bool collision = false;
- if (x == 0)
- return true;
- for (int b = 0; b < FIELD_BOX_MAX; b++) {
- if (GameField::box[b].type == CIRCLE || GameField::box[b].type == CROSS) {
- st_Box ne = GameField::box[b];
- if ((x - BOX_SPRITE_WIDTH) == ne.x && y == ne.y) {
- collision = true;
- break;
- }
- }
- }
- return collision;
- }
- bool GameField::collisionRight(int x, int y) {
- bool collision = false;
- if ((x + BOX_SPRITE_WIDTH) == SCREEN_WIDTH)
- return true;
- for (int b = 0; b < FIELD_BOX_MAX; b++) {
- if (GameField::box[b].type == CIRCLE || GameField::box[b].type == CROSS) {
- st_Box ne = GameField::box[b];
- if ((x + BOX_SPRITE_WIDTH) == ne.x && y == ne.y) {
- collision = true;
- break;
- }
- }
- }
- return collision;
- }
- bool GameField::collisionUpleft(int x, int y) {
- bool collision = false;
- if (x == 0 || y == 0)
- return true;
- for (int b = 0; b < FIELD_BOX_MAX; b++) {
- if (GameField::box[b].type == CIRCLE || GameField::box[b].type == CROSS) {
- st_Box ne = GameField::box[b];
- if ((x - BOX_SPRITE_WIDTH) == ne.x && (y - BOX_SPRITE_HEIGHT) == ne.y) {
- collision = true;
- break;
- }
- }
- }
- return collision;
- }
- bool GameField::collisionUpright(int x, int y) {
- bool collision = false;
- if ((x + BOX_SPRITE_WIDTH) == SCREEN_WIDTH || y == 0)
- return true;
- for (int b = 0; b < FIELD_BOX_MAX; b++) {
- if (GameField::box[b].type == CIRCLE || GameField::box[b].type == CROSS) {
- st_Box ne = GameField::box[b];
- if ((x + BOX_SPRITE_WIDTH) == ne.x && (y - BOX_SPRITE_HEIGHT) == ne.y) {
- collision = true;
- break;
- }
- }
- }
- return collision;
- }
- bool GameField::collisionDownleft(int x, int y) {
- bool collision = false;
- if (x == 0 || (y + BOX_SPRITE_HEIGHT) == SCREEN_HEIGHT)
- return true;
- for (int b = 0; b < FIELD_BOX_MAX; b++) {
- if (GameField::box[b].type == CIRCLE || GameField::box[b].type == CROSS) {
- st_Box ne = GameField::box[b];
- if ((x - BOX_SPRITE_WIDTH) == ne.x && (y + BOX_SPRITE_HEIGHT) == ne.y) {
- collision = true;
- break;
- }
- }
- }
- return collision;
- }
- bool GameField::collisionDownright(int x, int y) {
- bool collision = false;
- if ((x + BOX_SPRITE_WIDTH) == SCREEN_WIDTH || (y + BOX_SPRITE_HEIGHT) == SCREEN_HEIGHT)
- return true;
- for (int b = 0; b < FIELD_BOX_MAX; b++) {
- if (GameField::box[b].type == CIRCLE || GameField::box[b].type == CROSS) {
- st_Box ne = GameField::box[b];
- if ((x + BOX_SPRITE_WIDTH) == ne.x && (y + BOX_SPRITE_HEIGHT) == ne.y) {
- collision = true;
- break;
- }
- }
- }
- return collision;
- }
- void GameField::AICheckMove(void) {
- for (int b = 0; b < FIELD_BOX_MAX; b++) {
- if (GameField::box[b].type == EMPTY) {
- // Up
- if (GameField::collisionUp(GameField::box[b].x, GameField::box[b].y) && GameField::box[b].d.up == true) {
- GameField::box[b].points--;
- GameField::box[b].d.up = false;
- }
- // Down
- if (GameField::collisionDown(GameField::box[b].x, GameField::box[b].y) && GameField::box[b].d.down == true) {
- GameField::box[b].points--;
- GameField::box[b].d.down = false;
- }
- // Left
- if (GameField::collisionLeft(GameField::box[b].x, GameField::box[b].y) && GameField::box[b].d.left == true) {
- GameField::box[b].points--;
- GameField::box[b].d.left = false;
- }
- // Right
- if (GameField::collisionRight(GameField::box[b].x, GameField::box[b].y) && GameField::box[b].d.right == true) {
- GameField::box[b].points--;
- GameField::box[b].d.right = false;
- }
- // Up left
- if (GameField::collisionUpleft(GameField::box[b].x, GameField::box[b].y) && GameField::box[b].d.upleft == true) {
- GameField::box[b].points--;
- GameField::box[b].d.upleft = false;
- }
- // Up right
- if (GameField::collisionUpright(GameField::box[b].x, GameField::box[b].y) && GameField::box[b].d.upright == true) {
- GameField::box[b].points--;
- GameField::box[b].d.upright = false;
- }
- // Down left
- if (GameField::collisionDownleft(GameField::box[b].x, GameField::box[b].y) && GameField::box[b].d.downleft == true) {
- GameField::box[b].points--;
- GameField::box[b].d.downleft = false;
- }
- // Down right
- if (GameField::collisionDownright(GameField::box[b].x, GameField::box[b].y) && GameField::box[b].d.downright == true) {
- GameField::box[b].points--;
- GameField::box[b].d.downright = false;
- }
- }
- }
- }
- void GameField::AIRankBoxes(void) {
- // std::ofstream rankboxes("rankboxes.txt");
- for (int b = 0; b < FIELD_BOX_MAX; b++) {
- if (GameField::box[b].type == EMPTY) {
- GameField::rankBoxes[b] = GameField::box[b].points;
- } else if (GameField::box[b].type == CIRCLE || GameField::box[b].type == CROSS) {
- GameField::rankBoxes[b] = 0;
- }
- }
- // LOG
- // int max_points = 0,
- // box_n = 0;
- //
- // for (int b = 0; b < FIELD_BOX_MAX; b++) {
- // if (GameField::box[b].type == EMPTY) {
- // if (GameField::box[b].points > max_points) {
- // max_points = GameField::box[b].points;
- // box_n = b;
- // }
- // }
- // }
- //
- // rankboxes << max_points << " " << box_n;
- // END LOG
- // rankboxes.close();
- }
- void GameField::AIMove(void) {
- if (GameField::ai_turn == true) {
- int max_points = 0,
- best_box = 0;
- for (int b = 0; b < FIELD_BOX_MAX; b++) {
- if (GameField::box[b].type == EMPTY) {
- if (GameField::box[b].points >= max_points) {
- max_points = GameField::box[b].points;
- best_box = b;
- }
- }
- }
- if (GameField::box[best_box].type == EMPTY) {
- GameField::box[best_box].type = CROSS;
- GameField::ai_turn = false;
- }
- }
- }
- void GameField::checkWinner(void) {
- // int winBoxes[8][3] = {
- // {0, 3, 6},
- // {1, 4, 7},
- // {2, 5, 8},
- // {0, 1, 2},
- // {3, 4, 5},
- // {6, 7, 8},
- // {0, 4, 8},
- // {2, 4, 6}
- // };
- st_Box winBoxes[8][3] = {
- {GameField::box[0], GameField::box[3], GameField::box[6]},
- {GameField::box[1], GameField::box[4], GameField::box[7]},
- {GameField::box[2], GameField::box[5], GameField::box[8]},
- {GameField::box[0], GameField::box[1], GameField::box[2]},
- {GameField::box[3], GameField::box[4], GameField::box[5]},
- {GameField::box[6], GameField::box[7], GameField::box[8]},
- {GameField::box[0], GameField::box[4], GameField::box[8]},
- {GameField::box[2], GameField::box[4], GameField::box[6]}
- };
- for (int w = 0; w < 8; w++) {
- if (winBoxes[w][0].type == CIRCLE && winBoxes[w][1].type == CIRCLE && winBoxes[w][2].type == CIRCLE) {
- GameField::user_win = true;
- break;
- } else if (winBoxes[w][0].type == CROSS && winBoxes[w][1].type == CROSS && winBoxes[w][2].type == CROSS) {
- GameField::ai_win = true;
- break;
- }
- }
- int circle = 0,
- cross = 0,
- empty = 0;
- for (int b = 0; b < FIELD_BOX_MAX; b++) {
- if (GameField::box[b].type == CIRCLE)
- circle++;
- else if (GameField::box[b].type == CROSS)
- cross++;
- else if (GameField::box[b].type == EMPTY)
- empty++;
- }
- if ((circle > cross || cross > circle) && empty == 0)
- if (! GameField::user_win && ! GameField::ai_win)
- GameField::game_tied = true;
- if (GameField::user_win || GameField::ai_win || GameField::game_tied)
- GameField::game_end = true;
- }
- void GameField::draw(void) {
- int x_pos = 0,
- y_pos = 0;
- int cols = 0,
- rows = 0;
- for (int b = 0; b < FIELD_BOX_MAX; b++) {
- x_pos = (BOX_SPRITE_WIDTH * cols);
- y_pos = (BOX_SPRITE_HEIGHT * rows);
- if (GameField::box[b].type == EMPTY) {
- GameField::sprite[0]->draw(x_pos, y_pos, GameField::screen);
- } else if (GameField::box[b].type == CIRCLE) {
- GameField::sprite[1]->draw(x_pos, y_pos, GameField::screen);
- } else if (GameField::box[b].type == CROSS) {
- GameField::sprite[2]->draw(x_pos, y_pos, GameField::screen);
- }
- if (cols == (FIELD_MAX_COLS - 1)) {
- if (rows == (FIELD_MAX_ROWS - 1))
- rows = 0;
- else
- rows++;
- cols = 0;
- } else {
- cols++;
- }
- }
- }
- #endif
- #endif
Add Comment
Please, Sign In to add comment