python实现简单五子棋

 规则:用鼠标下子,黑子白子交替下子

核心:1、使用turtle库画棋盘

           2、turtle库中的onscreenclick()函数,实现鼠标点击

详细步骤:

1、画棋盘,初始化数组

用turtle()库fd()函数实现画直线,tracer(0)消除动画效果

定义一个二维数组,也就是列表来对应棋盘上的落子情况,没有子为0,黑子为1,白子为-1

​
# 1、画棋盘,初始化棋盘
from turtle import *
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)]

2、实现落子功能

函数:turtle.onscreenclick(fun, btn=1, add=None)

参数:

fun 一个具有两个参数的函数,即画布上单击点的坐标。

btn mouse-button的编号默认为1(鼠标左键)

add 对或错。如果为True,将添加新的绑定,否则它将替换以前的绑定

funclick(x,y)函数:落子功能实现,通过遍历每个点,判断鼠标点击的位置与遍历的位置的距离,如果距离在范围内,并且该位置上没有子,就实现落子,然后交换落子者

# 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)
                    pendown()
                    circle(10)
                    penup()
                    turn=0  #交替下子
                    white_is_end(i,j)
    
onscreenclick(funclick)

3、判断是否五子连线、

black_is_end()函数:

①横向:由落子位置所在行数,从该行第一个位置开始判断往右5个是否都为刚才所落颜色的子,不是的话继续从第二个位置开始,往右5个判断,直到判断到最后一个子。

②竖向:由落子位置所在列数,从该列第一个位置开始判断往下5个是否都为刚才所落颜色的子,不是的话继续从第二个位置开始,往下5个判断,直到判断到最后一个子。

③\ 向:由落子位置向左斜上方找到第一个子然后遍历

④/ 向:由落子位置向右斜上方找到第一个子然后遍历

如果连成5子,输出那一方胜利,把onscreenclick()函数置空,使点击鼠标不能再下子。

​



# 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:
            print("游戏结束,黑子胜利!")
            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:
            print("游戏结束,黑子胜利!")
            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:
                print("游戏结束,黑子胜利!")
                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:
                print("游戏结束,黑子胜利!")
                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:
                print("游戏结束,黑子胜利!")
                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("游戏结束,黑子胜利!")
                onscreenclick(fun_null)
                


​

源代码 :

# 1、画棋盘,初始化棋盘
from turtle import *
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:
            print("游戏结束,黑子胜利!")
            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:
            print("游戏结束,黑子胜利!")
            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:
                print("游戏结束,黑子胜利!")
                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:
                print("游戏结束,黑子胜利!")
                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:
                print("游戏结束,黑子胜利!")
                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("游戏结束,黑子胜利!")
                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:
            print("游戏结束,白子胜利!")
            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:
            print("游戏结束,白子胜利!")
            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:
                print("游戏结束,白子胜利!")
                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:
                print("游戏结束,白子胜利!")
                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:
                print("游戏结束,白子胜利!")
                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("游戏结束,白子胜利!")
                onscreenclick(fun_null)
                


# 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)
                    pendown()
                    circle(10)
                    penup()
                    turn=0  #交替下子
                    white_is_end(i,j)
    
onscreenclick(funclick)

  • 50
    点赞
  • 329
    收藏
    觉得还不错? 一键收藏
  • 24
    评论
下面是一份简单Python 五子棋游戏代码,供您参考: ``` import numpy as np def create_board(): board = np.zeros((15,15)) return board def is_valid_move(board, row, col): if board[row][col] == 0: return True else: return False def make_move(board, row, col, player): board[row][col] = player def is_game_over(board, player): # check rows for i in range(15): for j in range(11): if board[i][j] == player and board[i][j+1] == player and board[i][j+2] == player and board[i][j+3] == player and board[i][j+4] == player: return True # check columns for i in range(11): for j in range(15): if board[i][j] == player and board[i+1][j] == player and board[i+2][j] == player and board[i+3][j] == player and board[i+4][j] == player: return True # check diagonals for i in range(11): for j in range(11): if board[i][j] == player and board[i+1][j+1] == player and board[i+2][j+2] == player and board[i+3][j+3] == player and board[i+4][j+4] == player: return True if board[i][j+4] == player and board[i+1][j+3] == player and board[i+2][j+2] == player and board[i+3][j+1] == player and board[i+4][j] == player: return True return False def print_board(board): print(board) def main(): board = create_board() print_board(board) player = 1 while True: row = int(input("Enter row: ")) col = int(input("Enter column: ")) if is_valid_move(board, row, col): make_move(board, row, col, player) if is_game_over(board, player): print("Player", player, "wins!") break player = 2 if player == 1 else 1 print_board(board) else: print("Invalid move. Try again.") if __name__ == '__main__': main() ``` 这份代码实现了一个简单五子棋游戏,使用了 numpy 库来创建棋盘。您可以在控制台中运行该代码,并按照提示输入行和列来落子。当有一方获胜时,游戏结束并显示胜者。
评论 24
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值