基于Python制作愤怒的小鸟小游戏

基于 Python 制作愤怒的小鸟小游戏 导语 小伙伴们周末愉快呀~楼主又好久没更新公众号的样子,为了避免继续被某些小伙伴吐槽,还是上来更新一波吧,既然是周末

本文包含相关资料包-----> 点击直达获取<-------

基于 Python 制作愤怒的小鸟小游戏

导语

小伙伴们周末愉快呀~楼主又好久没更新公众号的样子,为了避免继续被某些小伙伴吐槽,还是上来更新一波吧。既然是周末,不如带大家一起写个小游戏吧,毕竟上一次带大家写新的小游戏都是去年 6 月份的事情了。这次带大家仿写个之前有段时间比较火的愤怒的小鸟小游戏呗。

废话不多说,让我们愉快地开始吧~

开发工具

Python 版本:3.6.4

相关模块:

pygame 模块;

以及一些 python 自带的模块。

环境搭建

安装 Python 并添加到环境变量,pip 安装需要的相关模块即可。

先睹为快

在终端运行如下命令即可:

python Game26.py

效果如下:

原理简介

这里简单介绍一下游戏的实现原理呗。首先是游戏的开始界面,大概是长这样的,比较简约:

主要包括两个部分,即游戏的标题和游戏的开始以及退出按钮,这两部分的代码实现如下:

```python '''按钮类''' class Button(pygame.sprite.Sprite): def init (self, screen, x, y, width, height, action=None, color_not_active=(189, 195, 199), color_active=(189, 195, 199)): pygame.sprite.Sprite. init (self) self.x = x self.y = y self.width = width self.height = height self.action = action self.screen = screen self.color_active = color_active self.color_not_active = color_not_active '''添加文字''' def addtext(self, text, size=20, font='Times New Roman', color=(0, 0, 0)): self.font = pygame.font.Font(font, size) self.text = self.font.render(text, True, color) self.text_pos = self.text.get_rect() self.text_pos.center = (self.x + self.width / 2, self.y + self.height / 2) '''是否被鼠标选中''' def selected(self): pos = pygame.mouse.get_pos() if (self.x < pos[0] < self.x + self.width) and (self.y < pos[1] < self.y + self.height): return True return False '''画到屏幕上''' def draw(self): if self.selected(): pygame.draw.rect(self.screen, self.color_active, (self.x, self.y, self.width, self.height)) else: pygame.draw.rect(self.screen, self.color_not_active, (self.x, self.y, self.width, self.height)) if hasattr(self, 'text'): self.screen.blit(self.text, self.text_pos)

'''文字标签类''' class Label(pygame.sprite.Sprite): def init (self, screen, x, y, width, height): pygame.sprite.Sprite. init (self) self.x = x self.y = y self.width = width self.height = height self.screen = screen '''添加文字''' def addtext(self, text, size=20, font='Times New Roman', color=(0, 0, 0)): self.font = pygame.font.Font(font, size) self.text = self.font.render(text, True, color) self.text_pos = self.text.get_rect() self.text_pos.center = (self.x + self.width / 2, self.y + self.height / 2) '''画到屏幕上''' def draw(self): if hasattr(self, 'text'): self.screen.blit(self.text, self.text_pos) ```

实现起来其实都比较简单,按钮类就是多了一个被鼠标选中之后(也就是鼠标的位置落在按钮的区域范围内时)改变颜色以直观地告诉玩家该按钮已经被选中了的功能。

如果玩家点击退出键(QUIT),则退出游戏:

```

def quitgame(): pygame.quit() sys.exit() ```

若点击开始游戏按钮,则开始游戏:

```

def startgame(): game_levels = GameLevels(cfg, screen) game_levels.start() ```

游戏界面大概长这样:

玩家获胜的方法就是操作有限数量的小鸟将所有入侵的猪干掉,换句话说就是利用弹弓发射小鸟,让小鸟击中场上的所有猪。若小鸟全部发射完之后场上仍然有猪没有被击中,则玩家失败。判断游戏胜负关系的代码实现起来其实蛮简单的,大概是这样的:

