简介

俄罗斯方块是一款风靡全球的电视游戏机和掌上游戏机游戏,它由俄罗斯人阿列克谢·帕基特诺夫发明,故得此名。俄罗斯方块的基本规则是移动、旋转和摆放游戏自动输出的各种方块,使之排列成完整的一行或多行并且消除得分。由于上手简单、老少皆宜,从而家喻户晓,风靡世界。

相关文件

小伙伴们可以关注小编的Python源码、问题解答&学习交流群:733089476
有很多的资源可以白嫖的哈,需要源码的小伙伴可以在+君羊领取

游戏规则

由小方块组成的不同形状的板块陆续从屏幕上方落下来,玩家通过调整板块的位置和方向,使它们在屏幕底部拼出完整的一条或几条。这些完整的横条会随即消失,给新落下来的板块腾出空间,与此同时,玩家得到分数奖励。没有被消除掉的方块不断堆积起来,一旦堆到屏幕顶端,玩家便告输,游戏结束。

环境搭建

Python版本:3.7.8
安装Python并添加到环境变量,pip安装需要的相关模块即可。

效果展示

开始界面

游戏界面

结束界面

首先

导入模块

import sys
import pygame
import random
import time
from settings import *
from piece import Piece
from gamewall import GameWall
from gamedisplay import GameDisplay
from gamestate import GameState
from gameresource import GameResource

主函数代码

def main():#初始化pygame。启用Pygame必不可少的一步,在程序开始阶段执行。pygame.init()#创建屏幕对象screen = pygame.display.set_mode((1200, 900) )  #分辨率是1200*900pygame.display.set_caption("俄罗斯方块  需要源码+Q群:733089476")  #窗口标题pygame.key.set_repeat(100, 100)  # 一直按下某个键,每过100毫秒就引发一个KEYDOWN事件#屏幕背景色bg_color = (230, 230, 230)game_state = GameState(screen)game_resource = GameResource()game_resource.play_bg_music()#游戏主循环while True:#方块触底的话if game_state.piece and game_state.piece.is_on_bottom:game_state.touch_bottom()#监视键盘和鼠标事件check_events(game_state, game_resource)#设定屏幕背景screen.blit(game_resource.load_bg_img(), (0, 0))#绘制方块if game_state.piece:game_state.piece.paint()#绘制游戏区域网格线和墙体GameDisplay.draw_game_window(screen, game_state, game_resource)#让最近绘制的屏幕可见pygame.display.flip()def check_events(game_state, game_resource):'''捕捉和处理键盘按键事件'''for event in pygame.event.get():if event.type == pygame.QUIT:sys.exit()elif event.type == pygame.KEYDOWN:on_key_down(event, game_state, game_resource)elif event.type == pygame.USEREVENT:game_state.piece.move_down()def on_key_down(event, game_state, game_resource):if not game_state.paused and event.key == pygame.K_DOWN:# print("向下方向键被按下")if game_state.piece:game_state.piece.move_down()elif not game_state.paused and event.key == pygame.K_UP:# print("向上方向键被按下")if game_state.piece:game_state.piece.turn()elif not game_state.paused and event.key == pygame.K_RIGHT:# print("向右方向键被按下")if game_state.piece:game_state.piece.move_right()elif not game_state.paused and event.key == pygame.K_LEFT:# print("向左方向键被按下")if game_state.piece:game_state.piece.move_left()elif not game_state.paused and event.key == pygame.K_f:if game_state.piece:game_state.piece.fall_down()elif event.key == pygame.K_s and game_state.stopped:game_state.start_game()elif event.key == pygame.K_p and not game_state.stopped:if game_state.paused:game_state.resume_game()else:game_state.pause_game()elif event.key == pygame.K_r:game_state.start_game()  #按r键强制重新开始游戏elif event.key == pygame.K_m:game_resource.pause_bg_music()elif event.key == pygame.K_q:sys.exit()if __name__ == '__main__':main()

