type hinting and started working on cli v2
This commit is contained in:
parent
7fee99cce8
commit
b55ecde811
|
|
@ -32,7 +32,12 @@ Both game modes include:
|
||||||
|
|
||||||
### Player vs CPU
|
### Player vs CPU
|
||||||
|
|
||||||
- Fix priority issues: sometimes the CPU prefers a vertical 3-in-a-row instead of completing a horizontal win.
|
- better eval heuristics
|
||||||
|
- order allowedMoves to try more promising moves first
|
||||||
|
- cache / transposition table (avoid rechecking already evaled positions)
|
||||||
|
- if a move results in a win, immediately return without recursion
|
||||||
|
- MAYBE refactor to a bitboard approach (MUCH MUCH faster cuz bitwise operations)
|
||||||
|
- parallel operations
|
||||||
|
|
||||||
### GUI
|
### GUI
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -1,4 +1,4 @@
|
||||||
{
|
{
|
||||||
"display_mode": "coloured_background",
|
"display_mode": "coloured_background",
|
||||||
"cpu_search_depth": 6
|
"cpu_search_depth": 5
|
||||||
}
|
}
|
||||||
72
cli/v2.py
Normal file
72
cli/v2.py
Normal file
|
|
@ -0,0 +1,72 @@
|
||||||
|
board = '0'*42
|
||||||
|
player = '1'
|
||||||
|
|
||||||
|
def clear():
|
||||||
|
print(end='\033[2J\033[1;1H',flush=True)
|
||||||
|
|
||||||
|
def prettyChar(char):
|
||||||
|
if char == "0":
|
||||||
|
return " "
|
||||||
|
elif char == "1":
|
||||||
|
return "R"
|
||||||
|
elif char == "2":
|
||||||
|
return "Y"
|
||||||
|
|
||||||
|
else:
|
||||||
|
return "C"
|
||||||
|
|
||||||
|
def printBoard():
|
||||||
|
global board
|
||||||
|
|
||||||
|
boardChunks = []
|
||||||
|
|
||||||
|
for i in range(0, len(board), 7):
|
||||||
|
chunk = board[i:i+7]
|
||||||
|
boardChunks.append(chunk)
|
||||||
|
|
||||||
|
print(" CONNECT FOUR")
|
||||||
|
print("=============================")
|
||||||
|
|
||||||
|
for chunk in boardChunks:
|
||||||
|
row = "|"
|
||||||
|
for tile in chunk:
|
||||||
|
row += f" {prettyChar(tile)} |"
|
||||||
|
print(row)
|
||||||
|
|
||||||
|
print("=============================")
|
||||||
|
|
||||||
|
def getColumn():
|
||||||
|
global player
|
||||||
|
while True:
|
||||||
|
try:
|
||||||
|
column = int(input(f"{prettyChar(player)}, where drop the tile? "))-1
|
||||||
|
return column
|
||||||
|
except ValueError:
|
||||||
|
print("bro enter an int")
|
||||||
|
|
||||||
|
def dropTile(col):
|
||||||
|
global board, player
|
||||||
|
index = next((row * 7 + col for row in range(5, -1, -1) if board[row * 7 + col] == '0'), None)
|
||||||
|
|
||||||
|
if index is None:
|
||||||
|
raise ValueError("Column is full")
|
||||||
|
|
||||||
|
board = board[:index] + str(player) + board[index+1:]
|
||||||
|
|
||||||
|
while True:
|
||||||
|
clear()
|
||||||
|
printBoard()
|
||||||
|
while True:
|
||||||
|
try:
|
||||||
|
col = getColumn()
|
||||||
|
dropTile(col)
|
||||||
|
break
|
||||||
|
except KeyboardInterrupt:
|
||||||
|
print("toodle-oo")
|
||||||
|
exit()
|
||||||
|
except:
|
||||||
|
print('monkey')
|
||||||
|
print(player)
|
||||||
|
|
||||||
|
|
||||||
|
player = "2" if player == "1" else "1"
|
||||||
|
|
@ -99,7 +99,7 @@ def drop_tile(col_index):
|
||||||
target_tile.hover_colour = yellow_tile_hover
|
target_tile.hover_colour = yellow_tile_hover
|
||||||
return r
|
return r
|
||||||
|
|
||||||
def check_win():
|
def check_win() -> list[Button, Button, Button, Button]:
|
||||||
global tiles, player
|
global tiles, player
|
||||||
|
|
||||||
colours = [yellow_tile, yellow_tile_hover] if player == "yellow" else [red_tile, red_tile_hover]
|
colours = [yellow_tile, yellow_tile_hover] if player == "yellow" else [red_tile, red_tile_hover]
|
||||||
|
|
@ -122,7 +122,7 @@ def check_win():
|
||||||
if all(tiles[col + i][row - i].colour in colours for i in range(winCount)):
|
if all(tiles[col + i][row - i].colour in colours for i in range(winCount)):
|
||||||
return [(col + i, row - i) for i in range(winCount)]
|
return [(col + i, row - i) for i in range(winCount)]
|
||||||
|
|
||||||
def is_board_full():
|
def is_board_full() -> bool:
|
||||||
for col in tiles:
|
for col in tiles:
|
||||||
for tile in col:
|
for tile in col:
|
||||||
if tile.colour == tile_colour:
|
if tile.colour == tile_colour:
|
||||||
|
|
@ -140,15 +140,17 @@ def play_move(col_index: int):
|
||||||
return
|
return
|
||||||
|
|
||||||
if last_tile:
|
if last_tile:
|
||||||
tiles[last_tile[0]][last_tile[1]].img = None
|
old_tile: Button = tiles[last_tile[0]][last_tile[1]]
|
||||||
|
old_tile.img = None
|
||||||
last_tile = (col_index, row_dropped)
|
last_tile = (col_index, row_dropped)
|
||||||
|
|
||||||
wins = check_win()
|
wins = check_win()
|
||||||
if wins:
|
if wins:
|
||||||
winner = player
|
winner = player
|
||||||
for winX, winY in wins:
|
for winX, winY in wins:
|
||||||
tiles[winX][winY].outline_width = 5
|
tile: Button = tiles[winX][winY]
|
||||||
tiles[winX][winY].outline_colour = win_outline_colour
|
tile.outline_width = 5
|
||||||
|
tile.outline_colour = win_outline_colour
|
||||||
board_full = True
|
board_full = True
|
||||||
elif is_board_full():
|
elif is_board_full():
|
||||||
winner = None
|
winner = None
|
||||||
|
|
@ -175,11 +177,11 @@ start_button = Button(x, y - 100, width, height, "Start Game",
|
||||||
lambda *_: menu_manager.change_menu("mode_pick"),
|
lambda *_: menu_manager.change_menu("mode_pick"),
|
||||||
font, 50, rounding=8)
|
font, 50, rounding=8)
|
||||||
|
|
||||||
pvp_button = Button(x, y-height/1.5, width, height, "Player vs Player",
|
pvp_button = Button(x-50, y-height/1.5, width+100, height, "Player vs Player",
|
||||||
primary_colour, hover_colour, text_colour,
|
primary_colour, hover_colour, text_colour,
|
||||||
lambda *_: start_game("pvp"), font, 50, rounding=8)
|
lambda *_: start_game("pvp"), font, 50, rounding=8)
|
||||||
|
|
||||||
pvc_button = Button(x, y+height/1.5, width, height, "Player vs CPU",
|
pvc_button = Button(x-50, y+height/1.5, width+100, height, "Player vs CPU",
|
||||||
primary_colour, hover_colour, text_colour,
|
primary_colour, hover_colour, text_colour,
|
||||||
lambda *_: start_game("cpu"), font, 50, rounding=8)
|
lambda *_: start_game("cpu"), font, 50, rounding=8)
|
||||||
|
|
||||||
|
|
|
||||||
4
settings.json
Normal file
4
settings.json
Normal file
|
|
@ -0,0 +1,4 @@
|
||||||
|
{
|
||||||
|
"display_mode": "coloured_background",
|
||||||
|
"cpu_search_depth": 6
|
||||||
|
}
|
||||||
Loading…
Reference in New Issue
Block a user