```

'''游戏状态''' def status(self, pigs, birds): status_codes = { 'gaming': 0, 'failure': 1, 'victory': 2, } if len(pigs) == 0: return status_codes['victory'] elif len(birds) == 0: return status_codes['failure'] else: return status_codes['gaming'] ```

接着,为了实现游戏,我们先定义一下所有我们需要的游戏精灵类。首先,是我们的主角,愤怒的小鸟:

python '''小鸟''' class Bird(pygame.sprite.Sprite): def __init__(self, screen, imagepaths, loc_info, velocity=None, color=(255, 255, 255), **kwargs): pygame.sprite.Sprite.__init__(self) assert len(loc_info) == 3 assert len(imagepaths) == 1 # 设置必要的属性常量 self.color = color self.screen = screen self.loc_info = list(loc_info) self.imagepaths = imagepaths self.velocity = VelocityVector() if velocity is None else velocity self.type = 'bird' self.fly_path = [] self.is_dead = False self.elasticity = 0.8 self.is_loaded = False self.is_selected = False self.inverse_friction = 0.99 self.gravity = VelocityVector(0.2, math.pi) # 屏幕大小 self.screen_size = screen.get_rect().size self.screen_size = (self.screen_size[0], self.screen_size[1] - 50) # 导入图像 self.image = pygame.image.load(imagepaths[0]) '''画到屏幕上''' def draw(self): if not self.is_loaded: for point in self.fly_path: pygame.draw.ellipse(self.screen, self.color, (point[0], point[1], 3, 3), 1) position = self.loc_info[0] - self.loc_info[2], self.loc_info[1] - self.loc_info[2] self.screen.blit(self.image, position) '''判断有没有被鼠标选中''' def selected(self): pos = pygame.mouse.get_pos() dx, dy = pos[0] - self.loc_info[0], pos[1] - self.loc_info[1] dist = math.hypot(dy, dx) if dist < self.loc_info[2]: return True return False '''加载到弹弓上''' def load(self, slingshot): self.loc_info[0], self.loc_info[1] = slingshot.x, slingshot.y self.is_loaded = True '''重新设置位置''' def reposition(self, slingshot): pos = pygame.mouse.get_pos() if self.selected: self.loc_info[0], self.loc_info[1] = pos[0], pos[1] dx, dy = slingshot.x - self.loc_info[0], slingshot.y - self.loc_info[1] self.velocity.magnitude = min(int(math.hypot(dx, dy) / 2), 80) self.velocity.angle = math.pi / 2 + math.atan2(dy, dx) '''显示发射小鸟的路径''' def projectpath(self): if self.is_loaded: path = [] bird = Bird(self.screen, self.imagepaths, self.loc_info, velocity=self.velocity) for i in range(30): bird.move() if i % 5 == 0: path.append((bird.loc_info[0], bird.loc_info[1])) for point in path: pygame.draw.ellipse(self.screen, self.color, (point[0], point[1], 2, 2)) '''移动小鸟''' def move(self): # 根据重力改变小鸟的速度向量 self.velocity = VectorAddition(self.velocity, self.gravity) self.loc_info[0] += self.velocity.magnitude * math.sin(self.velocity.angle) self.loc_info[1] -= self.velocity.magnitude * math.cos(self.velocity.angle) self.velocity.magnitude *= self.inverse_friction # 宽度超出屏幕 if self.loc_info[0] > self.screen_size[0] - self.loc_info[2]: self.loc_info[0] = 2 * (self.screen_size[0] - self.loc_info[2]) - self.loc_info[0] self.velocity.angle *= -1 self.velocity.magnitude *= self.elasticity elif self.loc_info[0] < self.loc_info[2]: self.loc_info[0] = 2 * self.loc_info[2] - self.loc_info[0] self.velocity.angle *= -1 self.velocity.magnitude *= self.elasticity # 高度超出屏幕 if self.loc_info[1] > self.screen_size[1] - self.loc_info[2]: self.loc_info[1] = 2 * (self.screen_size[1] - self.loc_info[2]) - self.loc_info[1] self.velocity.angle = math.pi - self.velocity.angle self.velocity.magnitude *= self.elasticity elif self.loc_info[1] < self.loc_info[2]: self.loc_info[1] = 2 * self.loc_info[2] - self.loc_info[1] self.velocity.angle = math.pi - self.velocity.angle self.velocity.magnitude *= self.elasticity

