摘要:这篇文章主要介绍了使用PyQt5模块来设计一个俄罗斯方块的小游戏。


  • 游戏示例:如下视频演示了一个简单的游戏界面

视频演示地址

  • 游戏主要说明:
    俄罗斯方块主要涉及了五个类别19种图形,每个图形为4个小方块组成。功能模块主要包括了显示等级,成绩,修改面板的方块数等。

  • 设计思路:
    分为四个类来设计,分别包括:

    • Game类:启动一个游戏
    # Game
    class Game:
    def __init__(self):self.__board = Board()
  • Shape类:定义了俄罗斯方块的形状,边界,颜色等参数

# 形状
class Shape:def __init__(self):# 19种形状:tuple参数分别代表:(形状代号,左、右、上、下边缘距离,类型)self.num = 19self.type1 = 1self.type2 = 2self.type3 = 3self.type4 = 4self.type5 = 5self.vL = (1, 0, 0, 0, 3, self.type1)self.hL = (2, 0, 3, 0, 0, self.type1)self.S = (3, 0, 1, 0, 1, self.type2)self.lZ = (4, 0, 2, 0, 1, self.type3)self.ruZ = (5, 0, 1, 1, 1, self.type3)self.rZ = (6, 0, 2, 1, 0, self.type3)self.luZ = (7, 0, 1, 0, 2, self.type3)self.lvuF = (8, 0, 1, 0, 2, self.type4)self.rvuF = (9, 0, 1, 0, 2, self.type4)self.lhdF = (10, 0, 2, 0, 1, self.type4)self.rhdF = (11, 0, 2, 0, 1, self.type4)self.rvdF = (12, 0, 1, 0, 2, self.type4)self.lvdF = (13, 0, 1, 2, 0, self.type4)self.rhuF = (14, 0, 2, 1, 0, self.type4)self.lhuF = (15, 0, 2, 0, 1, self.type4)self.uW = (16, 0, 2, 1, 0, self.type5)self.dW = (17, 0, 2, 0, 1, self.type5)self.lW = (18, 0, 1, 1, 1, self.type5)self.rW = (19, 0, 1, 0, 2, self.type5)self.name = ((1, 0, 0, 0, 3, self.type1), (2, 0, 3, 0, 0, self.type1),(3, 0, 1, 0, 1, self.type2), (4, 0, 2, 0, 1, self.type3),(6, 0, 2, 1, 0, self.type3), (7, 0, 1, 0, 2, self.type3),(5, 0, 1, 1, 1, self.type3), (8, 0, 1, 0, 2, self.type4),(13, 0, 1, 2, 0, self.type4), (9, 0, 1, 0, 2, self.type4),(12, 0, 1, 0, 2, self.type4),(15, 0, 2, 0, 1, self.type4), (10, 0, 2, 0, 1, self.type4),(14, 0, 2, 1, 0, self.type4), (11, 0, 2, 0, 1, self.type4),(16, 0, 2, 1, 0, self.type5), (17, 0, 2, 0, 1, self.type5),(18, 0, 1, 1, 1, self.type5),(19, 0, 1, 0, 2, self.type5))self.color = (QColor(250, 150, 50), QColor(100, 100, 100), QColor(100, 150, 150), QColor(150, 100, 100))self.num_col = len(self.color)```- Block类:实现一个游戏对象的规则控制```# 对象类
class Block:def __init__(self, x, y, shape, mshape, color):self.__x = xself.__y = yself.__color = colorself.__shape = shapeself.__sha = mshape# 返回四个块的中心坐标def getPos(self):x1 = x2 = x3 = x4 = self.__xy1 = y2 = y3 = y4 = self.__yif self.__shape[0] == self.__sha.hL[0]:x2 = x1 + 1x3 = x2 + 1x4 = x3 + 1elif self.__shape[0] == self.__sha.vL[0]:y2 = y1 + 1y3 = y2 + 1y4 = y3 + 1elif self.__shape[0] == self.__sha.S[0]:y2 = y1 + 1x3 = x1 + 1x4 = x3y4 = y2elif self.__shape[0] == self.__sha.lZ[0]:x2 = x1 + 1x3 = x2y3 = y2 + 1x4 = x3 + 1y4 = y3elif self.__shape[0] == self.__sha.ruZ[0]:y2 = y1 + 1x3 = x1 + 1y3 = y1 - 1x4 = x1 + 1elif self.__shape[0] == self.__sha.luZ[0]:y2 = y1 + 1x3 = x1 + 1y3 = y2x4 = x3y4 = y3 + 1elif self.__shape[0] == self.__sha.rZ[0]:x2 = x1 + 1y2 = y1 - 1x3 = x2y3 = y2 + 1x4 = x3 + 1y4 = y2elif self.__shape[0] == self.__sha.lvuF[0]:x2 = x1 + 1x3 = x4 = x2y3 = y2 + 1y4 = y3 + 1elif self.__shape[0] == self.__sha.rvuF[0]:x2 = x1 + 1y3 = y2 + 1y4 = y3 + 1elif self.__shape[0] == self.__sha.lhdF[0]:y2 = y1 + 1x3 = x1 + 1x4 = x3 + 1elif self.__shape[0] == self.__sha.rhdF[0]:x2 = x1 + 1x3 = x2 + 1x4 = x3y4 = y3 + 1elif self.__shape[0] == self.__sha.rvdF[0]:y2 = y1 + 1y3 = y2 + 1x4 = x3 + 1y4 = y3elif self.__shape[0] == self.__sha.lvdF[0]:x2 = x1 + 1y2 = y1 - 2x3 = x4 = x2y3 = y1 - 1y4 = y1elif self.__shape[0] == self.__sha.rhuF[0]:x2 = x1 + 1x3 = x2 + 1x4 = x3y4 = y3 - 1elif self.__shape[0] == self.__sha.lhuF[0]:y2 = y1 + 1x3 = x2 + 1x4 = x3 + 1y3 = y4 = y2elif self.__shape[0] == self.__sha.uW[0]:x2 = x1 + 1x3 = x2x4 = x3 + 1y2 = y1 - 1elif self.__shape[0] == self.__sha.dW[0]:x2 = x1 + 1x3 = x2x4 = x3 + 1y3 = y2 + 1elif self.__shape[0] == self.__sha.lW[0]:x2 = x1 + 1x4 = x3 = x2y2 = y1 - 1y3 = y2 + 1y4 = y3 + 1elif self.__shape[0] == self.__sha.rW[0]:y2 = y1 + 1y3 = y2 + 1y4 = y2x4 = x1 + 1return [(x1, y1), (x2, y2), (x3, y3), (x4, y4)]# 返回边界def getLeftBoun(self):return self.__x - self.__shape[1]def getRightBoun(self):return self.__x + self.__shape[2]def getTopBoun(self):return self.__y - self.__shape[3]def getDownBoun(self):return self.__y + self.__shape[4]# 返回形状def getShape(self):return self.__shape# 返回颜色def getColor(self):return self.__color# 设置颜色def setColor(self, color):self.__color = color# 设置形状def setShape(self, shape):self.__shape = shape# 设置坐标def setXY(self, x, y):self.__x = xself.__y = y# 返回坐标def getXY(self):return [self.__x, self.__y]# 移动坐标def __movePos(self, step_x, step_y):self.setXY(self.__x + step_x, self.__y + step_y)# 旋转90度def rota90(self):# type1if self.__shape[-1] == self.__sha.type1:if self.__shape[0] == self.__sha.vL[0]:self.setShape(self.__sha.hL)self.__movePos(-1, 1)elif self.__shape[0] == self.__sha.hL[0]:self.setShape(self.__sha.vL)self.__movePos(1, -1)# type2elif self.__shape[-1] == self.__sha.type2:pass# type3elif self.__shape[-1] == self.__sha.type3:if self.__shape[0] == self.__sha.lZ[0]:self.setShape(self.__sha.ruZ)elif self.__shape[0] == self.__sha.rZ[0]:self.setShape(self.__sha.luZ)self.__movePos(0, -1)elif self.__shape[0] == self.__sha.luZ[0]:self.setShape(self.__sha.rZ)self.__movePos(-1, 1)elif self.__shape[0] == self.__sha.ruZ[0]:self.setShape(self.__sha.lZ)self.__movePos(0, -1)# type4elif self.__shape[-1] == self.__sha.type4:if self.__shape[0] == self.__sha.lvuF[0]:self.setShape(self.__sha.rhuF)self.__movePos(0, 1)elif self.__shape[0] == self.__sha.lvdF[0]:self.setShape(self.__sha.lhuF)self.__movePos(0, -2)elif self.__shape[0] == self.__sha.rvuF[0]:self.setShape(self.__sha.rhdF)self.__movePos(-1, 1)elif self.__shape[0] == self.__sha.rvdF[0]:self.setShape(self.__sha.lhdF)self.__movePos(-1, 1)elif self.__shape[0] == self.__sha.lhuF[0]:self.setShape(self.__sha.rvuF)self.__movePos(1, 0)elif self.__shape[0] == self.__sha.lhdF[0]:self.setShape(self.__sha.lvuF)self.__movePos(0, -1)elif self.__shape[0] == self.__sha.rhuF[0]:self.setShape(self.__sha.rvdF)self.__movePos(1, -1)elif self.__shape[0] == self.__sha.rhdF[0]:self.setShape(self.__sha.lvdF)self.__movePos(0, 1)# type5elif self.__shape[-1] == self.__sha.type5:if self.__shape[0] == self.__sha.uW[0]:self.setShape(self.__sha.rW)self.__movePos(1, -1)elif self.__shape[0] == self.__sha.dW[0]:self.setShape(self.__sha.lW)elif self.__shape[0] == self.__sha.lW[0]:self.setShape(self.__sha.uW)elif self.__shape[0] == self.__sha.rW[0]:self.setShape(self.__sha.dW)self.__movePos(-1, +1)```- Board 类:主要负责绘制```# 界面
class Board(QFrame):def __init__(self):super().__init__()self.__num_y = 23self.__num_x = 25self.__time_step = 400self.__initPara()self.__initUI()self.__initNet()self.setFocusPolicy(Qt.StrongFocus)# 初始化参数def __initPara(self):self.__score = 0self.__level = 0self.__timer = QBasicTimer()self.__FACTOR = 4 / 5self.__FACTOR_SCREEN = 0.6self.__canvas_w = self.geometry().width() * self.__FACTORself.__canvas_h = self.geometry().height()self.__szy = int(self.__canvas_h / self.__num_y)self.__szx = int(self.__canvas_w / self.__num_x)self.__gameOverFlag = Falseself.__net = []self.__mshape = Shape()self.__block = Block(1, 1, self.__mshape.name[random.randint(0, self.__mshape.num - 1)], self.__mshape,self.__mshape.color[random.randint(0, self.__mshape.num_col - 1)])# 初始化网格列表def __initNet(self):self.__net = [[0 for j in range(self.__num_x - 1)] for j in range(self.__num_y - 1)]# 初始化界面def __initUI(self):hb1 = QHBoxLayout()score_info_la = QLabel('Score: ')self.__score_la = QLabel('0')hb1.addWidget(score_info_la)hb1.addWidget(self.__score_la)hb1.addStretch(1)hb2 = QHBoxLayout()level_info_la = QLabel('Level: ')self.__level_la = QLabel('0')hb2.addWidget(level_info_la)hb2.addWidget(self.__level_la)hb2.addStretch(1)self.__speed_la = QLabel()self.__speed_la.setText(str((1010 - self.__time_step) / 10))self.__speed_label = QLabel('Speed:')self.__sd_slider = QSlider()self.__sd_slider.setOrientation(Qt.Horizontal)self.__sd_slider.setMaximum(1)self.__sd_slider.setMaximum(100)self.__sd_slider.setValue(int((1010 - self.__time_step) / 10))self.__sd_slider.valueChanged.connect(self.__LineEdt)hb3 = QHBoxLayout()hb3.addWidget(self.__speed_label)hb3.addWidget(self.__speed_la)hb2.addStretch(1)x_num_la = QLabel('X number:')self.__x_num_la_show = QLabel()self.__x_num_la_show.setText(str(self.__num_x - 1))hb12 = QHBoxLayout()hb12.addWidget(x_num_la)hb12.addWidget(self.__x_num_la_show)hb12.addStretch(1)self.__x_num_sl = QSlider(Qt.Horizontal, self)self.__x_num_sl.setMaximum(100)self.__x_num_sl.setMinimum(1)self.__x_num_sl.setValue(self.__num_x - 1)self.__x_num_sl.valueChanged.connect(self.__setXNum)y_num_la = QLabel('Y number:')self.__y_num_la_show = QLabel()self.__y_num_la_show.setText(str(self.__num_y - 1))hb13 = QHBoxLayout()hb13.addWidget(y_num_la)hb13.addWidget(self.__y_num_la_show)hb13.addStretch(1)self.__y_num_sl = QSlider(Qt.Horizontal, self)self.__y_num_sl.setMinimum(1)self.__y_num_sl.setMaximum(100)self.__y_num_sl.setValue(self.__num_y - 1)self.__y_num_sl.valueChanged.connect(self.__setYNum)self.__st_btn = QPushButton('Start')self.__st_btn.setEnabled(True)hb7 = QHBoxLayout()hb7.addWidget(self.__st_btn)hb7.addStretch(1)self.__stop_btn = QPushButton('Stop')self.__stop_btn.setEnabled(True)hb8 = QHBoxLayout()hb8.addWidget(self.__stop_btn)hb8.addStretch(1)self.__pause_btn = QPushButton('Pause')self.__pause_btn.setEnabled(True)hb9 = QHBoxLayout()hb9.addWidget(self.__pause_btn)hb9.addStretch(1)self.__new_btn = QPushButton('New Game')self.__new_btn.setEnabled(True)hb10 = QHBoxLayout()hb10.addWidget(self.__new_btn)hb10.addStretch(1)self.__exit_btn = QPushButton('Exit')self.__exit_btn.setEnabled(True)hb11 = QHBoxLayout()hb11.addWidget(self.__exit_btn)hb11.addStretch(1)self.__new_btn.clicked.connect(self.__newGameBtnAction)self.__st_btn.clicked.connect(self.__stBtnAction)self.__stop_btn.clicked.connect(self.__stopBtnAction)self.__pause_btn.clicked.connect(self.__pauseBtnAction)self.__exit_btn.clicked.connect(self.close)self.__lcd = QLCDNumber()self.__lcd.setMinimumSize(100, 100)hb4 = QHBoxLayout()hb4.addWidget(self.__lcd)hb4.addStretch(1)vb = QVBoxLayout()vb.addLayout(hb1)vb.addLayout(hb2)vb.addLayout(hb4)vb.addStretch(1)vb.addLayout(hb3)vb.addWidget(self.__sd_slider)vb.addLayout(hb7)vb.addLayout(hb8)vb.addLayout(hb9)vb.addStretch(1)vb.addLayout(hb12)vb.addWidget(self.__x_num_sl)vb.addLayout(hb13)vb.addWidget(self.__y_num_sl)vb.addLayout(hb10)vb.addStretch(10)vb.addLayout(hb11)hb5 = QHBoxLayout()hb5.addStretch(1)hb5.addLayout(vb)self.setLayout(hb5)screen = QDesktopWidget().screenGeometry()width = screen.width() * self.__FACTOR_SCREENheight = screen.height() * self.__FACTOR_SCREENx0 = screen.width() * (1 - self.__FACTOR_SCREEN) / 2y0 = screen.height() * (1 - self.__FACTOR_SCREEN) / 2self.setGeometry(x0, y0, width, height)self.__canva_w = self.geometry().width() * self.__FACTORself.__canva_h = self.geometry().height()self.__szx = int(self.__canva_w / self.__num_x)self.__szy = int(self.__canva_h / self.__num_y)self.setWindowTitle("Russian Block")self.setWindowIcon(QIcon('example.png'))self.show()# 绘制网格def __drawNetGrid(self, qp):pen = QPen(Qt.lightGray, 1, Qt.DashLine)qp.setPen(pen)for i in range(self.__num_y):qp.drawLine(int(self.__szx / 2), int(i * self.__szy + self.__szy / 2),int(self.__num_x * self.__szx - self.__szx / 2), int(i * self.__szy + self.__szy / 2))for i in range(self.__num_x):qp.drawLine(int(i * self.__szx + self.__szx / 2), int(self.__szy / 2),int(i * self.__szx + self.__szx / 2),int(self.__num_y * self.__szy - self.__szy / 2))# 提示Game Overdef __gameOver(self, qp, x, y):pen = QPen(Qt.red)qp.setPen(pen)qp.setFont(QFont('Blackoak Std', 20))qp.drawText(x, y, self.__canva_w / 2, self.__canva_h / 2, True, 'Game Over!')# 类的自调用painter绘制函数def paintEvent(self, e):self.__canvas_w = self.geometry().width() * self.__FACTORself.__canvas_h = self.geometry().height()self.__szx = int(self.__canvas_w / self.__num_x)self.__szy = int(self.__canvas_h / self.__num_y)qp = QPainter()qp.begin(self)self.__drawNetGrid(qp)  # 绘制网格# 绘制形状for i, eles in enumerate(self.__net):for j, ele in enumerate(eles):if not ele == 0:self.__drawRect(qp, j + 1, i + 1, self.__szx, self.__szy, ele)if self.__timer.isActive():self.__drawBlock(qp, self.__block, self.__szx, self.__szy)# game overif self.__gameOverFlag:self.__gameOverFlag = Falseself.__gameOver(qp, self.__canva_w / 4, self.__canva_h / 2)qp.end()# timerdef timerEvent(self, e):if self.__isNextPosEmpty(self.__block, 0, 1):self.__moveBlock(0, 1)else:self.__refreshFullNet(self.__block)for k, ele in enumerate(self.__net):if 0 not in ele:self.__score += 1self.__level += int(self.__score / 10)self.__update_score()self.__update_level()for i in range(k):self.__net[k - i] = self.__net[k - 1 - i]self.__net[0] = [0 for i in range(self.__num_x - 1)]# 游戏结束if sum([1 for ele in self.__net[0] if not ele == 0]) > 0:self.stop()self.__st_btn.setEnabled(False)self.__pause_btn.setEnabled(False)self.__stop_btn.setEnabled(False)self.__gameOverFlag = Trueelse:self.__block = self.__generateRandomBlock()self.update()# 键盘按键事件def keyPressEvent(self, e):key = e.key()x, y = self.__block.getXY()if key == Qt.Key_Left:if (x > 1) & self.__isNextPosEmpty(self.__block, -1, 0):self.__block.setXY(x - 1, y)elif key == Qt.Key_Right:if self.__isNextPosEmpty(self.__block, +1, 0):self.__block.setXY(x + 1, y)elif key == Qt.Key_Down:if self.__isNextPosEmpty(self.__block, 0, 2):self.__block.setXY(x, y + 2)elif key == Qt.Key_Up:block = Block(self.__block.getXY()[0], self.__block.getXY()[1], self.__block.getShape(), self.__mshape,self.__block.getColor())block.rota90()if (block.getDownBoun() > self.__num_y - 1) | (block.getLeftBoun() < 1) | (block.getRightBoun() > self.__num_x - 1):passelse:self.__block.rota90()elif key == Qt.Key_P:if self.__timer.isActive():self.stop()else:self.start()self.update()# 窗口大小改变自动调用事件def resizeEvent(self, e):self.update()# 判占位列表是否空def __isNextPosEmpty(self, block, step_x, step_y):bot = block.getDownBoun()right = block.getRightBoun()if ((bot + step_y) > self.__num_y - 1) | ((step_x > 0) & ((right + step_x) > self.__num_x - 1)):return Falsepos = block.getPos()for p in pos:if p[1] < 1:passelif not self.__net[p[1] - 1 + step_y][p[0] - 1 + step_x] == 0:return Falsereturn True# 更新占位列表def __refreshFullNet(self, block):for pos in block.getPos():if (pos[0] < 1) | (pos[1] < 1) | (pos[0] > self.__num_x - 1) | (pos[1] > self.__num_y - 1):passself.__net[pos[1] - 1][pos[0] - 1] = block.getColor()# 生成一个随机对象def __generateRandomBlock(self):num_sha = random.randint(0, self.__mshape.num - 1)sha = self.__mshape.name[num_sha]num_col = random.randint(0, self.__mshape.num_col - 1)color = self.__mshape.color[num_col]x = random.randint(1, self.__num_x)block = Block(x, 1, sha, self.__mshape, color)while block.getRightBoun() > (self.__num_x - 1):x = random.randint(1, self.__num_x)block = Block(x, 1, sha, self.__mshape, color)return block# 绘制方块def __drawRect(self, qp, x, y, szx, szy, color):x_loca = x * szx - szx / 2y_loca = y * szy - szy / 2# Brushbrush = QBrush(color)brush.setStyle(Qt.SolidPattern)qp.setBrush(brush)qp.drawRect(x_loca, y_loca, szx, szy)# Penpen = QPen(Qt.darkBlue, 2, Qt.SolidLine)qp.setPen(pen)qp.drawRect(x_loca, y_loca, szx, szy)# 绘制特定形状def __drawBlock(self, qp, block, szx, szy):color = block.getColor()pos = block.getPos()x1 = pos[0][0]y1 = pos[0][1]x2 = pos[1][0]y2 = pos[1][1]x3 = pos[2][0]y3 = pos[2][1]x4 = pos[3][0]y4 = pos[3][1]self.__drawRect(qp, x1, y1, szx, szy, color)self.__drawRect(qp, x2, y2, szx, szy, color)self.__drawRect(qp, x3, y3, szx, szy, color)self.__drawRect(qp, x4, y4, szx, szy, color)# 移动def __moveBlock(self, speed_x, speed_y):self.__block.setXY(self.__block.getXY()[0] + speed_x, self.__block.getXY()[1] + speed_y)# 更新成绩def __update_score(self):self.__score_la.setText(str(self.__score))self.__lcd.display(str(self.__score))# 更新等级def __update_level(self):self.__level_la.setText(str(self.__level))# 滑动条事件def __LineEdt(self):self.__speed_la.setText(str(self.__sd_slider.value()))self.__time_step = 1010 - self.__sd_slider.value() * 10if self.__stop_btn.isEnabled() & self.__pause_btn.isEnabled():self.start()# 设置Xnumdef __setXNum(self):self.stop()self.__st_btn.setEnabled(False)self.__stop_btn.setEnabled(False)self.__pause_btn.setEnabled(False)self.__x_num_la_show.setText(str(self.__x_num_sl.value()))self.__num_x = self.__x_num_sl.value()# 设置Y Numdef __setYNum(self):self.stop()self.__st_btn.setEnabled(False)self.__stop_btn.setEnabled(False)self.__pause_btn.setEnabled(False)self.__y_num_la_show.setText(str(self.__y_num_sl.value()))self.__num_y = self.__y_num_sl.value()# 开始按钮事件def __stBtnAction(self):if self.__timer.isActive():passelse:self.__st_btn.setEnabled(False)self.__stop_btn.setEnabled(True)self.__pause_btn.setEnabled(True)self.__timer.start(self.__time_step, self)# 停止按钮事件def __stopBtnAction(self):if self.__timer.isActive():self.__timer.stop()self.__st_btn.setEnabled(False)self.__pause_btn.setEnabled(False)self.__stop_btn.setEnabled(False)self.__timer.stop()# 暂停按钮事件def __pauseBtnAction(self):if self.__timer.isActive():self.__timer.stop()self.__st_btn.setEnabled(True)self.__pause_btn.setEnabled(False)self.__stop_btn.setEnabled(True)# 新游戏按钮事件def __newGameBtnAction(self):if self.__timer.isActive():self.stop()self.__initPara()self.__initNet()self.__st_btn.setEnabled(True)self.__pause_btn.setEnabled(True)self.__stop_btn.setEnabled(True)self.update()self.start()# 启动时间循环时间def start(self):self.__timer.start(self.__time_step, self)# 停止计时器def stop(self):self.__timer.stop()
  • 最后:
    总的来说俄罗斯方块实现起来比较方便,是进行PyQt学习的一个不错方式。另外,楼主的想法是接下来完成自动万俄罗斯方块的功能,有感兴趣的小伙伴可以下载代码自己试试看喔。
  • 项目Github 地址:https://github.com/yooongchun/Tetris

