前面讲解了Python+pygame制作小游戏--俄罗斯方块的完整过程和源码。
Python+pygame制作小游戏--俄罗斯方块 源码
python+pygame制作小游戏--俄罗斯方块(双打)源码
那如果要实现在一台电脑上双打怎么实现呢?其实很容易。只要注意以下几方面即可:
1、右边的得分信息及下一个方块不能显示在右边了。(也不是不能,有兴趣的同学可以自行修改)得分信息就显示在游戏区域下面;下一个方块显示在游戏区域最上面,为了和下落的方块区别,统一将下一个方块颜色设置为灰色。
2、既然是双打,所以控制的键盘不一样,左边的玩家用asdw控制,右边的不变
代码需要修改的地方在:
...
win_width = cols * 2 * cell_size + 6 * cell_size #修改
win_hight = (rows + 1) * cell_size #修改
...
颜色最后加了一个灰色,显示下一个方块
app_colors = [(138,200,198),(200,50,50),(50,200,200),(50,50,200),(200,200,50),(200,50,200),(50,200,50),(125,50,125),(180,180,180)]
class Tetris中修改的内容:
class Tetris():
...
def display_next_blocks(self):
#显示下一个方块
for (x,y) in blocks[self.next_key][0]:
self.rect.topleft = x * cell_size , (y - 1) * cell_size
self.draw_block(8, 1) #颜色固定为灰色,以示区分
def display_score(self):
#显示得分,在游戏区域下面显示
text = "得分:%d 行数:%d 等级:%d" %(self.score,self.lines,self.level)
self.img = pygame.font.SysFont("kaiti",25).render(text, True, (0,0,255))
self.img_rect = self.img.get_rect()
self.img_rect.topleft = (self.x0, rows* cell_size)
screen.blit(self.img, self.img_rect)
...
主程序修改后的源码:
time = pygame.time.Clock()
player1 = Tetris(0, 0)
player2 = Tetris((cols + 6) * cell_size, 0) #初始化游戏和两个玩家
while True:
time.tick(fps)
screen.fill((166,138,88))
player1.display()
player2.display()
pygame.display.update()
#移动旋转控制
for event in pygame.event.get():
if event.type == pygame.KEYDOWN:
if event.key == pygame.K_d: #player1 :d键右移动一格
player1.move(1,0)
elif event.key == pygame.K_a: #player1 :a键左移动一格
player1.move(-1,0)
elif event.key == pygame.K_w: #player1 :w键旋转一次
player1.rotate()
elif event.key == pygame.K_s: #player1 :s键加速下移
player1.fall_speed_up = True
if event.key == pygame.K_RIGHT: #player2 :→键右移动一格
player2.move(1,0)
elif event.key == pygame.K_LEFT: #player2 :←键左移动一格
player2.move(-1,0)
elif event.key == pygame.K_UP: #player2 :↑键旋转一次
player2.rotate()
elif event.key == pygame.K_DOWN: #player2 :↓键加速下移
player2.fall_speed_up = True
elif event.key == pygame.K_q:
sys.exit()
elif event.type == pygame.KEYUP:
if event.key == pygame.K_s: #player1 :s键加速下移
player1.fall_speed_up = False
if event.key == pygame.K_DOWN: #player2 :↓键加速下移
player2.fall_speed_up = False
elif event.type == pygame.QUIT:
sys.exit()
这样就可以了,代码修改量很小。
运行的效果就是这样的:
20240618_191847
至于双人对打比赛,例如消除行后,给对方加一行没有满载的行,超级砖块,炸弹等玩法,同学们自己完成,大致都差不多。