实现它主要需要考虑的是小鸟其实存在五种状态:

  • 排队状态,即在左下角等待进入弹弓时的状态,静止不动即可;
  • 就绪状态,即进入弹弓准备被发射的状态,其需要跟着鼠标不断地移动,使得玩家知道自己目前调整小鸟所到的位置被发射出去之后大概会是什么样的角度和路径;
  • 飞行状态,即被弹弓发射出去之后的状态,需要根据重力和小鸟的初速度来计算其飞行路径并不断地移动;
  • 碰撞状态,即在飞行过程中撞击到其他物体例如小猪和木桩等时,运动状态发生了改变;
  • 静止状态,即小鸟完成飞行状态之后最终静止时的状态。

接着来实现一下小猪:

```

'''猪''' class Pig(pygame.sprite.Sprite): def init (self, screen, imagepaths, loc_info, velocity=None, kwargs): pygame.sprite.Sprite. init (self) assert len(loc_info) == 3 assert len(imagepaths) == 3 # 设置必要的属性常量 self.screen = screen self.loc_info = list(loc_info) self.imagepaths = imagepaths self.velocity = VelocityVector() if velocity is None else velocity self.type = 'pig' self.is_dead = False self.elasticity = 0.8 self.switch_freq = 20 self.animate_count = 0 self.inverse_friction = 0.99 self.gravity = VelocityVector(0.2, math.pi) # 屏幕大小 self.screen_size = screen.get_rect().size self.screen_size = (self.screen_size[0], self.screen_size[1] - 50) # 导入图像 self.pig_images = [] for imagepath in imagepaths: self.pig_images.append(pygame.image.load(imagepath)) # 设置当前图像 self.image = random.choice(self.pig_images[:2]) '''画到屏幕上''' def draw(self): self.animate_count += 1 if (self.animate_count % self.switch_freq == 0) and (not self.is_dead): self.animate_count = 0 self.image = random.choice(self.pig_images[:2]) position = self.loc_info[0] - self.loc_info[2], self.loc_info[1] - self.loc_info[2] self.screen.blit(self.image, position) '''移动猪''' def move(self): # 根据重力改变猪的速度向量 self.velocity = VectorAddition(self.velocity, self.gravity) self.loc_info[0] += self.velocity.magnitude * math.sin(self.velocity.angle) self.loc_info[1] -= self.velocity.magnitude * math.cos(self.velocity.angle) self.velocity.magnitude = self.inverse_friction # 宽度超出屏幕 if self.loc_info[0] > self.screen_size[0] - self.loc_info[2]: self.loc_info[0] = 2 * (self.screen_size[0] - self.loc_info[2]) - self.loc_info[0] self.velocity.angle = -1 self.velocity.magnitude = self.elasticity elif self.loc_info[0] < self.loc_info[2]: self.loc_info[0] = 2 * self.loc_info[2] - self.loc_info[0] self.velocity.angle = -1 self.velocity.magnitude = self.elasticity # 高度超出屏幕 if self.loc_info[1] > self.screen_size[1] - self.loc_info[2]: self.loc_info[1] = 2 * (self.screen_size[1] - self.loc_info[2]) - self.loc_info[1] self.velocity.angle = math.pi - self.velocity.angle self.velocity.magnitude = self.elasticity elif self.loc_info[1] < self.loc_info[2]: self.loc_info[1] = 2 * self.loc_info[2] - self.loc_info[1] self.velocity.angle = math.pi - self.velocity.angle self.velocity.magnitude *= self.elasticity '''猪死掉了''' def setdead(self): self.is_dead = True self.image = self.pig_images[-1] ```

猪在游戏中主要包括三种状态:

  • 静止状态,即未被击中时静止在某处的状态;
  • 被击中后的运动状态,即被其他物体击中之后根据动量守恒原理也一起运行时的状态;
  • 被击中后的静止状态,即因为被击中而产生运动之后又恢复静止时的状态、

游戏中的木块实现原理与小猪类似:

