Heim > Artikel > Backend-Entwicklung > So implementieren Sie ein 24-Punkte-Spiel mit Python+Pygame
(1) Was ist das 24-Punkte-Spiel?
Brett- und Kartenrätselspiel, das erforderliche Ergebnis ist gleich vierundzwanzig
(2) Spielregeln
Ziehe 4 beliebige Zahlen (1 --10), verwenden Sie Addieren, Subtrahieren, Multiplizieren und Dividieren (Sie können Klammern hinzufügen), um die angezeigten Zahlen bis 24 zu zählen. Jede Nummer darf nur einmal verwendet werden. „24 Punkte zählen“ ist ein Denkspiel, das das Denken trainiert. Auch auf die technischen Aspekte des Rechnens sollte geachtet werden. Bei der Berechnung ist es uns unmöglich, verschiedene Kombinationen der vier Zahlen auf der Karte auszuprobieren, geschweige denn zufällige Kombinationen.
Beispiel: 3, 8, 8, 9
Antwort: 3×8÷(9-8)=24
1. Definieren Sie diesen Teil des Spielcodes in der Datei game.py in Kleinbuchstaben
''' 定义游戏 ''' import copy import random import pygame ''' Function: 卡片类 Initial Args: --x,y: 左上角坐标 --width: 宽 --height: 高 --text: 文本 --font: [字体路径, 字体大小] --font_colors(list): 字体颜色 --bg_colors(list): 背景色 ''' class Card(pygame.sprite.Sprite): def __init__(self, x, y, width, height, text, font, font_colors, bg_colors, attribute, **kwargs): pygame.sprite.Sprite.__init__(self) self.rect = pygame.Rect(x, y, width, height) self.text = text self.attribute = attribute self.font_info = font self.font = pygame.font.Font(font[0], font[1]) self.font_colors = font_colors self.is_selected = False self.select_order = None self.bg_colors = bg_colors '''画到屏幕上''' def draw(self, screen, mouse_pos): pygame.draw.rect(screen, self.bg_colors[1], self.rect, 0) if self.rect.collidepoint(mouse_pos): pygame.draw.rect(screen, self.bg_colors[0], self.rect, 0) font_color = self.font_colors[self.is_selected] text_render = self.font.render(self.text, True, font_color) font_size = self.font.size(self.text) screen.blit(text_render, (self.rect.x+(self.rect.width-font_size[0])/2, self.rect.y+(self.rect.height-font_size[1])/2)) '''按钮类''' class Button(Card): def __init__(self, x, y, width, height, text, font, font_colors, bg_colors, attribute, **kwargs): Card.__init__(self, x, y, width, height, text, font, font_colors, bg_colors, attribute) '''根据button function执行响应操作''' def do(self, game24_gen, func, sprites_group, objs): if self.attribute == 'NEXT': for obj in objs: obj.font = pygame.font.Font(obj.font_info[0], obj.font_info[1]) obj.text = obj.attribute self.font = pygame.font.Font(self.font_info[0], self.font_info[1]) self.text = self.attribute game24_gen.generate() sprites_group = func(game24_gen.numbers_now) elif self.attribute == 'RESET': for obj in objs: obj.font = pygame.font.Font(obj.font_info[0], obj.font_info[1]) obj.text = obj.attribute game24_gen.numbers_now = game24_gen.numbers_ori game24_gen.answers_idx = 0 sprites_group = func(game24_gen.numbers_now) elif self.attribute == 'ANSWERS': self.font = pygame.font.Font(self.font_info[0], 20) self.text = '[%d/%d]: ' % (game24_gen.answers_idx+1, len(game24_gen.answers)) + game24_gen.answers[game24_gen.answers_idx] game24_gen.answers_idx = (game24_gen.answers_idx+1) % len(game24_gen.answers) else: raise ValueError('Button.attribute unsupport %s, expect %s, %s or %s...' % (self.attribute, 'NEXT', 'RESET', 'ANSWERS')) return sprites_group '''24点游戏生成器''' class game24Generator(): def __init__(self): self.info = 'game24Generator' '''生成器''' def generate(self): self.__reset() while True: self.numbers_ori = [random.randint(1, 10) for i in range(4)] self.numbers_now = copy.deepcopy(self.numbers_ori) self.answers = self.__verify() if self.answers: break '''只剩下一个数字时检查是否为24''' def check(self): if len(self.numbers_now) == 1 and float(self.numbers_now[0]) == self.target: return True return False '''重置''' def __reset(self): self.answers = [] self.numbers_ori = [] self.numbers_now = [] self.target = 24. self.answers_idx = 0 '''验证生成的数字是否有答案''' def __verify(self): answers = [] for item in self.__iter(self.numbers_ori, len(self.numbers_ori)): item_dict = [] list(map(lambda i: item_dict.append({str(i): i}), item)) solution1 = self.__func(self.__func(self.__func(item_dict[0], item_dict[1]), item_dict[2]), item_dict[3]) solution2 = self.__func(self.__func(item_dict[0], item_dict[1]), self.__func(item_dict[2], item_dict[3])) solution = dict() solution.update(solution1) solution.update(solution2) for key, value in solution.items(): if float(value) == self.target: answers.append(key) # 避免有数字重复时表达式重复(T_T懒得优化了) answers = list(set(answers)) return answers '''递归枚举''' def __iter(self, items, n): for idx, item in enumerate(items): if n == 1: yield [item] else: for each in self.__iter(items[:idx]+items[idx+1:], n-1): yield [item] + each '''计算函数''' def __func(self, a, b): res = dict() for key1, value1 in a.items(): for key2, value2 in b.items(): res.update({'('+key1+'+'+key2+')': value1+value2}) res.update({'('+key1+'-'+key2+')': value1-value2}) res.update({'('+key2+'-'+key1+')': value2-value1}) res.update({'('+key1+'×'+key2+')': value1*value2}) value2 > 0 and res.update({'('+key1+'÷'+key2+')': value1/value2}) value1 > 0 and res.update({'('+key2+'÷'+key1+')': value2/value1}) return res
2. Hauptfunktion des Spiels
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] is_win = game24_gen.check() if is_win: win_sound.play() if not is_win and len(game24_gen.numbers_now) == 1: 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 if selected_buttons and each.attribute == selected_buttons[0]: each.is_selected = False 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.flip() clock.tick(30)
Das obige ist der detaillierte Inhalt vonSo implementieren Sie ein 24-Punkte-Spiel mit Python+Pygame. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!