python简易五子棋游戏

1.新人用于记录个人学习python的过程,主要想写一下计算五子棋胜利的方法,不够完善,只是个大概,后续也许可能会更新

2.实现过程

        python版本用的3.10.4

        用到的包

        pygame 、tkinter、pynput、threading

        代码块

import pygame
from tkinter import Canvas
import tkinter
import pynput.mouse as pm
import threading

##全局变量,除2取余为0则为蓝,为1则为红
index = 0
##设置两个数组,存放红棋和蓝棋坐标
arr_blue = []
arr_red =[]
box = []

win = tkinter.Tk()
win.title="五子棋"
win.geometry("600x600")

ca = Canvas(win,width= 510,height= 510,bg="white")
ca.pack()

##计算五子棋胜利方法
##共有4个方向,横向、纵向、正斜、反斜
##拿横向来讲,找到棋子落点,
# 先向棋子左方查询连续的棋子,查询左1,如果存在棋子则放入数组,然后查询左2 ...依次将连续的棋子放入数组,
# 若查找位置没有棋子,则此次查找结束,然后重复上面查询右侧棋子,等左右查询结束,判断数组中的棋子数量是否等于5个,
# 若等于5则代表胜利,否则就为正常落子游戏继续
def is_success(x,y,type):
    global box
    get_arr = []
    if type==0: ##type为0则判断蓝棋是否胜利
        get_arr = arr_blue
    if type==1: ##type为1则判断红棋是否胜利
        get_arr = arr_red

    box = []
    ##判断横向
    box.append([x,y])
    ##往左判断
    search_info(x,y,-30,0,get_arr)
    ##往右判断
    search_info(x,y,30,0,get_arr)
    if len(box)==5:
        box = []
        return True

    box = []
    ##判断纵向
    box.append([x,y])
    ##往上判断
    search_info(x,y,0,-30,get_arr)
    ##往下判断
    search_info(x,y,0,30,get_arr)
    if len(box)==5:
        box = []
        return True
    
    box = []
    ##判断反斜
    box.append([x,y])
    ##往上判断
    search_info(x,y,-30,-30,get_arr)
    ##往下判断
    search_info(x,y,30,30,get_arr)
    if len(box)==5:
        box = []
        return True

    box = []
    ##判断正斜
    box.append([x,y])
    ##往上判断
    search_info(x,y,30,-30,get_arr)
    ##往下判断
    search_info(x,y,-30,30,get_arr)
    if len(box)==5:
        box = []
        return True

#传入坐标判断数组中是否有值,有则返回此坐标,无则返回false
def search_info(x,y,value_x,value_y,getArr):
    global box
    if [x+value_x,y+value_y] in getArr:
        box.append([x+value_x,y+value_y])
        search_info(x+value_x,y+value_y,value_x,value_y,getArr)

##落子
def chess_select(x,y):
    ##声明全局变量
    global index
    global arr_blue,arr_red
    ##定义色系
    color = ""
    ##将落子添加到数组中
    if(index%2==0):
        color = "blue"
        arr_blue.append([x,y])
    elif(index%2==1):
        color = "red"
        arr_red.append([x,y])
    ca.create_oval(x-10,y-10,x+10,y+10,width=1,fill=color)
    ##判断是否胜利
    if is_success(x,y,index%2):
        print(color+"胜利")
        return
    ##全局+1
    index += 1

##点击坐标
def handle_click(event):
    #点击坐标
    x = event.x
    y = event.y

    ##计算棋子落在位置,棋子半径设为10
    ##棋盘坐标最小为30,最大480,加减去棋子半径,最小为20,最大为490,因此超出范围不予响应
    if(x<20 or x>490 or y<20 or y>490):
        return
    
    ##坐标除30取余数,小于10则减去余数,大于20则加上(30-余数),10-20之间为不确定落子范围,无效返回
    get_x = x%30
    get_y = y%30

    ###落子地不确定,直接返回
    if(get_x>10 and get_x<20)or (get_y>10 and get_y<20):
        return

    ###处理x坐标
    if(get_x<=10):
        x = x-get_x
    elif(get_x>=20):
        x = x+(30-get_x)
    ###处理y坐标
    if(get_y<=10):
        y = y-get_y
    elif(get_y>=20):
        y = y+(30-get_y)

    ##落子方法
    chess_select(x,y)

##横纵坐标最大480,最小30
for num in range(1,17):
    ca.create_line(num*30,30,num*30,480,width=1)
for num in range(1,17):
    ca.create_line(30,num*30,480,num*30,width=1)

ca.bind('<Button-1>', handle_click)

if __name__=='__main__':
    win.mainloop()

        

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
好的,以下是一个简易Python 五子棋游戏实现: ```python import os # 初始化棋盘 board = [] for i in range(15): board.append(['+']*15) # 打印棋盘 def print_board(): os.system('cls') print(' ', end='') for i in range(15): print(chr(65+i), end=' ') print() for i in range(15): print(i+1, end=' ') for j in range(15): print(board[i][j], end=' ') print() # 判断胜负 def check_win(row, col): # 横向判断 count = 1 for i in range(col-1, -1, -1): if board[row][i] == board[row][col]: count += 1 else: break for i in range(col+1, 15): if board[row][i] == board[row][col]: count += 1 else: break if count >= 5: return True # 纵向判断 count = 1 for i in range(row-1, -1, -1): if board[i][col] == board[row][col]: count += 1 else: break for i in range(row+1, 15): if board[i][col] == board[row][col]: count += 1 else: break if count >= 5: return True # 左上-右下判断 count = 1 i = row - 1 j = col - 1 while i >= 0 and j >= 0: if board[i][j] == board[row][col]: count += 1 i -= 1 j -= 1 else: break i = row + 1 j = col + 1 while i < 15 and j < 15: if board[i][j] == board[row][col]: count += 1 i += 1 j += 1 else: break if count >= 5: return True # 右上-左下判断 count = 1 i = row - 1 j = col + 1 while i >= 0 and j < 15: if board[i][j] == board[row][col]: count += 1 i -= 1 j += 1 else: break i = row + 1 j = col - 1 while i < 15 and j >= 0: if board[i][j] == board[row][col]: count += 1 i += 1 j -= 1 else: break if count >= 5: return True return False # 开始游戏 player = 'B' while True: print_board() print('当前玩家:', player) move = input('请输入您的落子(例如:A1):') col = ord(move[0]) - ord('A') row = int(move[1:]) - 1 if board[row][col] == '+': board[row][col] = player if check_win(row, col): print_board() print(player, '获胜!') break player = 'B' if player == 'W' else 'W' else: print('此位置已经下过,请重新输入!') ``` 运行上述代码,即可开始玩简易五子棋游戏
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值