iis服务器助手广告广告
返回顶部
首页 > 资讯 > 后端开发 > Python >pygame俄罗斯方块游戏
  • 594
分享到

pygame俄罗斯方块游戏

pygame游戏python 2023-10-25 20:10:35 594人浏览 独家记忆

Python 官方文档:入门教程 => 点击学习

摘要

俄罗斯方块游戏开发 俄罗斯方块是一款世界级经典游戏,每门语言开发学习初步都会考虑制作俄罗斯方块游戏今天带着大家把俄罗斯方块用python语言开发一次 开发准备 安装Python 2.引入游戏库pyga

俄罗斯方块游戏开发

俄罗斯方块是一款世界级经典游戏,每门语言开发学习初步都会考虑制作俄罗斯方块游戏今天带着大家把俄罗斯方块用python语言开发一次

开发准备

安装Python
2.引入游戏库pygame
3.引入随机数

import pygameimport random

俄罗斯游戏步骤

俄罗斯方块初始形状

这里使用一个二维数组 用来标记俄罗斯相对应的方块形状 代码如下:

# 定义方块的基本形状blocks = [    # I    [        [1, 1, 1, 1],        [0, 0, 0, 0],        [0, 0, 0, 0],        [0, 0, 0, 0],    ],    # O    [        [1, 1, 0, 0],        [1, 1, 0, 0],        [0, 0, 0, 0],        [0, 0, 0, 0],    ],    # T    [        [1, 1, 1, 0],        [0, 1, 0, 0],        [0, 0, 0, 0],        [0, 0, 0, 0],    ],    # S    [        [0, 1, 1, 0],        [1, 1, 0, 0],        [0, 0, 0, 0],        [0, 0, 0, 0],    ],    # Z    [        [1, 1, 0, 0],        [0, 1, 1, 0],        [0, 0, 0, 0],        [0, 0, 0, 0],    ],    # J    [        [1, 1, 1, 0],        [0, 0, 1, 0],        [0, 0, 0, 0],        [0, 0, 0, 0],    ],    # L    [        [1, 1, 1, 0],        [1, 0, 0, 0],        [0, 0, 0, 0],        [0, 0, 0, 0],    ],]

游戏移动方向是否可能判断

这里为了不让他出现穿墙,跨过方块下落 都做对应的碰撞判断 具体代码如下:

# 判断方块是否可以向左移动def can_move_left(x, y, block):    for i in range(len(block)):        for j in range(len(block[i])):            if block[i][j] == 1:                if x + j - 1 < 0 or play_area[y + i][x + j - 1] != EMPTY:                    return False    return True# 判断方块是否可以向右移动def can_move_right(x, y, block):    for i in range(len(block)):        for j in range(len(block[i])):            if block[i][j] == 1:                if x + j + 1 >= COLS or play_area[y + i][x + j + 1] != EMPTY:                    return False    return True# 判断方块是否可以向下移动def can_move_down(x, y, block):    for i in range(len(block)):        for j in range(len(block[i])):            if block[i][j] == 1:                if y + i + 1 >= ROWS or play_area[y + i + 1][x + j] != EMPTY:                    global count                    count += 1                    print(y,",",x,";不能下降了",count)                    return False    return True# 判断方块是否可以变形def can_rotate(x, y, block):    return rotate_block(x, y, block) != block

俄罗斯方块旋转变形代码实现

# 变形方块def rotate_block(x, y, block):    new_block = []    for i in range(len(block)):        row = []        for j in range(len(block[i])):            row.append(block[len(block) - j - 1][i])        new_block.append(row)    if x + len(new_block[0]) > COLS or y + len(new_block) > ROWS:        return block    for i in range(len(new_block)):        for j in range(len(new_block[i])):            if new_block[i][j] == 1 and play_area[y + i][x + j] != EMPTY:                return block    return new_block

俄罗斯方块整行满格删除对应行

# 删除行def delete_rows():    full_rows = []  # 总共要删除的行号列表    for i in range(len(play_area)):  # 检测整行没有空格了        if EMPTY not in play_area[i]:            full_rows.append(i)   # 加入删除这行    # 偏移量bu 在一次性删除多行的时候 因为边删边补 会引起删除索引改变    bu = 0    for row in sorted(full_rows, reverse=True):  # 必须逆序 删除没有空格的行        del play_area[row+bu]        play_area.insert(0, [EMPTY] * COLS)        bu += 1    return len(full_rows)  # 返回删除的总行数

