PyQt5实现五子棋游戏(人机对弈)

  

这篇博客主要是为了学习Python和PyQt,因为对棋类游戏比较热衷,所以从规则较简单的五子棋入手,利用PyQt5实现图形界面,做一个可以进行人机对弈的脚本,最后打包成应用程序.AI的算法打算用神经网络来完成,正在苦学TensorFlow中。

  

本来我以为五子棋规则很简单,不就像小学时候玩的那样,五个棋子连在一起就赢了嘛,但是后来发现事情并没有那么简单,现在的五子棋有禁手这个规则,“三三禁手”、“四四禁手”,“长连禁手”等等,都是为了限制现行一方必胜。我也不是职业的棋的手,对吧,所以禁手什么的就不考虑了,弄个简单的成品出来就很满足了。

  

代码全是边学习边写的,有瑕疵的地方欢迎提出。

  

<强>第一步,强收集素材

  

主要就是棋子,棋盘的图片,还有下棋的音效

  

 PyQt5实现五子棋游戏(人机对弈)

  

 PyQt5实现五子棋游戏(人机对弈)

  

 PyQt5实现五子棋游戏(人机对弈)

  

音效与代码一起在最后给出

  

<强>第二步,五子棋的逻辑类

  

收集完素材后,不着急界面的编写,先将五子棋的逻辑写好,界面和逻辑要分开,这很重要。

  

先想想在五子棋的逻辑类里要有哪些东西。

  

首先是棋盘,棋盘用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实现图形界面

PyQt5实现五子棋游戏(人机对弈)