'''地图里的木块''' class Block(pygame.sprite.Sprite): def __init__(self, screen, imagepaths, loc_info, velocity=None, **kwargs): pygame.sprite.Sprite.__init__(self) assert len(loc_info) == 3 assert len(imagepaths) == 2 # 设置必要的属性常量 self.type = 'block' self.screen = screen self.loc_info = list(loc_info) self.imagepaths = imagepaths self.velocity = VelocityVector() if velocity is None else velocity self.elasticity = 0.7 self.is_destroyed = False self.inverse_friction = 0.99 self.gravity = VelocityVector(0.2, math.pi) # 导入图像 self.block_images = [] for imagepath in imagepaths: self.block_images.append(pygame.transform.scale(pygame.image.load(imagepath), (100, 100))) # 屏幕大小 self.screen_size = screen.get_rect().size self.screen_size = (self.screen_size[0], self.screen_size[1] - 50) # 设置当前图像 self.image = self.block_images[0] self.rect = self.image.get_rect() self.rotate_angle = math.radians(0) '''画到屏幕上''' def draw(self): pygame.transform.rotate(self.image, self.rotate_angle) self.screen.blit(self.image, (self.loc_info[0] - self.rect.width // 2, self.loc_info[1])) '''设置为损坏状态''' def setdestroy(self): self.is_destroyed = True self.image = self.block_images[1] '''移动木块''' def move(self): # 根据重力改变木块的速度向量 self.velocity = VectorAddition(self.velocity, self.gravity) self.loc_info[0] += self.velocity.magnitude * math.sin(self.velocity.angle) self.loc_info[1] -= self.velocity.magnitude * math.cos(self.velocity.angle) self.velocity.magnitude *= self.inverse_friction # 宽度超出屏幕 if self.loc_info[0] > self.screen_size[0] - self.rect.width: self.loc_info[0] = 2 * (self.screen_size[0] - self.rect.width) - self.loc_info[0] self.velocity.angle *= -1 self.rotate_angle = -self.velocity.angle self.velocity.magnitude *= self.elasticity elif self.loc_info[0] < self.rect.width: self.loc_info[0] = 2 * self.rect.width - self.loc_info[0] self.velocity.angle *= -1 self.rotate_angle = -self.velocity.angle self.velocity.magnitude *= self.elasticity # 高度超出屏幕 if self.loc_info[1] > self.screen_size[1] - self.rect.height: self.loc_info[1] = 2 * (self.screen_size[1] - self.rect.height) - self.loc_info[1] self.velocity.angle = math.pi - self.velocity.angle self.rotate_angle = math.pi - self.velocity.angle self.velocity.magnitude *= self.elasticity elif self.loc_info[1] < self.rect.height: self.loc_info[1] = 2 * self.rect.height - self.loc_info[1] self.velocity.angle = math.pi - self.velocity.angle self.rotate_angle = math.pi - self.velocity.angle self.velocity.magnitude *= self.elasticity

最后,我们来实现一下墙和弹弓就可以啦:

```

'''弹弓''' class Slingshot(pygame.sprite.Sprite): def init (self, screen, x, y, width, height, color=(66, 73, 73), line_color=(100, 30, 22), **kwargs): pygame.sprite.Sprite. init (self) self.x = x self.y = y self.color = color self.width = width self.height = height self.screen = screen self.line_color = line_color self.type = 'slingshot' '''画到屏幕上''' def draw(self, bird=None): pygame.draw.rect(self.screen, self.color, (self.x, self.y + self.height * 1 / 3, self.width, self.height * 2 / 3)) if bird is not None and bird.is_loaded: pygame.draw.line(self.screen, self.line_color, (self.x, self.y + self.height / 6), (bird.loc_info[0], bird.loc_info[1] + bird.loc_info[2] / 2), 10) pygame.draw.line(self.screen, self.line_color, (self.x + self.width, self.y + self.height / 6), (bird.loc_info[0] + bird.loc_info[2], bird.loc_info[1] + bird.loc_info[2] / 2), 10) pygame.draw.rect(self.screen, self.color, (self.x - self.width / 4, self.y, self.width / 2, self.height / 3), 5) pygame.draw.rect(self.screen, self.color, (self.x + self.width * 3 / 4, self.y, self.width / 2, self.height / 3), 5)

'''墙''' class Slab(pygame.sprite.Sprite): def init (self, screen, imagepaths, x, y, width, height, color=(255, 255, 255)): pygame.sprite.Sprite. init (self) self.x = x self.y = y self.color = color self.width = width self.height = height self.screen = screen self.imagepaths = imagepaths if self.width > self.height: self.image = pygame.image.load(self.imagepaths[0]) else: self.image = pygame.image.load(self.imagepaths[1]) self.image = pygame.transform.scale(self.image, (self.width, self.height)) self.type = 'wall' '''画到屏幕上''' def draw(self): self.screen.blit(self.image, (self.x, self.y)) ```

