主要内容 #
-
- 之前已经完成了24点游戏所需的所有界面,以及类的定义和数字运算符功能的展示,本课主要是完成功能的实现:
- 检查控件是否被点击模块
- 计算和显示信息模块
1.检查控件是否被点击模块 #
该模块实现的功能为:检查控件是否被点击。
该部分代码如下:
def checkClicked(group, mouse_pos, group_type='NUMBER'): ''' 检查控件是否被点击 ''' selected = [] # 数字卡片/运算符卡片 if group_type == GROUPTYPES[0] or group_type == GROUPTYPES[1]: max_selected = 2 if group_type == GROUPTYPES[0] else 1 # 如果是数据卡片,则最大选择2个,如果是运算符卡片则最大选择一个 num_selected = 0 for each in group: num_selected += int(each.is_selected) # 选择的数字卡片数量 for each in group: if each.rect.collidepoint(mouse_pos): # 卡片是否被鼠标点击 if each.is_selected: # 原始被选中再次被点击 each.is_selected = not each.is_selected # 取消选中 num_selected -= 1 # 选择的卡片数量减一 each.select_order = None else: # 原始没被选中 if num_selected < max_selected: # 没有超过最大可选中数 each.is_selected = not each.is_selected # 选中 num_selected += 1 # 选中的卡片数量加一 each.select_order = str(num_selected) if each.is_selected: selected.append(each.attribute) # 按钮卡片 elif group_type == GROUPTYPES[2]: for each in group: if each.rect.collidepoint(mouse_pos): each.is_selected = True selected.append(each.attribute) # 增加到选择列表 # 抛出异常 else: raise ValueError('checkClicked.group_type unsupport <%s>, expect <%s>, <%s> or <%s>...' % (group_type, *GROUPTYPES)) return selected
将以上所有代码加入到main()函数的上方,请注意该函数不是某个类的成员函数,而是普通函数。
接下来需要在各个模块中添加和修改代码,具体如下。
# 在maint()函数中找到如下代码 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') print(selected_numbers, selected_operators, selected_buttons)
# 在maint()函数中找到如下代码 # 游戏主循环 clock = pygame.time.Clock() # 在该句代码下方增加如下代码 selected_numbers = [] selected_operators = [] selected_buttons = [] is_win = False
全部修改完之后,运行整体代码,看整体效果,可以在shell命令行看到print出的结果,每次点击都会在结果列表中显示,这也就完成了检查是否被点击的功能。
2.计算和显示信息模块 #
如下是必要的计算和显示信息模块,代码实现如下:
def calculate(number1, number2, operator): ''' 计算 ''' operator_map = {'+': '+', '-': '-', '×': '*', '÷': '/'} try: result = str(eval(number1+operator_map[operator]+number2)) return result if '.' not in result else str(Fraction(number1+operator_map[operator]+number2)) except: return None def showInfo(text, screen): ''' 在屏幕上显示信息 ''' rect = pygame.Rect(200, 180, 400, 200) pygame.draw.rect(screen, PAPAYAWHIP, rect) font = pygame.font.Font(FONTPATH, 40) text_render = font.render(text, True, BLACK) font_size = font.size(text) screen.blit(text_render, (rect.x+(rect.width-font_size[0])/2, rect.y+(rect.height-font_size[1])/2))
将以上所有代码加入到main()函数的上方,请注意该函数不是某个类的成员函数,而是普通函数。
接下来需要在各个模块中添加和修改代码,具体如下。
# 在main()函数中找到如下代码 pygame.display.update() # 在该句代码上方增加如下代码 # 游戏胜利 is_win = True if is_win: showInfo('Congratulations', screen) # 游戏失败 if not is_win and len(game24_gen.numbers_now) == 1: showInfo('Game Over', screen)
全部修改完之后,运行整体代码,看整体效果,可以看出直接弹出了Congratulations,这是因为我们将is_win置为True,后续请删除is_win=True 这句代码。
小结 #
本节主要介绍了24点游戏中所需要的功能函数,包括检查按钮是否被按下,计算模块和显示模块。