• Python实现接糖果小游戏


    介绍:

    基于Pygame的糖果从屏幕顶部下落的游戏代码。这个游戏包括了一个可以左右移动的篮子来接住下落的糖果,接住糖果会增加得分。

    代码:

    1. import pygame
    2. import random
    3. import os
    4. # 初始化pygame和设置屏幕大小
    5. pygame.init()
    6. screen_width, screen_height = 800, 600
    7. screen = pygame.display.set_mode((screen_width, screen_height))
    8. # 设置颜色
    9. WHITE = (255, 255, 255)
    10. RED = (255, 0, 0)
    11. ORANGE = (255, 128, 0)
    12. BLACK = (0, 0, 0)
    13. # 糖果和篮子的尺寸
    14. candy_width, candy_height = 30, 30
    15. basket_width, basket_height = 100, 50
    16. # 初始化篮子的位置
    17. basket_x = screen_width // 2
    18. basket_y = screen_height - basket_height
    19. # 糖果列表
    20. candies = []
    21. # 初始化得分
    22. score = 0
    23. # 最高得分
    24. highest_score = 0
    25. # 设置游戏运行时间(毫秒)
    26. game_duration = 30000
    27. # 难度和对应的下落速度
    28. DIFFICULTIES = {
    29. 'Easy': 10,
    30. 'Medium': 20,
    31. 'Hard': 30
    32. }
    33. # 按钮的位置和大小
    34. button_width = 150
    35. button_height = 50
    36. button_x_offset = 100
    37. button_y = screen_height // 2 - (button_height // 2)
    38. # 字体
    39. font = pygame.font.Font(None, 36)
    40. # 难度选择函数
    41. def select_difficulty():
    42. selected_difficulty = None
    43. clock = pygame.time.Clock() # 添加一个时钟对象来控制帧率
    44. while not selected_difficulty:
    45. for event in pygame.event.get():
    46. if event.type == pygame.QUIT:
    47. return None
    48. elif event.type == pygame.MOUSEBUTTONDOWN:
    49. mouse_x, mouse_y = pygame.mouse.get_pos()
    50. if button_x_offset <= mouse_x < button_x_offset + button_width and button_y <= mouse_y < button_y + button_height:
    51. selected_difficulty = 'Easy'
    52. elif button_x_offset + button_width + 10 <= mouse_x < button_x_offset + 2 * button_width + 10 and button_y <= mouse_y < button_y + button_height:
    53. selected_difficulty = 'Medium'
    54. elif button_x_offset + 2 * button_width + 20 <= mouse_x < button_x_offset + 3 * button_width + 20 and button_y <= mouse_y < button_y + button_height:
    55. selected_difficulty = 'Hard'
    56. # 在循环内渲染难度选择界面
    57. screen.fill(WHITE)
    58. # 绘制按钮
    59. pygame.draw.rect(screen, RED, (button_x_offset, button_y, button_width, button_height))
    60. pygame.draw.rect(screen, RED, (button_x_offset + button_width + 10, button_y, button_width, button_height))
    61. pygame.draw.rect(screen, RED, (button_x_offset + 2 * button_width + 20, button_y, button_width, button_height))
    62. # 绘制按钮文本
    63. easy_text = font.render("Easy", True, WHITE)
    64. screen.blit(easy_text, (button_x_offset + (button_width - easy_text.get_width()) // 2,
    65. button_y + (button_height - easy_text.get_height()) // 2))
    66. medium_text = font.render("Medium", True, WHITE)
    67. screen.blit(medium_text, (button_x_offset + button_width + 10 + (button_width - medium_text.get_width()) // 2,
    68. button_y + (button_height - medium_text.get_height()) // 2))
    69. hard_text = font.render("Hard", True, WHITE)
    70. screen.blit(hard_text, (button_x_offset + 2 * button_width + 20 + (button_width - hard_text.get_width()) // 2,
    71. button_y + (button_height - hard_text.get_height()) // 2))
    72. pygame.display.flip() # 更新屏幕显示
    73. # 控制帧率
    74. clock.tick(60)
    75. return selected_difficulty
    76. # 加载或设置历史最高分数
    77. def load_highest_score():
    78. global highest_score
    79. file_path = os.path.join(os.getcwd(), 'highest_score.txt')
    80. try:
    81. with open(file_path, 'r') as file:
    82. highest_score = int(file.read().strip())
    83. except FileNotFoundError:
    84. highest_score = 0
    85. def save_highest_score():
    86. global highest_score
    87. file_path = os.path.join(os.getcwd(), 'highest_score.txt')
    88. with open(file_path, 'w') as file:
    89. file.write(str(highest_score))
    90. def check_restart_button(event):
    91. button_rect = pygame.Rect(screen_width - 100, screen_height - 50, 100, 50)
    92. return event.type == pygame.MOUSEBUTTONDOWN and event.button == 1 and button_rect.collidepoint(event.pos)
    93. # 选择难度
    94. difficulty = select_difficulty()
    95. if difficulty is None:
    96. pygame.quit()
    97. # 根据难度设置下落速度
    98. speed = DIFFICULTIES[difficulty]
    99. # 游戏主循环
    100. clock = pygame.time.Clock()
    101. running = True
    102. game_over = False
    103. load_highest_score() # 加载历史最高分数
    104. game_start_time = pygame.time.get_ticks() # 记录游戏开始时间
    105. while running:
    106. for event in pygame.event.get():
    107. if event.type == pygame.QUIT:
    108. running = False
    109. elif event.type == pygame.MOUSEMOTION:
    110. basket_x = event.pos[0]
    111. basket_x = max(0, min(basket_x, screen_width - basket_width))
    112. elif check_restart_button(event):
    113. game_start_time = pygame.time.get_ticks()
    114. candies.clear()
    115. score = 0
    116. # 计算已经过去的时间(毫秒)
    117. elapsed_time = pygame.time.get_ticks() - game_start_time
    118. # 将毫秒转换为秒
    119. elapsed_seconds = elapsed_time / 1000
    120. # 生成新的糖果(限制生成频率)
    121. if random.random() < 0.02 and len(candies) < 10:
    122. candy_x = random.randint(0, screen_width - candy_width)
    123. candy_y = 0 - candy_height # 开始时稍微在屏幕外
    124. candies.append([candy_x, candy_y])
    125. # 移动糖果
    126. for candy in candies:
    127. candy[1] += speed
    128. # 检查糖果是否超出屏幕底部
    129. if candy[1] > screen_height:
    130. candies.remove(candy)
    131. # 检查是否接到糖果(在糖果掉出屏幕之前)
    132. if (basket_x < candy[0] < basket_x + basket_width and
    133. basket_y - candy_height < candy[1] < basket_y):
    134. score += 1
    135. candies.remove(candy)
    136. # 在游戏结束时保存最高分数
    137. if not candies and score > highest_score:
    138. highest_score = score
    139. save_highest_score()
    140. # 绘制游戏元素
    141. screen.fill(WHITE) # 填充背景色
    142. for candy_x, candy_y in candies:
    143. pygame.draw.rect(screen, (255, 0, 0), (candy_x, candy_y, candy_width, candy_height))
    144. pygame.draw.rect(screen, (100, 50, 0), (basket_x, basket_y, basket_width, basket_height)) # 绘制篮子矩形
    145. # 显示得分
    146. score_text = font.render(f"Score: {score}", True, BLACK)
    147. highest_score_text = font.render(f"Highest score: {highest_score}", True, BLACK)
    148. screen.blit(score_text, (10, 10))
    149. screen.blit(highest_score_text, (10, 50))
    150. time = game_duration - elapsed_time
    151. # 获取秒数的后三位
    152. last_three_digits = time % 1000
    153. # 转换为字符串以便显示
    154. time1 = int(time/1000)
    155. time_str = str(last_three_digits).zfill(3)
    156. if time > 0:
    157. screen.blit(font.render(f"remainder: {time1}.{time_str}", True, RED), (300, 10))
    158. # 绘制“重新开始”按钮
    159. pygame.draw.rect(screen, BLACK, (screen_width - 100, screen_height - 50, 100, 50))
    160. pygame.draw.rect(screen, WHITE, (screen_width - 98, screen_height - 48, 96, 46), 2)
    161. screen.blit(font.render("restart", True, ORANGE), (screen_width - 85, screen_width - 300))
    162. # 检查游戏是否应该结束
    163. if time < 0:
    164. font1 = pygame.font.Font(None, 52)
    165. screen.blit(font1.render("game over", True, RED), (300, 300))
    166. candies.clear()
    167. score = 0
    168. # 更新屏幕显示
    169. pygame.display.flip()
    170. # 控制游戏循环的速度
    171. clock.tick(60)
    172. # 退出pygame
    173. pygame.quit()

    选择难度页面示例:

     游戏页面:

    源码下载 

  • 相关阅读:
    2023.10.8 基本 Thread 线程详解
    【异常检测】数据挖掘领域常用异常检测算法总结以及原理解析(一)
    【赠书第4期】机器学习与人工智能实战:基于业务场景的工程应用
    数据结构的魔法:高级算法优化实战
    万字长文:从计算机本源深入探寻volatile和Java内存模型
    性能测试LoadRunner02
    web前端项目案例实战
    计算机毕业设计Java爱宠医院管理系统(源码+系统+mysql数据库+lw文档)
    【Git从青铜到王者】第一篇:Git引言
    python之*用法
  • 原文地址:https://blog.csdn.net/qq_65356881/article/details/140107292