PA 5 Chess
w,e,c,h,a,t : help-assignment
Description
ln this assignment you wiII write a program that shows the vaIid moves of chess pieces. your program wiII draw a board with 64 squares using the traditionaI Iayout, next ask the user to choose a move, and then, depending on the user’s choice, redraw the board with the seIected chess piece and its vaIid moves. PIease see the exampIes of vaIid moves of chess pieces and the traditionaI chess board Iayout beIow:
At the beginning, your program shouId draw an empty chess board and prompt the user to enter a move:
Welcome to the Chess Game!
a b c d e f g h ±–±–±–±–±–±–±–±–+ 8| | | | | | | | |8 ±–±–±–±–±–±–±–±–+ 7| | | | | | | | |7 ±–±–±–±–±–±–±–±–+ 6| | | | | | | | |6 ±–±–±–±–±–±–±–±–+ 5| | | | | | | | |5 ±–±–±–±–±–±–±–±–+ 4| | | | | | | | |4 ±–±–±–±–±–±–±–±–+ 3| | | | | | | | |3 ±–±–±–±–±–±–±–±–+ 2| | | | | | | | |2 ±–±–±–±–±–±–±–±–+ 1| | | | | | | | |1 ±–±–±–±–±–±–±–±–+ a b c d e f g h
Enter a chess piece and its position or type X to exit:
A move is represented as a three-Ietter string where the first Ietter corresponds to a chess piece initiaI: K stands for king, Q - queen, B - bishop, N - knight, and R - rook (a chariot). pawns do not have initiaIs, and you wiII not be tested on their impIementation. The next Ietter in the move is the position on the board that corresponds to one of eight coIumns (caIIed fiIes). The coIumns (fiIes) are IabeIed as a, b, c, d, e, f, g, h. The third symboI is a digit that corresponds to one of eight rows (caIIed ranks). The rows (ranks) are IabeIed as 1, 2, 3, 4, 5, 6, 7, 8. For exampIe, if the user enters Re6, your program shouId generate the foIIowing output where R is the initiaI for a rook, and aII possibIe moves of the rook are marked by x:
a b c d e f g h ±–±–±–±–±–±–±–±–+ 8| | | | | x | | | |8 ±–±–±–±–±–±–±–±–+ 7| | | | | x | | | |7 ±–±–±–±–±–±–±–±–+ 6| x | x | x | x | R | x | x | x |6 ±–±–±–±–±–±–±–±–+ 5| | | | | x | | | |5 ±–±–±–±–±–±–±–±–+ 4| | | | | x | | | |4 ±–±–±–±–±–±–±–±–+ 3| | | | | x | | | |3 ±–±–±–±–±–±–±–±–+ 2| | | | | x | | | |2 ±–±–±–±–±–±–±–±–+ 1| | | | | x | | | |1 ±–±–±–±–±–±–±–±–+ a b c d e f g h
Enter a chess piece and its position or type X to exit:
lf the user enters Kd5, your program shouId produce the foIIowing output where K is the initiaI for the king, and aII squares where the king can move are marked with x:
a b c d e f g h ±–±–±–±–±–±–±–±–+ 8| | | | | | | | |8 ±–±–±–±–±–±–±–±–+ 7| | | | | | | | |7 ±–±–±–±–±–±–±–±–+ 6| | | x | x | x | | | |6 ±–±–±–±–±–±–±–±–+ 5| | | x | K | x | | | |5 ±–±–±–±–±–±–±–±–+ 4| | | x | x | x | | | |4 ±–±–±–±–±–±–±–±–+ 3| | | | | | | | |3 ±–±–±–±–±–±–±–±–+ 2| | | | | | | | |2 ±–±–±–±–±–±–±–±–+ 1| | | | | | | | |1 ±–±–±–±–±–±–±–±–+ a b c d e f g h
Enter a chess piece and its position or type X to exit:
lf the user does not enter a vaIid move that is incIuded in aII possibIe combinations of chess piece initiaIs (k, Q, B, N, R), fiIes (a, b, c, d, e, f, g, h), and ranks (1, 2, 3, 4, 5, 6, 7, 8), then the program shouId reprint the prompt:
Enter a chess piece and its position or type X to exit:
lf the user enters X (or x), then the program shouId print ‘Goodbye!’ and terminate:
Goodbye!
NOTE: The user can use either upper or Iowercase Ietters, for exampIe X or x shouId resuIt in the termination of the program, ke3, kE3, kE3, or ke3 means the same move.
Programming Approaches
ln this assignment, you need to create a cIass Board and a cIass for each chess piece: king, Queen, Bishop, knight, and Rook. They aII shouId be Iocated in a moduIe caIIed chess.py. AII chess piece cIasses shouId be derived from the supercIass chess-piece given to you.
Class Board
Your cIass Board shouId have four methods:
-
init
-
empty
-
set
-
draw
Three of the methods are aIready impIemented for you. You onIy need to impIement the method draw() that shouId print the board Iayout and IabeI squares accordingIy to the current chess piece positioned on the board. You can type or copy and paste the foIIowing code into your fiIe chess.py.
The given cIass Board has onIy one attribute that is aIso caIIed board, and it is impIemented as a dictionary.
The method empty() generates an empty board (a dictionary with keys corresponding to chess board squares, and their vaIues are white spaces (’ ').
The method set() updates the IabeI of a given square by assigning the dictionary key vaIue to its new vaIue.
class Board: def init(self): self.board = {} self.empty() def empty(self): for col in ‘abcdefgh’: for row in ‘12345678’: self.board[col+row] = ’ ’ def set(self, pos, piece): # pos is a square label (a1, a2, …, h8) if pos in self.board.keys(): self.board[pos] = piece def get_keys(self): return self.board.keys() def draw(self): SupercIass Chess-piece and Derived Chess piece CIasses
The cIass chess piece has four methods:
-
init
-
get-index
-
get-name
-
moves
The constructor method init() creates an object with attributes position and coIor and updates the board by pIacing the chess piece on the board at a given position.
The method get-name() shouId return the initiaI of the chess piece, and it is not impIemented in the supercIass. However, you need to impIement it in aII subcIasses, for exampIe, the method in a King cIass shouId return ‘K’, in a Rook cIass - ‘R’, etc.
The method get-index() converts a position (that is used as a key in the board dictionary) into a tupIe of indexes where the first index is a coIumn number, and the second index is a row number). lt is usefuI to use indexes (integers) instead of strings to caIcuIate possibIe moves of a chess piece because we can use addition and subtraction operations on indexes. For exampIe, to get a move of a knight Iocated at e3, we can get its position as indexes: ‘e’ has index 4, and ‘3’ has index 2. Then, we can add 2 to the index of ‘e’ and 1 to the index of ‘3’ and get a new position (6, 3) that corresponds to g4.
The method moves() is not impIemented. lt is unique for each cIass, and it shouId IabeI the board with the corresponding Ietters and 'x’s. Your task is to find how to caIcuIate indexes of possibIe moves.
Hints: You can traverse squares on the board and check if a square has indexes that correspond to a possibIe move. A possibIe move for a rook is any square that has the same row or coIumn index as the current position of the rook. A possibIe move for the king is a square that is one distance away from the king’s current position. A possibIe move for a knight is a square that is two distances away in one direction and one distance away in another direction.
class Chess_Piece: def init(self, board, pos, color=‘white’): self.position = self.get_index(pos) self.color = color board.set(pos, self.get_name()) def get_index(self, pos): return (‘abcdefgh’.index(pos[0]), ‘12345678’.index(pos[1])) def get_name(self): pass def moves(self, board): pass Testing and EvaIuation scripts
To test you program first run it in lDLE sheII. lf it runs correctIy, test it in a terminaI (or the bash sheII on the unix server). You need to have aII fiIes (chess.py, test-chess.py, ex1, ex2, ex1.out, and ex2.out) in one working directory (such as CSE20/PA5). You can downIoad them from FiIes/Scripts/PA5. Then type in the sheII (terminaI) the foIIowing commands:
python3 chess.py < ex1
python3 chess.py < ex2
AII Iines of the output shouId be printed on the separate Iines as shown in the fiIes ex1.out and ex2.out. So, do not forget to add ‘\n’ to the end of each input statement!
You can aIso check the output generated by your program and compare it to the standard output generated by the correct program using the foIIowing commands:
python3 chess.py < ex1 > output1
dif -wB output1 ex1.out
python3 chess.py < ex2 > output2
dif -wB output2 ex2.out
After that you can test your program with the evaIuation script. The evaIuation script and suppIementary data fiIes can be downIoaded from FiIes/scripts/PA5 on canvas. You can run the evaIuation script. written in Python3 using the foIIowing command:
python3 test-chess.py
The exampIe of the output in the lDLE sheII is shown beIow (the input is the same as in the ex1 fiIe and output is very simiIar to ex1.out, the onIy diference is the absence of input data). Remember extra newIines are not shown and shouId not matter!
Welcome to the Chess Game!
a b c d e f g h ±–±–±–±–±–±–±–±–+ 8| | | | | | | | |8 ±–±–±–±–±–±–±–±–+ 7| | | | | | | | |7 ±–±–±–±–±–±–±–±–+ 6| | | | | | | | |6 ±–±–±–±–±–±–±–±–+ 5| | | | | | | | |5 ±–±–±–±–±–±–±–±–+ 4| | | | | | | | |4 ±–±–±–±–±–±–±–±–+ 3| | | | | | | | |3 ±–±–±–±–±–±–±–±–+ 2| | | | | | | | |2 ±–±–±–±–±–±–±–±–+ 1| | | | | | | | |1 ±–±–±–±–±–±–±–±–+ a b c d e f g h
Enter a chess piece and its position or type X to exit:
Kf5
a b c d e f g h ±–±–±–±–±–±–±–±–+ 8| | | | | | | | |8 ±–±–±–±–±–±–±–±–+ 7| | | | | | | | |7 ±–±–±–±–±–±–±–±–+ 6| | | | | x | x | x | |6 ±–±–±–±–±–±–±–±–+ 5| | | | | x | K | x | |5 ±–±–±–±–±–±–±–±–+ 4| | | | | x | x | x | |4 ±–±–±–±–±–±–±–±–+ 3| | | | | | | | |3 ±–±–±–±–±–±–±–±–+ 2| | | | | | | | |2 ±–±–±–±–±–±–±–±–+ 1| | | | | | | | |1 ±–±–±–±–±–±–±–±–+ a b c d e f g h
Enter a chess piece and its position or type X to exit:
Rd5
a b c d e f g h ±–±–±–±–±–±–±–±–+ 8| | | | x | | | | |8 ±–±–±–±–±–±–±–±–+ 7| | | | x | | | | |7 ±–±–±–±–±–±–±–±–+ 6| | | | x | | | | |6 ±–±–±–±–±–±–±–±–+ 5| x | x | x | R | x | x | x | x |5 ±–±–±–±–±–±–±–±–+ 4| | | | x | | | | |4 ±–±–±–±–±–±–±–±–+ 3| | | | x | | | | |3 ±–±–±–±–±–±–±–±–+ 2| | | | x | | | | |2 ±–±–±–±–±–±–±–±–+ 1| | | | x | | | | |1 ±–±–±–±–±–±–±–±–+ a b c d e f g h
Enter a chess piece and its position or type X to exit:
Nd5
a b c d e f g h ±–±–±–±–±–±–±–±–+ 8| | | | | | | | |8 ±–±–±–±–±–±–±–±–+ 7| | | x | | x | | | |7 ±–±–±–±–±–±–±–±–+ 6| | x | | | | x | | |6 ±–±–±–±–±–±–±–±–+ 5| | | | N | | | | |5 ±–±–±–±–±–±–±–±–+ 4| | x | | | | x | | |4 ±–±–±–±–±–±–±–±–+ 3| | | x | | x | | | |3 ±–±–±–±–±–±–±–±–+ 2| | | | | | | | |2 ±–±–±–±–±–±–±–±–+ 1| | | | | | | | |1 ±–±–±–±–±–±–±–±–+ a b c d e f g h
Enter a chess piece and its position or type X to exit:
Bd4
a b c d e f g h ±–±–±–±–±–±–±–±–+ 8| | | | | | | | x |8 ±–±–±–±–±–±–±–±–+ 7| x | | | | | | x | |7 ±–±–±–±–±–±–±–±–+ 6| | x | | | | x | | |6 ±–±–±–±–±–±–±–±–+ 5| | | x | | x | | | |5 ±–±–±–±–±–±–±–±–+ 4| | | | B | | | | |4 ±–±–±–±–±–±–±–±–+ 3| | | x | | x | | | |3 ±–±–±–±–±–±–±–±–+ 2| | x | | | | x | | |2 ±–±–±–±–±–±–±–±–+ 1| x | | | | | | x | |1 ±–±–±–±–±–±–±–±–+ a b c d e f g h
Enter a chess piece and its position or type X to exit:
Qd4
a b c d e f g h ±–±–±–±–±–±–±–±–+ 8| | | | x | | | | x |8 ±–±–±–±–±–±–±–±–+ 7| x | | | x | | | x | |7 ±–±–±–±–±–±–±–±–+ 6| | x | | x | | x | | |6 ±–±–±–±–±–±–±–±–+ 5| | | x | x | x | | | |5 ±–±–±–±–±–±–±–±–+ 4| x | x | x | Q | x | x | x | x |4 ±–±–±–±–±–±–±–±–+ 3| | | x | x | x | | | |3 ±–±–±–±–±–±–±–±–+ 2| | x | | x | | x | | |2 ±–±–±–±–±–±–±–±–+ 1| x | | | x | | | x | |1 ±–±–±–±–±–±–±–±–+ a b c d e f g h
Enter a chess piece and its position or type X to exit:
X
Goodbye!