社区所有版块导航
Python
python开源   Django   Python   DjangoApp   pycharm  
DATA
docker   Elasticsearch  
aigc
aigc   chatgpt  
WEB开发
linux   MongoDB   Redis   DATABASE   NGINX   其他Web框架   web工具   zookeeper   tornado   NoSql   Bootstrap   js   peewee   Git   bottle   IE   MQ   Jquery  
机器学习
机器学习算法  
Python88.com
反馈   公告   社区推广  
产品
短视频  
印度
印度  
Py学习  »  Python

Python版小游戏《水果忍者》

Crossin的编程教室 • 6 月前 • 124 次点击  
入门教程、案例源码、学习资料、读者群
请访问: python666.cn

大家好,欢迎来到 Crossin的编程教室 !

「水果忍者」这个游戏很多人都玩过,玩法很简单,尽可能多地切开抛出的水果就行。

今天我们就用python简单的模拟一下这个游戏。在这个简单的项目中,我们用鼠标选择水果来切割,同时炸弹也会隐藏在水果中,如果切开了三次炸弹,玩家就会失败。

一、需要导入的包

  1. import pygame, sys

  2. import os

  3. import random

二、窗口界面设置

  1. # 游戏窗口

  2. WIDTH =  800

  3. HEIGHT = 500

  4. FPS = 15             # gameDisplay的帧率,1/12秒刷新一次

  5. pygame.init()

  6. pygame.display.set_caption('水果忍者') # 标题

  7. gameDisplay = pygame.display. set_mode((WIDTH, HEIGHT)) # 固定窗口大小

  8. clock = pygame.time.Clock()

  9.  

  10. # 用到的颜色

  11. WHITE = (255,255,255)

  12. BLACK = (0 ,0,0)

  13. RED = (255,0,0)

  14. GREEN = (0,255,0)

  15. BLUE = (0,0,255)

  16.  

  17. background = pygame.image.load('背景.jpg') # 背景

  18. font = pygame.font.Font(os.path.join(os.getcwd(), 'comic.ttf'), 42 ) # 字体

  19. score_text = font.render('Score : ' + str(score), True, (255, 255, 255)) #得分字体样式

三、随机生成水果位置




    
  1. def generate_random_fruits(fruit):

  2.     fruit_path = "images/" + fruit + ".png"

  3.     data[fruit] = {

  4.         'img': pygame.image.load(fruit_path ),

  5.         'x' : random.randint(100,500),

  6.         'y' : 800,

  7.         'speed_x': random.randint(-10,10),

  8.         'speed_y' : random.randint(-80, -60),

  9.         'throw': False,

  10.         't': 0,

  11.         'hit': False,

  12.     }

  13.  

  14.     if random.random() >= 0.75:

  15.         data[fruit]['throw'] = True

  16.     else:

  17.         data[fruit]['throw'] = False

  18.  

  19. data = {}

  20. for fruit in fruits:

  21.     generate_random_fruits(fruit)

这个函数用于随机生成水果和保存水果的数据

'x'和'y'存储水果在x坐标和y坐标上的位置。

speed_x和speed_y是存储水果在x和y方向的移动速度。它也控制水果的对角线移动。

throw,用于判断生成的水果坐标是否在游戏之外。如果在外面,那么将被丢弃。

data字典用于存放随机生成的水果的数据。

四、绘制字体

  1. font_name = pygame.font.match_font('comic.ttf')

  2.  

  3. def draw_text(display, text, size, x, y):

  4.     font = pygame.font.Font(font_name, size)

  5.     text_surface = font.render(text, True , WHITE)

  6.     text_rect = text_surface.get_rect()

  7.     text_rect.midtop = (x, y)

  8.     gameDisplay.blit(text_surface, text_rect)

draw_text函数可以在屏幕上绘制文字。

get_rect() 返回 Rect 对象。

x和y是x方向和y方向的位置。

blit()在屏幕上的指定位置绘制图像或写入文字。

五、玩家生命的提示




    
  1. # 绘制玩家的生命

  2. def draw_lives(display, x, y, lives, image) :

  3. for i in range(lives) :

  4. img = pygame.image.load(image )

  5. img_rect = img.get_rect()

  6. img_rect.= int(+ 35 * i)

  7. img_rect.= y

  8. display.blit(img, img_rect )

  1. def hide_cross_lives(x, y):

  2. gameDisplay.blit(pygame.image.load("images/red_lives.png"), (x, y))

img_rect获取十字图标的(x,y)坐标(位于最右上方)
img_rect .x 设置下一个十字图标距离前一个图标35像素。
img_rect.y负责确定十字图标从屏幕顶部开始的位置。

六、游戏开始与结束的画面

  1. def show_gameover_screen():

  2.     gameDisplay.blit(background, (0,0))

  3.     draw_text(gameDisplay, "FRUIT NINJA!", 90, WIDTH / 2, HEIGHT / 4)

  4.     if not game_over :

  5.         draw_text(gameDisplay,"Score : " + str(score), 50, WIDTH / 2, HEIGHT /2)

  6.  

  7.     draw_text(gameDisplay,  "Press a key to begin!", 64, WIDTH / 2, HEIGHT * 3 / 4)

  8.     pygame.display.flip()

  9.     waiting = True

  10.     while waiting:

  11.         clock.tick(FPS)

  12.         for event in pygame.event.get():

  13.             if event.type == pygame.QUIT:

  14.                 pygame.quit()

  15.              if event.type == pygame.KEYUP:

  16.                 waiting = False