删除行后 根据一次删除的行计算得分规则

一次一行得10分 一次2行得30分 一次3行得50分 一次四行得100分,代码如下:

# 消除几行加分规则def add_score(drow):    global score    if drow == 1:        score += 10  # 一次消除一行 得分加10    elif drow == 2:  # 一次消除2行 得分加30        score += 30    elif drow == 3:        score += 50    elif drow == 4:        score += 100

检测游戏失败后 是否重新继续

# 游戏结束,重置游戏def reset_game():    global score    # 绘制提示语言    font = pygame.font.Font("simsun.ttc", 24)    # font = pygame.font.SysFont(None, 24)    text = font.render("游戏结束您的得分是{},重新开始请按空格键".fORMat(score), True, WHITE)    screen.blit(text, (10, height//2-12))    pygame.display.update()    flag = True    while flag:        for event in pygame.event.get():            if event.type == pygame.KEYDOWN and event.key == pygame.K_SPACE:                flag = False                break    global play_area, cur_block, cur_color    play_area = [[EMPTY] * COLS for i in range(ROWS)]    # play_area = [[EMPTY] * width for i in range(height)]    # 随机生成俄罗斯方块    cur_block = blocks[random.randint(0, len(blocks) - 1)]    cur_color = random.randint(0, 255), random.randint(0, 255), random.randint(0, 255)    # 重置分数    score = 0

游戏窗体创建与游戏初始数据设置

# 颜色定义BLACK = (0, 0, 0)WHITE = (255, 255, 255)# 初始化游戏pygame.init()# 设置游戏界面大小size = width, height = 640, 480# 游戏设置EMPTY = -1FPS = 60   ## 祯数SIZE = 20ROWS = height//SIZECOLS = width//SIZEcount = 0# 创建游戏界面screen = pygame.display.set_mode(size)# 设置游戏标题pygame.display.set_caption("俄罗斯方块")# 随机生成俄罗斯方块cur_block = blocks[random.randint(0, len(blocks) - 1)]cur_color = random.randint(0, 255), random.randint(0, 255), random.randint(0, 255)play_area = [[EMPTY] * COLS for i in range(ROWS)]x, y = width // 2//SIZE, 0  # 方块的初始位置clock = pygame.time.Clock()score = 0  # 分数 speed = 1000 #下降速度 目前没用到 后续会根据这个值来调整关卡速度(方块下落速度)# 设置定时器来控制下降速度  如果用帧数控制游戏速度的话 会影响按键 帧数低的时候 按键也失灵 这里用定时器来控制速度pygame.time.set_timer(pygame.USEREVENT ,speed)

主体控制代码:

while True:    for event in pygame.event.get():        if event.type == pygame.QUIT:            pygame.quit()            exit()        elif event.type == pygame.USEREVENT:            y += 1  # 一秒下降一格        elif event.type == pygame.KEYDOWN:            if event.key == pygame.K_LEFT and can_move_left(x, y, cur_block):                x -= 1            elif event.key == pygame.K_RIGHT and can_move_right(x, y, cur_block):                x += 1            elif event.key == pygame.K_UP and can_rotate(x, y, cur_block):                cur_block = rotate_block(x, y, cur_block)            elif event.key == pygame.K_DOWN and can_move_down(x, y+3, cur_block):                y += 3    # print(x,",",y)    # 消除行并计分    add_score(delete_rows())    # 随机生成新方块    if not can_move_down(x, y, cur_block):        # 将方块添加到游戏区域        for i in range(len(cur_block)):            for j in range(len(cur_block[i])):                if cur_block[i][j] == 1:                    print("y=",y,";x=",x,";i=",i,";j=",j)                    play_area[y + i][x + j] = cur_color        # 随机生成俄罗斯方块        cur_block = blocks[random.randint(0, len(blocks) - 1)]        cur_color = random.randint(0, 255), random.randint(0, 255), random.randint(0, 255)        x, y = width // 2//SIZE, 0  # 方块的初始位置        # 判断游戏是否结束        for i in play_area[0]:            if i != EMPTY:                reset_game()    # 绘制游戏区域    screen.fill(BLACK)    # print(play_area)    for i in range(ROWS):        for j in range(COLS):            if play_area[i][j] != EMPTY:                pygame.draw.rect(screen, play_area[i][j], pygame.Rect(j * 20, i * 20, 20, 20), 0)    # 绘制当前方块    for i in range(len(cur_block)):        for j in range(len(cur_block[i])):            if cur_block[i][j] == 1:                pygame.draw.rect(screen, cur_color, pygame.Rect((x + j) * 20, (y + i) * 20, 20, 20), 0)    # 绘制分数    font = pygame.font.SysFont(None, 24)    text = font.render("Score: {}".format(score), True, WHITE)    screen.blit(text, (10, 10))    pygame.display.update()    clock.tick(FPS)

