212 lines
5.3 KiB
C++
212 lines
5.3 KiB
C++
|
#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;
|
|||
|
}
|