show_gameover_screen()函数显示初始游戏画面和游戏结束画面。

pygame.display.flip()将只更新屏幕的一部分,但如果没有参数传递,则会更新整个屏幕。

pygame.event.get()将返回存储在pygame事件队列中的所有事件。

如果事件类型等于quit,那么pygame将退出。

event.KEYUP事件,当按键被按下和释放时发生的事件。

七、游戏主循环

  1. first_round = True

  2. game_over = True        

  3. game_running =  True    

  4. while game_running :

  5.     if game_over :

  6.         if first_round :

  7.             show_gameover_screen()

  8.             first_round = False

  9.         game_over = False

  10.         player_lives = 3

  11.         draw_lives(gameDisplay, 690, 5, player_lives, 'images/red_lives.png')

  12.         score = 0

  13.  

  14.     for event in pygame.event.get():

  15.  

  16.         if event.type == pygame.QUIT:

  17.             game_running = False

  18.  

  19.     gameDisplay.blit(background, (0, 0))

  20.     gameDisplay.blit(score_text , (0, 0))

  21.     draw_lives(gameDisplay, 690, 5, player_lives, 'images/red_lives.png')

  22.  

  23.     for key, value in data.items():

  24.         if value['throw']:

  25.             value['x'] += value['speed_x']

  26.             value['y'] += value['speed_y']

  27.             value['speed_y'] += (1  * value['t'])

  28.             value['t'] += 1

  29.  

  30.             if value['y'] <= 800:

  31.                 gameDisplay.blit(value['img'],  (value['x'], value['y']))

  32.             else:

  33.                 generate_random_fruits(key)

  34.  

  35.             current_position = pygame.mouse.get_pos()

  36.  

  37.             if not value ['hit'] and current_position[0] > value['x'] and current_position[0] < value['x']+60 \

  38.                     and current_position[1] > value ['y'] and current_position[1] < value['y']+60:

  39.                 if key == 'bomb':

  40.                     player_lives -= 1

  41.                     if player_lives == 0:

  42.                         hide_cross_lives(690, 15)

  43.                     elif player_lives == 1 :

  44.                         hide_cross_lives(725, 15)

  45.                     elif player_lives == 2 :

  46.                         hide_cross_lives( 760, 15)

  47.                   

  48.                     if player_lives < 0 :

  49.                         show_gameover_screen()

  50.                         game_over = True

  51.  

  52.                     half_fruit_path = "images/explosion.png"

  53.                 else:

  54.                     half_fruit_path = "images/" + "half_" + key + ".png"

  55.  

  56.                 value['img'] = pygame.image.load(half_fruit_path)

  57.                 value['speed_x'] +=  10

  58.                 if key != 'bomb' :

  59.                     score += 1

  60.                 score_text = font.render('Score : ' + str(score), True, (255,  255, 255))

  61.                 value['hit'] = True

  62.         else:

  63.             generate_random_fruits(key)

  64.  

  65.     pygame.display.update()

  66.     clock.tick( FPS)

  67.  

  68. pygame.quit()

这是游戏的主循环

如果超过3个炸弹被切掉,game_over终止游戏,同时循环。

game_running 用于管理游戏循环。

如果事件类型是退出,那么游戏窗口将被关闭。

在这个游戏循环中,我们动态显示屏幕内的水果。

如果一个水果没有被切开,那么它将不会发生任何事情。如果水果被切开,那么一个半切开的水果图像应该出现在该水果的地方

如果用户点击了三次炸弹,将显示GAME OVER信息,并重置窗口。

clock.tick()将保持循环以正确的速度运行。循环应该在每1/12秒后更新一次。

以上就是一个简单的Python版「水果忍者」小游戏,完整代码都在文中了,赶紧动手试试吧。

作者:小五

来源:Python联盟
https://mp.weixin.qq.com/s/DhJQSsDwpJfwWIp6LHvZXw



Crossin的第2本书码上行动:利用Python与ChatGPT高效搞定Excel数据分析已经上市了

点此查看上一本《码上行动:零基础学会Python编程》介绍

本书从 Python 和 Excel 结合使用的角度讲解处理分析数据的思路、方法与实战应用。不论是希望从事数据分析岗位的学习者,还是其他职业的办公人员,都可以通过本书的学习掌握 Python 分析数据的技能。书中创新性地将 ChatGPT 引入到教学当中,用 ChatGPT 答疑并提供实训代码,并介绍了使用 ChatGPT 辅助学习的一些实用技巧,给学习者带来全新的学习方式。


京东双十一5折进行中

读者朋友们购买后可在后台联系我,加入读者交流群,Crossin会为你开启陪读模式,解答你在阅读本书时的一切疑问。


感谢转发点赞的各位~

_往期文章推荐_

Python复刻声控游戏《八分音符酱》
Python复刻游戏《贪吃蛇大作战》



【教程】: python

【答疑】: 666
更多资源点击阅读原文

Python社区是高质量的Python/Django开发社区
本文地址:http://www.python88.com/topic/163587
 
124 次点击