tictactoe/game/main.cpp

212 lines
5.3 KiB
C++
Raw Permalink Normal View History

2023-04-30 22:22:58 +00:00
#include <iostream>
#include <allegro5/allegro.h>
#include <allegro5/allegro_native_dialog.h>
#include <allegro5/allegro_primitives.h>
#include <allegro5/allegro_image.h>
#include "ai.hpp"
#include "map.hpp"
#include "parse_args.hpp"
#include "version.hpp"
int main(int argc, char **argv)
{
int countKeys = 3;
ra::key ks; // size
ra::key kw; // width/height window
ra::key km; // margin map
ra::key kv; // version
ra::key *keys[countKeys] = {&ks, &kw, &km, &kv};
ra::parse_args(argc, argv, keys);
int size = 3;
int window_wh = 600;
int margin_map = 20;
if (kv.isset)
{
std::cout << "TicTacToe " << version << std::endl;
return 0;
}
if (ks.isset)
{
size = atoi(ks.arguments[0]);
if (size > 10 || size < 3)
size = 3;
}
if (kw.isset)
{
window_wh = atoi(kw.arguments[0]);
if (window_wh > 1000 || window_wh < 300)
window_wh = 600;
}
if (km.isset)
{
margin_map = atoi(km.arguments[0]);
if (margin_map > 100 || size < 20)
margin_map = 20;
}
map *m = init_map(size, window_wh, margin_map);
bool done = false;
bool redraw = true;
bool isdraw = true;
int FPS = 60;
bool move_ai = false;
int mouse_x = 0;
int mouse_y = 0;
ALLEGRO_DISPLAY *display = NULL;
ALLEGRO_EVENT_QUEUE *event_queue = NULL;
ALLEGRO_TIMER *timer = NULL;
ALLEGRO_BITMAP *img_x = NULL;
ALLEGRO_BITMAP *img_o = NULL;
if (!al_init())
{
al_show_native_message_box(NULL, NULL, NULL,
"Не удается инициализировать allegro!", NULL, ALLEGRO_MESSAGEBOX_ERROR);
return (-1);
}
display = al_create_display(window_wh, window_wh);
if(!display)
{
al_show_native_message_box(NULL, NULL, "Ошибка!", "Не удается инициализировать дисплей!", NULL, ALLEGRO_MESSAGEBOX_ERROR);
return (-1);
}
al_init_primitives_addon();
al_install_keyboard();
al_install_mouse();
al_init_image_addon();
img_x = al_load_bitmap("data/x.png");
if(!img_x)
{
al_show_native_message_box(display, NULL, "Ошибка!", "Не удается инициализировать \"x.png\"", NULL, ALLEGRO_MESSAGEBOX_ERROR);
return (-1);
}
img_o = al_load_bitmap("data/o.png");
if(!img_o)
{
al_show_native_message_box(display, NULL, "Ошибка!", "Не удается инициализировать \"o.png\"!", NULL, ALLEGRO_MESSAGEBOX_ERROR);
return (-1);
}
timer = al_create_timer(1.0 / FPS);
event_queue = al_create_event_queue();
if(!event_queue)
{
al_show_native_message_box(display, NULL, "Ошибка!",
"Не удается инициализировать событие!", NULL, ALLEGRO_MESSAGEBOX_ERROR);
return (-1);
}
al_register_event_source(event_queue, al_get_keyboard_event_source());
al_register_event_source(event_queue, al_get_display_event_source(display));
al_register_event_source(event_queue, al_get_timer_event_source(timer));
al_register_event_source(event_queue, al_get_mouse_event_source());
al_start_timer(timer);
while (!done)
{
ALLEGRO_EVENT ev;
al_wait_for_event(event_queue, &ev);
if (ev.type == ALLEGRO_EVENT_KEY_UP)
{
switch (ev.keyboard.keycode)
{
case ALLEGRO_KEY_ESCAPE:
if (exit_game(display))
{
done = true;
continue;
}
al_flush_event_queue(event_queue);
}
}
else if (ev.type == ALLEGRO_EVENT_DISPLAY_CLOSE)
{
if (exit_game(display))
{
done = true;
continue;
}
al_flush_event_queue(event_queue);
}
else if (ev.type == ALLEGRO_EVENT_MOUSE_BUTTON_UP)
{
if (isdraw && enter_cell(m, mouse_x, mouse_y, HUMAN))
{
move_ai = true;
isdraw = false;
}
}
else if (ev.type == ALLEGRO_EVENT_MOUSE_AXES)
{
mouse_x = ev.mouse.x;
mouse_y = ev.mouse.y;
}
else if (ev.type == ALLEGRO_EVENT_TIMER)
{
if (isdraw)
{
if (game_check(m, display))
{
al_flush_event_queue(event_queue);
done = true;
continue;
}
if (move_ai)
{
aiTurn(m);
move_ai = false;
isdraw = false;
}
}
select_cell(m, mouse_x, mouse_y);
redraw = true;
}
if (redraw && al_is_event_queue_empty(event_queue))
{
redraw = false;
isdraw = true;
draw_map(m, img_x, img_o);
al_flip_display();
al_clear_to_color(al_map_rgb(255, 255, 255));
}
}
free_map(m);
al_destroy_display(display);
al_destroy_bitmap(img_x);
al_destroy_bitmap(img_o);
al_destroy_timer(timer);
al_destroy_event_queue(event_queue);
return 0;
}