Made the game and README
This commit is contained in:
commit
c62cb433f7
7
README.md
Normal file
7
README.md
Normal file
@ -0,0 +1,7 @@
|
||||
<img src="https://kubosya.cocolog-nifty.com/photos/uncategorized/othello_game.png" style="align:center" />
|
||||
# Othelloworld
|
||||
|
||||
This is a small exercise which involves creating a functioning othello/reversi game in the terminal and implementing the minimax algorithm in order to create an AI for the player to play against. Part of a hobby hackathon with my friends.
|
||||
|
||||
## Network
|
||||
To be continued...
|
137
src/game.py
Normal file
137
src/game.py
Normal file
@ -0,0 +1,137 @@
|
||||
from enum import Enum
|
||||
from terminaltables import AsciiTable
|
||||
from os import system
|
||||
import shutil
|
||||
|
||||
class Color(Enum):
|
||||
WHITE = 1
|
||||
BLACK = 2
|
||||
EMPTY = -1
|
||||
|
||||
class Direction(Enum):
|
||||
UP = (0, -1)
|
||||
DOWN = (0, 1)
|
||||
LEFT = (-1, 0)
|
||||
RIGHT = (1, 0)
|
||||
UP_LEFT = (-1, -1)
|
||||
UP_RIGHT = (1, -1)
|
||||
DOWN_LEFT = (-1, 1)
|
||||
DOWN_RIGHT = (1, 1)
|
||||
|
||||
class Board:
|
||||
def __init__(self):
|
||||
# Initialize board
|
||||
self.board = {i: [Color.EMPTY.value for _ in range(8)] for i in range(8)}
|
||||
|
||||
self.play_move(Color.WHITE, 3,3, initial=True)
|
||||
self.play_move(Color.WHITE, 4,4, initial=True)
|
||||
self.play_move(Color.BLACK, 3,4, initial=True)
|
||||
self.play_move(Color.BLACK, 4,3, initial=True)
|
||||
self.mover = False
|
||||
|
||||
# print(self.board)
|
||||
|
||||
# Correcting the syntax error and redefining the function
|
||||
|
||||
def check_direction(self, move, x, y, direction):
|
||||
opponent = Color.WHITE if move == Color.BLACK else Color.BLACK
|
||||
|
||||
dx, dy = direction.value
|
||||
to_flip = list()
|
||||
x += dx
|
||||
y += dy
|
||||
to_flip = list()
|
||||
if not (0 <= x < 8 and 0 <= y < 8) or self.board[x][y] != opponent.value:
|
||||
return False
|
||||
|
||||
while 0 <= x < 8 and 0 <= y < 8 and self.board[x][y] == opponent.value:
|
||||
to_flip.append((x, y))
|
||||
x += dx
|
||||
y += dy
|
||||
|
||||
if not (0 <= x < 8 and 0 <= y < 8) or self.board[x][y] == Color.EMPTY.value:
|
||||
return False
|
||||
|
||||
for i in to_flip:
|
||||
self.board[i[0]][i[1]] = move.value
|
||||
|
||||
return self.board[x][y] == move.value
|
||||
|
||||
def check_move(self, move:Color, x:int, y:int):
|
||||
once = False
|
||||
for direction in Direction:
|
||||
result = self.check_direction(move, x, y, direction)
|
||||
if result:
|
||||
once = True
|
||||
return once
|
||||
|
||||
def play_move(self, move:Color, x:int, y:int, initial=False):
|
||||
# Check if move is valid
|
||||
if not initial:
|
||||
if self.board[x][y] != Color.EMPTY.value:
|
||||
raise KeyError("On top")
|
||||
|
||||
result = self.check_move(move, x, y)
|
||||
|
||||
if not result:
|
||||
raise KeyError("Invalid move")
|
||||
self.board[x][y] = move.value
|
||||
|
||||
def display_board(self):
|
||||
table_data = [[" " for i in range(8)] for j in range(8)]
|
||||
|
||||
for x in range(8):
|
||||
for y in range(8):
|
||||
if self.board[x][y] == 1:
|
||||
table_data[y][x] = "■"
|
||||
elif self.board[x][y] == 2:
|
||||
table_data[y][x] = "□"
|
||||
else:
|
||||
table_data[y][x] = "🟨"
|
||||
|
||||
table_data.insert(0, [" ", 0, 1, 2, 3, 4, 5, 6, 7])
|
||||
for i in range(8):
|
||||
table_data[i+1].insert(0, i)
|
||||
|
||||
table = AsciiTable(table_data)
|
||||
table.inner_column_border = False
|
||||
table.column_max_width = 1
|
||||
table.title = self.get_mover().name.lower() + "'s turn"
|
||||
table.padding_right =0
|
||||
return print(table.table)
|
||||
|
||||
def switch_mover(self):
|
||||
self.mover = not self.mover
|
||||
|
||||
def get_mover(self):
|
||||
if not self.mover:
|
||||
return Color.BLACK
|
||||
else:
|
||||
return Color.WHITE
|
||||
|
||||
def main():
|
||||
board = Board()
|
||||
|
||||
while True:
|
||||
system("clear")
|
||||
|
||||
board.display_board()
|
||||
|
||||
move = input("What is your move?\n")
|
||||
move = move.split(" ")
|
||||
move = [int(move[0]), int(move[1])]
|
||||
try:
|
||||
board.play_move(move=board.get_mover(), x=move[0], y=move[1])
|
||||
|
||||
except KeyError as e:
|
||||
print("Invalid move: " + str(move))
|
||||
input("Press enter to continue...")
|
||||
|
||||
|
||||
board.switch_mover()
|
||||
|
||||
if __name__=="__main__":
|
||||
try:
|
||||
main()
|
||||
except KeyboardInterrupt:
|
||||
pass
|
Loading…
x
Reference in New Issue
Block a user