开发总结

整个项目下载链接: pygame-俄罗斯方块游戏项目
1.游戏细节比较多,容易出错,需要清晰的逻辑思维,
2.速度控制上原先一直用FPS(帧数)来调节速度发现 按键灵敏度也跟帧数息息相关,所以这里用定时器来控制。不知道如果有多个定时器同时使用的话 会不会有新的问题,后续继续研究
3.消除行判断 原先没考虑到整个屏幕用二维列表来定义是否占格,浪费了很长时间无法很好的实现消除整行,这里用二维可以完美解决这个问题。
4.要显示中文字体需要加载字体,后面我会放整个项目下载链接,里面包括字体,后续持续更新 可能会加上音效等。
5.整个游戏花费了我5,6个小时的精力,还有很多心得 得大家一起去写写用用改改才能发现。有什么问题可以互相交流

游戏截图

俄罗斯方块游戏截图

来源地址:https://blog.csdn.net/yu126long/article/details/133691398

--结束END--

本文标题: pygame俄罗斯方块游戏

本文链接: https://www.lsjlt.com/news/442876.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • pygame俄罗斯方块游戏
    俄罗斯方块游戏开发 俄罗斯方块是一款世界级经典游戏,每门语言开发学习初步都会考虑制作俄罗斯方块游戏今天带着大家把俄罗斯方块用python语言开发一次 开发准备 安装python 2.引入游戏库pyga...
    99+
    2023-10-25
    pygame 游戏 python
  • Python+Pygame实战之俄罗斯方块游戏的实现
    目录导语一、运行环境二、代码展示三、效果展示导语 俄罗斯方块,作为是一款家喻户晓的游戏,陪伴70、80甚至90后,度过无忧的儿时岁月 它上手简单能自由组合、拼接技巧也很多。 你知道么...
    99+
    2022-12-28
    Python Pygame俄罗斯方块游戏 Python 俄罗斯方块 Python Pygame 游戏
  • CocosCreatorTypescript制作俄罗斯方块游戏
    目录1.引言2.需要解决的几个关键问题3.写在最后1.引言 最近开始学cocos,学完Typescript语法之后,跑去看cocos的官方文档,捣鼓了几天,写了一个非常简单的贪吃蛇,...
    99+
    2024-04-02
  • C++实现俄罗斯方块小游戏
    本文实例为大家分享了C++实现俄罗斯方块小游戏的具体代码,供大家参考,具体内容如下 操作说明: D F:左右旋转 J  L:左右移动 E(一堆键都行): 加快下落速度 空格...
    99+
    2024-04-02
  • C/C++实现俄罗斯方块游戏
    目录一、游戏效果展示二、完整代码三、所需开发环境四、具体项目实现①游戏欢迎界面 welcome( )②游戏背景 initGameScreen( ) ③方块表示 int bl...
    99+
    2024-04-02
  • JavaScript canvas实现俄罗斯方块游戏
    俄罗斯方块是个很经典的小游戏,也尝试写了一下。不过我想用尽量简洁逻辑清晰的代码实现。不用过多的代码记录下落方块的模型,或者记录每一个下落方块的x,y。想了下面的思路,然后发现这样很写...
    99+
    2024-04-02
  • Java 小游戏开发之俄罗斯方块
    Java项目 俄罗斯方块一、心得二、游戏实例游戏截图目录结构三、代码主界面 Tetris.javapackage com.fry.tetris;import java.util.Arrays;import java.util.Random;...
    99+
    2023-05-31
    java 俄罗斯方块 ava
  • python实现简单俄罗斯方块游戏
    本文实例为大家分享了python实现简单俄罗斯方块游戏的具体代码,供大家参考,具体内容如下 import pygame,sys,random,time all_block = [[...
    99+
    2024-04-02
  • 基于Matlab实现俄罗斯方块游戏
    我最早写的一个matlab小游戏 写的可能不够简洁,但还有可玩性, 先发上来,以后可能改进或出教程。 大家自己探索吧(外挂是哪个按键,更改颜色是哪个按键) 游戏效果 完整代码 fu...
    99+
    2024-04-02
  • 怎么用JavaScript做俄罗斯方块游戏
    这篇文章主要为大家展示了“怎么用JavaScript做俄罗斯方块游戏”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“怎么用JavaScript做俄罗斯方块游戏”这篇文章吧。最终游戏效果一开始我们先...
    99+
    2023-06-27
  • c++实现俄罗斯方块游戏代码
    俄罗斯方块c++ 1.创建项目2.总共需要创建两个文件,一个main.cpp,一个是elsfk2.h。本人使用的编译器是vs2019. 3.在项目的源文件夹下创建一个文件夹image...
    99+
    2024-04-02
  • c++如何实现俄罗斯方块游戏
    这篇文章主要介绍“c++如何实现俄罗斯方块游戏”,在日常操作中,相信很多人在c++如何实现俄罗斯方块游戏问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”c++如何实现俄罗斯方块游戏”的疑惑有所帮助!接下来,请跟...
    99+
    2023-06-22
  • Java实现经典俄罗斯方块游戏
    目录前言主要设计功能截图代码实现总结前言 俄罗斯方块是一个最初由阿列克谢帕吉特诺夫在苏联设计和编程的益智类视频游戏。 《俄罗斯方块》的基本规则是移动、旋转和摆放游戏自动输出的各种方块...
    99+
    2024-04-02
  • C#游戏开发之实现俄罗斯方块游戏
    目录实践过程效果代码实践过程 效果 代码 public partial class Form1 : Form { public Form1() { ...
    99+
    2023-01-05
    C#俄罗斯方块游戏 C#俄罗斯方块 C# 游戏
  • 使用JS+CSS实现俄罗斯方块游戏
    目录前提:设置HTML结构:创建CSS样式:编写JavaScript代码:响应式设计:添加触摸事件支持:测试并优化:代码示例:前提: 要在网页上实现一个适用于PC端和移动端的俄罗斯方...
    99+
    2023-05-14
    JS+CSS JS+CSS实现俄罗斯方块
  • Python实现简单的俄罗斯方块游戏
    本文实例为大家分享了Python实现俄罗斯方块游戏的具体代码,供大家参考,具体内容如下 玩法:童年经典,普通模式没啥意思,小时候我们都是玩加速的。 源码分享: import o...
    99+
    2024-04-02
  • 怎么在Python中利用Pygame实现一个俄罗斯方块游戏
    今天就跟大家聊聊有关怎么在Python中利用Pygame实现一个俄罗斯方块游戏,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。源码:# coding : ...
    99+
    2023-06-06
  • 怎么用Javascript实现俄罗斯方块游戏
    这篇文章主要介绍“怎么用Javascript实现俄罗斯方块游戏”,在日常操作中,相信很多人在怎么用Javascript实现俄罗斯方块游戏问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大...
    99+
    2024-04-02
  • Java实现俄罗斯方块游戏简单版
    本文实例为大家分享了Java实现俄罗斯方块游戏的具体代码,供大家参考,具体内容如下 游戏页面效果如下: 俄罗斯方块游戏本身的逻辑: 俄罗斯方块游戏的逻辑是比较简单的。它就类似于堆砌...
    99+
    2024-04-02
  • Java实现俄罗斯方块小游戏源码
    本文实例为大家分享了Java实现俄罗斯方块小游戏的具体代码,供大家参考,具体内容如下 一、最终效果 二、功能需求 1、 在二维平面里面用各种随机产生的方块堆积木,每满一行消去一行,...
    99+
    2024-04-02
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作