Python小项目俄罗斯方块代码基于pygame编写

Posted 木子念睎

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Python小项目俄罗斯方块代码基于pygame编写相关的知识,希望对你有一定的参考价值。

python实习作业或者期末作业,俄罗斯方块,基于pygame编写
有很多小伙伴想要找一些小项目练练手,下面是我在闲暇时写的一个俄罗斯方块的一个小游戏,它是基于pygame板块来实现的
这是它的首页界面

然后这里是它的运行界面

总共有四个速度等级,分别对应四种不同的速度,可以自行调整

import math
import random
import sys
from copy import deepcopy
import pygame as pg
import pygame.locals as pl

pg.init()        # 初始化pygame模块

pg.display.set_caption('俄罗斯方块')       # 设置当前窗口标题
fclock = pg.time.Clock()               # 创建一个对象来帮助跟踪时间

FPS = 30    # 每秒的传送帧数
FONT = pg.font.SysFont('simhei', 30)         # 从系统字体创建字体对象
WindowX = 30
WindowY = 25
award = 10  # 奖励倍数
BLOCK_SIZE = 30          # 一个方块的大小
LINE_SPACE = 2
MAIN_X, MAIN_Y = MAIN_WINDOW = [30, 25]
GAME_X, GAME_Y = GAME_WINDOW = [20, MAIN_Y]
NEXT_X = MAIN_X - GAME_X

RED = (255, 0, 0)       # 运用RGB颜色转载,RGB的颜色表示方法
BLACK = (0, 0, 0)
WHITE = (255, 255, 255)
YELLOW = (255, 255, 0)
GREEN = (0, 255, 0)
BLUE = (0, 0, 255)


class BaseBlock:                 # 创建一个类建立基本的方块
    def __init__(self):
        self.turn_times = 0
        self.x_move = 0
        self.y_move = 0
        self.location = []


class IBlock(BaseBlock):            #  定义一个小类,创建I型方块,#在4*4的小网格内,以中间左上角坐下为原点(0,0),7种方块及其各形态4个方块在小网格的相对坐标
                                    # 移动时记录小网络(0,0)点在游戏网格的(x,y),就知道4个方块在游戏网格中的位置
    def __init__(self):
        super().__init__()
        self.dot = 
            0: [(0, 1), (0, 0), (0, -1), (0, -2)],
            1: [(-1, 0), (0, 0), (1, 0), (2, 0)],
        


class OBlock(BaseBlock):
    def __init__(self):
        super().__init__()           # 创建o型方块
        self.dot = 
            0: [(0, 0), (1, 0), (1, 1), (0, 1)],
        


class LBlock(BaseBlock):
    def __init__(self):
        super().__init__()
        self.dot = 
            0: [(0, 0), (0, 1), (0, -1), (-1, 1),(1,1)],           # 创建L型方块
            1: [(0, 0), (-1, 0), (1, 0), (1, 1)],
            2: [(0, 0), (0, 1), (0, -1), (1, -1)],
            3: [(0, 0), (1, 0), (-1, 0), (-1, -1)],
        


class ULBlock(BaseBlock):
    def __init__(self):                                        # 定义一个小类创建U型方块
        super().__init__()
        self.dot = 
            0: [(0, 0), (0, 1), (0, -1), (1, 1)]
            ,
            1: [(0, 0), (-1, 0), (1, 0), (1, -1)],
            2: [(0, 0), (0, 1), (0, -1), (-1, -1)],
            3: [(0, 0), (1, 0), (-1, 0), (-1, 1)],
        


class TBlock(BaseBlock):
    def __init__(self):
        super().__init__()
        self.dot = 
            0: [(0, 0), (1, 0), (0, 1), (-1, 0)],
            1: [(0, 0), (1, 0), (0, 1), (0, -1)],
            2: [(0, 0), (1, 0), (0, -1), (-1, 0)],            # 创建T型方块
            3: [(0, 0), (0, -1), (0, 1), (-1, 0)],
        


class SBlock(BaseBlock):
    def __init__(self, *args, **kwargs):
        super().__init__()                             # 定义一个小类,创建S型方块
        self.dot = 
            0: [(0, 0), (0, 1), (-1, 0), (-1, -1)],
            1: [(0, 0), (1, 0), (0, 1), (-1, 1)],
        


class ZBlock(BaseBlock):
    def __init__(self):
        super().__init__()
        self.dot = 
            0: [(0, 0), (0, 1), (-1, 0), (-1, -1)],              # 创建Z型方块
            1: [(0, 0), (1, 0), (0, 1), (-1, 1)],
        


