python写游戏|funny俄罗斯方块
来源:互联网 发布:关于淘宝店 编辑:程序博客网 时间:2024/06/05 16:11
最近几天在学习python,我是比较喜欢一边跟着敲代码一边看理论的学习方式,昨天去目光的博客拉源码过来改了一下,先上图(没图你说个蛋- -):
不要吐槽UI!这不是重点,重点是学习编程的过程哈哈哈。
顺便附上让我受益匪浅的两个网址:
目光博客|python、pygame游戏编程
廖雪峰的官方网站
两个师傅的讲解已经非常详细,图文并茂,十分适合我这样刚入门的小白,再配上一本《Python核心编程》在手中,感觉自己每天都有在进步。入正题:
game.py: ---主循环,该文件会调用main,menu莱尼展示不同界面,包括设置游戏窗口分辨率大小,ALPHA通道设置,图片导入等操作,主要部分在loop(),这个也就是界面的判断,进入游戏后一般会有“选项”“开始游戏”“关于我们”这样的界面吧,就是在这里设置的。通过对应的按键,程序会切到相应的状态“stat”下,该状态又会运行自己的run()方法,该方法接受一个时间参数,也就是之前clock()设置的那个东西。
main.py:这里只是声明了一些基本的函数“__init__”"run""start",提供给子类继承的父类,没实质性的东西。
class Main: def __init__(self, screen): self.screen = screen def run(self, elapse): return self.tetris.update(elapse) def start(self, kind): if kind == 6: self.tetris = tetris.Tetris(self.screen)
menu.py:这里主要就是按上下键进行移动修改,draw()好像是说用来“判断一下颜色有些不同的标示?”这里我不太清楚。len(self.OPTS)就是计算按键在OPTS数组的哪一个位置,比如OPTS[0]=“level 1”,OPTS[1]="level 2"这样。
def run(self, elapse): self.draw() for e in pygame.event.get(): if e.type == QUIT: return 'quit' elif e.type == KEYDOWN: if e.key == K_UP: self.current = (self.current - 1) % len(self.OPTS) #play_sound('menu') elif e.key == K_DOWN: self.current = (self.current + 1) % len(self.OPTS) #play_sound('menu') elif e.key == K_RETURN: return self.OPTS[self.current].lower() return 'menu'
shape.py:shape其实说白了就是方块的各种动作,因为是用数组判断的,你可以在这里任意的设置“0、1”的位置,让你的方块模样转换,我是无聊给设置了一个有16种变化的贪吃蛇...这里就大家随意发挥了
class Shape(object): # shape是画在一个矩阵上面的 # 因为我们有不同的模式,所以矩阵的信息也要详细给出 SHAPEW = 4 # 这个是矩阵的宽度 SHAPEH = 4 # 这个是高度 SHAPES = ( ( ((0,0,0,0), # (0,1,1,0), # [][] (0,1,1,0), # [][] (0,0,0,0),), # ), # 还有很多图形,省略,具体请查看代码 ), ) COLORS = ((0xcc, 0x66, 0x66), # 各个shape的颜色 ) def __init__(self, board_start, (board_width, board_height), (w, h)): self.start = board_start self.W, self.H = w, h # board的横、纵的tile数 self.length = board_width / w # 一个tille的长宽(正方形) self.x, self.y = 0, 0 # shape的起始位置 self.index = 0 # 当前shape在SHAPES内的索引 self.indexN = 0 # 下一个shape在SHAPES内的索引 self.subindex = 0 # shape是在怎样的一个朝向 self.shapes = [] # 记录当前shape可能的朝向 self.color = () self.shape = None # 这两个Surface用来存放当前、下一个shape的图像 self.image = pygame.Surface( (self.length * self.SHAPEW, self.length * self.SHAPEH), SRCALPHA, 32) self.image_next = pygame.Surface( (self.length * self.SHAPEW, self.length * self.SHAPEH), SRCALPHA, 32) self.board = [] # 外界信息 self.new() # let's dance! def set_board(self, board): # 接受外界状况的数组 pass def new(self): # 新产生一个方块 # 注意这里其实是新产生“下一个”方块,而马上要落下的方块则 # 从上一个“下一个”方块那里获得 pass def rotate(self): # 翻转 pass def move(self, r, c): # 左右下方向的移动 def check_legal(self, r=0, c=0): # 用在上面的move判断中,“这样的移动”是否合法(如是否越界) # 合法才会实际的动作 pass def at_bottom(self): # 是否已经不能再下降了 pass def draw_current_shape(self): # 绘制当前shhape的图像 pass def draw_next_shape(self): # 绘制下一个shape的图像 pass def _draw_shape(self, surface, shape, color): # 上两个方法的支援方法 # 注意这里的绘制是绘制到一个surface中方便下面的draw方法blit # 并不是画到屏幕上 pass def draw(self, screen): # 更新shape到屏幕上 pass
tetris.py:这一部分是核心代码,大致的构成如下(自己去目光blog下源代码啊喂)。我是在update里面加上了K_END的一个变量(move()也要加),用来控制可以向上移动的- -当然这里还得设置成:当按下空格键暂停时,仍然可以移动方块,只要暂停时不要给方块上“锁”就可以了。在这里还有一点,为了可以实现“按下键持续移动”的效果,需要加一个pressing的变量,如果是pressing,则持续移动,也就是所谓的“把event.get和get_pressed”混合使用。
class Tetris(object): W = 12 # board区域横向多少个格子 H = 20 # 纵向多少个格子 TILEW = 20 # 每个格子的高/宽的像素数 START = (100, 20) # board在屏幕上的位置 SPACE = 1000 # 方块在多少毫秒内会落下(现在是level 1) def __init__(self, screen): pass def update(self, elapse): # 在游戏阶段,每次都会调用这个,用来接受输入,更新画面 pass def move(self, u, d, l, r): # 控制当前方块的状态 pass def check_line(self): # 判断已经落下方块的状态,然后调用kill_line pass def kill_line(self, filled=[]): # 删除填满的行,需要播放个消除动画 pass def get_score(self, num): # 计算得分 pass def add_to_board(self): # 将触底的方块加入到board数组中 pass def create_board_image(self): # 创造出一个稳定方块的图像 pass def next(self): # 产生下一个方块 pass def draw(self): # 把当前状态画出来 pass def display_info(self): # 显示各种信息(分数,等级等),调用下面的_display*** pass def _display_score(self): pass def _display_next(self): pass def game_over(self): # 游戏结束 pass
util.py:工具函数这里也没有什么特别的,无非就是返回文件的完全路径以供加载,这里有个hasattr()是用来确定一个对象是否具有某个属性的。当然还有什么字体,颜色啊之类的:
def file_path(filename=None): """ give a file(img, sound, font...) name, return full path name. """ if filename is None: raise ValueError, 'must supply a filename' fileext = os.path.splitext(filename)[1] if fileext in ('.png', '.bmp', '.tga', '.jpg'): sub = 'image' elif fileext in ('.ogg', '.mp3', '.wav'): sub = 'sound' elif fileext in ('.ttf',): sub = 'font' file_path = os.path.join(DATA_PATH, sub, filename) print 'Will read', file_path
虽然游戏效果还是蛮渣的,而且重复性的代码比较多,杂乱,各种界面的跳转看着也是醉了...不过至少实现了必要的几个功能不是?自己对python的了解也多了一点,希望下次能做出更好玩的东西~
- python写游戏|funny俄罗斯方块
- Python写的俄罗斯方块
- 大一写的俄罗斯方块游戏
- JS 写的俄罗斯方块游戏
- 用TC2.0写俄罗斯方块游戏---cnasm
- C语言写的俄罗斯方块游戏
- 牛×,用批处理写的俄罗斯方块游戏
- 用shell写的俄罗斯方块游戏
- 【Python】用Python实现一个俄罗斯方块游戏
- 用Python和Pygame写游戏-从入门到精通(实战二:恶搞俄罗斯方块1)
- 用Python和Pygame写游戏-从入门到精通(实战二:恶搞俄罗斯方块2)
- 用Python和Pygame写游戏-从入门到精通(实战二:恶搞俄罗斯方块3)
- 用Python和Pygame写游戏-从入门到精通(实战二:恶搞俄罗斯方块4)
- 俄罗斯方块游戏
- 俄罗斯方块游戏
- 俄罗斯方块游戏
- 俄罗斯方块游戏
- 写俄罗斯方块...
- Nebula_level02
- AOP技术基础(转)
- 内核编译init脚本调用mountroot()函数分析
- APB_SPI模块DUT&Testbench实践
- Nebula_level03
- python写游戏|funny俄罗斯方块
- Linux内核源码分析--内核启动之(6)Image内核启动(do_basic_setup函数)(Linux-3.0 ARMv7)
- Leetcode -- N-Queens
- 语言创新在当代文学教育中的具体使用
- poj1113--Wall(凸包)
- A. Pasha and Pixels(Codeforces Round #288 (Div. 2))
- B. Anton and currency you all know(Codeforces Round #288 (Div. 2))
- ural 1353. Milliard Vasya's Function
- C. Anya and Ghosts( Codeforces Round #288 (Div. 2))