这篇博客主要是为了学习Python和PyQt,因为对棋类游戏比较热衷,所以从规则较简单的五子棋入手,利用PyQt5实现图形界面,做一个可以进行人机对弈的脚本,最后打包成应用程序.AI的算法打算用神经网络来完成,正在苦学TensorFlow中。
本来我以为五子棋规则很简单,不就像小学时候玩的那样,五个棋子连在一起就赢了嘛,但是后来发现事情并没有那么简单,现在的五子棋有禁手这个规则,“三三禁手”、“四四禁手”,“长连禁手”等等,都是为了限制现行一方必胜。我也不是职业的棋的手,对吧,所以禁手什么的就不考虑了,弄个简单的成品出来就很满足了。
代码全是边学习边写的,有瑕疵的地方欢迎提出。
<强>第一步,>强收集素材
主要就是棋子,棋盘的图片,还有下棋的音效
音效与代码一起在最后给出
<强>第二步,强>五子棋的逻辑类
收集完素材后,不着急界面的编写,先将五子棋的逻辑写好,界面和逻辑要分开,这很重要。
先想想在五子棋的逻辑类里要有哪些东西。
首先是棋盘,棋盘用15 * 15的数组表示
然后是棋子,黑棋用1表示,白棋用2表示,空白就用0表示
再然后还要获取指定点的坐标,获取指定点的方向等等。
最重要的也是稍微有点难度的部分就是判断输赢。结合网上的方法和我自己的理解,下面贴出我写的代码,仅供参考。
chessboard.py
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - #定义棋子类型,输赢情况 # - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 空=0 黑色=1 白色=2 # - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - #定义棋盘类,绘制棋盘的形状,切换先后手,判断输赢等 # - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 棋盘类(对象): def __init__(自我): 自我。__board=[[空范围(15)n) m的范围(15)] 自我。__dir=[[(1,0)、(1,0)], [(0, 1), (0,1)], [(1, 1), (1,1)], [(1, 1), (1,1)]] #左(右)(上下)(左下右上)(左上右下) def委员会(自我):#返回数组对象 返回self.__board def draw_xy(自我,x, y,状态):#获取落子点坐标的状态 自我。__board [x] [y]=状态 def get_xy_on_logic_state(自我,x, y): #获取指定点坐标的状态 返回self.__board [x] [y] def get_next_xy(自我、点、方向):#获取指定点的指定方向的坐标 x=点[0]+[0]方向 y=点[1]+[1]方向 如果x & lt;0或x祝辞=15或y & lt;0或y祝辞=15: 返回假 其他: 返回x, y def get_xy_on_direction_state(自我、点、方向):#获取指定点的指定方向的状态 如果一点不假: xy=自我。get_next_xy(点、方向) 如果xy不是错误的: x, y=xy 返回self.__board [x] [y] 返回假 def anyone_win(自我,x, y):=自我状态。get_xy_on_logic_state (x, y) #当前落下的棋是黑棋还是白棋,它的状态存储在状态中 在自我的方向。__dir: #对米字的4个方向分别检测是否有5子相连的棋 数=1 #初始记录为1,因为刚落下的棋也算 方向的方向:#对落下的棋子的同一条线的两侧都要检测,结果累积 点=(x, y) #每次循环前都要刷新 而真正的: 如果自我。get_xy_on_direction_state(点、方向)==状态: 数+=1 点=自我。get_next_xy(点、方向) 其他: 打破 如果计数祝辞=5: 返回状态 返回空 def重置(自我):#重置 自我。__board=[[空范围(15)n) m的范围(15)]
将上面的代码放在chessboard.py里面就完成了最基本的操作了。
<强>第三步,>强利用PyQt5实现图形界面