// kóko i krzyżyk  8/2018  marianekA  //
#include <allegro5/allegro.h>
#include <allegro5/allegro_font.h>
#include <allegro5/allegro_ttf.h>
#include <allegro5/allegro_primitives.h>
using namespace std;
ALLEGRO_KEYBOARD_STATE klaw;
ALLEGRO_MOUSE_STATE mm;
ALLEGRO_DISPLAY *ekran = NULL;  // ekran edytora
ALLEGRO_FONT *f28,*f20 = NULL;  // czcionki
int const a=98;                 // wielkosc pola

void inicjacja()
{
    al_init();
    al_install_keyboard();        // klawiatura
    al_install_mouse();           // myszka
    al_init_font_addon();         // czcionki
    al_init_ttf_addon();          // czcionki skalowane
    al_init_primitives_addon();
    ekran  = al_create_display(600,340);
    f28  = al_load_ttf_font( "arial.ttf",28,0 );
    f20  = al_load_ttf_font( "arial.ttf",20,0 );
}

void plansza(int &mz, int t[], int wyg)
{
    mz=0;
    al_draw_filled_rectangle(25,25,25+a*3+2,25+a*3+2,al_map_rgb(175,195,200)); // cień
    al_draw_filled_rectangle(20,20,20+a*3,20+a*3,al_map_rgb(240,240,240));    // tło
    if(wyg>0)  al_draw_filled_rectangle(20,20,20+a*3,20+a*3,al_map_rgb(202,220,222)); // tło końca gry
    for(int j=0; j<3; ++j)
        for(int i=0; i<3; ++i)
        {
            // ramki
            al_draw_rectangle(20+i*a,20+j*a,20+i*a+a,20+j*a+a,al_map_rgb(0,0,0),2);
            //kółka
            if(t[i+j*3+1]==1) al_draw_circle(20+a/2+i*a,20+a/2+j*a,35,al_map_rgb(0,150,0),8);
            // krzyżyki
            if(t[i+j*3+1]==2)
            {
                al_draw_line(20+i*a+15,20+j*a+15,20+i*a+83,20+j*a+83,al_map_rgb(0,105,185),8);
                al_draw_line(20+i*a+83,20+j*a+15,20+i*a+15,20+j*a+83,al_map_rgb(0,105,185),8);
            }
            //strefy pól
            if(mm.x>20+i*a && mm.x<20+i*a+a && mm.y>20+j*a && mm.y<20+j*a+a) mz=i+j*3+1;
        }
    // --- prxyciemnienie aktywnego pola
    int x=0,y=0;
    if(mz>0 && t[mz]==0 && wyg==0)
    {
        x=20+(mz-1)%3*a, y=20+(mz-1)/3*a;
        al_draw_filled_rectangle(x+3,y+3,x+a-3,y+a-3,al_map_rgba(250,250,250,10));
    } //----
}

void komputer( int t[] )
{
    int v=0; // numer wolnego/wybranego pola
    /// Analizowanie pola dla ruchu komputera. Jeśli na sprawdzanej lini napotka
    /// dwa pola zajęte przez przeciwnika i trzecie wolne to wybiera to pole
    // linia 1
    if(t[1]==0 && t[2]==1 && t[3]==1) v=1;
    if(t[1]==1 && t[2]==0 && t[3]==1) v=2;
    if(t[1]==1 && t[2]==1 && t[3]==0) v=3;
    // linia 2
    if(t[4]==0 && t[5]==1 && t[6]==1) v=4;
    if(t[4]==1 && t[5]==0 && t[6]==1) v=5;
    if(t[4]==1 && t[5]==1 && t[6]==0) v=6;
    // linia 3
    if(t[7]==0 && t[8]==1 && t[9]==1) v=7;
    if(t[7]==1 && t[8]==0 && t[9]==1) v=8;
    if(t[7]==1 && t[8]==1 && t[9]==0) v=9;
    // kolumna 1
    if(t[1]==0 && t[4]==1 && t[7]==1) v=1;
    if(t[1]==1 && t[4]==0 && t[7]==1) v=4;
    if(t[1]==1 && t[7]==1 && t[7]==0) v=7;
    // kolumna 2
    if(t[2]==0 && t[5]==1 && t[8]==1) v=2;
    if(t[2]==1 && t[5]==0 && t[8]==1) v=5;
    if(t[2]==1 && t[5]==1 && t[8]==0) v=8;
    // kolumna 3
    if(t[3]==0 && t[6]==1 && t[9]==1) v=3;
    if(t[3]==1 && t[6]==0 && t[9]==1) v=6;
    if(t[3]==1 && t[6]==1 && t[9]==0) v=9;
    // w przek. '\'
    if(t[1]==0 && t[5]==1 && t[9]==1) v=1;
    if(t[1]==1 && t[5]==0 && t[9]==1) v=5;
    if(t[1]==1 && t[5]==1 && t[9]==0) v=9;
    // w przek. '/'
    if(t[3]==0 && t[5]==1 && t[7]==1) v=3;
    if(t[3]==1 && t[5]==0 && t[7]==1) v=5;
    if(t[3]==1 && t[5]==1 && t[7]==0) v=7;
    /// jeśli analiza nie odniosła skutku to losowo wybiera puste pole
    if(v==0)
        while(1)
        {
            v=rand()%9+1;
            if(t[v]==0) break;
        };
    t[v]=2; // pole wybrane przez 'komputer'
}
void spr(int t[], char gracz, int &wyg, int st[])
{
    if(
        (t[1]==t[2] && t[2]==t[3] && t[1]!=0) ||  // linia 1
        (t[4]==t[5] && t[5]==t[6] && t[4]!=0) ||  //       2
        (t[7]==t[8] && t[8]==t[9] && t[7]!=0) ||  //       3
        (t[1]==t[4] && t[4]==t[7] && t[1]!=0) ||  // kolumna 1
        (t[2]==t[5] && t[5]==t[8] && t[2]!=0) ||  //         2
        (t[3]==t[6] && t[6]==t[9] && t[3]!=0) ||  //         3
        (t[1]==t[5] && t[5]==t[9] && t[1]!=0) ||  // przek. '\'
        (t[3]==t[5] && t[5]==t[7] && t[3]!=0))    //        '/'
    {
        if(gracz=='O') ++st[1], wyg=1;
        if(gracz=='X') ++st[2], wyg=2;
        return;
    }
    for(int i=1; i<=9; ++i) if(t[i]==0) return; // jeśli pętla się skończy to 'remis'
    ++st[0], wyg=3;
}