由此,我们完成了所有游戏精灵的定义,可以开始实现游戏的主循环啦,具体的代码实现如下:

```python

'''开始游戏''' def start(self): # 导入所有游戏精灵 game_sprites = self.loadlevelmap() birds, pigs, blocks, walls = game_sprites['birds'], game_sprites['pigs'], game_sprites['blocks'], game_sprites['walls'] slingshot = Slingshot(self.screen, 200, self.screen_size[1] - 200, 30, 200) birds[0].load(slingshot) score_label = Label(self.screen, 50, 10, 100, 50) score_label.addtext(f'SCORE: {self.score}', 25, self.cfg.FONTPATH['Comic_Kings'], (236, 240, 241)) birds_remaining_label = Label(self.screen, 120, 50, 100, 50) birds_remaining_label.addtext(f"BIRDS REMAINING: {len(birds)}", 25, self.cfg.FONTPATH['Comic_Kings'], (236, 240, 241)) pigs_remaining_label = Label(self.screen, 110, 90, 100, 50) pigs_remaining_label.addtext(f"PIGS REMAINING: {len(pigs)}", 25, self.cfg.FONTPATH['Comic_Kings'], (236, 240, 241)) carles_label = Label(self.screen, self.screen_size[0] - 270, self.screen_size[1] - 20, 300, 100) carles_label.addtext('CARLES', 60, self.cfg.FONTPATH['arfmoochikncheez'], (113, 125, 126)) # 游戏主循环 clock = pygame.time.Clock() blocks_to_remove, pigs_to_remove = [], [] while True: # --按键检测 for event in pygame.event.get(): if event.type == pygame.QUIT: self.quitgame() elif event.type == pygame.KEYDOWN: if event.key == pygame.K_q: self.quitgame() elif event.key == pygame.K_r: self.start() elif event.key == pygame.K_p or event.key == pygame.K_ESCAPE: self.pauseinterface() elif event.type == pygame.MOUSEBUTTONDOWN: if birds[0].selected(): birds[0].is_selected = True elif event.type == pygame.MOUSEBUTTONUP: if birds[0].is_selected: birds[0].is_selected = False birds[0].start_flying = True # --背景颜色填充 color = self.cfg.BACKGROUND_COLOR for i in range(3): color = (color[0] + 5, color[1] + 5, color[2] + 5) pygame.draw.rect(self.screen, color, (0, i * 300, self.screen_size[0], 300)) pygame.draw.rect(self.screen, (77, 86, 86), (0, self.screen_size[1], self.screen_size[0], 50)) # --判断游戏是否结束,若没有则导入新的小鸟 if (not birds[0].is_loaded) and self.still(pigs + birds + blocks): birds.pop(0) if self.status(pigs, birds) == 2: self.score += len(birds) * 100 self.switchlevelinterface() elif self.status(pigs, birds) == 1: self.failureinterface() birds[0].load(slingshot) birds[0].start_flying = False # --重置小鸟的位置 if birds[0].is_selected: birds[0].reposition(slingshot) if hasattr(birds[0], 'start_flying') and birds[0].start_flying: birds[0].is_loaded = False # --弹弓 slingshot.draw(birds[0]) # --判断猪是否撞上木桩 for i in range(len(pigs)): for j in range(len(blocks)): pig_magnitude_1, block_magnitude_1 = pigs[i].velocity.magnitude, blocks[j].velocity.magnitude pigs[i], blocks[j], is_collision = self.collision(pigs[i], blocks[j]) pig_magnitude_2, block_magnitude_2 = pigs[i].velocity.magnitude, blocks[j].velocity.magnitude if is_collision: if abs(pig_magnitude_2 - pig_magnitude_2) > 2: blocks_to_remove.append(blocks[j]) blocks[j].setdestroy() if abs(block_magnitude_2 - block_magnitude_1) > 2: pigs_to_remove.append(pigs[i]) pigs[i].setdead() # --判断鸟是否撞上木桩 for i in range(len(birds)): if not (birds[i].is_loaded or birds[i].velocity.magnitude == 0): for j in range(len(blocks)): bird_magnitude_1, block_magnitude_1 = birds[i].velocity.magnitude, blocks[j].velocity.magnitude birds[i], blocks[j], is_collision = self.collision(birds[i], blocks[j]) bird_magnitude_2, block_magnitude_2 = birds[i].velocity.magnitude, blocks[j].velocity.magnitude if is_collision: if abs(bird_magnitude_1 - bird_magnitude_2) > 2: if blocks[j] not in blocks_to_remove: blocks_to_remove.append(blocks[j]) blocks[j].setdestroy() # --判断猪是否撞上猪或者猪撞墙 for i in range(len(pigs)): pigs[i].move() for j in range(i+1, len(pigs)): pig1_magnitude_1, pig2_magnitude_1 = pigs[i].velocity.magnitude, pigs[j].velocity.magnitude pigs[i], pigs[j], is_collision = self.collision(pigs[i], pigs[j]) pig1_magnitude_2, pig2_magnitude_2 = pigs[i].velocity.magnitude, pigs[j].velocity.magnitude if abs(pig1_magnitude_1 - pig1_magnitude_2) > 2: if pigs[j] not in pigs_to_remove: pigs_to_remove.append(pigs[j]) pigs[j].setdead() if abs(pig2_magnitude_1 - pig2_magnitude_2) > 2: if pigs[i] not in pigs_to_remove: pigs_to_remove.append(pigs[i]) pigs[i].setdead() for wall in walls: pigs[i] = self.collision(pigs[i], wall)[0] pigs[i].draw() # --判断鸟是否撞到猪或者鸟是否撞到墙 for i in range(len(birds)): if (not birds[i].is_loaded) and (birds[i].velocity.magnitude): birds[i].move() for j in range(len(pigs)): bird_magnitude_1, pig_magnitude_1 = birds[i].velocity.magnitude, pigs[j].velocity.magnitude birds[i], pigs[j], is_collision = self.collision(birds[i], pigs[j]) bird_magnitude_2, pig_magnitude_2 = birds[i].velocity.magnitude, pigs[j].velocity.magnitude if is_collision: if abs(bird_magnitude_2 - bird_magnitude_1) > 2: if pigs[j] not in pigs_to_remove: pigs_to_remove.append(pigs[j]) pigs[j].setdead() if birds[i].is_loaded: birds[i].projectpath() for wall in walls: birds[i] = self.collision(birds[i], wall)[0] birds[i].draw() # --判断木桩是否撞到了木桩或者木桩撞到墙 for i in range(len(blocks)): for j in range(i+1, len(blocks)): block1_magnitude_1, block2_magnitude_1 = blocks[i].velocity.magnitude, blocks[j].velocity.magnitude blocks[i], blocks[j], is_collision = self.collision(blocks[i], blocks[j]) block1_magnitude_2, block2_magnitude_2 = blocks[i].velocity.magnitude, blocks[j].velocity.magnitude if is_collision: if abs(block1_magnitude_2 - block1_magnitude_1) > 2: if blocks[j] not in blocks_to_remove: blocks_to_remove.append(blocks[j]) blocks[j].setdestroy() if abs(block2_magnitude_2 - block2_magnitude_1) > 2: if blocks[i] not in blocks_to_remove: blocks_to_remove.append(blocks[i]) blocks[i].setdestroy() blocks[i].move() for wall in walls: blocks[i] = self.collision(blocks[i], wall)[0] blocks[i].draw() # --墙 for wall in walls: wall.draw() # --显示文字 score_label.addtext(f'SCORE: {self.score}', 25, self.cfg.FONTPATH['Comic_Kings'], (236, 240, 241)) score_label.draw() birds_remaining_label.addtext(f"BIRDS REMAINING: {len(birds)}", 25, self.cfg.FONTPATH['Comic_Kings'], (236, 240, 241)) birds_remaining_label.draw() pigs_remaining_label.addtext(f"PIGS REMAINING: {len(pigs)}", 25, self.cfg.FONTPATH['Comic_Kings'], (236, 240, 241)) pigs_remaining_label.draw() carles_label.draw() # --画面刷新 pygame.display.update() clock.tick(self.cfg.FPS) # --删除无效的元素 if self.still(birds + pigs + blocks): for pig in pigs_to_remove: if pig in pigs: pigs.remove(pig) self.score += 100 for block in blocks_to_remove: if block in blocks: blocks.remove(block) self.score += 50 pigs_to_remove = [] blocks_to_remove = [] ```