【Python小游戏】俄罗斯方块相关推荐

  1. python小游戏——俄罗斯方块

    最近研究pygame游戏制作板块,本次对于简单的俄罗斯方块进行介绍. 1.首先引入我们需要用到的pygame库和random库(pygame库基础知识请移步首页) import pygame impo ...

  2. Python小游戏(俄罗斯方块)

    玩法:童年经典,普通模式没啥意思,小时候我们都是玩加速的. 源码分享: import os import sys import random from modules import * from Py ...

  3. python编的俄罗斯方块游戏_手把手制作Python小游戏:俄罗斯方块(一)

    手把手制作Python小游戏:俄罗斯方块1 大家好,新手第一次写文章,请多多指教 A.准备工作: 这里我们运用的是Pygame库,因为Python没有内置,所以需要下载 如果没有pygame,可以到官 ...

  4. python图形小游戏代码_手把手制作Python小游戏:俄罗斯方块(一)

    手把手制作Python小游戏:俄罗斯方块1 大家好,新手第一次写文章,请多多指教 A.准备工作: 这里我们运用的是Pygame库,因为Python没有内置,所以需要下载 如果没有pygame,可以到官 ...

  5. python tkinter火柴人_用Python实现童年小游戏俄罗斯方块!别说还挺好玩!

    原标题:用Python实现童年小游戏俄罗斯方块!别说还挺好玩! 前言 大三上学期的程序设计实训大作业,挑了其中一个我认为最简单的的<图书管理系统>来写.用python写是因为py有自带的G ...

  6. 边玩边学,13个 Python 小游戏真有趣啊(含源码)

    经常听到有朋友说,学习编程是一件非常枯燥无味的事情.其实,大家有没有认真想过,可能是我们的学习方法不对? 比方说,你有没有想过,可以通过打游戏来学编程? 今天我想跟大家分享几个Python小游戏,教你 ...

  7. 《推箱子》python小游戏(第二期)

    欢迎加入我们卧虎藏龙的python讨论qq群:996113038 ┉┉┉┉┉┉ 『导语』 ┉┉┉┉┉┉ 上期给大家讲了 最基本的推箱子原理 也就是游戏元素怎么表示 我们说了用"棋盘" ...

  8. 分享30个有趣的 Python小游戏,我能玩一天

    大家好,今天给大家带来30个 Python 小游戏,喜欢记得点赞.一定要收藏,完整版代码,文末获取 文章目录 有手就行 1.吃金币 2.打乒乓 3.滑雪 4.并夕夕版飞机大战 5.打地鼠 简简单单 6 ...

  9. 分享30个有趣的 Python小游戏,我能玩一天(附源码)

    大家好,今天给大家带来30个 Python 小游戏,喜欢记得点赞.一定要收藏! 文章目录 有手就行 1.吃金币 2.打乒乓 3.滑雪 4.并夕夕版飞机大战 5.打地鼠 简简单单 6.小恐龙 7.消消乐 ...

  10. 30个Python小游戏,小白练手,我都能玩一天

    大家好,我是雨雨~ 今天给大家带来30个py小游戏,一定要收藏! 全部源码都整理好了 小游戏源码腾讯文档-在线文档https://docs.qq.com/doc/DRnZDTnFGVUFMc3FL 有 ...