设置

SCREEN_WIDTH = 1200      #窗口宽度
SCREEN_HEIGHT = 900     #窗口高度
CELL_WIDTH = 40         #方块在20*10个单元格组成的游戏区内移动。每个单元格的边长是40个像素。
LINE_NUM = 20           #游戏区域共20行
COLUMN_NUM = 10         #游戏区域共10列
GAME_AREA_WIDTH = CELL_WIDTH * COLUMN_NUM     #游戏区域宽度(单位:像素)
GAME_AREA_HEIGHT = CELL_WIDTH * LINE_NUM      #游戏区域高度
GAME_AREA_LEFT = (SCREEN_WIDTH - GAME_AREA_WIDTH) // 2      #游戏区左侧的空白区的宽度
GAME_AREA_TOP = SCREEN_HEIGHT - GAME_AREA_HEIGHT - 50       #游戏区顶部的空白区的宽度
EDGE_COLOR = (0, 0, 0)          #游戏区单元格边界线的颜色。今后,网格线会被去除。
CELL_COLOR = (100, 100, 100)    #单元格填充色。
BG_COLOR = (230, 230, 230)      #窗口背景色#S型方块的姿态序列。首先是未翻转的姿态,接着是向右翻转90度的姿态。再翻转90度,将回到未翻转前的姿态。
S_SHAPE_TEMPLATE = [['.OO.','OO..','....'],['.O..','.OO.','..O.']]Z_SHAPE_TEMPLATE = [['OO..','.OO.','....'],['..O.','.OO.','.O..']]I_SHAPE_TEMPLATE = [['.O..','.O..','.O..','.O..'],['....','OOOO','....','....']]O_SHAPE_TEMPLATE = [['OO','OO']]J_SHAPE_TEMPLATE = [['.O.','.O.','OO.'],['O..','OOO','...'],['OO.','O..','O..'],['OOO','..O','...']]L_SHAPE_TEMPLATE = [['O..','O..','OO.'],['...','OOO','O..'],['OO.','.O.','.O.'],['..O','OOO','...']]T_SHAPE_TEMPLATE = [['.O.','OOO','...'],['.O.','.OO','.O.'],['...','OOO','.O.'],['..O','.OO','..O']]PIECES = {'S': S_SHAPE_TEMPLATE,'Z': Z_SHAPE_TEMPLATE,'J': J_SHAPE_TEMPLATE,'L': L_SHAPE_TEMPLATE,'I': I_SHAPE_TEMPLATE,'O': O_SHAPE_TEMPLATE,'T': T_SHAPE_TEMPLATE}PIECE_TYPES = ['S', 'Z', 'J', 'L', 'I', 'O', 'T']PIECE_COLORS = {'S': (0, 255, 128),'Z': (255, 128, 255),'J': (128, 0, 255),'L': (0, 0, 255),'I': (0, 128, 0),'O': (255, 0, 0),'T': (255, 128, 0)
}WALL_BLANK_LABEL = '-'   #墙体矩阵中表示无砖块
TIMER_INTERVAL = 1000   #方块自动落下的等待时间初始值。SCORE_LABEL_COLOR = (0, 0, 0)
SCORE_COLOR = (255, 0, 0)
TITLE_COLOR = (0, 0, 255)
HANZI_COLOR = (0, 0, 0)EDGE_WIDTH = 5      #游戏区域外框线宽度
MARGIN_WIDTH = 40   #游戏区域外框线与其他窗口元素之间的间距DIFFICULTY_LEVEL_INTERVAL = 5000   #每过5000分,难度升1级
TIMER_DECREASE_VALUE = 50           #难度每升1级,定时器加快50ms发出闹铃信号

游戏状态类