其实就是一些按键检测和碰撞检测以及一些分数之类的游戏状态实时更新,感觉没啥好讲的,总之,我们又大功告成啦~

完整源代码详见相关文件~

参考文献

  • 生态数据分析系统的设计与实现(北京交通大学·吴志炜)
  • 基于Android平台的手机游戏的设计与开发(云南大学·秦成)
  • 基于J2EE的工作流管理系统的研究与实现(中国农业大学·梁言兵)
  • PureMVC框架和种子填充算法的适配研究及应用(哈尔滨工业大学·孙立舰)
  • 基于B/S架构的酷跑社区系统的设计与实现(内蒙古大学·张晓乐)
  • 基于B/S架构的酷跑社区系统的设计与实现(内蒙古大学·张晓乐)
  • 基于B/S架构的酷跑社区系统的设计与实现(内蒙古大学·张晓乐)
  • 基于SSH框架的电子宠物系统设计与实现(吉林大学·王丽丽)
  • 基于Web的竞赛软件的设计与实现(河北科技大学·马丽红)
  • 基于J2EE平台的工作流管理系统的运行引擎和客户端及管理工具的设计与实现(西北大学·门浩)
  • 面向计算思维发展的游戏创作学习活动设计与应用研究——以小学编程教学为例(华东师范大学·程亮)
  • 基于互联网的鸟情信息采集与分析系统的设计与实现(山东师范大学·张康丽)
  • 基于轻量级J2EE的网络游戏虚拟物品交易系统的设计与实现(北京邮电大学·曹鹃)
  • 基于轻量级J2EE的网络游戏虚拟物品交易系统的设计与实现(北京邮电大学·曹鹃)
  • 基于网络爬虫的论坛数据分析系统的设计与实现(华中科技大学·黎曦)

