Still celebrating National IT Professionals Day with 3 months of free Premium Membership. Use Code ITDAY17


Input for a chess game

Posted on 2003-11-27
Medium Priority
Last Modified: 2012-05-04
This should be a fairly simple question; I have a chessboard, which is an 8x8 array. (There are no graphics, this is text only). The program begins with displaying the board on screen. I need to ask the user which piece to move, and which piece to move it, in the format x1,y1:x2,y2. Should I use gets() to get the move?
Here is the board:
 BR   BN   BB   BQ   BK   BB   BN   BR
 BP   BP   BP   BP   BP   BP   BP   BP
      []        []        []        []
 []        []        []        []      
      []        []        []        []
 []        []        []        []      
 WP   WP   WP   WP   WP   WP   WP   WP
 WR   WN   WB   WQ   WK   WB   WN   WR

That'd probably look a lot better in notepad.
So for instance, I enter 2,2:2:4 to move a WP foward two spaces. How would I do that? I'm not too familiar with string functions to know how to dissect a string into usable numbers. Any help?
Question by:Tabris42
Welcome to Experts Exchange

Add your voice to the tech community where 5M+ people just like you are talking about what matters.

  • Help others & share knowledge
  • Earn cash & points
  • Learn & ask questions

Author Comment

ID: 9834124
It has also occurred to me that the coordinates for the chessboard wouldn't actually match the coordinates for the array. What can I do to effectively 'spin' the board around, so that the entered coordinates would actually apply to the array coordinates?

Expert Comment

ID: 9834169
You can use scanf to get the user input into strings.
For example this code asks the user for four numbers separated by spaces and store them on x1, y1, x2, y2.

int x1;
int y1;
int x2;
int y2;

scanf("%d %d %d %d", &x1, &y1, &x2, &y2);

You can refer to scanf documentation to get all the benefits it has.

Hope it helps.


Author Comment

ID: 9834664
I don't think that would work with the colon in the middle.

Modern healthcare requires a modern cloud. View this brief video to understand how the Concerto Cloud for Healthcare can help your organization.


Author Comment

ID: 9834868
Ok, I've solved that problem. Here is my chess game so far:

#include <stdio.h>

void printboard(char* board[8][8]);
int main(){
      FILE *f;
      char move[7];
      int whitesturn; //if whitesturn = 1, it's white's turn, if 0 it's black's
      int y1, x1, y2, x2;
      char *chessboard[8][8] ={{"BR ","BN ","BB ","BQ ","BK ","BB ","BN ","BR "},
                               {"BP ","BP ","BP ","BP ","BP ","BP ","BP ","BP "},
                               {"   ","[] ","   ","[] ","   ","[] ","   ","[] "},
                               {"[] ","   ","[] ","   ","[] ","   ","[] ","   "},
                               {"   ","[] ","   ","[] ","   ","[] ","   ","[] "},
                               {"[] ","   ","[] ","   ","[] ","   ","[] ","   "},
                               {"WP ","WP ","WP ","WP ","WP ","WP ","WP ","WP "},
                               {"WR ","WN ","WB ","WQ ","WK ","WB ","WN ","WR "}};
     f = fopen("moves.txt","w");
          if (strcmp(move, "exit") == 0){
          y1 = ((int)move[0] - 48)-1;
          x1 = 8-((int)move[2] - 48);
          y2 = ((int)move[4] - 48)-1;
          x2 = 8-((int)move[6] - 48);
          fprintf(f, "%s\n", move);
          chessboard[x2][y2] = chessboard[x1][y1];
          if(((x1%2 > 0)&&(y1%2 > 0)) || ((x1%2 == 0)&&(y1%2 == 0))){
               chessboard[x1][y1] = "   ";
               chessboard[x1][y1] = "[] ";
     printf("\nThanks for playing!\n");
void printboard(char *chessboard[8][8]){
     int i, j, a=8;
     for (i=0; i<8; i++){
          printf("%d  ", a);
          for (j=0; j<8; j++){
     printf("\n   1  2  3  4  5  6  7  8  \n");
     printf("\nMOVE: ");

What I would like to know, is how can I validate whether it's white or black's turn to go? Additionally, how can I check for invalid data, such as bad coordinates, or trying to move a black piece on white's turn, or data not in int,int:int,int format?
LVL 46

Accepted Solution

Kent Olsen earned 2000 total points
ID: 9835005

Validating the data is pretty easy.

To keep track of which player is to move, just keep a counter of the total number of moves.  Then mask off the bottom bit to determine odd or even.

while (1)

  if (MoveNumber & 1)  /*  Odd number means black's move  */
    MoveBlack ();
    MoveWhite ();

You can also keep a "logical" variable to do the same thing:

BlacksMove = 1;
while (1)
  if (BlacksMove)
    MoveBlack ();
    MoveWhite ();
  BlacksMove = !BlacksMove;

The player should input coordinates from 1 to 8.  scanf() will cease the scan if it encounters an error so it's easy to detect a badly formatted input.

  fgets (Buffer, BUFFER_LENGTH, stdin);
  NewY = 0;
  sscanf (Buffer, "%d,%d:%d,%d", &OldX, &OldY, &NewX, &NewY);
  if (OldX < 1 || OldX > 8 || OldY < 1 || OldY > 8 || NewX < 1 || NewX > 8 || NewY < 1 || NewY > 8)
    IllegalInput ();
    TryMove ();  /*  Check that the move is valid and make it  */

To check that a player is moving his own piece, use either of the "Change Turn" methods above and add this:

  if (BlacksMove)
    if (*ChessBoard[OldX][OldY] == 'B')  /*  Black's move and the piece is black  */
      MakeMove ();
    if (*ChessBoard[OldX][OldY] == 'W')  /*  White's move and the piece is white  */
      MakeMove ();

Good Luck
LVL 16

Expert Comment

ID: 9839512
You could also consider accepting logical notation. A common form of move notation designates the rows on the board from 1 to 8 and the columns from a to h. So KP - P4 (your example) would be written e2 - e4 and the standard response would be written e7 - e5. This would be much easier for chess players to use.

It would not be hard to interpret, in fact, you could rid of the need for keeping track of whose move it is. Translate a - h to 0 - 7 for the column coordinates and 1 - 8 to 0 - 7 for the rows, and they're ready to use as indexes.

Featured Post

Independent Software Vendors: We Want Your Opinion

We value your feedback.

Take our survey and automatically be enter to win anyone of the following:
Yeti Cooler, Amazon eGift Card, and Movie eGift Card!

Question has a verified solution.

If you are experiencing a similar issue, please ask a related question

Preface I don't like visual development tools that are supposed to write a program for me. Even if it is Xcode and I can use Interface Builder. Yes, it is a perfect tool and has helped me a lot, mainly, in the beginning, when my programs were small…
Windows programmers of the C/C++ variety, how many of you realise that since Window 9x Microsoft has been lying to you about what constitutes Unicode ( They will have you believe that Unicode requires you to use…
The goal of this video is to provide viewers with basic examples to understand and use pointers in the C programming language.
Video by: Grant
The goal of this video is to provide viewers with basic examples to understand and use for-loops in the C programming language.
Suggested Courses

705 members asked questions and received personalized solutions in the past 7 days.

Join the community of 500,000 technology professionals and ask your questions.

Join & Ask a Question