python五子棋程序,qt小游戏开发-五子棋

  python五子棋程序,qt小游戏开发:五子棋

  本文主要详细介绍Python3用Qt5做的简单五子棋游戏。本文中的示例代码非常详细,具有一定的参考价值。感兴趣的朋友可以参考一下。

  写一个五子棋游戏,我们首先要解决的是如何下,如何判断有连续五局,而不是如何画图,所以我们先确定棋盘。

  五子棋用的是15*15的棋盘。因此,我们可以使用二维列表创建一个棋盘。我们不妨认为0代表没有棋子,1代表白子,2代表太阳黑子。

  显然你可以列一个清单,注意不能使用*来复制列表.

  self . chess _ board=[[0 for I in range(15)]for I in range(15)]

  下棋的步骤很容易做到。你只需要找到相应的索引来赋值。下一步应该是解决如何判断连珠的问题。

  我们应该在完成了招式之后再判断是否完成了五子连投。对于一个刚刚放置的棋子,大致有四种可能的情况:

  1.水平

  2.向右下方倾斜

  3.垂直的

  4.向右上方倾斜

  判断连铸坯是否已经成功,我们从新放置的棋子开始,先向前遍历四个棋子,统计相同棋子的个数。一旦遇到不同的棋子,我们就停下来,然后从起点向后遍历四个棋子,直到所有的棋子都被遍历完或者棋子总数达到五个,然后就可以回去了。我们只需要注意如何获得棋子的前后棋子棋盘的边界问题.棋子不能走出棋盘,所以被走过的棋子也不能走出棋盘。

  以关卡为例,可以得到代码。

  def judge_1(self,x:int,y:int) - bool:

  计数=1

  if self.chess_board[x][y]!=0:

  对于(1,5):范围内的I

  如果y - i=0:

  if self . chess _ board[x][y]==self . chess _ board[x][y-I]:

  打印(x,y-i)

  计数=1

  else:

  破裂

  else:

  破裂

  对于(1,5):范围内的I

  如果y i=14:

  if self . chess _ board[x][y]==self . chess _ board[x][y I]:

  打印(x,y,I)

  计数=1

  else:

  破裂

  else:

  破裂

  如果计数==5:

  返回True

  返回False

  通过类似步骤完成另外三个判断,五子棋游戏的核心要素已经完成,剩下的就需要交给PyQt5完成游戏的绘制来完善游戏了。

  我们创建一个类来继承QWidget类,创建一个窗口,然后我们需要创建几个属性来存储我们的数据信息。

  #棋子的坐标

  self.x=-1

  self.y=-1

  #区分玩家

  #开始标签

  self.flag=False

  #储存已经放下的白子

  self.white_chess=[]

  #储存已经种下的黑子。

  self.black_chess=[]

  我们已经可以开始画棋盘了。在Qt5中,如果我们需要画图,我们应该重写paint event方法,这个方法会被程序自动调用并执行。创建一个QPainter对象,用begin和end方法把要绘制的内容包装起来,就可以完成绘制了。

  我们用drawLine方法画线,drawEllipse方法画棋子,setPen改变线条样式,setBrush改变棋子样式。

  获取(本段代码有参考他人代码,这是我第一次接触Qt的绘制).代码

  -在GUI中

  x轴竖直向下,y轴水平向右,因此绘制棋子时的x与y需要颠倒---------------

  

#绘制棋盘与棋子

      def paintEvent(self, e) -> None:

          qp = QPainter()

          qp.begin(self)

          qp.fillRect(self.rect(), QColor("light blue"))

          qp.drawRect(self.rect())

          qp.setBackground(QColor("yellow"))

          qp.setPen(QPen(QColor(0, 0, 0), 2, Qt.SolidLine))

          for i in range(15):

              qp.drawLine(QPoint(30, 30 + 30 * i), QPoint(450, 30 + 30 * i))

          for i in range(15):

              qp.drawLine(QPoint(30 + 30 * i, 30), QPoint(30 + 30 * i, 450))

          qp.setBrush(QColor(0, 0, 0))

          key_points = [(3, 3), (11, 3), (3, 11), (11, 11), (7, 7)]

          if len(self.black_chess) != 0:

              for t in self.black_chess:

                  #画黑子

                  qp.drawEllipse(QPoint(30 + 30 * t[1], 30 + 30 * t[0]), 6, 6)

          for t in key_points:

              #棋盘的5个定点

              qp.drawEllipse(QPoint(30 + 30 * t[0], 30 + 30 * t[1]), 3, 3)

          qp.setBrush(QColor(255,255,255))

          if len(self.white_chess) != 0:

              for t in self.white_chess:

                  #画白子

                  qp.drawEllipse(QPoint(30 + 30 * t[1], 30 + 30 * t[0]), 6, 6)

          qp.end()

  另一个需要在GUI中解决的问题就是,如何获取要下的棋子的坐标?我们可以通过重写鼠标事件来解决,重写单机事件mousePressEvent,并修改棋子的x坐标与y坐标即可,另外,用户不可能每次都恰巧点到我们规定的坐标点上,因此需要给出一个大致范围判断,这里我的方式是先获取坐标,然后根据坐标找到距离最近的点

  