本文内容包括但不限于文字、数据、图表及超链接等)均来源于该信息及资料的相关主题。发布者:代码驿站 ,原文地址:https://m.bishedaima.com/yuanma/36068.html

相关推荐

  • 基于SpringBoot框架的二手车交易系统

    这是一套采用Java编程语言,基于SpringBoot框架构建的二手车辆交易系统源代码,开发工具为Idea或Eclipse,采用了现代化的SpringBoot和Vue技术栈
    2024年05月23日
    7 1 3
  • 基于ssm+bootstrsp简单极易上手的小型图书系统

    基于 ssm+bootstrsp 简单极易上手的小型图书系统 效果图: 步骤 第一步 idea 下载 idea, 怎么下载安装配置 idea 第二步 创建项目 打开 idea —> File —> new —> project —> maven —> create from archetype —> maven-archetype-webapp —> 接下来一般默认即可 先放上项目结构图 第三步 配置 maven 依赖
    2024年05月14日
    3 1 1
  • 基于springboot实现的整合dubbo服务框架

    本文你将学到什么? 本文将以原理+实战的方式,首先对“微服务”相关的概念进行知识点扫盲,然后开始手把手教你搭建这一整套的微服务系统, 这套微服务框架能干啥? 这套系统搭建完之后
    2024年05月14日
    1 1 1
  • 基于Python实现书店销售管理系统

    书店销售管理管理子系统 一,设 计 总 说 明 现在社会随着计算机技术迅速发展与技术的逐渐成熟,信息技术已经使人们的生活发生深刻的变化,生活中的各种服务系统也使人们在生活中的联系日常销售活动方式发生了很大的变化
    2024年05月14日
    6 1 1
  • 基于python + dlib实现人脸识别

    python 进行人脸识别 人脸识别的主要算法 其核心算法是 欧式距离算法使用该算法计算两张脸的面部特征差异,一般在 0,6 以下都可以被认为是同一张脸 人脸识别的主要步骤 获得人脸图片 将人脸图片转为 128D 的矩阵(这个也就是人脸特征的一种数字化表现) 保存人脸 128D 的特征到文件中 获取其他人脸转为 128D 特征通过欧式距离算法与我们保存的特征对比
    2024年05月14日
    2 1 1
  • 基于SSM的中医管理系统源码

    这是一个🔥🔥基于SSM的中医管理系统🔥🔥的项目源码,开发语言Java,开发环境Idea/Eclipse,这个 中医管理系统开发技术栈为SSM项目,可以作为毕业设计课程设计作业使用SSM框架实现一个中医管理系统
    2024年05月23日
    7 1 3
  • 基于Python的信息检索课程设计

    基于Python的信息检索课程设计 sdu视点新闻 全站爬虫爬取+索引构建+搜索引擎查询练习程序 爬虫功能使用Python的scrapy库实现
    2024年05月14日
    2 1 1
  • 基于jsp+servlet+mysql的图书管理系统

    Book-management-jsp 基于jsp+servlet+mysql的图书管理系统 参考文献 基于RBAC的SSH架构下的图书管理应用研究(大连理工大学·姜楠) 高校图书管理系统的设计与实现(东北大学·黄鑫) 复旦大学数字图书馆个人图书管理系统的设计与实现(电子科技大学·陆卫国) 图书综合管理系统(吉林大学·王宇) 宁波职业技术学院图书管理系统分析与设计(云南大学·赵顺勇) 大同实验小学图书馆借还系统的设计与实现(电子科技大学·王洪宇) 山西电大图书管理信息系统的设计与实现(北京工业大学·李莹) 山西电大图书管理信息系统的设计与实现(北京工业大学·李莹) 山西电大图书管理信息系统的设计与实现(北京工业大学·李莹) 医疗卫生图书网的设计与实现(电子科技大学·张占平) 基于Web的书刊进销存系统的设计与实现(大连理工大学·王宁) 基于JSP/Servlet的三层式网上书店的研究与实现(吉林大学·郭小雪) 基于RBAC的SSH架构下的图书管理应用研究(大连理工大学·姜楠) 基于B/S架构的网上书店系统的设计与实现(电子科技大学·陈云英) 基于
    2024年05月14日
    11 1 2
  • 基于Springboot和Redis实现的在线选课系统

    基于Springboot和Redis实现的在线选课系统 1,项目简介 1,1 介绍 毕业设计真的就是demo吗?作为工作前的最后一个校园项目,毕业设计应当尽可能的贴近企业实战
    2024年05月14日
    1 1 1
  • 基于Springmvc+MyBatis+Spring+Bootstrap+EasyUI+Mysql的个人博客系统

    Blog-master 基于Springmvc+MyBatis+Spring+Bootstrap+EasyUI+Mysql的个人博客系统 参考文献 基于SSH框架的博客用户分享平台的设计与实现(河北工业大学·刘磊) 基于SSH框架的人力资源管理系统的设计与开发(电子科技大学·唐伟) 博客管理系统的设计与实现(吉林大学·赵岩) 基于SSH架构的个人空间交友网站的设计与实现(北京邮电大学·隋昕航) 基于MVC设计模式的博客系统的设计与实现(大连理工大学·侯林) 基于SSH框架的博客用户分享平台的设计与实现(河北工业大学·刘磊) 基于SSH框架模式的博客系统的设计与实现(西北师范大学·王刚成) 基于SSH2的轻博客系统的研究与实现(吉林大学·杨雪梅) 博客管理系统的设计与实现(吉林大学·赵岩) 基于OAuth2
    2024年05月14日
    4 1 1

发表回复

登录后才能评论