主要内容 #
-
- 24点游戏的主函数完善
1.24点游戏的主函数完善 #
前面几课我们已经完成了界面设计,类的定义,显示功能等,现在主要是将main函数的功能流程进行完善,代码实现如下:
def main():
'''
主函数
'''
# 初始化, 导入必要的游戏素材
pygame.init()
pygame.mixer.init()
screen = pygame.display.set_mode(SCREENSIZE)
pygame.display.set_caption('24点小游戏-大师码')
win_sound = pygame.mixer.Sound(AUDIOWINPATH)
lose_sound = pygame.mixer.Sound(AUDIOLOSEPATH)
warn_sound = pygame.mixer.Sound(AUDIOWARNPATH)
pygame.mixer.music.load(BGMPATH)
pygame.mixer.music.play(-1, 0.0)
# 24点游戏生成器
game24_gen = Game24Generator()
game24_gen.generate()
# 精灵组
# --数字
number_sprites_group = getNumberSpritesGroup(game24_gen.numbers_now)
# --运算符
operator_sprites_group = getOperatorSpritesGroup(OPREATORS)
# --按钮
button_sprites_group = getButtonSpritesGroup(BUTTONS)
# 游戏主循环
clock = pygame.time.Clock()
selected_numbers = []
selected_operators = []
selected_buttons = []
is_win = False
while True:
for event in pygame.event.get():
if event.type == pygame.QUIT: # 是否退出
pygame.quit()
sys.exit(-1)
elif event.type == pygame.MOUSEBUTTONUP: # 检测鼠标是否点击三个不同的按钮
mouse_pos = pygame.mouse.get_pos()
selected_numbers = checkClicked(number_sprites_group, mouse_pos, 'NUMBER')
selected_operators = checkClicked(operator_sprites_group, mouse_pos, 'OPREATOR')
selected_buttons = checkClicked(button_sprites_group, mouse_pos, 'BUTTON')
screen.fill(AZURE)
# 更新数字
if len(selected_numbers) == 2 and len(selected_operators) == 1: # 选择两个操作数和一个操作符
noselected_numbers = []
for each in number_sprites_group: # 遍历数字组
if each.is_selected: # 如果被选中
if each.select_order == '1': # 选中的次序
selected_number1 = each.attribute
elif each.select_order == '2':
selected_number2 = each.attribute
else:
raise ValueError('Unknow select_order <%s>, expect <1> or <2>...' % each.select_order)
else: # 未被选中则加入未选中列表
noselected_numbers.append(each.attribute)
each.is_selected = False
for each in operator_sprites_group: # 遍历字符组
each.is_selected = False
result = calculate(selected_number1, selected_number2, *selected_operators) # 计算结果
if result is not None:
game24_gen.numbers_now = noselected_numbers + [result] # 更新数字为Result
is_win = game24_gen.check() # 检测是否胜利
if is_win:
win_sound.play() # 播放胜利音效
if not is_win and len(game24_gen.numbers_now) == 1: # 如果没赢并且只剩下一个数字还不是24说明游戏失败
lose_sound.play() # 播放失败音效
else:
warn_sound.play() # 结果为空,播放警告音效
selected_numbers = []
selected_operators = []
number_sprites_group = getNumberSpritesGroup(game24_gen.numbers_now) # 由于数字在逐渐变少,因此需要重新绘出数字精灵组
# 精灵都画到screen上
for each in number_sprites_group:
each.draw(screen, pygame.mouse.get_pos()) # 画出数字精灵
for each in operator_sprites_group:
each.draw(screen, pygame.mouse.get_pos()) # 画出操作符精灵
for each in button_sprites_group:
if selected_buttons and selected_buttons[0] in ['RESET', 'NEXT']:
is_win = False # 如果选择按钮是'RESET'或者'NEXT',则将成功标志设为否
if selected_buttons and each.attribute == selected_buttons[0]:
each.is_selected = False
# 根据button function执行响应操作
number_sprites_group = each.do(game24_gen, getNumberSpritesGroup, number_sprites_group, button_sprites_group)
selected_buttons = []
each.draw(screen, pygame.mouse.get_pos()) # 画出按钮精灵
# 游戏胜利
if is_win:
showInfo('Congratulations', screen)
# 游戏失败
if not is_win and len(game24_gen.numbers_now) == 1:
showInfo('Game Over', screen)
pygame.display.update()
clock.tick(30)
全部修改完之后,运行整体代码,看整体效果。
至此完成了24点游戏所有的代码部分,希望大家可以对代码进行深入理解,并且尝试修改代码,完成新的功能,比如改为21点等。
小结 #
- 本节主要介绍了24点游戏的主循环start函数的完善,至此24点游戏开发完成。