import random
from settings import *
from piece import Piece
from gamewall import GameWall
import pygame
import time
class GameState():def __init__(self, screen):self.screen = screenself.wall = GameWall(screen)self.piece = Noneself.next_piece = Noneself.timer_interval = TIMER_INTERVAL   #1000msself.game_score = 0self.stopped = Trueself.paused = Falseself.session_count = 0self.difficulty = 1def set_timer(self, timer_interval):pygame.time.set_timer(pygame.USEREVENT, timer_interval)def stop_timer(self):pygame.time.set_timer(pygame.USEREVENT, 0)  #传入0表示清除定时器def add_score(self, score):self.game_score += scoredifficulty = self.game_score // DIFFICULTY_LEVEL_INTERVAL + 1if difficulty > self.difficulty:self.difficulty += 1self.timer_interval -= TIMER_DECREASE_VALUEpygame.time.set_timer(pygame.USEREVENT, self.timer_interval)def start_game(self):self.stopped = Falseself.set_timer(TIMER_INTERVAL)self.timer_interval = TIMER_INTERVALself.piece = self.new_piece()  #生成第一个方块。此时self.piece=None, self.next_piece引用方块对象。self.piece = self.new_piece()  #生成第二个方块,此时self.piece引用方块对象。self.session_count += 1self.wall.clear()self.game_score = 0self.paused = Falserandom.seed(int(time.time()))  #每次游戏,使用不同的随机数序列def pause_game(self):self.stop_timer()self.paused = Truedef resume_game(self):self.set_timer(self.timer_interval)self.paused = Falsedef touch_bottom(self):self.wall.add_to_wall(self.piece)self.add_score(self.wall.eliminate_lines())for c in range(COLUMN_NUM):if self.wall.is_wall(0, c):self.stopped = Truebreakif not self.stopped:self.piece = self.new_piece()if self.piece.hit_wall():self.stopped = Trueif self.stopped:self.stop_timer()def new_piece(self):self.piece = self.next_pieceself.next_piece = Piece(random.choice(PIECE_TYPES), self.screen, self.wall)return self.piece

好啦,今天的小游戏就到这里啦,源码获取的话+君羊就行了

Python源码、问题解答&学习交流群:733089476