def mousePressEvent(self, e) -> None:

          if e.buttons() == QtCore.Qt.LeftButton:

              if e.x() > 15 and e.x() < 465 and e.y() > 15 and e.y() < 465:

                  x = e.x()/30 - e.x()//30

                  y = e.y()/30 - e.y()//30

                  self.y = (e.x()-30)//30 if x < 0.5 else (e.x()-30)//30 + 1

                  self.x = (e.y()-30)//30 if y < 0.5 else (e.y()-30)//30 + 1

                  if self.flag:

                      print(self.x,self.y)

                      if self.player % 2 == 1:

                          if goBang.put_white_chess(self.x,self.y):

                              self.player += 1 

                              print(黑子行动)

                          else:

                              print(白子行动)

                          if goBang.judge(self.x,self.y):

                              msg_box = QMessageBox(QMessageBox.Information, 提示, 白子获胜!)

                              msg_box.exec_()

                      else:

                          if goBang.put_black_chess(self.x,self.y):

                              self.player += 1

                              print(白子行动)

                          else:

                              print(黑子行动)

                          if goBang.judge(self.x,self.y):

                              msg_box = QMessageBox(QMessageBox.Information, 提示, 黑子获胜!)

                              msg_box.exec_()

  每当游戏完成,我们应该可以清空棋盘,也就是将所有储存数据的变量都重新初始化再重绘棋盘

  

#清除棋盘,重开游戏

      def clear(self) -> None:

          self.x = -1

          self.y = -1

          self.player = 0

          self.flag = False

          self.white_chess = []

          self.black_chess = []

          self.chess_board = [[0 for i in range(15)] for i in range(15)]

          self.update()

  这样就大致结束了!!

  下面是全部代码:

  