void przycisk(int &mz, int wyg)
{
    int x=460, y=250;
    if(mm.x>x-80+5 && mm.x<x+80+5 && mm.y>y+5 && mm.y<y+40+5)  mz=11;     // strefa
    al_draw_filled_rectangle(x-80+5,y+5,x+80+7,y+40+7,al_map_rgb(175,195,200)); // cień
    al_draw_filled_rectangle(x-80,y,x+80,y+40,al_map_rgb(240,240,240)); // tło
    al_draw_rectangle(x-80,y,x+80,y+40,al_map_rgb(0,0,0),2);           // ramka
    if(wyg==0)  al_draw_filled_rectangle(x-80,y,x+80,y+40,al_map_rgba(0,0,0,30)); // przyciemnienie gdy nieaktywny
    if(wyg>0 && mz==11)  al_draw_filled_rectangle(x-80,y,x+80,y+40,al_map_rgba(y,y,y,2)); // rozjaśnienie
    al_draw_text(f28,al_map_rgb(80,80,80),x,254,1,"Nowa Gra");
}

void teksty(int wyg, int st[])
{
    if(wyg==1) al_draw_text(f28,al_map_rgb(0,0,0),460,150,1,"Wygrał GRACZ");
    if(wyg==2) al_draw_text(f28,al_map_rgb(0,0,0),460,150,1,"Wygrał KOMPUTER");
    if(wyg==3) al_draw_text(f28,al_map_rgb(0,0,0),460,150,1,"REMIS");
    al_draw_text(f20,al_map_rgb(100,140,140),460,30,1,"Statystyka wygranych");
    al_draw_line(460-120,60,460+120,60,al_map_rgb(80,120,120),1);
    al_draw_text(f20,al_map_rgb(60,100,100),460,65,1,"Gracz   Komputer  Remisy");
    al_draw_textf(f28,al_map_rgb(40,80,80),460,85,1," %d         %d         %d ",st[1],st[2],st[0]);
    al_draw_text(f20,al_map_rgb(170,180,180),350,200,0,"M.Awgul, Rawicz 2018r.");
}

int main()
{
    inicjacja();
    int t[10]= {0,0,0,0,0,0,0,0,0,0}; // pola diagramu, 0-puste,1-kóko,2-krzyżyk
    int st[3]= {0,0,0};               // statystyki rozgrywek
    int  mz=0, wyg=0;
    char gracz='O'; // rozpoczyna gracz 'O'...aby zmienić gracza w miejsce'O' wstaw 'X' tu i w restart

    while( !al_key_down(& klaw, ALLEGRO_KEY_ESCAPE ))
    {
        al_get_mouse_state( &mm);      // sprawdza stan przycisków myszki
        al_get_keyboard_state( &klaw); //spr. stanu klawiszawiatury
        // ruch gracza
        if(mm.buttons==1 && gracz=='O' && wyg==0 && mz>0 && t[mz]==0)  t[mz]=1, spr(t,gracz,wyg,st), gracz='X';
        // ruch komputera
        if(mm.buttons==0 && gracz=='X' && wyg==0)  komputer(t), spr(t,gracz,wyg,st), gracz='O';
        // restart
        if(mz==11 && mm.buttons==1 && wyg>0)  memset(t,0,10*sizeof(int)), gracz='O', wyg=0;
        // rysowanie
        al_clear_to_color(al_map_rgb(202,220,222));
        plansza(mz,t,wyg);
        przycisk(mz,wyg);
        teksty(wyg,st);
        al_flip_display();
        al_rest(0.005);
    }
    al_destroy_display(ekran);
    al_destroy_font(f20);
    al_destroy_font(f28);
    return 0;
}
