主要内容 #
-
- 之前已经完成了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点游戏中所需要的功能函数,包括检查按钮是否被按下,计算模块和显示模块。