最新文章

  1. 开源成就你我,感恩共享礼包
  2. Prism.Interactivity 之 PopupWindowAction 用法简记
  3. python 的进程池不可嵌套
  4. Android笔记——Matrix
  5. SAP Spartacus 3.0部署在development environment上
  6. scrapy爬虫启示录-小伙子老夫看你血气方刚这本《爬虫秘录》就传给你了
  7. [html] 如何使用纯HTML实现跑马灯的效果?
  8. Nginx配置HTTP2.0
  9. python实现单链表快速排序升序linkedqueue_LeetCode 总结 - 搞定 Linked List 面试题
  10. 数据结构实验之图论九:最小生成树
  11. 关于do{}while()的代码讨论
  12. 【WPF】如何获取命令行参数
  13. CSS外边距合并(塌陷/margin越界)
  14. WPF XMAL获取元素的父元素,子元素
  15. 企业微信检测僵尸粉小工具,企业微信如何检测僵尸粉
  16. html表格的常用样式
  17. 聚焦 Kusama Parachain Lease Offering(PLO),Karura 先行网抢先参与
  18. 使用Adb shell dumpsys检测Android的Activity任务栈
  19. 技术开放平台,推进开放银行布局
  20. bzoj 4408: [FJOI2016]神秘数 主席树

热门文章

  1. 人生之路1.20代码 第四部分
  2. magic2怎样升级HarmonyOS,鸿蒙2.0怎么升级 华为鸿蒙新系统升级方法步骤
  3. Android Studio使用Mob获取手机验证码
  4. IDEA Java程序启动添加参数 VM options、Program arguments、Program arguments
  5. 基于内存取证进行stuxnet 病毒分析(上)
  6. 鸿蒙之境全关卡,神都夜行录鸿蒙之境攻略
  7. 图论500题 慢慢写
  8. Weblogic 弱密码+部署war包getshell
  9. 拉卡拉支付有效提高线下支付场景效率
  10. 让IE浏览器支持HTML5标准的方法