-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathconect_four.py
More file actions
123 lines (111 loc) · 3.38 KB
/
conect_four.py
File metadata and controls
123 lines (111 loc) · 3.38 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
H = 6
W = 7
RED = 1
BLUE = 2
def find_all_pos(puzzle, player):
result = []
for i, col in enumerate(puzzle):
if len(col) < H:
j = len(col)
result.append((i, j))
return result
def at(puzzle, ii, jj, player):
if ii > -1 and ii < len(puzzle):
if jj > -1 and jj < len(puzzle[ii]):
return puzzle[ii][jj] == player
return False
def count(i, j, di, dj, puzzle, player):
cnt = 0
# Count left Horizontal
ii, jj = i, j
while True:
ii, jj = ii + di, jj + dj
if at(puzzle, ii, jj, player):
cnt += 1
else:
break
return cnt
def is_win(i, j, puzzle, player):
if count(i, j, -1, 0, puzzle, player) + count(i, j, 1, 0, puzzle, player) >= 3:
return True
if count(i, j, 0, -1, puzzle, player) + count(i, j, 0, 1, puzzle, player) >= 3:
return True
if count(i, j, -1, -1, puzzle, player) + count(i, j, 1, 1, puzzle, player) >= 3:
return True
if count(i, j, -1, 1, puzzle, player) + count(i, j, 1, -1, puzzle, player) >= 3:
return True
return False
def other_player(player):
if player == 1:
return 2
else:
return 1
def deep_copy(puzzle):
new_puzzle = []
for col in puzzle:
new_puzzle.append(col.copy())
return new_puzzle
def make_move(puzzle, player, depth = 1):
all_poses = find_all_pos(puzzle, player)
print("possible positions", all_poses)
for ic, j in all_poses:
puzzle[ic].append(player)
if is_win(ic, j, puzzle, player):
return True, (ic, j)
new_puzzle = deep_copy(puzzle)
op = other_player(player)
if depth < 8 and make_move(new_puzzle, op, depth + 1):
puzzle[ic].pop()
else:
return True, (ic, j)
return False, None
def is_over(puzzle):
for col in puzzle:
if len(col) != H:
return False
return True
def printp(puzzle):
for j in range(H-1, -1, -1):
val = []
for col in puzzle:
if j < len(col):
val.append(str(col[j]))
else:
val.append("_")
print("[" + " | ".join(val) + "]")
if __name__ == '__main__2':
puzzle = [[] for i in range(W)] #Left is bottom, # End of list is top
puzzle[0] = [1,1,1,1]
print(is_win(0, 0, puzzle, 1))
if __name__ == '__main__':
puzzle = [[] for i in range(W)] #Left is bottom, # End of list is top
while not is_over(puzzle):
print(f"I,{RED}, am making a move...")
result, pos = make_move(puzzle, RED)
if not result:
print("Can't make a move.")
break
else:
print("Made move!")
irow, icol = pos
if is_win(irow, icol, puzzle, BLUE):
print("I won!")
break
elif is_over(puzzle):
print("Game Over")
break
printp(puzzle)
irow = None
icol = None
while True:
srow = input(f"Player {BLUE} to move. Which row do you want to put [1-{W}]:")
irow = int(srow) - 1
if irow < 0 or irow >= W or len(puzzle[irow]) >= H:
print("Invalid Move")
else:
icol = len(puzzle[irow])
puzzle[irow].append(BLUE)
break
if is_win(irow, icol, puzzle, BLUE):
print("You won!")
break