首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >初学者,这个俄罗斯方块游戏如何完善呀?

初学者,这个俄罗斯方块游戏如何完善呀?

提问于 2022-04-16 11:27:07
回答 0关注 0查看 120
代码语言:javascript
运行
AI代码解释
复制
# 主程序(启动)

import pygame, sys  # 导入pygame模块
from day07.tetris.settings import Setting  # 导入settings模块中的Setting类
from day07.tetris.Tetromino import Tetromino  # 导入Tetromino模块中的Tetromino类

pygame.init()  # 初始化窗口
screen = pygame.display.set_mode((525, 550))  # 创建屏幕(窗口),并设置屏幕大小
pygame.display.set_caption("俄罗斯方块")
clockObj = pygame.time.Clock()  # 确定程序运行最大帧速度
set = Setting()  # 创建Settings对象
wall = [[None for col in range(0, 10)] for row in range(0, 20)]  # 打墙
# wall = [[None,None,None,None,....],[None,None,None,None,....],....]
RUNNING = 0  # 运行状态
PAUSE = 1  # 暂停状态
GAMEOVER = 2  # 结束状态
state = RUNNING


def full_cell(row):  # 检查某一行是否满了
    # row:当前行,有一个cell为None就是不满
    for cell in wall[row]:
        if cell is None:
            return False
    return True


def delete_row(row):  # 删除某一行
    while row > 0:
        col = 0
        while col < 10:
            wall[row][col] = wall[row - 1][col]
            col += 1
        row -= 1
    for cell in wall[0]:
        cell = None


scoreTable = [0, 1, 5, 10, 50]


def destory_lines():  # 删除若干行
    global lines, score, scoreTable
    one_time_lines = 0
    row = 0
    while row < 19:
        if full_cell(row):
            delete_row(row)
            one_time_lines += 1
        row += 1
    score += scoreTable[one_time_lines]
    lines += one_time_lines


level = 1;
lines = 0;
score = 0


def score_blit():  # 绘制分数和等级
    fontObj = pygame.font.Font("arial.ttf", 35)  # 得到字体对象
    scoreObj = fontObj.render("SCORE:" + str(score), True, (50, 20, 240))  # 得到绘制的文本
    linesObj = fontObj.render("LINES:" + str(lines), True, (50, 20, 240))
    levelObj = fontObj.render("LEVEL:" + str(level), True, (50, 20, 240))
    screen.blit(scoreObj, (310, 150))  # 绘制分数
    screen.blit(linesObj, (310, 205))  # 绘制行
    screen.blit(levelObj, (310, 260))  # 绘制等级


speed = 40  # 下落的速度
index = 0  # 下落的频率


