这篇博客主要是为了学习Python和PyQt,因为对棋类游戏比较热衷,所以从规则较简单的五子棋入手,利用PyQt5实现图形界面,做一个可以进行人机对弈的脚本,最后打包成应用程序。AI的算法打算用神经网络来完成,正在苦学TensorFlow中。
让客户满意是我们工作的目标,不断超越客户的期望值来自于我们对这个行业的热爱。我们立志把好的技术通过有效、简单的方式提供给客户,将通过不懈努力成为客户在信息化领域值得信任、有价值的长期合作伙伴,公司提供的服务项目有:国际域名空间、虚拟空间、营销软件、网站建设、德令哈网站维护、网站推广。本来我以为五子棋规则很简单,不就像小学时候玩的那样,五个棋子连在一起就赢了嘛,但是后来发现事情并没有那么简单,现在的五子棋有禁手这个规则 ,“三三禁手” 、“四四禁手”、“长连禁手”等等,都是为了限制现行一方必胜。我也不是职业的棋手,对吧,所以禁手什么的就不考虑了,弄个简单的成品出来就很满足了。
代码全是边学习边写的,有瑕疵的地方欢迎提出。
第一步,收集素材
主要就是棋子、棋盘的图片,还有下棋的音效
音效与代码一起在最后给出
第二步,五子棋的逻辑类
收集完素材后,不着急界面的编写,先将五子棋的逻辑写好,界面和逻辑要分开,这很重要。
先想想在五子棋的逻辑类里要有哪些东西。
首先是棋盘,棋盘用15*15的数组表示
然后是棋子,黑棋用1表示,白棋用2表示,空白就用0表示
再然后还要获取指定点的坐标,获取指定点的方向等等。
最重要的也是稍微有点难度的部分就是判断输赢。结合网上的方法和我自己的理解,下面贴出我写的代码,仅供参考。
chessboard.py
# ---------------------------------------------------------------------- # 定义棋子类型,输赢情况 # ---------------------------------------------------------------------- EMPTY = 0 BLACK = 1 WHITE = 2 # ---------------------------------------------------------------------- # 定义棋盘类,绘制棋盘的形状,切换先后手,判断输赢等 # ---------------------------------------------------------------------- class ChessBoard(object): def __init__(self): self.__board = [[EMPTY for n in range(15)] for m in range(15)] self.__dir = [[(-1, 0), (1, 0)], [(0, -1), (0, 1)], [(-1, 1), (1, -1)], [(-1, -1), (1, 1)]] # (左 右) (上 下) (左下 右上) (左上 右下) def board(self): # 返回数组对象 return self.__board def draw_xy(self, x, y, state): # 获取落子点坐标的状态 self.__board[x][y] = state def get_xy_on_logic_state(self, x, y): # 获取指定点坐标的状态 return self.__board[x][y] def get_next_xy(self, point, direction): # 获取指定点的指定方向的坐标 x = point[0] + direction[0] y = point[1] + direction[1] if x < 0 or x >= 15 or y < 0 or y >= 15: return False else: return x, y def get_xy_on_direction_state(self, point, direction): # 获取指定点的指定方向的状态 if point is not False: xy = self.get_next_xy(point, direction) if xy is not False: x, y = xy return self.__board[x][y] return False def anyone_win(self, x, y): state = self.get_xy_on_logic_state(x, y) # 当前落下的棋是黑棋还是白棋,它的状态存储在state中 for directions in self.__dir: # 对米字的4个方向分别检测是否有5子相连的棋 count = 1 # 初始记录为1,因为刚落下的棋也算 for direction in directions: # 对落下的棋子的同一条线的两侧都要检测,结果累积 point = (x, y) # 每次循环前都要刷新 while True: if self.get_xy_on_direction_state(point, direction) == state: count += 1 point = self.get_next_xy(point, direction) else: break if count >= 5: return state return EMPTY def reset(self): # 重置 self.__board = [[EMPTY for n in range(15)] for m in range(15)]