Python初学者制作俄罗斯方块小游戏之路

背景

我刚学Python三天,但不想一直看书,于是在网上学习了一些用Python制作俄罗斯方块的代码,有的代码没有注释,并且比较难理解,这里我找到了一个博主的代码,思路很清晰,游戏运行后也很顺畅,但代码没有注释,所以我就自己拿来学习并做了一定的修改。为了方便和我一样想拿小游戏练习巩固基础知识的小伙伴,我将自己的学习收获分享给大家,希望大家学习代码中能快速理解!

实现过程

过程主要分为以下几部分:

  1. 窗口设计
  2. 画布设计
  3. 方块定义与设置
  4. 方块功能方法设计
  5. 控件功能方法设计
    大致过程就分为这几部分,具体的流程见下面详细分析,原理啥的都会放在具体的部分中讲解

绘制窗口

在Python中,我们可以用tkinter模块进行窗口设计。为了使用此模块,我们首先需要import它:

from tkinter import *
import time
import random
import math
from tkinter import messagebox
from PIL import ImageTk, Image

在这里,我一下子把所有要导入的库块全贴出来了,下面对其解释:
from tkinter import * :导入tkinter库中所有的类、变量、函数等信息。
import time : 导入时间库(因为在代码中用到了sleep函数)
import random :导入随机数生成库
from tkinter import messagebox : 导入messagebox弹窗库
from PIL import ImageTk, Image :从PIL导入ImageTk、Image库,用于添加背景图片
前四个都是Python自带的库,不需要我们自己安装,但是最后一个需要我们安装PIL库(PIL是Python处理图像的库),安装方法在这里也给出:
(1)找到pip.exe所在的文件夹,我的是在D:\Python37\Scripts (一般pip.exe都在Python安装目录中Scripts文件夹里)
在这里插入图片描述
(2)运行cmd,将路径跳转到pip.exe所在的文件夹(我的是Scripts),输入pip install pillow , 电脑将会自动搜索pillow并进行安装,安装成功将会看到Successfully字样:
在这里插入图片描述
此时,Pillow就安装成功了。
之后,我们进行窗口绘制,代码如下:

        self.win = Tk()                                   #创建窗口
        self.win.title("俄罗斯方块_by ZSQ")  
        self.win.geometry('450x610+400+100')  
        #self.win.geometry('w×h+x+y'),w:窗口宽度,h:窗口长度,x,y是窗口在屏幕上的位置
        self.win.resizable(0, 0)                         #窗口的长宽不可改变
        self.win.mainloop()                              #让窗口运行起来

这样我们一个制作了一个窗口,效果如下:
在这里插入图片描述

添加控件与文本

下面我们添加四个按钮,分别是开始、暂停、重新开始、退出。多个文本,比如:等级、分数,对应代码如下:

        self.pauseBut = Button(self.win, text="暂停", bg='#7B8E9C', height=1, width=10, font=(10), command=self.pause)
        self.pauseBut.place(x=338, y=473)
        self.startBut = Button(self.win, text="开始",bg = '#DEC8B0', height=1, width=10, font=(10), command=self.startgame)
        self.startBut.place(x=338, y=430)
        self.restartBut = Button(self.win, text="重新开始",bg = '#EBB78C',height=1, width=10, font=(10), command=self.restart)
        self.restartBut.place(x=338, y=516)
        self.quitBut = Button(self.win, text="退出", height=1,bg = '#CA4F53' ,width=10, font=(10), command=self.quitgame) 
        self.quitBut.place(x=338, y=559)
        self.lab_score = Label(self.win, text="分数:0", font=("宋体",16,"normal"))
        self.lab_score.place(x=335, y=50)
        self.lab_scoreEx = Label(self.win, text = "每200升级一次", font = ("宋体",8,"normal"))
        self.lab_scoreEx.place(x=335,y=80)
        self.lab_grade = Label(self.win, text="等级:1", font=("宋体",16,"normal"))
        self.lab_grade.place(x=335, y=115)
        self.lab_next = Label(self.win, text = "下一个:",font=("宋体",16,"normal"))
        self.lab_next.place(x=335,y=180)

