五子棋——双人对决

这个博客展示了如何使用Python的Tkinter库创建一个五子棋游戏。游戏开始时,玩家可以输入黑方和白方的名字。棋盘通过二维数组初始化,并用图形界面绘制。当一方在横、竖、斜四个方向形成连续五个棋子时,系统会判断游戏结束并显示胜利者。点击屏幕落子,黑白双方轮流下棋,判断胜利条件的函数会检查每一步后的获胜情况。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

# 1、画棋盘,初始化棋盘
import tkinter
from turtle import *
zz=textinput('输入名字','黑方的名字是:')
yy=textinput('输入名字','白方的名字是:')
screensize()
tracer(0)
 
for i in range(15):#画横向
    penup()
    goto(-280,-280+i*40)
    pendown()
    fd(560)
left(90)
for i in range(15):#画竖向
    penup()
    goto(-280+i*40,-280)
    pendown()
    fd(560)
 
penup() #画标点
goto(0,0)
dot()
goto(160,160)
dot()
goto(-160,160)
dot()
goto(160,-160)
dot()
goto(-160,-160)
dot()
 
#如果要使用列表创建一个二维数组,可以使用生成器来辅助实现。
#棋盘上每一个点初始值为0
arr=[[0 for i in range(15)] for j in range(15)]
 
 
# 3、判断4个方向是否连成五个子
 
def fun_null(x,y):
    return ;
 
def black_is_end(i,j):
    global arr
    for m in range(11): #竖向
        if arr[m][j]==1 and arr[m+1][j]==1 and arr[m+2][j]==1 and \
        arr[m+3][j]==1 and arr[m+4][j]==1:
            tkinter.messagebox.showinfo(title='胜利', message=zz+'胜利!')
            onscreenclick(fun_null)
    for m in range(11): #横向
        if arr[i][m]==1 and arr[i][m+1]==1 and arr[i][m+2]==1 and \
        arr[i][m+3]==1 and arr[i][m+4]==1:
            tkinter.messagebox.showinfo(title='胜利', message=zz+'胜利!')
            onscreenclick(fun_null)
    if i<=j:            #\向
        m=j-i     
        for k in range(m,11):
            if arr[k-m][k]==1 and arr[k-m+1][k+1]==1 and arr[k-m+2][k+2]==1 and \
               arr[k-m+3][k+3]==1 and arr[k-m+4][k+4]==1:
                tkinter.messagebox.showinfo(title='胜利', message=zz+'胜利!')
                onscreenclick(fun_null)
    if i>j:             #\向
        m=i-j    
        for k in range(m,11):
            if arr[k][k-m]==1 and arr[k+1][k-m+1]==1 and arr[k+2][k-m+2]==1 and \
               arr[k+3][k-m+3]==1 and arr[k+4][k-m+4]==1:
                tkinter.messagebox.showinfo(title='胜利', message=zz+'胜利!')
                onscreenclick(fun_null)
    n=i+j               #/向
    if n<=14:
        for k in range(0,n-4):
            if arr[k][n-k]==1 and arr[k+1][n-k-1]==1 and arr[k+2][n-k-2]==1 and \
               arr[k+3][n-k-3]==1 and arr[k+4][n-k-4]==1:
                tkinter.messagebox.showinfo(title='胜利', message=zz+'胜利!')
                onscreenclick(fun_null)
    if n>14:
        for v in range(n-14,11):
            if arr[v][n-v]==1 and arr[v+1][n-v-1]==1 and arr[v+2][n-v-2]==1 and \
               arr[v+3][n-v-3]==1 and arr[v+4][n-v-4]==1:
                tkinter.messagebox.showinfo(title='胜利', message=zz+'胜利!')
                onscreenclick(fun_null)
                
def white_is_end(i,j):
    global arr
    for m in range(11): #竖向
        if arr[m][j]==-1 and arr[m+1][j]==-1 and arr[m+2][j]==-1 and \
        arr[m+3][j]==-1 and arr[m+4][j]==-1:
            tkinter.messagebox.showinfo(title='胜利', message=yy+'胜利!')
            onscreenclick(fun_null)
    for m in range(11): #横向
        if arr[i][m]==-1 and arr[i][m+1]==-1 and arr[i][m+2]==-1 and \
        arr[i][m+3]==-1 and arr[i][m+4]==-1:
            tkinter.messagebox.showinfo(title='胜利', message=yy+'胜利!')

            onscreenclick(fun_null)
    if i<=j:            #\向
        m=j-i     
        for k in range(m,11):
            if arr[k-m][k]==-1 and arr[k-m+1][k+1]==-1 and arr[k-m+2][k+2]==-1 and \
               arr[k-m+3][k+3]==-1 and arr[k-m+4][k+4]==-1:
                tkinter.messagebox.showinfo(title='胜利', message=yy+'胜利!')

                onscreenclick(fun_null)
    if i>j:             #\向
        m=i-j    
        for k in range(m,11):
            if arr[k][k-m]==-1 and arr[k+1][k-m+1]==-1 and arr[k+2][k-m+2]==-1 and \
               arr[k+3][k-m+3]==-1 and arr[k+4][k-m+4]==-1:
                tkinter.messagebox.showinfo(title='胜利', message=yy+'胜利!')

                onscreenclick(fun_null)
    n=i+j               #/向
    if n<=14:
        for k in range(0,n-4):
            if arr[k][n-k]==-1 and arr[k+1][n-k-1]==-1 and arr[k+2][n-k-2]==-1 and \
               arr[k+3][n-k-3]==-1 and arr[k+4][n-k-4]==-1:
                tkinter.messagebox.showinfo(title='胜利', message=yy+'胜利!')

                onscreenclick(fun_null)
    if n>14:
        for v in range(n-14,11):
            if arr[v][n-v]==-1 and arr[v+1][n-v-1]==-1 and arr[v+2][n-v-2]==-1 and \
               arr[v+3][n-v-3]==-1 and arr[v+4][n-v-4]==-1:
                print("游戏结束,",yy,"胜利!")
                tkinter.messagebox.showinfo(title='胜利', message=yy+'胜利!')

                
 
 
# 2、鼠标事件,点击落子
 
turn=0 #记录该哪方落子
def funclick(x,y):
    global turn
    global arr
    if turn==0: #黑子先下1
        for i in range(15):
            Y=280-i*40
            for j in range(15):
                X=-280+j*40  #棋盘上的整点
                if abs(X-x)<20 and abs(Y-y)<20 and arr[i][j]==0:
                    arr[i][j]=1
                    goto(X,Y)
                    dot(20) 
                    turn=1  #交替下子
                    black_is_end(i,j)
    if turn==1: #白子-1
        for i in range(15):
            Y=280-i*40
            for j in range(15):
                X=-280+j*40  #棋盘上的整点
                if abs(X-x)<20 and abs(Y-y)<20 and arr[i][j]==0:
                    arr[i][j]=-1
                    goto(X+10,Y)
                    begin_fill()
                    fillcolor('white')

                    pendown()
                    circle(10)
                    end_fill()
                    penup()
                    turn=0  #交替下子
                    white_is_end(i,j)
    
onscreenclick(funclick)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值