// This file is by Marian Dvorsky & Sam Kupka #include <stdlib.h> #include <stdio.h> #include <dos.h> #include "allegro.h" #include "sachy.h" // sleduj poznamky TODO // status remizy !! // hash table char castled[2]={0,0}; //RLE_SPRITE *figurky_cierne[6]; //RLE_SPRITE *figurky_biele[6]; //extern POLICKO sachovnica[8][8]; extern float maxskore; int picked_x,picked_y; int whose_turn,jesach,konec=0; POLICKO_XY *saved; int poc_saved; MOVE possible[108]; int poss; int computer; int xxx; int a,oa=-1; int aa=1,oaa=-1; char convx(int a) { return ('a'+a); } int convy(int a) { return 8-a; } void draw_interface(void) { int x,y,c; float sc; PALETTE zpal; /* clear(buffer); for (y=0;y<=7;y++) for (x=0;x<=7;x++) { c = ((x+y)%2 == 0)?makecol(255,255,255):makecol(0,0,128); rectfill(buffer,x*34,y*32,x*34+33,y*32+31,c); if (sachovnica[x][y].figurka>0) if (sachovnica[x][y].farba == 0) draw_rle_sprite(buffer,figurky_biele[sachovnica[x][y].figurka-1],x*34,y*32+4); else draw_rle_sprite(buffer,figurky_cierne[sachovnica[x][y].figurka-1],x*34,y*32+4); if (picked_x==x && picked_y==y) { c = makecol(0,128,0); rect(buffer,x*34,y*32,x*34+33,y*32+31,c); rect(buffer,x*34+1,y*32+1,x*34+32,y*32+30,c); rect(buffer,x*34+2,y*32+2,x*34+31,y*32+29,c); } } for (x=0;x<poss;x++) { textprintf(buffer,font,300,x*8, 2, "%c%d-%c%d",convx(possible[x].x1),convy(possible[x].y1),convx(possible[x].x2),convy(possible[x].y2)); } sc = score(whose_turn); textprintf(buffer,font,0,300, 2, "%f",sc); textprintf(buffer,font,0,310, 2, "Da skore of this turn is going to be: %f",maxskore); show_mouse(NULL); blit(buffer,screen,0,0,0,0,640,480); show_mouse(screen); */ clear(buffer); SMKpanaky(); SMKdraw(buffer,a,aa); if((oa!=a)||(oaa!=aa)){ SMKmguess(); oa=a; oaa=aa; } tdbox(buffer,585,0,50,poss*8+10,6); for (x=0;x<poss;x++) { textprintf(buffer,font,590,x*8+5,0,"%c%d-%c%d",convx(possible[x].x1),convy(possible[x].y1),convx(possible[x].x2),convy(possible[x].y2)); } tdbox(buffer,535,425,105,55,6); textprintf(buffer,font,540,430,0,"SCORE"); textprintf(buffer,font,550,440,50,"White"); textprintf(buffer,font,550,450,50,"%2f",score(0)); textprintf(buffer,font,550,460,254,"Black"); textprintf(buffer,font,550,470,254,"%2f",score(1)); // blit(moves_bmp,buffer,0,0,600,0,40,450); show_mouse(NULL); blit(buffer,screen,0,0,0,0,640,480); show_mouse(screen); /* if(key[KEY_F12]){ get_palette(zpal); save_pcx("chess.pcx",buffer,zpal); } */ } // Skontroluje ci ma strana SIDE sach char check_for_chess(int side) { int x,y,i,j,e; POLICKO a; int kralx,kraly; for (y=0;y<=7;y++) for (x=0;x<=7;x++) { if (sachovnica[x][y].figurka == kral && sachovnica[x][y].farba == side) { kralx=x; kraly=y; x=7;y=7; } } side = !side; for (y=0;y<=7;y++) for (x=0;x<=7;x++) { if (sachovnica[x][y].farba == side && sachovnica[x][y].figurka > 0) { a = sachovnica[x][y]; if (a.figurka == pesiak) { // branie if (x>0 && sachovnica[x-1][y-((side==0)?1:-1)].farba != side && sachovnica[x-1][y-((side==0)?1:-1)].figurka > 0) if (x-1 == kralx && y-((side==0)?1:-1) == kraly) return 1; if (x<7 && sachovnica[x+1][y-((side==0)?1:-1)].farba != side && sachovnica[x+1][y-((side==0)?1:-1)].figurka > 0) if (x+1 == kralx && y-((side==0)?1:-1) == kraly) return 1; } if (a.figurka == veza || a.figurka == dama) { // na pravo i = x+1; j = y; while (i<=7) { if (sachovnica[i][j].figurka == 0 || (sachovnica[i][j].figurka > 0 && sachovnica[i][j].farba != side)) if (i == kralx && j == kraly) return 1; if (sachovnica[i][j].figurka > 0) i = 7; i++; } // na lavo i = x-1; j = y; while (i>=0) { if (sachovnica[i][j].figurka == 0 || (sachovnica[i][j].figurka > 0 && sachovnica[i][j].farba != side)) if (i == kralx && j == kraly) return 1; if (sachovnica[i][j].figurka > 0) i = 0; i--; } // hore i = x; j = y-1; while (j>=0) { if (sachovnica[i][j].figurka == 0 || (sachovnica[i][j].figurka > 0 && sachovnica[i][j].farba != side)) if (i == kralx && j == kraly) return 1; if (sachovnica[i][j].figurka > 0) j = 0; j--; } // dole i = x; j = y+1; while (j<=7) { if (sachovnica[i][j].figurka == 0 || (sachovnica[i][j].figurka > 0 && sachovnica[i][j].farba != side)) if (i == kralx && j == kraly) return 1; if (sachovnica[i][j].figurka > 0) j = 7; j++; } } if (a.figurka == jazdec) { int x1[8]={-1,-2,-2,-1,1, 2, 2,1}; int y1[8]={-2,-1,1, 2, -2,-1,1,2}; for (e=0;e<=7;e++) { i = x+x1[e]; j = y+y1[e]; if (sachovnica[i][j].figurka == 0 || (sachovnica[i][j].figurka > 0 && sachovnica[i][j].farba != side)) if (i == kralx && j == kraly) return 1; } } if (a.figurka == kral) { int x1[8]={1,1,1,-1,-1,-1,0,0}; int y1[8]={1,0,-1,1, 0, -1,1,-1}; for (e=0;e<=7;e++) { i = x+x1[e]; j = y+y1[e]; if (sachovnica[i][j].figurka == 0 || (sachovnica[i][j].figurka > 0 && sachovnica[i][j].farba != side)) if (i == kralx && j == kraly) return 1; } } if (a.figurka == strelec || a.figurka == dama) { // pravo-dole i = x+1; j = y+1; while (i<=7 && j<=7) { if (sachovnica[i][j].figurka == 0 || (sachovnica[i][j].figurka > 0 && sachovnica[i][j].farba != side)) if (i == kralx && j == kraly) return 1; if (sachovnica[i][j].figurka > 0) i = 7; i++; j++; } // pravo hore i = x+1; j = y-1; while (i<=7 && j>=0) { if (sachovnica[i][j].figurka == 0 || (sachovnica[i][j].figurka > 0 && sachovnica[i][j].farba != side)) if (i == kralx && j == kraly) return 1; if (sachovnica[i][j].figurka > 0) i = 7; i++; j--; } // vlavo hore i = x-1; j = y-1; while (j>=0 && i>=0) { if (sachovnica[i][j].figurka == 0 || (sachovnica[i][j].figurka > 0 && sachovnica[i][j].farba != side)) if (i == kralx && j == kraly) return 1; if (sachovnica[i][j].figurka > 0) j = 0; j--; i--; } // vlavo dole i = x-1; j = y+1; while (j<=7 && i >=0) { if (sachovnica[i][j].figurka == 0 || (sachovnica[i][j].figurka > 0 && sachovnica[i][j].farba != side)) if (i == kralx && j == kraly) return 1; if (sachovnica[i][j].figurka > 0) j = 7; j++; i--; } } } } return 0; } void save_pos(int x, int y) { saved[poc_saved].x = x; saved[poc_saved].y = y; saved[poc_saved].figurka = sachovnica[x][y].figurka; saved[poc_saved].farba = sachovnica[x][y].farba; poc_saved++; } void load_pos(POLICKO_XY svd[8]) { int x; for (x=0;x<poc_saved;x++) { sachovnica[svd[x].x][svd[x].y].figurka = svd[x].figurka; sachovnica[svd[x].x][svd[x].y].farba = svd[x].farba; } poc_saved = 0; } void check_move(int x1, int y1, int x2, int y2, int save, POLICKO_XY svd[8]) { int x,e; if (save==1) { saved = svd; } if (sachovnica[x1][y1].figurka == kral && x1 == 4 && (y1 == 0 || y1 == 7)) { e = (whose_turn==0)?7:0; if (x2 == 6) { castled[whose_turn] = 1; flags[1+(whose_turn*3)]=0; flags[2+(whose_turn*3)]=0; if (save==1) save_pos(5,e); sachovnica[5][e].farba = whose_turn; sachovnica[5][e].figurka = sachovnica[7][e].figurka; if (save==1) save_pos(7,e); sachovnica[7][e].figurka=0; sachovnica[7][e].farba=0; } if (x2 == 2) { castled[whose_turn] = 1; flags[1+(whose_turn*3)]=0; flags[2+(whose_turn*3)]=0; if (save==1) save_pos(3,e); sachovnica[3][e].farba = whose_turn; sachovnica[3][e].figurka = sachovnica[0][e].figurka; if (save==1) save_pos(0,e); sachovnica[0][e].figurka=0; sachovnica[0][e].farba=0; } } if (sachovnica[x1][y1].figurka == kral) { if (whose_turn == 0) flags[0] = 1; else flags[3] = 1; } if (sachovnica[x1][y1].figurka == veza) { if (x1 == 0) if (whose_turn == 0) flags[1] = 1; else flags[4] = 1; else if (whose_turn == 0) flags[2] = 1; else flags[5] = 1; } if (sachovnica[x1][y1].figurka == pesiak && x1-x2!=0 && sachovnica[x2][y2].figurka == 0) { if (whose_turn == 0) { if (save==1) save_pos(x2,y2+1); sachovnica[x2][y2+1].figurka=0; } if (whose_turn == 1) { if (save==1) save_pos(x2,y2-1); sachovnica[x2][y2-1].figurka=0; } } if (save==1) save_pos(x2,y2); sachovnica[x2][y2].farba = whose_turn; sachovnica[x2][y2].figurka = sachovnica[x1][y1].figurka; if (save==1) save_pos(x1,y1); sachovnica[x1][y1].figurka=0; sachovnica[x1][y1].farba=0; if (sachovnica[x2][y2].figurka == pesiak && (y2 == 0 || y2 == 7)) { // TODO: dovolit vybrat sachovnica[x2][y2].figurka = dama; } prev_move.x1 = x1; prev_move.y1 = y1; prev_move.x2 = x2; prev_move.y2 = y2; whose_turn = (whose_turn==0)?1:0; picked_x=-1; picked_y=-1; } void initial_positions() { int x,y,z; for(x=0;x<8;x++) for(y=0;y<8;y++){ sachovnica[x][y].figurka=0; sachovnica[x][y].farba=0; } for (x=0;x<=1;x++) { y = (x==0)?7:0; sachovnica[0][y].figurka = 2; sachovnica[0][y].farba = x; sachovnica[1][y].figurka = 3; sachovnica[1][y].farba = x; sachovnica[2][y].figurka = 4; sachovnica[2][y].farba = x; sachovnica[3][y].figurka = 5; sachovnica[3][y].farba = x; sachovnica[4][y].figurka = 6; sachovnica[4][y].farba = x; sachovnica[5][y].figurka = 4; sachovnica[5][y].farba = x; sachovnica[6][y].figurka = 3; sachovnica[6][y].farba = x; sachovnica[7][y].figurka = 2; sachovnica[7][y].farba = x; y = (x==0)?6:1; for (z=0;z<=7;z++){ sachovnica[z][y].figurka = 1; sachovnica[z][y].farba = x;} } } char cco=0; void marian_main(int farba,int co,int obt) { int x,x1,y1; char c=0,k=0; struct time cas; oa=-1; gettime(&cas); srandom(cas.ti_sec*cas.ti_hour*cas.ti_min); picked_x=-1; picked_y=-1; if((co==0)||(cco==0)){ if(farba>=0) computer=!farba; else computer=-1; whose_turn=0; xxx=0; flags[0]=0; flags[1]=0; flags[2]=0; flags[3]=0; flags[4]=0; cco=1; initial_positions(); max_depth=obt+2; konec=0; } if (computer == whose_turn) go(); poss = generate_possible_moves(possible,whose_turn); set_mouse_sprite(0); draw_interface(); do{ c=0; if (key[KEY_SPACE]) xxx=1; if(key[KEY_LEFT]){ a+=2; c=1; } if(key[KEY_RIGHT]){ a-=2; c=1; } if(key[KEY_UP]){ aa-=2; if(aa<1) aa=1; c=1; } if(key[KEY_DOWN]){ aa+=2; if(aa>50) aa=50; c=1; } if(key[KEY_R]){ a=0;aa=14; c=1; } if(key[KEY_H]){ a=0; c=1; } if(key[KEY_F]){ a+=a>128?-128:128; c=1; clear_keybuf(); } if(key[KEY_V]){ aa=14; c=1; } if(key[KEY_ESC]) k=1; if (mouse_b & 1) { if (SMKget(mouse_x,mouse_y)!=-1) { if (picked_x==-1) { y1=SMKget(mouse_x,mouse_y); x1=y1%8; y1/=8; if (sachovnica[x1][y1].figurka > 0) { if (sachovnica[x1][y1].farba == whose_turn || whose_turn == computer) {picked_x = x1;picked_y=y1; show_mouse(0); if (sachovnica[x1][y1].farba == 0) set_mouse_sprite(figurky_biele[sachovnica[x1][y1].figurka-1]); else set_mouse_sprite(figurky_cierne[sachovnica[x1][y1].figurka-1]); set_mouse_sprite_focus(17,12); show_mouse(screen); } else { if (whose_turn == computer) billalert("PinChess message","Na tahu je pocitac!",NULL,"OK",NULL,'O',NULL); else { if (whose_turn == 0) billalert("PinChess message","Na tahu je biely!",NULL,"OK",NULL,'O',NULL); else billalert("PinChess message","Na tahu je cierny!",NULL,"OK",NULL,'O',NULL); } } } } else { y1=SMKget(mouse_x,mouse_y); x1=y1%8; y1/=8; for (x=0;x<poss;x++) { if (possible[x].x1 == picked_x && possible[x].y1 == picked_y && possible[x].x2 == x1 && possible[x].y2 == y1) { check_move(picked_x,picked_y,x1,y1,0,NULL); set_mouse_sprite(NULL); set_mouse_sprite_focus(0,0); draw_interface(); c=0; if (computer == whose_turn){ _thinking(); go(); } if (xxx == 1) delay(0); poss = generate_possible_moves(possible,whose_turn); goto dalej; } } dalej: } c=1; if (poss == 0 || konec == 1) { jesach = check_for_chess(whose_turn); if (jesach) { draw_interface(); k=1; if (whose_turn == 0) billalert("PinChess message","Biely dostal mat!",NULL,"OK",NULL,'O',NULL); else billalert("PinChess message","Cierny dostal mat!",NULL,"OK",NULL,'O',NULL); } else { draw_interface(); k=1; if (whose_turn == 0) billalert("PinChess message","Biely dostal pat! Je to remiza.",NULL,"OK",NULL,'O',NULL); else billalert("PinChess message","Cierny dostal pat! Je to remiza.",NULL,"OK",NULL,'O',NULL); } } while (mouse_b&1) {} } } if (mouse_b&2) { if (picked_x!=-1) { picked_x=-1; picked_y=-1; set_mouse_sprite(NULL); c=1; } } if(c==1) draw_interface(); }while (k!=1); }