用pygame做一个简单的俄罗斯方块游戏

一、对战的方块管理

定义一个BlockManage管理对战的方块

class BlockManage(object):
    pnum=1
    blocks = []
    def __init__(self,pnum):
        self.pnum=pnum
        self.blocks=[[] for i in range(self.pnum)]

    def get_block(self, pid=0):
        if len(self.blocks[pid]) == 0:
            block = create_block()
            for arr in self.blocks:
                arr.append(pickle.loads(pickle.dumps(block)))
        return self.blocks[pid].pop(0)
复制代码

根据BlockManage根据传入的玩家id返回方块,保证每个玩家拿到的方块序列十一致的,所以在每次创建方块时存放了玩家数量相同的拷贝,拷贝是避免对象的引用造成对同一个方块对象操作混乱。 然后HintBox里加入block_manage的引用并且在take_block函数里将创建Block改为使用block_manage去取方块

class HintBox(object):
    block_manage=None
    next_block=None
    def __init__(self, bg, block_size, position, block_manage):
        self._bg=bg;
        self._x,self._y,self._width,self._height=position
        self._block_size=block_size
        self._bgcolor=[0,0,0]
        self.block_manage=block_manage

    def take_block(self):
        block = self.next_block
        if block is None: # make first block
            block = self.block_manage.get_block()
    
        self.next_block = self.block_manage.get_block()
        return block
复制代码

分别定义一个VirtualHintBox和一个VirtualScoreBox,用于给右下角面板上的

class VirtualHintBox(object):
    pid = 0
    block_manage=None
    next_block=None
    def __init__(self, pid, block_manage):
        print pid
        self.pid=pid
        self.block_manage=block_manage

    def take_block(self):
        block = self.next_block
        if block is None: # make first block
            block = block_manage.get_block(self.pid)
    
        self.next_block = block_manage.get_block(self.pid)
        return block
复制代码

class VirtualScoreBox(object):
    total_score = 0
    def __init__(self):
        pass

    def add_score(self, score):
        self.total_score += score
复制代码

在这里插入图片描述

使用block_manage并分别传递给主面板的hint_box和右下角面板的VirtualHintBox,右下角面板的定义和初使设置完了以后,将下面的player改为player1和player2两个玩家。

在这里插入图片描述

在游戏主循环增加完相应的设置和操作,现在就可以玩人机对战了。

在这里插入图片描述

当然如果你把

player1 = HumanPlayer()
player2 = AIPlayer(ai_diff_ticks=350)
复制代码

改成

player1 = AIPlayer(ai_diff_ticks=150)
player2 = AIPlayer(ai_diff_ticks=350)
复制代码

当然就是一场机器人对机器人的战斗

在这里插入图片描述

二、记分和增加对抗性  完整源码

增加记分显示比较容易,给VirtualScoreBox实现下paint就行。

class VirtualScoreBox(object):
    total_score = 0
    def __init__(self, bg, position):
        self._bg=bg;
        self._x,self._y,self._width,self._height=position
        self._bgcolor=[0,0,0]

    def paint(self):
        myfont = pygame.font.Font(None,22)
        white = 255,255,255
        textImage = myfont.render('Player2 Score:%06d'%(self.total_score), True, white)
        self._bg.blit(textImage, (self._x,self._y))

    def add_score(self, score):
        self.total_score += score
复制代码

增加对抗性的话先设置个规则,谁的分数满1000,就可以给另一方增加两层方块作为攻击,为便于计算,我们在Panel里增加一个数字,用于标记对对方攻击的次数。 Panel里增加一个添加障碍物的函数

    def add_hinder(self):
        hinder_lines=2
        for tmp in self.rect_arr:
            tmp.y-=hinder_lines
        for y in range(hinder_lines):
            arr=range(10)
            for i in range(5):
                n = random.randint(0,len(arr)-1)
                arr.pop(n)
            for x in arr:
                self.rect_arr.append(RectInfo(x,19-y,[0,0,255]))
复制代码

Panel里再添加一个获取是否有攻击触发的函数

    def get_attach_num(self):
        if self.score_box.total_score /1000 > self.attack_num:
            self.attack_num+=1
            return 1
        else:
            return 0
复制代码

主循环里再增加攻击的处理

在这里插入图片描述

好了,现在对战效果也完成了。

在这里插入图片描述

最后再给AIPlayer一个level属性,将level映射为时间间隔

在这里插入图片描述

以现在的机器人水平,试了下大概能战胜5级的AIPlayer。 最后附下目前的部分代码。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值