123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175 |
- /* This file contains code for X-CHESS.
- Copyright (C) 1986 Free Software Foundation, Inc.
- This file is part of X-CHESS.
- X-CHESS is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY. No author or distributor
- accepts responsibility to anyone for the consequences of using it
- or for whether it serves any particular purpose or works at all,
- unless he says so in writing. Refer to the X-CHESS General Public
- License for full details.
- Everyone is granted permission to copy, modify and redistribute
- X-CHESS, but only under the conditions described in the
- X-CHESS General Public License. A copy of this license is
- supposed to have been given to you along with X-CHESS so you
- can know your rights and responsibilities. It should be in a
- file named COPYING. Among other things, the copyright notice
- and this notice must be preserved on all copies. */
- /* RCS Info: $Revision: 1.4 $ on $Date: 86/11/23 17:17:15 $
- * $Source: /users/faustus/xchess/RCS/board.c,v $
- * Copyright (c) 1986 Wayne A. Christopher, U. C. Berkeley CAD Group
- * Permission is granted to do anything with this code except sell it
- * or remove this message.
- *
- * Stuff to deal with the board.
- */
- #include "xchess.h"
- board *chessboard;
- void
- board_setup()
- {
- chessboard = alloc(board);
- board_init(chessboard);
- return;
- }
- void
- board_init(b)
- board *b;
- {
- int i, j;
- for (i = 0; i < 2; i++)
- for (j = 0; j < SIZE; j++)
- b->square[i][j].color = BLACK;
- for (i = 2; i < 6; i++)
- for (j = 0; j < SIZE; j++)
- b->square[i][j].color = NONE;
- for (i = 6; i < 8; i++)
- for (j = 0; j < SIZE; j++)
- b->square[i][j].color = WHITE;
- for (i = 0; i < SIZE; i++)
- b->square[1][i].type = b->square[6][i].type =
- PAWN;
- b->square[0][0].type = b->square[7][0].type = ROOK;
- b->square[0][1].type = b->square[7][1].type = KNIGHT;
- b->square[0][2].type = b->square[7][2].type = BISHOP;
- b->square[0][3].type = b->square[7][3].type = QUEEN;
- b->square[0][4].type = b->square[7][4].type = KING;
- b->square[0][5].type = b->square[7][5].type = BISHOP;
- b->square[0][6].type = b->square[7][6].type = KNIGHT;
- b->square[0][7].type = b->square[7][7].type = ROOK;
- return;
- }
- void
- board_drawall()
- {
- int i, j;
- for (i = 0; i < SIZE; i++)
- for (j = 0; j < SIZE; j++)
- if (chessboard->square[i][j].color != NONE) {
- win_drawpiece(&chessboard->square[i][j], i,
- j, WHITE);
- if (!oneboard)
- win_drawpiece(&chessboard->square[i][j],
- i, j, BLACK);
- }
- return;
- }
- void
- board_move(b, m)
- board *b;
- move *m;
- {
- switch (m->type) {
- case MOVE:
- case CAPTURE:
- b->square[m->fromy][m->fromx].color = NONE;
- b->square[m->toy][m->tox].color = m->piece.color;
- b->square[m->toy][m->tox].type = m->piece.type;
- if ((m->piece.type == PAWN) && (((m->piece.color == BLACK) &&
- (m->toy == 7)) || ((m->piece.color == WHITE) &&
- (m->toy == 0))))
- b->square[m->toy][m->tox].type = QUEEN;
- if (m->enpassant)
- b->square[m->toy + ((m->piece.color == WHITE) ? 1 :
- -1)][m->tox].color = NONE;
- break;
- case KCASTLE:
- if (m->piece.color == WHITE) {
- b->square[7][5].color = m->piece.color;
- b->square[7][5].type = ROOK;
- b->square[7][6].color = m->piece.color;
- b->square[7][6].type = KING;
- b->square[7][4].color = NONE;
- b->square[7][7].color = NONE;
- } else {
- b->square[0][5].color = m->piece.color;
- b->square[0][5].type = ROOK;
- b->square[0][6].color = m->piece.color;
- b->square[0][6].type = KING;
- b->square[0][4].color = NONE;
- b->square[0][7].color = NONE;
- }
- break;
- case QCASTLE:
- if (m->piece.color == WHITE) {
- b->square[7][3].color = m->piece.color;
- b->square[7][3].type = ROOK;
- b->square[7][2].color = m->piece.color;
- b->square[7][2].type = KING;
- b->square[7][4].color = NONE;
- b->square[7][0].color = NONE;
- } else {
- b->square[0][3].color = m->piece.color;
- b->square[0][3].type = ROOK;
- b->square[0][2].color = m->piece.color;
- b->square[0][2].type = KING;
- b->square[0][4].color = NONE;
- b->square[0][0].color = NONE;
- }
- break;
- default:
- fprintf(stderr, "Bad move type %d\n", m->type);
- }
- if (m->piece.type == KING) {
- if (m->piece.color == WHITE)
- b->white_cant_castle_q =
- b->white_cant_castle_k= true;
- else
- b->black_cant_castle_q =
- b->black_cant_castle_k= true;
- } else if (m->piece.type == ROOK) {
- if (m->piece.color == WHITE) {
- if (m->fromx == 0)
- b->white_cant_castle_q = true;
- else if (m->fromx == 7)
- b->white_cant_castle_k = true;
- } else {
- if (m->fromx == 0)
- b->black_cant_castle_q = true;
- else if (m->fromx == 7)
- b->black_cant_castle_k = true;
- }
- }
- return;
- }
|