今天咱们用 Python 整一个 俄罗斯方块 小游戏吧(附源代码)相关推荐

  1. python俄罗斯方块小游戏实验报告,童年的记忆——如何用python写一个俄罗斯方块小游戏!...

    谈到记忆里的小游戏,俄罗斯方块是大家一定会想到的一款游戏,自己写出来的应该玩起来更有感觉,然后就写了一个俄罗斯方块的游戏 给大家分享一下这个游戏的源码 先用python创建一个py文件 定义这次程序所 ...

  2. python编的俄罗斯方块游戏下载_用python写一个俄罗斯方块小游戏

    相信大家都玩过俄罗斯方块吧,应该是小时候的回忆吧,但是想不想了解一下这个程序是怎么写出来的呢,自己写出来的应该玩起来更有感觉吧! 感觉还是蛮好玩吧! 接下来,我就分享一下这个游戏的源码过程啊! 先用p ...

  3. python经典小游戏-用Python设计一个经典小游戏:猜大小

    码农那点事儿 关注我们,一起学习进步 本文主要介绍如何用Python设计一个经典小游戏:猜大小. 游戏规则: 初始本金是1000元,默认赔率是1倍,赢了,获得一倍金额,输了,扣除1倍金额. 玩家选择下 ...

  4. 20行python代码的入门级小游戏-用Python设计一个经典小游戏

    本文主要介绍如何用Python设计一个经典小游戏:猜大小. 在这个游戏中,将用到前面我介绍过的所有内容:变量的使用.参数传递.函数设计.条件控制和循环等,做个整体的总结和复习. 游戏规则: 初始本金是 ...

  5. python经典小游戏-用Python设计一个经典小游戏

    本文主要介绍如何用Python设计一个经典小游戏:猜大小. 在这个游戏中,将用到前面我介绍过的所有内容:变量的使用.参数传递.函数设计.条件控制和循环等,做个整体的总结和复习. 游戏规则: 初始本金是 ...

  6. 童年经典回忆 | 从零开始带大家用Python撸一个魔塔小游戏呀(2)

    导语 上一期我们带大家完成了魔塔游戏每一层的初始化画面的制作: 童年经典回忆 | 从零开始带大家用Python撸一个魔塔小游戏呀(1) 这一期我们会带大家进一步复现我们的魔塔小游戏,主要内容包括英雄类 ...

  7. python简单代码制作小游戏-用Python设计一个经典小游戏

    本文主要介绍如何用Python设计一个经典小游戏:猜大小. 在这个游戏中,将用到前面我介绍过的所有内容:变量的使用.参数传递.函数设计.条件控制和循环等,做个整体的总结和复习. 游戏规则: 初始本金是 ...

  8. python游戏设计_用Python设计一个经典小游戏

    本文主要介绍如何用Python设计一个经典小游戏:猜大小. 在这个游戏中,将用到前面我介绍过的所有内容:变量的使用.参数传递.函数设计.条件控制和循环等,做个整体的总结和复习. 游戏规则: 初始本金是 ...

  9. 童年经典回忆 | 从零开始带大家用Python撸一个魔塔小游戏呀(3)

    导语 上一期我们主要带大家写了勇士类,以及勇士与一些简单的地图元素接触时所触发的事件: 童年经典回忆 | 从零开始带大家用Python撸一个魔塔小游戏呀(2) 这一期我们会带大家进一步复现我们的魔塔小 ...

  10. python课程设计小游戏大全_用Python设计一个经典小游戏

    本文主要介绍如何用Python设计一个经典小游戏:猜大小. 在这个游戏中,将用到前面我介绍过的所有内容:变量的使用.参数传递.函数设计.条件控制和循环等,做个整体的总结和复习. 游戏规则: 初始本金是 ...

最新文章

  1. 稀缺:你是如何陷入贫穷与忙碌的
  2. 继人工智能攻陷围棋,德州扑克也沦陷了
  3. Matlab的不同进制转换
  4. JUnit+EclEmma进行覆盖测试
  5. Spring boot Mybatis 整合(注解版)
  6. java.net.SocketException: 权限不够
  7. 前端实现3d效果_前端动画效果实现的简单比较
  8. c语言.h和.c连接错误,conio.h链接错误问题
  9. 一行代码下载网页视频!
  10. 关于JSZIP压缩图片打包下载的一些用法
  11. 你还在用乞丐版的深拷贝么
  12. ps钢笔路径打不出字怎么解决?
  13. 苏州计算机云联盟协会,【缤FUN社团】计算机协会
  14. 【Android】java.lang.SecurityException: getDeviceId: Neither user xxxxx nor current process has andro
  15. 用c++模拟ATM机
  16. 网络营销不是收费删帖:为网络营销正本清源
  17. php mixed 类型,PHP数据类型及简单介绍
  18. 【强化学习-医疗】用于临床决策支持的深度强化学习:简要综述
  19. 液晶显示器花屏怎样解决
  20. 还在叫苦VR AR资本寒冬,看看人家是怎么落地挣钱的!

热门文章

  1. C语言程序员个人简历范文,程序员求职放大招!牛人用C语言写简历
  2. Halcon region区域提取及区域转图像
  3. 文本处理技能与文本数据清洗、提取、分词与统计
  4. 宾夕法尼亚州立大学:探索量子AI如何加速治愈癌症
  5. 学习 PixiJS — 动画精灵
  6. 02计算机优秀毕业论文-摘要·前言
  7. 【STM32】1.44寸TFT液晶屏显示字符、汉字和图片
  8. css 实现一个带尖角的正方形
  9. 概率论与随机过程(分布函数整合)
  10. RFBnet论文翻译:感受野块网络对于精确的和快速的目标检测