from PyQt5 import *

  from PyQt5 import QtCore

  from PyQt5.QtWidgets import *

  from PyQt5.QtGui import *

  from PyQt5.QtCore import *

  import sys

  class GoBang(QWidget):

      #初始化棋盘

      def __init__(self):

          super().__init__()

          self.setWindowTitle(五子棋Hi~ o(* ̄▽ ̄*)ブ)

          self.x = -1

          self.y = -1

          #区分玩家

          self.player = 0

          #开始标签

          self.flag = False

          #储存已经下好的白子

          self.white_chess = []

          #储存已经下好的黑子

          self.black_chess = []

          self.setFixedSize(800,600)

          self.chess_board = [[0 for i in range(15)] for i in range(15)]

          btn1 = QPushButton(开始,self)

          btn1.setGeometry(500,100,50,30)

          btn1.clicked.connect(self.setFlag)

          btn2 = QPushButton(重开,self)

          btn2.setGeometry(550,100,50,30)

          btn2.clicked.connect(self.clear)

          self.show()

      #绘制棋盘与棋子

      def paintEvent(self, e) -> None:

          qp = QPainter()

          qp.begin(self)

          qp.fillRect(self.rect(), QColor("light blue"))

          qp.drawRect(self.rect())

          qp.setBackground(QColor("yellow"))

          qp.setPen(QPen(QColor(0, 0, 0), 2, Qt.SolidLine))

          for i in range(15):

              qp.drawLine(QPoint(30, 30 + 30 * i), QPoint(450, 30 + 30 * i))

          for i in range(15):

              qp.drawLine(QPoint(30 + 30 * i, 30), QPoint(30 + 30 * i, 450))

          qp.setBrush(QColor(0, 0, 0))

          key_points = [(3, 3), (11, 3), (3, 11), (11, 11), (7, 7)]

          if len(self.black_chess) != 0:

              for t in self.black_chess:

                  #画黑子

                  qp.drawEllipse(QPoint(30 + 30 * t[1], 30 + 30 * t[0]), 6, 6)

          for t in key_points:

              #棋盘的5个定点

              qp.drawEllipse(QPoint(30 + 30 * t[0], 30 + 30 * t[1]), 3, 3)

          qp.setBrush(QColor(255,255,255))

          if len(self.white_chess) != 0:

              for t in self.white_chess:

                  #画白子

                  qp.drawEllipse(QPoint(30 + 30 * t[1], 30 + 30 * t[0]), 6, 6)

          qp.end()

      #更改标签,开始游戏

      def setFlag(self) -> None:

          self.flag = True

      def mousePressEvent(self, e) -> None:

          if e.buttons() == QtCore.Qt.LeftButton:

              if e.x() > 15 and e.x() < 465 and e.y() > 15 and e.y() < 465:

                  x = e.x()/30 - e.x()//30

                  y = e.y()/30 - e.y()//30

                  self.y = (e.x()-30)//30 if x < 0.5 else (e.x()-30)//30 + 1

                  self.x = (e.y()-30)//30 if y < 0.5 else (e.y()-30)//30 + 1

                  if self.flag:

                      print(self.x,self.y)

                      if self.player % 2 == 1:

                          if goBang.put_white_chess(self.x,self.y):

                              self.player += 1 

                              print(黑子行动)

                          else:

                              print(白子行动)

                          if goBang.judge(self.x,self.y):

                              msg_box = QMessageBox(QMessageBox.Information, 提示, 白子获胜!)

                              msg_box.exec_()

                      else:

                          if goBang.put_black_chess(self.x,self.y):

                              self.player += 1

                              print(白子行动)

                          else:

                              print(黑子行动)

                          if goBang.judge(self.x,self.y):

                              msg_box = QMessageBox(QMessageBox.Information, 提示, 黑子获胜!)

                              msg_box.exec_()

      #下白子

      def put_white_chess(self,x:int,y:int) -> bool:

          if self.chess_board[x][y] != 0:

              msg_box = QMessageBox(QMessageBox.Information, 提示, 这个位置已经有棋子了!)

              msg_box.exec_()

              return False

          else:

              self.chess_board[x][y] = 1

              self.white_chess.append((x,y))

              self.update()

              return True

      #下黑子

      def put_black_chess(self,x:int,y:int) -> bool:

          if self.chess_board[x][y] != 0:

              msg_box = QMessageBox(QMessageBox.Information, 提示, 这个位置已经有棋子了!)

              msg_box.exec_()

              return False

          else:

              self.chess_board[x][y] = 2

              self.black_chess.append((x,y))

              self.update()

              return True

      #清除棋盘,重开游戏

      def clear(self) -> None:

          self.x = -1

          self.y = -1

          self.player = 0

          self.flag = False

          self.white_chess = []

          self.black_chess = []

          self.chess_board = [[0 for i in range(15)] for i in range(15)]

          self.update()

      #判断是否已经五子连珠

      def judge(self,x:int,y:int) -> bool:

          if self.judge_1(x,y) or self.judge_2(x,y) or self.judge_3(x,y) or self.judge_4(x,y):

              return True

          return False

      #判断横线

      def judge_1(self,x:int,y:int) -> bool:

          count = 1

          if self.chess_board[x][y] != 0:

              for i in range(1,5):

                  if y - i >= 0:

                      if self.chess_board[x][y] == self.chess_board[x][y-i]:

                          print(x,y-i)

                          count += 1

                      else:

                          break

                  else:

                      break

              for i in range(1,5):

                  if y + i <=14:

                      if self.chess_board[x][y] == self.chess_board[x][y+i]:

                          print(x,y+i)

                          count += 1

                      else:

                          break

                  else:

                      break

          if count == 5:

              return True

          return False

      #判断右下线

      def judge_2(self,x:int,y:int) -> bool:

          count = 1

          if self.chess_board[x][y] != 0:

              for i in range(1,5):

                  if x-i >= 0 and y - i >= 0:

                      if self.chess_board[x][y] == self.chess_board[x-i][y-i]:

                          print(x-i,y-i)

                          count += 1

                      else:

                          break

                  else:

                      break

              for i in range(1,5):

                  if x + i <= 14 and y + i <= 14:

                      if self.chess_board[x][y] == self.chess_board[x+i][y+i]:

                          print(x+i,y+i)

                          count += 1

                      else:

                          break

                  else:

                      break

          if count == 5:

              return True

          return False

      #判断竖线

      def judge_3(self,x:int,y:int) -> bool:

          count = 1

          if self.chess_board[x][y] != 0:

              for i in range(1,5):

                  if x - i >= 0:

                      if self.chess_board[x][y] == self.chess_board[x-i][y]:

                          print(x-i,y)

                          count += 1

                      else:

                          break

                  else:

                      break

              for i in range(1,5):

                  if x + i <= 14:

                      if self.chess_board[x][y] == self.chess_board[x+i][y]:

                          print(x+i,y)

                          count += 1

                      else:

                          break

                  else:

                      break

          if count == 5:

              return True

          return False

      #判断右上线

      def judge_4(self,x:int,y:int) -> bool:

          count = 1

          if self.chess_board[x][y] != 0:

              for i in range(1,5):

                  if x - i >= 0 and y + i <= 14:

                      if self.chess_board[x][y] == self.chess_board[x-i][y+i]:

                          print(x-i,y+i)

                          count += 1

                      else:

                          break

                  else:

                      break

              for i in range(1,5):

                  if x + i <= 14 and y - i >= 0:

                      if self.chess_board[x][y] == self.chess_board[x+i][y-i]:

                          print(x+i,y-i)

                          count += 1

                      else:

                          break

                  else:

                      break

          if count == 5:

              return True

          return False

  #程序入口

  if __name__ == __main__:  

      app = QApplication(sys.argv)  

      goBang = GoBang()

      sys.exit(app.exec_())

  以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持盛行IT软件开发工作室。

郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。

留言与评论(共有 条评论)
   
验证码: