四子棋,是黑白棋的一种。是一种益智的棋类游戏。黑白两方(也有其它颜色的棋子)在8*8的格子内依次落子。黑方为先手,白方为后手。落子规则为,每一列必须从最底下的一格开始。依此可向上一格落子。一方落子后另一方落子,依此抡次。直到游戏结束。
"""Connect Four
Exercises 尝试练习
改变颜色
改变形状
创造电脑用户
你怎么判断赢家
1. Change the colors.
2. Draw squares instead of circles for open spaces.
3. Add logic to detect a full row.
4. Create a random computer player.
5. How would you detect a winner?
"""
from turtle import *
from freegames import line
turns = {'red': 'yellow', 'yellow': 'red'}
state = {'player': 'yellow', 'rows': [0] * 8}
su = {'yellow': 1, 'red': 2}
lst = [[0 for col in range(8)] for row in range(8)]
cha = 4
def grid():
"""Draw Connect Four grid."""
bgcolor('light blue')
# for x in range(-150, 200, 50):
# line(x, -200, x, 200)
for x in range(-175, 200, 50):
for y in range(-175, 200, 50):
up()
goto(x, y)
# begin_fill()
# fillcolor('white')
# for r in range(4):
# forward(40)
# right(90)
# end_fill()
dot(40, 'white')
update()
def tap(x, y):
"""Draw red or yellow circle in tapped row."""
if cha == 1:
return
player = state['player']
rows = state['rows']
row = int((x + 200) // 50)
count = rows[row]
if count >= 8:
return
x = int(((x + 200) // 50) * 50 - 200 + 25)
y = int(count * 50 - 200 + 25)
up()
goto(x, y)
dot(40, player)
# begin_fill()
# fillcolor(player)
# for r in range(4):
# forward(40)
# right(90)
# end_fill()
update()
rows[row] = count + 1
# print(row, count)
state['player'] = turns[player]
lst[row][count] = su[player]
xy = lst[row][count]
check(row, count, xy)
def dfs(x, y, xd, yd, xys):
num = 0
tx = 0
ty = 0
for i in range(1, 5):
tx = x + xd * i
ty = y + yd * i
if 8 > tx > -1 and 8 > ty > -1:
if lst[tx][ty] != xys:
break
num += 1
else:
break
for i in range(1, 5):
tx = x - xd * i
ty = y - yd * i
if 8 > tx > -1 and 8 > ty > -1:
if lst[tx][ty] != xys:
break
num += 1
else:
break
if num >= 4:
return True
return False
def check(x, y, xy):
if dfs(x, y, 0, 1, xy) or dfs(x, y, 1, 0, xy) or dfs(x, y, 1, 1, xy) or dfs(x, y, -1, 1, xy):
# 上下直线判断 # 左右直线判断 # 右朝上直线判断# 右朝下直线判断
print('yyyyeeesss')
dot(40, 'black')
global cha
cha = 1
# begin_fill()
# fillcolor('black')
# for r in range(4):
# forward(40)
# right(90)
# end_fill()
return False
setup(420, 420, 370, 0)
hideturtle()
tracer(False)
grid()
onscreenclick(tap)
done()