def drop_action():  # 下落流程的控制
    global speed, index, score, lines, level
    speed = 40 - (lines // 100)  # 每100行速度减1
    if speed < 1: speed = 1
    level = 41 - speed
    index += 1
    if index % speed == 0:
        soft_drop()
    if index > 10000:
        index = 0


def can_drop():  # 该方法主要用来判断图形是否可以继续下落
    global currentOne
    # 不能下落情况:1.当图形中有任意一个方块触底的时候
    # 2.当图形中有任意一个方块落到墙不是None的位置
    for cell in currentOne.cells:
        row = cell.row
        col = cell.col
        if row == 19: return False
        if col >= 0 and col < 10 and row + 1 > 0 and row + 1 <= 19 and wall[row + 1][col] is not None:
            return False
    return True


# 不能继续下落的方块固定在墙上
def land_into_wall():
    global currentOne
    for cell in currentOne.cells:  # 利用循环将图形中的每个小方块取出来
        row = cell.row
        col = cell.col
        wall[row][col] = cell  # 将小方块放到墙的列表中去,这样该位置的None就被替换了


def soft_drop():  # 软下落
    global currentOne, nextOne
    if can_drop():
        currentOne.drop()
    else:
        land_into_wall()
        destory_lines()
        currentOne = nextOne
        nextOne = Tetromino.rand_one()


def hard_drop_action():  # 硬下落
    global currentOne, nextOne  # 声明此处的变量是全部变量不是局部变量
    while can_drop():
        soft_drop()  # 调用软下落
    destory_lines()
    land_into_wall()
    currentOne = nextOne
    nextOne = Tetromino.rand_one()


# 绘制当前图形和下一个图形
currentOne = Tetromino.rand_one()  # 当前图形
nextOne = Tetromino.rand_one()  # 下一个图形


def current_next_blit():
    for cell in currentOne.cells:  # 将当前图形中的每个小方块取出来
        x = cell.col
        y = cell.row
        screen.blit(cell.img, (x * 26 + 15 - 1, y * 26 + 15 - 1))  # 绘制当前图形
    for cell in nextOne.cells:  # 将下一个图形的每一个小方块取出来
        x = cell.col
        y = cell.row
        screen.blit(cell.img, ((x + 10) * 26 + 15, (y + 1) * 26 + 15))  # 绘制下一个图形


def bg_wall_blit():
    '''绘制背景图和墙壁'''
    screen.blit(set.bgImage, (0, 0))  # 绘制背景图
    # 绘制墙壁
    for row in range(0, 20):
        for col in range(0, 10):
            if wall[row][col] is None:  # 绘制空白墙
                pygame.draw.rect(screen, (0, 0, 0), (col * 26 + 15, row * 26 + 15, 26, 26), 1)
            else:  # 绘制实心墙(图性墙)
                screen.blit(wall[row][col].img, (col * 26 + 15 - 1, row * 26 + 15 - 1))


# 判断是否越界
def out_of_bounds():
    for cell in currentOne.cells:
        col = cell.col
        if col < 0 or col > 9:
            return True
    return False


# 判断是否重合
def coincide():
    for cell in currentOne.cells:
        row = cell.row
        col = cell.col
        if wall[row][col] is not None:
            return True
    return False


# 左移流程的控制
def move_left_action():
    currentOne.move_left()
    if out_of_bounds() or coincide():
        move_right_action()


# 右移流程的控制
def move_right_action():
    currentOne.move_right()
    if out_of_bounds() or coincide():
        move_left_action()


def process_running(key):  # 运行状态下按键时的控制
    global state
    if key == pygame.K_LEFT: move_left_action()  # 左键 向左移动
    if key == pygame.K_RIGHT: move_right_action()  # 右键 向右移动
    if key == pygame.K_SPACE: hard_drop_action()  # 空格键硬下落
    if key == pygame.K_UP: rotate_right_action()  # 向右旋转



def rotate_right_action():
    currentOne.rotate_right()
    if out_of_bounds() or coincide():
        currentOne.rotate_left() # 向左旋转

def rotate_left_action():
    currentOne.rotate_right()
    if out_of_bounds() or coincide():
        currentOne.rotate_right() # 向右旋转


def action():
    bg_wall_blit()  # 调用绘制背景图和墙壁的方法
    current_next_blit()  # 调用绘制当前图形和下一个图形
    # hard_drop_action()# 调用硬下落方法
    score_blit()  # 调用绘制分数,等级,消去的行
    drop_action()  # 下落流程的控制


def main():
    while True:
        # 遍历事件的列表(鼠标事件,键盘事件,。。。)
        for event in pygame.event.get():
            if event.type == pygame.QUIT:
                pygame.quit()
                sys.exit()
            if event.type == pygame.KEYDOWN:
                process_running(event.key)
        pygame.display.update()  # 刷新
        clockObj.tick(60)  # 设置帧数
        action()  # 调用action方法


if __name__ == '__main__':
    main()  # 启动程序
代码语言:javascript
运行
AI代码解释
复制
class State:
    def __init__(self,row0,col10,row1,col1,row2,col2,row3,col3):
        self.row0 = row0
        self.col0 = col10
        self.row1 = row1
        self.col1 = col1
        self.row2 = row2
        self.col2 = col2
        self.row3 = row3
        self.col3 = col3

代码语言:javascript
运行
AI代码解释
复制
# 加载图片
import pygame

class Setting:
    def __init__(self):
        self.bgImage = pygame.image.load("img/tetris.jpg")
        self.T = pygame.image.load("img/T.jpg")
        self.S = pygame.image.load("img/S.jpg")
        self.Z = pygame.image.load("img/Z.jpg")
        self.O = pygame.image.load("img/O.jpg")
        self.L = pygame.image.load("img/L.jpg")
        self.J = pygame.image.load("img/J.jpg")
        self.I = pygame.image.load("img/I.jpg")
        self.pause = pygame.image.load("img/pause.jpg")
        self.gameover = pygame.image.load("img/game-over.jpg")
代码语言:javascript
运行
AI代码解释
复制
#小方块类

class Cell:
    def __init__(self,row,col,img):
        self.row=row
        self.col=col
        self.img=img

    def drop(self):
        "下降,纵坐标+1"
        self.row += 1

    def move_left(self):
        "左移,横坐标-1"
        self.col -= 1
    def move_right(self):
        "右移,横坐标+1"
        self.col +=1
代码语言:javascript
运行
AI代码解释
复制
# 图形类

from day07.tetris.cell import Cell
from day07.tetris.settings import Setting
import random
from day07.tetris.state import State

class Tetromino:
    '''基类'''
    index = 1000
    def drop(self): # 下降
        for cell in self.cells: # 循环获取方块列表中的所有小方块
            cell.drop() # 每个小方块都调用下降的方法

    def move_left(self): # 左移
        for cell in self.cells: # 循环获取方块列表中的所有小方块
            cell.move_left() # 每个小方块都调用左移的方法

    def move_right(self): # 右移
        for cell in self.cells: # 循环获取方块列表中的所有小方块
            cell.move_right() # 每个小方块都调用右移的方法

    @classmethod
    def rand_one(cls): # 使用类方法是因为可以直接用类名调用,不需要创建Tetromino对象
        i = random.randint(1,7) # 随机产生1-7之间的任意整数
        if i == 1:return T() # 产生不同的整数就返回不同的图形对象,保证每次产生图形的随机性
        if i == 2: return J()
        if i == 3:return O()
        if i == 4: return Z()
        if i == 5:return S()
        if i == 6: return I()
        if i == 7:return L()

    def rotate_right(self): #向右旋转
        self.index += 1
        s = self.states[self.index % len(self.states)]
        row = self.cells[3].row
        col = self.cells[3].col
        self.cells[0].row = row+s.row1
        self.cells[1].row = row + s.row2
        self.cells[2].row = row + s.row3
        self.cells[0].col = col + s.col0
        self.cells[1].col = col + s.col1
        self.cells[2].col = col + s.col2

    def rotate_left(self):  # 向左旋转
            self.index += 1
            s = self.states[self.index % len(self.states)]
            row = self.cells[3].row
            col = self.cells[3].col
            self.cells[0].row = row - s.row1
            self.cells[1].row = row - s.row2
            self.cells[2].row = row - s.row3
            self.cells[0].col = col - s.col0
            self.cells[1].col = col - s.col1
            self.cells[2].col = col - s.col2







set = Setting()  # 创建Settings()对象
class T(Tetromino):
    def __init__(self):
        self.cells = [Cell(1, 4, set.T), Cell(0, 3, set.T),
                      Cell(0, 5, set.T), Cell(0, 4, set.T)]
        self.states = [State(1, 0, 0, -1, 0, 1, 0, 0), State(0, -1, -1, 0, 1, 0, 0, 0),
                       State(-1, 0, 0, 1, 0, -1, 0, 0), State(0, 1, 1, 0, -1, 0, 0, 0)]

class L(Tetromino):
    def __init__(self):
        self.cells = [Cell(1, 3, set.L), Cell(0, 3, set.L),
                      Cell(0, 5, set.L), Cell(0, 4, set.L)]
        self.states = [State( 1, -1, 0, -1, 0, 1, 0, 0), State( -1, -1, -1, 0, 1, 0, 0, 0),
                       State(-1, 1, 0, 1, 0, -1, 0, 0), State( 1, 1, 1, 0, -1, 0, 0, 0)]

class S(Tetromino):
    def __init__(self):
        self.cells = [Cell(1, 4, set.S), Cell(1, 3, set.S),
                      Cell(0, 4, set.S), Cell(0, 5, set.S)]
        self.state = [State(0,0,0,-1,-1,0,-1,1), State(0,0,-1,0,0,1,1,1)]

class O(Tetromino):
    def __init__(self):
        self.cells = [Cell(1, 3, set.O), Cell(0, 4, set.O),
                      Cell(0, 3, set.O), Cell(1, 4, set.O)]
        self.state = [State(1,0,0,1,0,0,1,1), State(1,0,0,1,0,0,1,1)]

class I(Tetromino):
    def __init__(self):
        self.cells = [Cell(0, 4, set.I), Cell(0, 3, set.I),
                      Cell(0, 5, set.I), Cell(0, 6, set.I)]
        self.state = [State(0,0,0,-1,0,1,0,2), State(0,0,-1,0,1,0,2,0)]
class Z(Tetromino):
    def __init__(self):
        self.cells = [Cell(1, 4, set.Z), Cell(0, 3, set.Z),
                      Cell(0, 4, set.Z), Cell(1, 5, set.Z)]
        self.states = [State(0, 0, -1, -1, -1, 0, 0, 1), State(0, 0, -1, 1, 0, 1, 1, 0)]

class J(Tetromino):
    def __init__(self):
        self.cells = [Cell(1, 5, set.J), Cell(0, 3, set.J),
                      Cell(0, 5, set.J), Cell(0, 4, set.J)]
        self.states = [State( 1, 1, 0, -1, 0, 1, 0, 0), State(1, -1, -1, 0, 1, 0, 0, 0),
                       State( -1, -1, 0, 1, 0, -1, 0, 0), State(-1, 1, 1, 0, -1, 0, 0, 0)]

回答 2

最爱开车啦

发布于 2017-12-21 03:41:47

Eclipse项目属性 - > Java构建路径 - >订单和导出

取消选中Android私有库。

嗨喽你好

发布于 2017-12-21 03:41:33

我有同样的问题,很奇怪,因为它只发生在使用Eclipse时(但它与蚂蚁确定)。这是我如何解决它:

  • 右键单击 Project Name
  • 选择Build Path- >Configure Build Path
  • 在Java Build Path,转到选项卡Order and Export
  • 取消你的.jar包

只是有时: 在订单和导出选项卡,我没有任何jar库,所以我有未经检查的Android私人库项目。现在我的项目正在运行。

和开发者交流更多问题细节吧,去 写回答
相关文章
Cause: com.android.dex.DexException: Multiple dex files define Lcom
stackoverflow:http://stackoverflow.com/questions/7870265/unable-to-execute-dex-multiple-dex-files-define-lcom-myapp-rarray
yechaoa
2022/06/10
3660
Cause: com.android.dex.DexException: Multiple dex files define Lcom
dex文件详解
1、通过IDE自动帮我们build 生成 2、手动通过dx命令去生成dex文件 3、在手机上手动运行dex文件
全栈程序员站长
2022/09/14
8470
打开DEX文件
.apk文件改为.zip文件 解压。 下载dex2jar软件 解压下载的文件 将 APK解压出来的文件夹下的 classes.dex 文件复制到 解压下的dex2jar文件下. 在dex2jar文件夹目录处输入cmd 复制“d2j-dex2jar.bat classes.dex” 右键粘贴 会生成一个.jar文件 下载jd-gui软件 解压后打开软件 拖入.jar文件
全栈程序员站长
2022/09/14
7K0
【Android 安全】DEX 加密 ( DEX 加密原理 | DEX 加密简介 | APK 文件分析 | DEX 分割 )
Proguard 混淆弊端 : 之前使用 Proguard 混淆 后的代码 , 虽然降低了代码的可读性 , 但是如果多花点时间和精力 , 还是可以读懂的 , 因此这里继续进行下一个操作 , DEX 加密 , 经过加密后的 DEX 文件 , 就 无法被反编译工具反编译出来了 ;
韩曙亮
2023/03/28
1.5K0
【Android 安全】DEX 加密 ( DEX 加密原理 | DEX 加密简介 | APK 文件分析 | DEX 分割 )
dex文件打开
我们知道,要读取一个类代码,或读取类里的方法代码,都需要打开Dex文件,然后按前面介绍的格式去分析,并且读取出相应的内容,才可以给虚拟机进行解释执行。现在,我们就来学习和分析Dex文件的读取相关的代码。如下:
全栈程序员站长
2022/09/14
3.9K0
Java文件是如何编译成Dex文件的?如何执行Dex文件?「建议收藏」
Android系统中,一个App的所有代码都在一个Dex文件里面。Dex是一个类似Jar的存储了多有Java编译字节码的归档文件。
全栈程序员站长
2022/09/07
2.3K0
dex文件介绍
发布者:全栈程序员栈长,转载请注明出处:https://javaforall.cn/153507.html原文链接:https://javaforall.cn
全栈程序员站长
2022/09/07
7270
dex文件介绍
java打开dex文件_dex文件反编译工具(Dedexer)
dedexer是Android DEX文件反汇编工具,目前网上唯一一个反编译dex文件的反编译工具。如果你用过ant编译java程序,那么编译Dedexer是一件非常简单的工作。
全栈程序员站长
2022/09/14
1.8K0
【Android 安全】DEX 加密 ( Java 工具开发 | 生成 dex 文件 | Java 命令行执行 )
上一篇博客解压了 代理 Application 依赖库 multiple-dex-core-debug.aar , 并获取了其中的 classes.jar 文件 ;
韩曙亮
2023/03/28
1.1K1
【Android 安全】DEX 加密 ( Java 工具开发 | 生成 dex 文件 | Java 命令行执行 )
android加载dex方法,android Dex文件的加载
上篇文章讲到了apk的分包,通过multidex构建出包含多个dex文件的apk,从而解决65536的方法数限制问题《Android Dex分包》。
全栈程序员站长
2022/09/07
2.2K0
dex文件格式
Android 4.0源码Dalvik/docs目录下文档dex-format.html有详细介绍dex文件格式
全栈程序员站长
2022/09/13
1.8K0
dex文件格式
浅谈 Android Dex 文件
了解了 Dex 文件以后,对日常开发中遇到一些问题能有更深的理解。如:APK 的瘦身、热修复、插件化、应用加固、Android 逆向工程、64K 方法数限制。
有赞coder
2020/08/25
7200
浅谈 Android Dex 文件
android .dex文件探究
在我们写Java代码的时候,生成的文件是.java文件,但是JVM并不识别这个,所以会先转成class文件,而在Android端,Android上的Davlik虚拟机能运行.dex。所以dex文件中包含了所有的app代码,可利用反编译工具获取java代码。
全栈程序员站长
2022/09/14
6220
android .dex文件探究
dex文件字节码解析
这一篇解析dex文件.还是由上一篇文章MainActivity生成的dex文件.dex文件比较大,我就不贴16进制代码了,大致讲一下具体怎么操作.由于手工解析太困难了,所以我就借助代码和两篇参考文章来解析的 Android逆向之旅---解析编译之后的Dex文件格式 Android dex文件解析 接下来开始解析.
提莫队长
2020/06/02
7530
【Android 热修复】热修复原理 ( 修复包 Dex 文件准备 | Dex 优化为 Odex | Dex 文件拷贝 | 源码资源 )
参考 【Android 热修复】热修复原理 ( 热修复框架简介 | 将 Java 字节码文件打包到 Dex 文件 ) 二、 将 Java 字节码文件打包到 Dex 文件 章节流程 , 将更新后的 kim.hsl.hotfix.HotFixTest 类打包成 dex 文件 ;
韩曙亮
2023/03/29
8990
【Android 热修复】热修复原理 ( 修复包 Dex 文件准备  | Dex 优化为 Odex | Dex 文件拷贝 | 源码资源 )
[Android][Security] Android 逆向之 smali
APK其实就是一个ZIP压缩包,将APK后缀改成ZIP后就可以解压出APK内部文件。
wOw
2020/01/21
2.1K1
class文件与dex文件解析
正式写之前先说两句废话,这篇笔记是我去年的时候创建的,当时是写了一部分,后来因为乱七八糟的事情太忙了,结果放到草稿箱里给忘记了,昨天回过头去复习这部分的内容偶然间发现了它,还是个没完成的它,大写的尴尬啊,所以急忙给补上了,此处鄙视一下自己!
全栈程序员站长
2022/09/14
1.9K0
class文件与dex文件解析
【Android 安全】DEX 加密 ( 代理 Application 开发 | 加载 dex 文件 | 使用反射获取方法创建本应用的 dexElements | 各版本创建 dex 数组源码对比 )
参考 : 4.4.4_r1/xref/libcore/dalvik/src/main/java/dalvik/system/DexPathList.java
韩曙亮
2023/03/28
2.2K0
【Java 虚拟机原理】Dalvik 虚拟机 ( 打包 Jar 文件和 Dex 文件 | 反编译 Dex 文件 | 分析 Dex 文件反编译结果 )
Dalvik 虚拟机运行的是 Dex 文件 ; Dex 文件并不是最终 DVM 运行的文件 , Dex 文件还需要再次优化为 Odex 文件 , 这才是最终运行在 DVM 上的文件 ;
韩曙亮
2023/03/29
2.3K0
【Java 虚拟机原理】Dalvik 虚拟机 ( 打包 Jar 文件和 Dex 文件 | 反编译 Dex 文件 | 分析 Dex 文件反编译结果 )
class文件和dex文件「建议收藏」
使用010Editor可以查看class文件的详细信息(注意需要安装模板):
全栈程序员站长
2022/09/14
6490
class文件和dex文件「建议收藏」

相似问题

Java SDK无法编译成dex文件?

1277

加固后crash,报dex not found?

32.6K

Multiple dex files define Lokhttp3/Challenge?

1544

应用加固助手 mac v3.0.7.12 加固安卓应用后 热加载的dex代码无法依赖jar代码?

1411

如何将多个numpy数组写入文件?

0378
相关问答用户
腾讯云TDP | 先锋会员擅长2个领域
某公司 | 程序员擅长1个领域
擅长2个领域
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

扫码加入开发者社群
关注 腾讯云开发者公众号

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档