pygame实现俄罗斯方块游戏(对战篇1)
作者:冰风漫天 发布时间:2023-05-29 16:23:44
标签:pygame,俄罗斯方块
上篇更新到pygame实现俄罗斯方块游戏(AI篇2) ,原本应该继续做优化,不过考虑到完成游戏完整性,这张就先把对战做好。
一、对战的方块管理
定义一个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
主循环里再增加攻击的处理
来源:https://blog.csdn.net/zhangenter/article/details/89441528


猜你喜欢
- 希望对您有所帮助!推荐:[精品]ASP中常用的22个FSO文件操作函数 <%@ Language=VBScript
- 导读:在Java中我们使用try-catch进行异常处理,同样的JavaScript也提供了和异常处理类似的异常处理机制,本节我们将对Jav
- 今天碰到一个很有意思的问题,需要将普通的 Unicode字符串转换为 Unicode编码的字符串,如下:将 \\u9500\\u552e 转
- python中return的用法1、return语句就是把执行结果返回到调用的地方,并把程序的控制权一起返回程序运行到所遇到的第一个retu
- 如何制作一个搜索引擎链接程序?多收集几个网站的,然后我们引用它到自己的页面中。接下来,我们要创建页面用于搜索:<center>&
- 1.背景看到这个标题你可能想一个分块能有什么难度?还值得细说吗,最近确实遇到一个有意思的分块函数,写法比较巧妙优雅,所以写一个分享。日前在做
- 首先,让我们介绍一下什么是pytorch,它是一个基于Python的开源深度学习框架,它提供了两个核心功能:张量计算和自动求导。张量计算张量
- 1.根据id获取元素document.getElementById("id属性的值");返回值是一个元素对象案例:点击按
- 企业管理器中没有改数据库名的功能,如果一定要用企业管理器来实现,你可以备份数据库,然后还原,在还原时候可以指定另一个库名,然后再删除旧库就行
- Linux下默认系统自带python2.6的版本,这个版本被系统很多程序所依赖,所以不建议删除,如果使用最新的Python3那么我们知道编译
- SQL Server 2005的新功能为动态管理对象,它们是在指定时间返回某个数据库实例的特殊状态信息的数据库视图或函数。这些对象允许数据库
- (一)什么是json:JSON(JavaScript Object Notation) 是一种轻量级的数据交换格式。易于人阅读和编写。同时也
- 引言这两天在做微服务上云的事,之前一直是本地运行,后来在服务器搭建了生产环境集群。上云时出现了一些幺蛾子云上的服务都需要身份验证的,没有专用
- 理科学生应该都了解过共轭吧,经常在数学或者物理还有化学中出现,在坐标轴上去描述共轭函数还是比较清晰的,py语言里也经常会出现关于共轭函数的使
- 一、前期工作环境:python3.6,1080ti,pytorch1.10(实验室服务器的环境)1.设置GPU或者cpuimport tor
- 1. python-firepython-fire 是一个三方库,可以将任何 Python 对象变成一个命令行接口。使用前先 pip ins
- 使用cv2.imread(),cv2.imshow(),cv2.imwrite()读取、显示和保存图像一、读入图像使用函数cv2.imrea
- 前言自动化测试中我们存放数据无非是使用文件或者数据库,那么文件可以是csv,xlsx,xml,甚至是txt文件,通常excel文件往往是我们
- Python编程中经常遇到一些莫名其妙的错误, 其实这不是语言本身的问题, 而是我们忽略了语言本身的一些特性导致的,今天就来看下使用Pyth
- 4 月 27 日,GitHub 趋势榜第 3 位是一个用 Python 编码实现的算法库,Star 数早已达到 26000+链接:https