class Game():
    def __init__(self):      # self表示对象本身,谁调用,就表示谁
        self.fps = FPS
        self.screen = pg.display.set_mode([MAIN_X * BLOCK_SIZE, MAIN_Y * BLOCK_SIZE])    # 初始化窗口或屏幕以供显示并设置大小
        self.screen.fill(WHITE)
        self.stop_block = k: [] for k in range(MAIN_Y)     # 当k在y轴上循环,当方块在y轴最下方时停止下落;
        self.level_list = ['简单', '一般', '困难', '地狱']    # 设置难度分类
        self.moshi_list = ['单人','双人']
        self.moshi = 1      # 定义初始的单人模式
        self.level = 1      # 定义初始难度等级
        self.score = 0      # 定义初始分数
        self.next_block = self.create_next()     # 调用create_next这个函数生成下一个方块
        self.now_block = None
        self.gaming = False
        self.click_box = []
        self.click_color = RED

    def draw_text(self):
        score_obj = FONT.render('分数: %s' % self.score, True, (0, 0, 0), )   # render(内容,是否抗锯齿,字体颜色,字体背景颜色)
        level_obj = FONT.render('等级: %s' % self.level_list[self.level - 1], True, (0, 0, 0), )
        x, y = self.three.topleft

        self.screen.blit(score_obj, [x + BLOCK_SIZE * 2.5, y + BLOCK_SIZE * 5])   # 在主窗口上建立一个小窗口显示分数
        self.screen.blit(level_obj, [x + BLOCK_SIZE * 1.5, y + BLOCK_SIZE * 7.5])  # 在主窗口上建立一个小窗口显示难度等级

    @property              # 装饰器,让此方法变为私有属性,防止对其修改,可以用调用属性形式来调用方法,后面不需要加();
    def speed(self):
        # print(round(self.level / 10, 1))
        return round(self.level / 10, 1)         # 定义一个速度函数,用等级除以10,保留一位小数。控制着难度的等级,难度越大,速度越快。

    def start(self):
        if self.gaming:
            if not self.now_block:
                self.change_next()
            self.draw_next_block()
            self.draw_now_block()
            self.draw_stop()
            self.draw_wall()
            self.move()
            remove_line = self.check_full_block()        # 消去的行数调用check.full.block函数;
            if remove_line:                             # 分数等于除去的行数乘上倍数;
                self.score += award * remove_line
            self.draw_text()
        else:
            self.choice_level()

    def level_add(self):
        if self.level + 1 <= len(self.level_list):
            self.level += 1
        else:
            self.level = 1

    def level_pop(self):
        if self.level - 1 >= 1:
            self.level -= 1
        else:
            self.level = len(self.level_list)

    def moshi_add(self):
        if self.moshi + 1 <= len(self.moshi_list):
            self.moshi += 1
        else:
            self.moshi = 1

    def moshi_pop(self):
        if self.moshi - 1 <= len(self.moshi_list):
            self.moshi -= 1
        else:
            self.moshi = len(self.moshi_list)

    def to_gaming(self):
        self.gaming = not self.gaming

这是一部分的开头,创建函数的部分
完整代码可以去博主的Github仓库或者Gitee仓库下载
Gitee仓库地址:
点击跳转Gitee仓库
觉得喜欢的可以给博主的仓库加个星哦
Github仓库地址:
点击跳转Github仓库
觉得有用的可以给博主的仓库加个小星星哦
最后,觉得这篇文章对你来说有用的话,给博主点个赞再走吧

pygame小游戏开发

版权声明:原创不易,本文禁止抄袭、转载,侵权必究!

 

一、开发环境&需求分析

开发环境:python3.6.4
第三方库:pygame1.9.6
集成开发环境:PyCharm/Sublime Text

  • 利用pygame开发俄罗斯方块游戏,左边提供游戏界面,右边提供显示界面,包括游戏得分、方块速度以及下一个方块的形状
  • 实现游戏方块精灵旋转,停靠,消除等交互动作
  • 用二维数组来实现7种不同类型的游戏方块,可以通过调整数组参数进而改变方块形状
  • 提供网格线,使方块精灵更直观清晰

 


 

二、功能模块

