pygame小游戏开发 - 俄罗斯方块

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

 

一、开发环境&需求分析

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

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

 


 

二、功能模块

游戏初始化

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

 

方块定义

 1 # S形方块
 2 S_BLOCK = [Block(['.OO',
 3                   'OO.',
 4                   '...'], Point(0, 0), Point(2, 1), 'S', 1),
 5            Block(['O..',
 6                   'OO.',
 7                   '.O.'], Point(0, 0), Point(1, 2), 'S', 0)]
 8 # Z形方块
 9 Z_BLOCK = [Block(['OO.',
10                   '.OO',
11                   '...'], Point(0, 0), Point(2, 1), 'Z', 1),
12            Block(['.O.',
13                   'OO.',
14                   'O..'], Point(0, 0), Point(1, 2), 'Z', 0)]

 

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

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

 

方块停靠

 1 def _dock():
 2         nonlocal cur_block, next_block, game_area, cur_pos_x, cur_pos_y, game_over, score, speed
 3         for _i in range(cur_block.start_pos.Y, cur_block.end_pos.Y + 1):
 4             for _j in range(cur_block.start_pos.X, cur_block.end_pos.X + 1):
 5                 if cur_block.template[_i][_j] != '.':
 6                     game_area[cur_pos_y + _i][cur_pos_x + _j] = '0'
 7         if cur_pos_y + cur_block.start_pos.Y <= 0:
 8             game_over = True
 9         else:
10             # 计算消除
11             remove_idxs = []
12             for _i in range(cur_block.start_pos.Y, cur_block.end_pos.Y + 1):
13                 if all(_x == '0' for _x in game_area[cur_pos_y + _i]):
14                     remove_idxs.append(cur_pos_y + _i)

 

网格线

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

 

分数

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

 

游戏画面

 

三、游戏视频

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

 


 

四、源码下载

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

 


 

五、作者Info

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

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

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

 

 


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


  

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

         欢迎扫码关注我的公众号

          小鸿爱摸鱼

       

 

posted @ 2021-12-04 23:21  南柯树下  阅读(683)  评论(0编辑  收藏  举报