如何在这个代码中加入金币,使得玛丽接触金币时金币消失,分数+1,越过金币不得分,游戏继续
时间: 2024-11-14 16:20:32 浏览: 15
要在现有的代码中加入金币功能,并实现玛丽接触金币时金币消失且得分增加1分,可以按照以下步骤进行修改:
### 1. 定义金币类
首先,定义一个新的 `Coin` 类,用于表示金币。
```python
# 金币类
class Coin():
def __init__(self):
self.image = pygame.image.load('image/coin.png').convert_alpha() # 加载金币图片
self.rect = self.image.get_rect()
self.rect.x = 800 # 初始位置
self.rect.y = 130 # 金币的y坐标
self.move = 5 # 金币的移动速度
def coin_move(self):
self.rect.x -= self.move # 金币向左移动
def draw_coin(self):
SCREEN.blit(self.image, (self.rect.x, self.rect.y))
```
### 2. 修改主游戏循环
在主游戏循环中添加金币的生成和处理逻辑。
#### 2.1 添加金币生成计时器
在 `mainGame` 函数中添加一个金币生成计时器。
```python
addCoinTimer = 0 # 添加金币的时间
coin_list = [] # 金币对象列表
```
#### 2.2 在主循环中生成金币
在主循环中添加生成金币的逻辑。
```python
if addCoinTimer >= 1500: # 每1500毫秒生成一个金币
addCoinTimer = 0
coin = Coin()
coin_list.append(coin)
else:
addCoinTimer += 20
```
#### 2.3 处理金币的移动和绘制
在主循环中处理金币的移动和绘制。
```python
for coin in coin_list:
coin.coin_move()
coin.draw_coin()
# 检测玛丽是否接触到金币
if pygame.sprite.collide_rect(marie, coin):
score += 1 # 增加分数
coin_list.remove(coin) # 移除金币
```
### 3. 修改 `showScore` 方法
确保 `showScore` 方法能够正确显示新的分数。
```python
def showScore(self, score):
self.scoreDigits = [int(x) for x in list(str(score))]
totalWidth = 0
for digit in self.scoreDigits:
totalWidth += self.numbers[digit].get_size()[0]
Xoffset = (SCREENWIDTH - (totalWidth + 30)) // 2
for digit in self.scoreDigits:
SCREEN.blit(self.numbers[digit], (Xoffset, SCREENHEIGHT * 0.1))
Xoffset += self.numbers[digit].get_size()[0]
```
### 4. 完整的 `mainGame` 函数
将上述修改整合到 `mainGame` 函数中。
```python
def mainGame():
score = 0 # 得分
over = False # 游戏结束标识
global SCREEN, FPSCLOCK # 游戏模块初始化
pygame.init() # 时间控制对象
FPSCLOCK = pygame.time.Clock() # 创建一个窗体
SCREEN = pygame.display.set_mode((SCREENWIDTH, SCREENHEIGHT)) # 设置标题
pygame.display.set_caption('玛丽冒险') # 创建地图
bg1 = MyMap(0, 0)
bg2 = MyMap(800, 0) # 创建玛丽
marie = Marie() # 背景音乐相关
music_button = Music_Button()
btn_img = music_button.open_img
music_button.bg_music.play(-1) # 障碍物相关
addObstacleTimer = 0 # 添加障碍物的时间
list = [] # 障碍物对象列表
addCoinTimer = 0 # 添加金币的时间
coin_list = [] # 金币对象列表
while True:
# 获取单击事件
for event in pygame.event.get():
# 关闭检测
if event.type == QUIT:
pygame.quit()
sys.exit()
elif event.type == KEYDOWN:
if event.key == K_SPACE:
# 如果玛丽刚起跳(判断当前是否在地上)
if marie.rect.y >= marie.lowest_y:
marie.jump_audio.play()
marie.jump()
# 如果死亡,按空格重新开始
if over == True:
mainGame()
elif event.type == MOUSEBUTTONUP:
# 判断鼠标事件
if music_button.is_select():
if music_button.is_open:
btn_img = music_button.close_img
music_button.is_open = False
music_button.bg_music.stop()
else:
btn_img = music_button.open_img
music_button.is_open = True
music_button.bg_music.play(-1)
if over == False:
# 绘制地图
bg1.map_update()
bg1.map_rolling()
bg2.map_update()
bg2.map_rolling()
# 绘制玛丽
marie.move()
marie.draw_marie()
# 绘制障碍物
if addObstacleTimer >= 1300:
addObstacleTimer = 0
# 随机一个障碍物
r = random.randint(0, 100)
if r > 40:
# 创建障碍物
obstacle = Obstacle()
list.append(obstacle)
for item in list:
# 障碍物移动
item.obstacle_move()
# 绘制障碍物
item.draw_obstacle()
# 检测是否发生碰撞
if pygame.sprite.collide_rect(marie, item):
over = True
game_over()
music_button.bg_music.stop()
break
else:
# 判断玛丽是否越过障碍物
if (item.rect.x + item.rect.width) < marie.rect.x:
score += item.getScore() # 加分
# 绘制金币
if addCoinTimer >= 1500:
addCoinTimer = 0
coin = Coin()
coin_list.append(coin)
else:
addCoinTimer += 20
for coin in coin_list:
coin.coin_move()
coin.draw_coin()
# 检测玛丽是否接触到金币
if pygame.sprite.collide_rect(marie, coin):
score += 1 # 增加分数
coin_list.remove(coin) # 移除金币
# 显示分数
for item in list:
item.showScore(score)
# 绘制音乐按钮
SCREEN.blit(btn_img, (20, 20))
# 更新窗体
pygame.display.update()
# 控制多长时间运行一次
FPSCLOCK.tick(FPS)
```
通过以上步骤,你可以在游戏中加入金币,并实现玛丽接触金币时金币消失且得分增加1分的功能。
阅读全文