跳至正文
View Categories

2 min read

主要内容 #

    1. 之前已经完成了24点游戏所需的所有界面,以及类的定义和数字运算符功能的展示,本课主要是完成功能的实现:
    1. 检查控件是否被点击模块
    2. 计算和显示信息模块

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点游戏中所需要的功能函数,包括检查按钮是否被按下,计算模块和显示模块。