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的了解也多了一点,希望下次能做出更好玩的东西~

0 0
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 玲珑骰子沾了水怎么办 花的枝干长歪了怎么办 电脑中毒了怎么办开不了机 台湾竹长得太高怎么办 文竹长得太高怎么办 桑叶牡l丹长虫怎么办 日本海棠开完花后枯萎了怎么办 长寿冠海棠烂根怎么办 夏季长寿冠海棠掉叶怎么办 竹节海棠有点烂根怎么办? 丽格海棠烂茎怎么办 长寿花徒长不开花怎么办 长寿花植株长了怎么办 丽格海棠不爱长怎么办 竹节海棠太高了怎么办 绿萝叶子发黄烂根怎么办 发财树叶子发黄烂根怎么办 君子兰烂根叶子发黄怎么办 四季海棠花叶子干了怎么办 海棠花叶子枯萎枝干发黑怎么办 长寿花叶尖焦了怎么办 新买的盆栽蔫了怎么办 熬中药水太多了怎么办 秋根海棠烂根怎么办 大叶海棠烂根怎么办 玻璃海棠长得很高怎么办 玫瑰海棠叶子干焦怎么办 海棠树树干生虫怎么办 天竺葵花骨朵有虫子了怎么办? 被刺梅的刺扎了怎么办 被刺梅的刺划手了怎么办 虎刺花叶子黄了怎么办 地栽月季叶子发黄怎么办 梅花浇水浇多了怎么办 深水井底下花管进水量小怎么办 盆景对节白腊树叶尖干枯怎么办 四季海棠茎软了怎么办 玫瑰海棠烂根了怎么办 格丽海棠花腌了怎么办 养殖场不能雨污分流怎么办 药店买的药贵了怎么办