这里Button、Label都是控件,括号里是设置他们的参数,不懂的小伙伴可以自行百度(其实很好理解的),其中四个Button中的command是触发,即点击了按钮就触发相应方法(后面讲述)。添加控件后的效果如下:
在这里插入图片描述

添加画布

绘制好窗口,我们利用Canvas组件添加画布,我们这里添加两个画布,分别是下落画布(huabu)和下一块显示画布(huabu_right),对应代码如下:

        self.huabu = Canvas(self.win ,bg ='#DEF6FF' ,height=600, width=COLUMN * (BIANCHANG+1), takefocus=True) #方块下落画布
        self.huabu.place(x=2, y=2) #画布的位置
        self.huabu_right = Canvas(self.win,bg = '#DEF6FF',height=100, width=100) #下一个方块预览画布
        self.huabu_right.place(x=335,y=210)

因为其中涉及到了一些变量的使用(例如COLUMN, BIANCHANG等),这些都是事先声明好的全局变量,在这里贴出声明代码:

		BIANCHANG = 19        #一小方块边长
		COLOR = ['red', 'orange', 'yellow', 'green', 'blue', 'purple', '#00C5CD', '#00EE76', '#388E8E', '#556B2F', '#6B8E23',
         '#8B2252', '#8B6969', '#A0522D', '#BC8F8F', '#BC8F3F', 'black']      #颜色
		COLUMN = 16           #列数
		ROW = 30              #行数
		imgpath = 'menglong_.gif'  #背景图片			
		img = Image.open(imgpath)  #获取背景图片

回到画布上,刚刚添加完画布后,整体效果如下:
在这里插入图片描述
至此,窗口、画布的添加到此完毕,其中细节我没有过多讲解(比如Canvas里的参数含义,这些都可以自行搜索,讲的都很详细),接下来就是设计方块以及实现各种功能。

绘制一小方块

我们定义一个类(fangk)来在画布上具体位置上画一小块,代码如下:

