四子棋 freepython

这是一个使用Python和Turtle库实现的四子棋游戏。玩家可以点击屏幕落子,游戏会检查是否形成四子连线并判断胜负。游戏包含改变棋子颜色、形状以及添加电脑玩家等功能,并提供了一个简单的游戏结束判断逻辑。
摘要由CSDN通过智能技术生成

四子棋,是黑白棋的一种。是一种益智的棋类游戏。黑白两方(也有其它颜色的棋子)在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()

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值