这次继续探索pygame的五子棋实现,和之前不一样,这次我稍微研究了一下
用pyqt调用pygame有点难,下棋的时候容易报错
报错:-1073740791 (0xC0000409)
而不用pyqt,只用pygame就少了很多麻烦
使用pyqt的部分代码:
`
from PyQt5 import QtCore, QtGui, QtWidgets
class Ui_MainWindow(object):
def setupUi(self, MainWindow):
MainWindow.setObjectName("MainWindow")
MainWindow.setEnabled(True)
MainWindow.resize(576, 309)
self.centralwidget = QtWidgets.QWidget(MainWindow)
self.centralwidget.setObjectName("centralwidget")
self.label = QtWidgets.QLabel(self.centralwidget)
self.label.setGeometry(QtCore.QRect(250, 10, 81, 41))
self.label.setObjectName("label")
self.label_2 = QtWidgets.QLabel(self.centralwidget)
self.label_2.setGeometry(QtCore.QRect(70, 90, 91, 51))
self.label_2.setObjectName("label_2")
self.doubleSpinBox = QtWidgets.QDoubleSpinBox(self.centralwidget)
self.doubleSpinBox.setGeometry(QtCore.QRect(140, 101, 66, 31))
self.doubleSpinBox.setObjectName("doubleSpinBox")
self.pushButton = QtWidgets.QPushButton(self.centralwidget)
self.pushButton.setGeometry(QtCore.QRect(190, 180, 131, 61))
self.pushButton.setObjectName("pushButton")
self.label_5 = QtWidgets.QLabel(self.centralwidget)
self.label_5.setGeometry(QtCore.QRect(300, 60, 81, 21))
self.label_5.setObjectName("label_5")
self.spinBox_2 = QtWidgets.QSpinBox(self.centralwidget)
self.spinBox_2.setGeometry(QtCore.QRect(380, 50, 51, 41))
self.spinBox_2.setObjectName("spinBox_2")
self.label_6 = QtWidgets.QLabel(self.centralwidget)
self.label_6.setGeometry(QtCore.QRect(300, 140, 71, 21))
self.label_6.setObjectName("label_6")
self.spinBox_3 = QtWidgets.QSpinBox(self.centralwidget)
self.spinBox_3.setGeometry(QtCore.QRect(380, 130, 51, 41))
self.spinBox_3.setObjectName("spinBox_3")
MainWindow.setCentralWidget(self.centralwidget)
self.menubar = QtWidgets.QMenuBar(MainWindow)
self.menubar.setGeometry(QtCore.QRect(0, 0, 576, 26))
self.menubar.setObjectName("menubar")
MainWindow.setMenuBar(self.menubar)
self.statusbar = QtWidgets.QStatusBar(MainWindow)
self.statusbar.setObjectName("statusbar")
MainWindow.setStatusBar(self.statusbar)
self.retranslateUi(MainWindow)
self.pushButton.clicked.connect(MainWindow.enter) # type: ignore
QtCore.QMetaObject.connectSlotsByName(MainWindow)
def retranslateUi(self, MainWindow):
_translate = QtCore.QCoreApplication.translate
MainWindow.setWindowTitle(_translate("MainWindow", "MainWindow"))
self.label.setText(_translate("MainWindow", "五子棋"))
self.label_2.setText(_translate("MainWindow", "音量调节"))
self.pushButton.setText(_translate("MainWindow", "开始游戏"))
self.label_5.setText(_translate("MainWindow", "棋盘行数"))
self.label_6.setText(_translate("MainWindow", "棋盘列数"))
`
`
import sys
from PyQt5.QtWidgets import *
from uach import *
from five_chess import *
class My(QMainWindow,Ui_MainWindow):
def init(self, parent=None):
super(My, self).init(parent)
self.setupUi(self)
def enter(self):
row = self.spinBox_2.value()
col = self.spinBox_3.value()
m = Manager(row,col)
m.main()
if name == 'main':
app = QApplication(sys.argv)
#对象数组
n = int(input('创建几个窗口:'))
m = [My() for _ in range(n+1)]
for i in range(n):
m[i].show()
sys.exit(app.exec())
`
只用pygame的代码:
`
import pygame
import sys
class Manager:
def init(self, BOARD_ROW , BOARD_COL):
self.WHITE = (255, 255, 255)
self.BLACK = (0, 0, 0)
self.BACKCOLOR = (100,130,250)
self.BOARD_ROW = BOARD_ROW # 棋盘行数
self.BOARD_COL = BOARD_COL # 棋盘列数
self.LEN_X = 10 # 棋盘至屏幕y轴距离
self.LEN_Y = 10 # 棋盘至屏幕x轴距离
self.CHESS_LEN = 50 # 棋盘里每一棋格的大小
self.CHESS_R = 20 # 棋子半径
self.SCREEN_X = self.BOARD_COL * self.CHESS_LEN + 2 * self.LEN_X
self.SCREEN_Y = self.BOARD_ROW * self.CHESS_LEN + 2 * self.LEN_Y
self.IMG = pygame.image.load('E:/图片/chessboard.jpg')
self.IMG = pygame.transform.scale(self.IMG,(self.CHESS_LEN,self.CHESS_LEN))
self.screen = pygame.display.set_mode((self.SCREEN_X,self.SCREEN_Y+50))
#把窗口加宽50,是因为便于显示字体
self.title = pygame.display.set_caption('五子棋')
self.isblack = True
self.boardcount = [[0 for i in range(BOARD_COL)] for i in range(BOARD_ROW)]
def draw(self):
for i in range(self.BOARD_ROW):
for j in range(self.BOARD_COL):
position_x = self.LEN_Y+j*self.CHESS_LEN
position_y = self.LEN_X+i*self.CHESS_LEN
self.screen.blit(self.IMG,(position_x,position_y))
def draw2(self):
for row in range(len(self.boardcount)):
for col in range(len(self.boardcount[row])):
position_x = self.LEN_Y+col*self.CHESS_LEN
position_y = self.LEN_X+row*self.CHESS_LEN#定位至某个格子
posx = position_x+self.CHESS_LEN/2
posy = position_y+self.CHESS_LEN/2#在格子的中心画圆
if self.boardcount[row][col] == 1:
pygame.draw.circle(self.screen,self.BLACK,(posx,posy),self.CHESS_R)
if self.boardcount[row][col] == -1:
pygame.draw.circle(self.screen,self.WHITE,(posx,posy),self.CHESS_R)
def in_area(self,x,y):
return self.LEN_X <= x <= self.SCREEN_X-self.LEN_X and \
self.LEN_Y <= y <= self.SCREEN_Y-self.LEN_Y
def make_move(self,x,y):
if self.boardcount[y][x] == 0:
self.boardcount[y][x] = 1 if self.isblack else -1
return True
return False
def winner(self,a,x,y):
if self.heng(x,y) or self.shu(x) or self.xie(x,y):
return 1 if a else -1
return 0
def heng(self,x,y):
row = self.boardcount[y]
left_start = max(0,x-4)
left_end = x
for i in range(left_start,left_end+1):
if abs(sum(row[i:i+5])) == 5:
return True
return False
def shu(self,x):
col = self.boardcount[x]
top_start = max(0, x- 4)
top_end = x
for i in range(top_start, top_end + 1):
if abs(sum(col[i:i + 5])) == 5:
return True
return False
def xie(self,x,y):
all = []
for i in range(-4,5):
if 0 <= x+i < self.BOARD_ROW and 0 <= y+i < self.BOARD_COL:
all.append(self.boardcount[y+i][x+i])
roll = self.r(all,5)
if 5 in roll:
return True
all = []
for i in range(-4, 5):
if 0 <= x + i < self.BOARD_ROW and 0 <= y - i < self.BOARD_COL:
all.append(self.boardcount[y - i][x + i])
roll = self.r(all, 5)
if 5 in roll:
return True
return False
def r(self,a,b):
r = []
for i in range(len(a)-b+1):
r.append(abs(sum(a[i:i+b])))
return r
def end(self,a):
winner = '黑棋' if a else '白棋'
font = pygame.font.SysFont(['方正粗黑宋简体', 'microsoftsansserif'], 50)
text = font.render(winner+'获胜了', True, (255, 0, 0), None)
r = text.get_rect()
r.topleft = (0,self.SCREEN_Y)
self.screen.blit(text, r)
def main(self):
while True:
pygame.init()
for e in pygame.event.get():
if e.type == pygame.QUIT:
pygame.quit()
sys.exit()
if e.type == pygame.MOUSEBUTTONUP:
click_x,click_y = pygame.mouse.get_pos()#获取鼠标位置
if self.in_area(click_x,click_y):
xx = (click_x-self.LEN_X)//self.CHESS_LEN
yy = (click_y-self.LEN_Y)//self.CHESS_LEN
self.isblack = not self.isblack if self.make_move(xx,yy) else self.isblack
if self.winner(self.isblack,xx,yy):
self.end(not self.isblack)
self.isblack = True
self.boardcount = [[0 for i in range(self.BOARD_COL)]
for i in range(self.BOARD_ROW)]
self.screen.fill(self.BACKCOLOR)
self.draw() # 画棋盘
self.draw2() # 画棋子
pygame.display.flip()
r = int(input('棋盘有几行?'))
c = int(input('棋盘有几列?'))
m = Manager(r,c)
m.main()
`