class fangk: 
    def __init__(self, huabu, col, row):  #属于对象的数据成员, 
       #self参数必须是第一个形参,它代表对象本身,在类的实例方法中访问实例属性时,需要以self为前缀
      self.huabu = huabu  
      self.col, self.row = col, row    #col-->第几行的行,row-->第几列的列
      self.color = COLOR[self.row % 16
  • 10
    点赞
  • 58
    收藏
    觉得还不错? 一键收藏
  • 5
    评论
制作俄罗斯方块小游戏的具体步骤如下: 1. 导入必要的模块 我们需要导入 Pygame 模块来制作游戏,同时也需要随机模块来生成方块的形状。在代码的开头,我们需要添加以下代码: ``` import pygame import random ``` 2. 初始化 Pygame 在开始制作游戏之前,我们需要初始化 Pygame。我们需要设置屏幕大小,同时也需要设置游戏标题。在代码中添加以下代码: ``` pygame.init() # 设置屏幕大小 screen = pygame.display.set_mode((600, 800)) # 设置游戏标题 pygame.display.set_caption("Tetris Game") ``` 3. 创建方块类 我们需要创建一个方块类,用于表示每个方块。每个方块由四个方块组成,我们可以使用一个列表来表示它们。在代码中添加以下代码: ``` class Block(object): def __init__(self, x, y, color): self.x = x self.y = y self.color = color self.shape = [ [1, 1], [1, 1] ] ``` 4. 创建游戏类 我们需要创建一个游戏类,用于表示整个游戏。在游戏类中,我们需要定义一些属性,例如方块的颜色列表、每个方块的大小、游戏区域的大小等。在代码中添加以下代码: ``` class Game(object): def __init__(self): self.colors = [ (0, 0, 0), (255, 0, 0), (0, 255, 0), (0, 0, 255), (255, 255, 0), (255, 0, 255), (0, 255, 255), (128, 0, 0) ] self.block_size = 30 self.width = 10 self.height = 20 self.screen_width = self.width * self.block_size self.screen_height = self.height * self.block_size ``` 5. 创建游戏区域 我们需要创建一个游戏区域,用于放置方块。游戏区域可以使用一个二维列表来表示,每个元素表示一个方块的颜色。在代码中添加以下代码: ``` self.board = [] for i in range(self.height): row = [0] * self.width self.board.append(row) ``` 6. 生成新方块 每次游戏需要生成一个新的方块,我们可以使用随机模块来生成方块的形状和颜色。在代码中添加以下代码: ``` self.new_block = Block(3, 0, random.randint(1, len(self.colors) - 1)) ``` 7. 绘制游戏区域和方块 在游戏循环中,我们需要不断地绘制游戏区域和方块。我们可以使用 Pygame 的绘图函数来绘制矩形和方块。在代码中添加以下代码: ``` def draw_board(self): for i in range(self.height): for j in range(self.width): pygame.draw.rect(screen, self.colors[self.board[i][j]], (j * self.block_size, i * self.block_size, self.block_size, self.block_size), 0) def draw_block(self, block): for i in range(len(block.shape)): for j in range(len(block.shape[0])): if block.shape[i][j] == 1: pygame.draw.rect(screen, self.colors[block.color], ((j + block.x) * self.block_size, (i + block.y) * self.block_size, self.block_size, self.block_size), 0) ``` 8. 移动方块 我们需要为方块添加移动功能,包括左移、右移和下移。在代码中添加以下代码: ``` def move_block_left(self, block): if self.check_collision(block, -1, 0): block.x -= 1 def move_block_right(self, block): if self.check_collision(block, 1, 0): block.x += 1 def move_block_down(self, block): if self.check_collision(block, 0, 1): block.y += 1 ``` 9. 检测碰撞 我们需要检测方块是否与游戏区域中的方块发生碰撞。在代码中添加以下代码: ``` def check_collision(self, block, offset_x, offset_y): for i in range(len(block.shape)): for j in range(len(block.shape[0])): if block.shape[i][j] == 1: x = j + block.x + offset_x y = i + block.y + offset_y if x < 0 or x >= self.width or y >= self.height or self.board[y][x] > 0: return False return True ``` 10. 更新游戏区域 当方块落到底部或者与游戏区域中的方块发生碰撞时,我们需要将方块中的颜色信息更新到游戏区域中。在代码中添加以下代码: ``` def update_board(self, block): for i in range(len(block.shape)): for j in range(len(block.shape[0])): if block.shape[i][j] == 1: x = j + block.x y = i + block.y self.board[y][x] = block.color ``` 11. 消除方块 当一行中所有的方块都被填满时,我们需要将该行清除,并将上方的方块下移一行。在代码中添加以下代码: ``` def remove_row(self, row): del self.board[row] new_row = [0] * self.width self.board.insert(0, new_row) def check_rows(self): for i in range(self.height): if all(self.board[i]): self.remove_row(i) ``` 12. 游戏循环 最后,我们需要在游戏循环中不断地更新游戏区域和方块,同时也需要检测碰撞和消除方块。在代码中添加以下代码: ``` game = Game() while True: for event in pygame.event.get(): if event.type == pygame.QUIT: pygame.quit() sys.exit() if event.type == pygame.KEYDOWN: if event.key == pygame.K_ESCAPE: pygame.quit() sys.exit() elif event.key == pygame.K_LEFT: game.move_block_left(game.new_block) elif event.key == pygame.K_RIGHT: game.move_block_right(game.new_block) elif event.key == pygame.K_DOWN: game.move_block_down(game.new_block) screen.fill((255, 255, 255)) game.draw_board() game.draw_block(game.new_block) if not game.check_collision(game.new_block, 0, 1): game.update_board(game.new_block) game.check_rows() game.new_block = Block(3, 0, random.randint(1, len(game.colors) - 1)) pygame.display.update() pygame.time.Clock().tick(5) ``` 完整代码如下:

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值