Untitled
unknown
plain_text
2 years ago
14 kB
13
Indexable
# include "iGraphics.h"
/*
What is left;
1. starting page;
2. check system;
3. castling king and rook;
*/
char turn = 'W';
int page = 0;
int board[10][10];
int temp_board[10][10];
int moveable[64][2];
int moveable_index = 0;
int eliminate[10][2];
int eliminate_index = 0;
int temp_eliminate[10][2];
int temp_eliminate_index = 0;
int count = 0;
int selectedX,selectedY;
bool selected = false;
bool castling[4] = {true, true, true, true};
int white_x, white_y, black_x, black_y;
int temp_white_x, temp_white_y, temp_black_x, temp_black_y;
char path[30][50] = {
"Pic\\\\Pieces\\\\white-king.bmp",
"Pic\\\\Pieces\\\\black-king.bmp",
"Pic\\\\Red_marked\\\\white-king.bmp",
"Pic\\\\Red_marked\\\\black-king.bmp",
"Pic\\\\Pieces\\\\white-queen.bmp",
"Pic\\\\Pieces\\\\black-queen.bmp",
"Pic\\\\Red_marked\\\\white-queen.bmp",
"Pic\\\\Red_marked\\\\black-queen.bmp",
"Pic\\\\Pieces\\\\white-bishop.bmp",
"Pic\\\\Pieces\\\\black-bishop.bmp",
"Pic\\\\Red_marked\\\\white-bishop.bmp",
"Pic\\\\Red_marked\\\\black-bishop.bmp",
"Pic\\\\Pieces\\\\white-knight.bmp",
"Pic\\\\Pieces\\\\black-knight.bmp",
"Pic\\\\Red_marked\\\\white-knight.bmp",
"Pic\\\\Red_marked\\\\black-knight.bmp",
"Pic\\\\Pieces\\\\white-rook.bmp",
"Pic\\\\Pieces\\\\black-rook.bmp",
"Pic\\\\Red_marked\\\\white-rook.bmp",
"Pic\\\\Red_marked\\\\black-rook.bmp",
"Pic\\\\Pieces\\\\white-pawn.bmp",
"Pic\\\\Pieces\\\\black-pawn.bmp",
"Pic\\\\Red_marked\\\\white-pawn.bmp",
"Pic\\\\Red_marked\\\\black-pawn.bmp"
};
char BoardPic[30][50] = {
"Pic\\\\ChessBoard\\\\Chess1.bmp",
"Pic\\\\ChessBoard\\\\Chess2.bmp",
"Pic\\\\ChessBoard\\\\Chess3.bmp",
"Pic\\\\ChessBoard\\\\Chess4.bmp",
"Pic\\\\ChessBoard\\\\Chess5.bmp",
"Pic\\\\ChessBoard\\\\Chess6.bmp"
};
int Board_index = 0;
struct Piece
{
char name;
int type;
int dirsize;
int dirX[8];
int dirY[8];
int moveCount;
Piece(){}
Piece(char s,int x, int y,int* arr,int* arr2,int moveC){
name = s;
type = x;
dirsize = y;
for(int i=0;i<y;i++) dirX[i] = arr[i];
for(int i=0;i<y;i++) dirY[i] = arr2[i];
moveCount = moveC;
};
};
Piece types[7];
void init(){
turn = 'W';
moveable_index = 0;
eliminate_index = 0;
temp_eliminate_index = 0;
int arr[8] = {1,-1,-1,1,1,-1,0,0};
int arr2[8] = {1,-1,1,-1,0,0,1,-1};
types[1] = Piece('K',1,8,arr,arr2,1);
types[2] = Piece('Q',2,8,arr,arr2,8);
int arr3[4] = {1,-1,-1,1};
int arr4[4] = {1,-1,1,-1};
types[3] = Piece('B',3,4,arr3,arr4,8);
int arr5[8] = {1,-1,1,-1,2,2,-2,-2};
int arr6[8] = {2,2,-2,-2,1,-1,1,-1};
types[4] = Piece('G',4,8,arr5,arr6,1);
int arr7[4] = {0,0,1,-1};
int arr8[4] = {1,-1,0,0};
types[5] = Piece('R',5,4,arr7,arr8,8);
int arr9[1] = {0};
int arr10[1] = {1};
types[6] = Piece('P',6,1,arr9,arr10,2);
board[1][1] = board[1][8] = 5;
board[1][2] = board[1][7] = 4;
board[1][3] = board[1][6] = 3;
board[1][4] = 2;
board[1][5] = 1;
for(int i = 1;i<=8;i++){
board[2][i] = 6;
board[0][i] = board[9][i] = 99;
}
for(int i=3;i<=6;i++){
for(int j=1;j<=8;j++){
board[i][j] = 0;
}
}
board[8][1] = board[8][8] = -5;
board[8][2] = board[8][7] = -4;
board[8][3] = board[8][6] = -3;
board[8][4] = -2;
board[8][5] = -1;
for(int i = 1;i<=8;i++){
board[7][i] = -6;
board[i][0] = board[i][9] = 99;
}
board[0][0] = board[9][9] = board[0][9] = board[9][0] = 99;
white_x = 5, white_y = 1, black_x = 5, black_y = 8;
}
void GetCoordinates(int x, int y);
void copy_board(){
temp_white_x = white_x, temp_white_y = white_y, temp_black_x = black_x, temp_black_y = black_y;
for(int i=0;i<10;i++){
for(int j=0;j<10;j++){
temp_board[i][j] = board[i][j];
}
}
}
bool win_lose(){
for(int i=1;i<=8;i++){
for(int j=1;j<=8;j++){
if(turn == 'B' && board[j][i] <0){
GetCoordinates(i,j);
if(moveable_index != 0 || eliminate_index != 0) {
moveable_index = 0;
eliminate_index = 0;
return false;
}
}
else if(turn == 'W' && board[j][i]>0){
GetCoordinates(i,j);
if(moveable_index != 0 || eliminate_index != 0) {
moveable_index = 0;
eliminate_index = 0;
return false;
}
}
}
}
return true;
}
void temp_eliminating(int x, int y){
temp_eliminate_index = 0;
int p = (temp_board[y][x]>0)?temp_board[y][x]:-1*temp_board[y][x];
//printf("%d\n", p);
for(int i=0;i<types[p].dirsize;i++){
int movex = x;
int movey = y;
//printf("%d %d\n",movex,movey);
for(int j=0;j<types[p].moveCount;j++){
movex = movex + types[p].dirX[i];
if(temp_board[y][x] == -6) movey = movey - types[p].dirY[i];
else movey = movey + types[p].dirY[i];
if(movex <0 || movey <0 || movex >9 || movey> 9) continue;
else if(temp_board[movey][movex] == 99) break;
if((temp_board[y][x] == 6 || temp_board[y][x] == -6) && j == 0){
if((movex+1)<9 && temp_board[movey][movex+1]*temp_board[y][x] < 0 ){
temp_eliminate[temp_eliminate_index][0] = movex+1;
temp_eliminate[temp_eliminate_index][1] = movey;
//printf("eli - %d %d\n", movex, movey);
temp_eliminate_index++;
}
if((movex-1)>0 && temp_board[movey][movex-1]*temp_board[y][x] < 0){
temp_eliminate[temp_eliminate_index][0] = movex-1;
temp_eliminate[temp_eliminate_index][1] = movey;
//printf("eli - %d %d\n", movex, movey);
temp_eliminate_index++;
}
}
if(temp_board[movey][movex] == 0){}
else if(temp_board[movey][movex]*temp_board[y][x] < 0 && temp_board[y][x] != 6 && temp_board[y][x] != -6) {
temp_eliminate[temp_eliminate_index][0] = movex;
temp_eliminate[temp_eliminate_index][1] = movey;
printf("eli - %d %d\n", movex, movey);
temp_eliminate_index++;
break;
}
else break;
if(board[y][x] == 6 && y != 2)break;
else if(board[y][x] == -6 && y != 7)break;
}
}
}
bool checksystem(int x, int y){
printf("Position of King = %d - %d\n", y, x);
for(int i=1;i<=8;i++){
for(int j=1;j<=8;j++){
if(temp_board[j][i]*temp_board[y][x] < 0){
temp_eliminate_index = 0;
temp_eliminating(i,j);
for(int k=0;k<temp_eliminate_index;k++){
printf("Elimimate to %d = %d - %d\n", temp_board[j][i], temp_eliminate[k][0] , temp_eliminate[k][1]);
if(temp_eliminate[k][0] == x && temp_eliminate[k][1] == y) return true;
}
printf("-----------------------------\n");
}
}
}
return false;
}
void GetCoordinates(int x, int y){
moveable_index = 0;
eliminate_index = 0;
int p = (board[y][x]>0)?board[y][x]:-1*board[y][x];
//printf("%d\n", p);
for(int i=0;i<types[p].dirsize;i++){
int movex = x;
int movey = y;
printf("%d %d\n",movex,movey);
for(int j=0;j<types[p].moveCount;j++){
movex = movex + types[p].dirX[i];
if(board[y][x] == -6) movey = movey - types[p].dirY[i];
else movey = movey + types[p].dirY[i];
if(movex < 0 || movey < 0 || movex > 10 || movey > 10) continue;
else if(board[movey][movex] == 99) break;
if((board[y][x] == 6 || board[y][x] == -6) && j == 0){
if((movex+1)<9 && board[movey][movex+1]*board[y][x] < 0 ){
eliminate[eliminate_index][0] = movex+1;
eliminate[eliminate_index][1] = movey;
printf("eli - %d %d\n", movex, movey);
eliminate_index++;
copy_board();
temp_board[movey][movex+1] = temp_board[y][x];
temp_board[y][x] = 0;
bool check = (turn == 'W')?checksystem(white_x, white_y):checksystem(black_x, black_y);
if(check) eliminate_index--;
}
if((movex-1)>0 && board[movey][movex-1]*board[y][x] < 0){
eliminate[eliminate_index][0] = movex-1;
eliminate[eliminate_index][1] = movey;
printf("eli - %d %d\n", movex, movey);
eliminate_index++;
copy_board();
temp_board[movey][movex-1] = temp_board[y][x];
temp_board[y][x] = 0;
bool check = (turn == 'W')?checksystem(white_x, white_y):checksystem(black_x, black_y);
if(check) eliminate_index--;
}
}
if(board[movey][movex] == 0){
moveable[moveable_index][0] = movex;
moveable[moveable_index][1] = movey;
moveable_index++;
copy_board();
temp_board[movey][movex] = temp_board[y][x];
temp_board[y][x] = 0;
if(temp_board[movey][movex] == 1) temp_white_x = movex,temp_white_y = movey;
else if(temp_board[movey][movex] == -1) temp_black_x = movex,temp_black_y = movey;
bool check = (turn == 'W')?checksystem(temp_white_x, temp_white_y):checksystem(temp_black_x, temp_black_y);
if(check) moveable_index--;
}
else if(board[movey][movex]*board[y][x] < 0 && board[y][x] != 6 && board[y][x] != -6) {
eliminate[eliminate_index][0] = movex;
eliminate[eliminate_index][1] = movey;
printf("eli - %d %d\n", movex, movey);
eliminate_index++;
copy_board();
temp_board[movey][movex] = temp_board[y][x];
temp_board[y][x] = 0;
if(temp_board[movey][movex] == 1) temp_white_x = movex,temp_white_y = movey;
else if(temp_board[movey][movex] == -1) temp_black_x = movex,temp_black_y = movey;
bool check = (turn == 'W')?checksystem(temp_white_x,temp_white_y):checksystem(temp_black_x, temp_black_y);
if(check) eliminate_index--;
break;
}
else break;
if(board[y][x] == 6 && y != 2)break;
else if(board[y][x] == -6 && y != 7)break;
}
}
}
void iDraw() {
iClear();
iShowBMP(0, 0, BoardPic[Board_index]);
int x = (52+4), y = (52+4);
int i,j;
for(i=1;i<=8;i++){
for(j=1;j<=8;j++){
int p = board[i][j];
//printf("%d\n", p);
if(p>0) {
iShowBMP2(x,y,path[((p-1)*4)+0],255);
}
else if(p<0) {
iShowBMP2(x,y,path[(((p*-1)-1)*4)+1],255);
}
x += (75);
}
x = (52+4);
y += (75);
}
for(int i=0;i<moveable_index;i++){
int cirx = (moveable[i][0]*75) +(52-75) + 4;
int ciry = (moveable[i][1]*75) +(52-75) + 4;
iShowBMP2(cirx,ciry,"Pic\\Pieces\\circle.bmp",255);
}
for(i=0;i<eliminate_index;i++){
int cirx = (eliminate[i][0]*75) +(52-75) + 4;
int ciry = (eliminate[i][1]*75) +(52-75) + 4;
int p = board[eliminate[i][1]][eliminate[i][0]];
if(p>0) {
iShowBMP2(cirx,ciry,path[((p-1)*4)+2],0);
}
else if(p<0) {
iShowBMP2(cirx,ciry,path[(((p*-1)-1)*4)+3],0);
}
}
if(page == 0){
iShowBMP(0,0,"Pic\\page1.bmp");
iSetColor(0,0,0);
iText(250, 150, "Press space to Enter", GLUT_BITMAP_TIMES_ROMAN_24);
}
if(page == 3) {
if(turn == 'W') {
iShowBMP(150,100,"Pic\\page2_black.bmp");
}
else if(turn == 'B') {
iShowBMP(150,100,"Pic\\page2_white.bmp");
}
}
if(page == 4) iText(100,100, "Keu jite gese", GLUT_BITMAP_TIMES_ROMAN_24);
}
/*
function iMouseMove() is called when the user presses and drags the mouse.
(mx, my) is the position where the mouse pointer is.
*/
void iMouseMove(int mx, int my) {
//printf("x = %d, y= %d\n",mx,my);
}
/*
function iMouse() is called when the user presses/releases the mouse.
(mx, my) is the position where the mouse pointer is.
*/
void iMouse(int button, int state, int mx, int my) {
int movex = (mx>=52 && mx<=652)?((mx-52)/75)+1:0;
int movey = (my>=52 && my<=652)?((my-52)/75)+1:0;
//printf("%d %d\n", movex, movey);
if(page == 0) return;
else if(page == 3) {
mx -= 150;
my -= 100;
if(mx>7 && mx<200){
if(my>12 && my<=203){
board[selectedY][selectedX] = (board[selectedY][selectedX]>0)?2:-2;
page = 2;
}
else if(my>203 && my<395){
board[selectedY][selectedX] = (board[selectedY][selectedX]>0)?3:-3;
page = 2;
}
}
else if(mx>=200 && mx<393){
if(my>12 && my<=203){
board[selectedY][selectedX] = (board[selectedY][selectedX]>0)?5:-5;
page = 2;
}
else if(my>203 && my<395){
board[selectedY][selectedX] = (board[selectedY][selectedX]>0)?4:-4;
page = 2;
}
}
return;
}
count++;
if (button == GLUT_LEFT_BUTTON && movex<9 && movex>0 && movey<9 && movey>0) {
if(((turn == 'W' && board[movey][movex]>0) || (turn == 'B' && board[movey][movex]<0)) && count%2 == 0){
selected = true;
selectedX = movex;
selectedY = movey;
GetCoordinates(movex,movey);
if(moveable_index == 0 && eliminate_index == 0) selected = false;
}
else if(selected && count%2==0){
selected = false;
bool eli = false;
for(int i=0;i<eliminate_index;i++){
if(movex == eliminate[i][0] && movey == eliminate[i][1]){
eli = true;
break;
}
}
for(int i=0;i<moveable_index;i++){
if(movex == moveable[i][0] && movey == moveable[i][1]){
eli = true;
break;
}
}
if(eli){
board[movey][movex] = board[selectedY][selectedX];
board[selectedY][selectedX] = 0;
turn = (turn == 'W')?'B':'W';
if(board[movey][movex] == 6 && movey == 8) {
page = 3;
selectedX = movex;
selectedY = movey;
}
else if(board[movey][movex] == -6 && movey == 1) {
page = 3;
selectedX = movex;
selectedY = movey;
}
}
if(board[movey][movex] == 1) {
white_x = movex;
white_y = movey;
}
else if(board[movey][movex] == -1){
black_x = movex;
black_y = movey;
}
moveable_index = 0;
eliminate_index = 0;
if(win_lose()) page = 4;
}
}
}
/*
function iKeyboard() is called whenever the user hits a key in keyboard.
key- holds the ASCII value of the key pressed.
*/
void iKeyboard(unsigned char key) {
if (key == ' ') {
init();
page = 2;
}
if(key == 'b'){
Board_index++;
if(Board_index >= 6) Board_index = 0;
}
//place your codes for other keys here
}
/*
function iSpecialKeyboard() is called whenver user hits special keys like-
function keys, home, end, pg up, pg down, arraows etc. you have to use
appropriate constants to detect them. A list is:
GLUT_KEY_F1, GLUT_KEY_F2, GLUT_KEY_F3, GLUT_KEY_F4, GLUT_KEY_F5, GLUT_KEY_F6,
GLUT_KEY_F7, GLUT_KEY_F8, GLUT_KEY_F9, GLUT_KEY_F10, GLUT_KEY_F11, GLUT_KEY_F12,
GLUT_KEY_LEFT, GLUT_KEY_UP, GLUT_KEY_RIGHT, GLUT_KEY_DOWN, GLUT_KEY_PAGE UP,
GLUT_KEY_PAGE DOWN, GLUT_KEY_HOME, GLUT_KEY_END, GLUT_KEY_INSERT
*/
void iSpecialKeyboard(unsigned char key) {
if (key == GLUT_KEY_END) {
exit(0);
}
//place your codes for other keys here
}
int main() {
init();
copy_board();
iInitialize(700,700,"Chess Game");
return 0;
}
Editor is loading...
Leave a Comment