游戏初始化

 SIZE = 30  # 每个小方格大小
 BLOCK_HEIGHT = 25  # 游戏区高度
 BLOCK_WIDTH = 10   # 游戏区宽度
 BORDER_WIDTH = 4   # 游戏区边框宽度
 BORDER_COLOR = (40, 40, 200)  # 游戏区边框颜色
 SCREEN_WIDTH = SIZE * (BLOCK_WIDTH + 5)  # 游戏屏幕的宽
 SCREEN_HEIGHT = SIZE * BLOCK_HEIGHT      # 游戏屏幕的高
 BG_COLOR = (40, 40, 60)  # 背景色
 BLOCK_COLOR = (20, 128, 200)  #
 BLACK = (0, 0, 0)
 RED = (200, 30, 30)      # GAME OVER 的字体颜色
 def main():
     pygame.init()
     screen = pygame.display.set_mode((SCREEN_WIDTH, SCREEN_HEIGHT))
     pygame.display.set_caption(\'俄罗斯方块\')

 

方块定义

 # S形方块
 S_BLOCK = [Block([\'.OO\',
                   \'OO.\',
                   \'...\'], Point(0, 0), Point(2, 1), \'S\', 1),
            Block([\'O..\',
                   \'OO.\',
                   \'.O.\'], Point(0, 0), Point(1, 2), \'S\', 0)]
 # Z形方块
 Z_BLOCK = [Block([\'OO.\',
                   \'.OO\',
                   \'...\'], Point(0, 0), Point(2, 1), \'Z\', 1),
            Block([\'.O.\',
                   \'OO.\',
                   \'O..\'], Point(0, 0), Point(1, 2), \'Z\', 0)]

 

判断是否可以旋转,下落,移动

 def _judge(pos_x, pos_y, block):
         nonlocal game_area
         for _i in range(block.start_pos.Y, block.end_pos.Y + 1):
             if pos_y + block.end_pos.Y >= BLOCK_HEIGHT:
                 return False
             for _j in range(block.start_pos.X, block.end_pos.X + 1):
                 if pos_y + _i >= 0 and block.template[_i][_j] != \'.\' and game_area[pos_y + _i][pos_x + _j] != \'.\':
                     return False
         return True

 

方块停靠

 def _dock():
         nonlocal cur_block, next_block, game_area, cur_pos_x, cur_pos_y, game_over, score, speed
         for _i in range(cur_block.start_pos.Y, cur_block.end_pos.Y + 1):
             for _j in range(cur_block.start_pos.X, cur_block.end_pos.X + 1):
                 if cur_block.template[_i][_j] != \'.\':
                     game_area[cur_pos_y + _i][cur_pos_x + _j] = \'0\'
         if cur_pos_y + cur_block.start_pos.Y <= 0:
             game_over = True
         else:
             # 计算消除
             remove_idxs = []
             for _i in range(cur_block.start_pos.Y, cur_block.end_pos.Y + 1):
                 if all(_x == \'0\' for _x in game_area[cur_pos_y + _i]):
                     remove_idxs.append(cur_pos_y + _i)

 

网格线

 def _draw_gridlines(screen):
     # 画网格线 竖线
     for x in range(BLOCK_WIDTH):
         pygame.draw.line(screen, BLACK, (x * SIZE, 0), (x * SIZE, SCREEN_HEIGHT), 1)
     # 画网格线 横线
     for y in range(BLOCK_HEIGHT):
         pygame.draw.line(screen, BLACK, (0, y * SIZE), (BLOCK_WIDTH * SIZE, y * SIZE), 1)

 

分数

 def _draw_info(screen, font, pos_x, font_height, score):
     print_text(screen, font, pos_x, 10, f\'得分: \')
     print_text(screen, font, pos_x, 10 + font_height + 6, f\'{score}\')
     print_text(screen, font, pos_x, 20 + (font_height + 6) * 2, f\'速度: \')
     print_text(screen, font, pos_x, 20 + (font_height + 6) * 3, f\'{score // 10000}\')
     print_text(screen, font, pos_x, 30 + (font_height + 6) * 4, f\'下一个:\')

 

游戏画面

 

三、游戏视频

点我观看视频,最下面有惊喜!

 


 

四、源码下载

关注我的原创公众号【小鸿星空科技】,回复【游戏开发】获取完整项目,包括源码及素材

 


 

五、作者Info

作者:南柯树下,Goal:让编程更有趣!

原创微信公众号:『小鸿星空科技』,专注于算法、爬虫,网站,游戏开发,数据分析、自然语言处理,AI等,期待你的关注,让我们一起成长、一起Coding!

版权声明:本文禁止抄袭、转载 ,侵权必究!

 

 


 欢迎扫码关注我的原创公众号【小鸿星空科技】,回复【游戏开发】获取完整项目,包括源码及素材


  

——  ——  ——  ——  —  END  ——  ——  ——  ——  ———— 

         欢迎扫码关注我的公众号

          小鸿星空科技

       

 

以上是关于Python小项目俄罗斯方块代码基于pygame编写的主要内容,如果未能解决你的问题,请参考以下文章

Pygame实战俄罗斯方块 | 太好玩了~停不下来,这种版本(Turtle彩版)你肯定没玩过……(经典怀旧:无人不知的俄罗斯方块)

Pygame小游戏之俄罗斯方块凭什么火了30年?(史上最畅销单机游戏)

pygame小游戏开发

Pygame俄罗斯方块填充整列

基于python的俄罗斯方块小游戏

Python游戏开发,pygame模块,Python实现炸弹人小游戏