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()