pygame小游戏开发

Posted 南柯树下

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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  ——  ——  ——  ——  ———— 

         欢迎扫码关注我的公众号

          小鸿星空科技

       

 

以上是关于pygame小游戏开发的主要内容,如果未能解决你的问题,请参考以下文章

Python游戏开发,pygame模块,Python实现经典90坦克大战游戏

Python游戏开发,pygame模块,Python实现升级版坦克大战小游戏

Python游戏开发,pygame模块,Python实现五子棋联机对战小游戏

pygame小游戏开发

Pygame 游戏开发 基础知识

Python_游戏开发库 Pygame 学习笔记