Python小游戏(24点小游戏)

举报
红目香薰 发表于 2022/01/23 01:17:31 2022/01/23
【摘要】 玩法:通过加减乘除操作,小学生都没问题的。 源码分享: import osimport sysimport pygamefrom cfg import *from modules import *from fractions import Fraction '''检查控件是否被点击'''def checkClicked(gro...

玩法:通过加减乘除操作,小学生都没问题的。

源码分享:


  
  1. import os
  2. import sys
  3. import pygame
  4. from cfg import *
  5. from modules import *
  6. from fractions import Fraction
  7. '''检查控件是否被点击'''
  8. def checkClicked(group, mouse_pos, group_type='NUMBER'):
  9. selected = []
  10. # 数字卡片/运算符卡片
  11. if group_type == GROUPTYPES[0] or group_type == GROUPTYPES[1]:
  12. max_selected = 2 if group_type == GROUPTYPES[0] else 1
  13. num_selected = 0
  14. for each in group:
  15. num_selected += int(each.is_selected)
  16. for each in group:
  17. if each.rect.collidepoint(mouse_pos):
  18. if each.is_selected:
  19. each.is_selected = not each.is_selected
  20. num_selected -= 1
  21. each.select_order = None
  22. else:
  23. if num_selected < max_selected:
  24. each.is_selected = not each.is_selected
  25. num_selected += 1
  26. each.select_order = str(num_selected)
  27. if each.is_selected:
  28. selected.append(each.attribute)
  29. # 按钮卡片
  30. elif group_type == GROUPTYPES[2]:
  31. for each in group:
  32. if each.rect.collidepoint(mouse_pos):
  33. each.is_selected = True
  34. selected.append(each.attribute)
  35. # 抛出异常
  36. else:
  37. raise ValueError('checkClicked.group_type unsupport %s, expect %s, %s or %s...' % (group_type, *GROUPTYPES))
  38. return selected
  39. '''获取数字精灵组'''
  40. def getNumberSpritesGroup(numbers):
  41. number_sprites_group = pygame.sprite.Group()
  42. for idx, number in enumerate(numbers):
  43. args = (*NUMBERCARD_POSITIONS[idx], str(number), NUMBERFONT, NUMBERFONT_COLORS, NUMBERCARD_COLORS, str(number))
  44. number_sprites_group.add(Card(*args))
  45. return number_sprites_group
  46. '''获取运算符精灵组'''
  47. def getOperatorSpritesGroup(operators):
  48. operator_sprites_group = pygame.sprite.Group()
  49. for idx, operator in enumerate(operators):
  50. args = (*OPERATORCARD_POSITIONS[idx], str(operator), OPERATORFONT, OPREATORFONT_COLORS, OPERATORCARD_COLORS, str(operator))
  51. operator_sprites_group.add(Card(*args))
  52. return operator_sprites_group
  53. '''获取按钮精灵组'''
  54. def getButtonSpritesGroup(buttons):
  55. button_sprites_group = pygame.sprite.Group()
  56. for idx, button in enumerate(buttons):
  57. args = (*BUTTONCARD_POSITIONS[idx], str(button), BUTTONFONT, BUTTONFONT_COLORS, BUTTONCARD_COLORS, str(button))
  58. button_sprites_group.add(Button(*args))
  59. return button_sprites_group
  60. '''计算'''
  61. def calculate(number1, number2, operator):
  62. operator_map = {'+': '+', '-': '-', '×': '*', '÷': '/'}
  63. try:
  64. result = str(eval(number1+operator_map[operator]+number2))
  65. return result if '.' not in result else str(Fraction(number1+operator_map[operator]+number2))
  66. except:
  67. return None
  68. '''在屏幕上显示信息'''
  69. def showInfo(text, screen):
  70. rect = pygame.Rect(200, 180, 400, 200)
  71. pygame.draw.rect(screen, PAPAYAWHIP, rect)
  72. font = pygame.font.Font(FONTPATH, 40)
  73. text_render = font.render(text, True, BLACK)
  74. font_size = font.size(text)
  75. screen.blit(text_render, (rect.x+(rect.width-font_size[0])/2, rect.y+(rect.height-font_size[1])/2))
  76. '''主函数'''
  77. def main():
  78. # 初始化, 导入必要的游戏素材
  79. pygame.init()
  80. pygame.mixer.init()
  81. screen = pygame.display.set_mode(SCREENSIZE)
  82. pygame.display.set_caption('24 point —— 九歌')
  83. win_sound = pygame.mixer.Sound(AUDIOWINPATH)
  84. lose_sound = pygame.mixer.Sound(AUDIOLOSEPATH)
  85. warn_sound = pygame.mixer.Sound(AUDIOWARNPATH)
  86. pygame.mixer.music.load(BGMPATH)
  87. pygame.mixer.music.play(-1, 0.0)
  88. # 24点游戏生成器
  89. game24_gen = game24Generator()
  90. game24_gen.generate()
  91. # 精灵组
  92. # --数字
  93. number_sprites_group = getNumberSpritesGroup(game24_gen.numbers_now)
  94. # --运算符
  95. operator_sprites_group = getOperatorSpritesGroup(OPREATORS)
  96. # --按钮
  97. button_sprites_group = getButtonSpritesGroup(BUTTONS)
  98. # 游戏主循环
  99. clock = pygame.time.Clock()
  100. selected_numbers = []
  101. selected_operators = []
  102. selected_buttons = []
  103. is_win = False
  104. while True:
  105. for event in pygame.event.get():
  106. if event.type == pygame.QUIT:
  107. pygame.quit()
  108. sys.exit(-1)
  109. elif event.type == pygame.MOUSEBUTTONUP:
  110. mouse_pos = pygame.mouse.get_pos()
  111. selected_numbers = checkClicked(number_sprites_group, mouse_pos, 'NUMBER')
  112. selected_operators = checkClicked(operator_sprites_group, mouse_pos, 'OPREATOR')
  113. selected_buttons = checkClicked(button_sprites_group, mouse_pos, 'BUTTON')
  114. screen.fill(AZURE)
  115. # 更新数字
  116. if len(selected_numbers) == 2 and len(selected_operators) == 1:
  117. noselected_numbers = []
  118. for each in number_sprites_group:
  119. if each.is_selected:
  120. if each.select_order == '1':
  121. selected_number1 = each.attribute
  122. elif each.select_order == '2':
  123. selected_number2 = each.attribute
  124. else:
  125. raise ValueError('Unknow select_order %s, expect 1 or 2...' % each.select_order)
  126. else:
  127. noselected_numbers.append(each.attribute)
  128. each.is_selected = False
  129. for each in operator_sprites_group:
  130. each.is_selected = False
  131. result = calculate(selected_number1, selected_number2, *selected_operators)
  132. if result is not None:
  133. game24_gen.numbers_now = noselected_numbers + [result]
  134. is_win = game24_gen.check()
  135. if is_win:
  136. win_sound.play()
  137. if not is_win and len(game24_gen.numbers_now) == 1:
  138. lose_sound.play()
  139. else:
  140. warn_sound.play()
  141. selected_numbers = []
  142. selected_operators = []
  143. number_sprites_group = getNumberSpritesGroup(game24_gen.numbers_now)
  144. # 精灵都画到screen上
  145. for each in number_sprites_group:
  146. each.draw(screen, pygame.mouse.get_pos())
  147. for each in operator_sprites_group:
  148. each.draw(screen, pygame.mouse.get_pos())
  149. for each in button_sprites_group:
  150. if selected_buttons and selected_buttons[0] in ['RESET', 'NEXT']:
  151. is_win = False
  152. if selected_buttons and each.attribute == selected_buttons[0]:
  153. each.is_selected = False
  154. number_sprites_group = each.do(game24_gen, getNumberSpritesGroup, number_sprites_group, button_sprites_group)
  155. selected_buttons = []
  156. each.draw(screen, pygame.mouse.get_pos())
  157. # 游戏胜利
  158. if is_win:
  159. showInfo('Congratulations', screen)
  160. # 游戏失败
  161. if not is_win and len(game24_gen.numbers_now) == 1:
  162. showInfo('Game Over', screen)
  163. pygame.display.flip()
  164. clock.tick(30)
  165. '''run'''
  166. if __name__ == '__main__':
  167. main()

祝大家玩得开心,欢迎点赞、关注、评论,欢迎一键三联。

文章来源: laoshifu.blog.csdn.net,作者:红目香薰,版权归原作者所有,如需转载,请联系作者。

原文链接:laoshifu.blog.csdn.net/article/details/120444418

【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。