最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Python+Pygame實(shí)戰(zhàn)之24點(diǎn)游戲的實(shí)現(xiàn)

 更新時(shí)間:2022年04月29日 09:18:15   作者:木木子學(xué)python  
這篇文章主要為大家詳細(xì)介紹了如何利用Python和Pygame實(shí)現(xiàn)24點(diǎn)小游戲,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下

導(dǎo)語(yǔ)

我第一次玩24點(diǎn)是初中的時(shí)候,那時(shí)候和堂弟表哥在堂妹家玩,堂妹提出玩24點(diǎn)游戲,堂妹比我們小三歲,可能正在上小學(xué)吧。

拿出一副撲克牌去掉大小怪和花牌,從剩下的牌里隨便找出四張,誰(shuí)能先用加減乘除算出24就算贏。

如果大家都同意放棄或者有人計(jì)算出來(lái)就重新開(kāi)始一局。結(jié)果是我們?nèi)齻€(gè)哥哥都輸多贏少,堂妹顯然是經(jīng)過(guò)了準(zhǔn)備的。

其實(shí)24點(diǎn)小游戲除了能用來(lái)無(wú)聊的時(shí)候跟朋友與一起玩兒下,還能鍛煉思維能力,尤其是家里的小孩子提升數(shù)學(xué)能力

多鍛煉還是很有好處的,尤其是那些數(shù)學(xué)不好小孩子——可提高心算的速度和準(zhǔn)確度,當(dāng)數(shù)學(xué)變成游戲之后孩子也更有興趣嘛~今天木木子就帶大家寫一款有界面的“24點(diǎn)小游戲”哦

游戲介紹

(1)什么是24點(diǎn)游戲

棋牌類益智游戲,要求結(jié)果等于二十四

(2)游戲規(guī)則

任意抽取4個(gè)數(shù)字(1——10),用加、減、乘、除(可加括號(hào))把出現(xiàn)的數(shù)算成24。每個(gè)數(shù)字必須用一次且只能用一次。“算24點(diǎn)”作為一種鍛煉思維的智力游戲,還應(yīng)注意計(jì)算中的技巧問(wèn)題。計(jì)算時(shí),我們不可能把牌面上的4個(gè)數(shù)的不同組合形式——去試,更不能瞎碰亂湊。

例:3、8、8、9

答案:3×8÷(9-8)=24

實(shí)現(xiàn)代碼

1.定義游戲這部分代碼小寫game.py文件

'''

    定義游戲

'''
import copy
import random
import pygame


'''
Function:
    卡片類
Initial Args:
    --x,y: 左上角坐標(biāo)
    --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)
    '''根據(jù)button function執(zhí)行響應(yīng)操作'''
    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點(diǎn)游戲生成器'''
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
    '''只剩下一個(gè)數(shù)字時(shí)檢查是否為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
    '''驗(yàn)證生成的數(shù)字是否有答案'''
    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)
        # 避免有數(shù)字重復(fù)時(shí)表達(dá)式重復(fù)(T_T懶得優(yōu)化了)
        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
    '''計(jì)算函數(shù)'''
    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.游戲主函數(shù)

def main():
    # 初始化, 導(dǎo)入必要的游戲素材
    pygame.init()
    pygame.mixer.init()
    screen = pygame.display.set_mode(SCREENSIZE)
    pygame.display.set_caption('24點(diǎn)小游戲')
    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點(diǎn)游戲生成器
    game24_gen = game24Generator()
    game24_gen.generate()
    # 精靈組
    # --數(shù)字
    number_sprites_group = getNumberSpritesGroup(game24_gen.numbers_now)
    # --運(yùn)算符
    operator_sprites_group = getOperatorSpritesGroup(OPREATORS)
    # --按鈕
    button_sprites_group = getButtonSpritesGroup(BUTTONS)
    # 游戲主循環(huán)
    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)
        # 更新數(shù)字
        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)

游戲效果展示

到此這篇關(guān)于Python+Pygame實(shí)戰(zhàn)之24點(diǎn)游戲的實(shí)現(xiàn)的文章就介紹到這了,更多相關(guān)Python Pygame 24點(diǎn)游戲內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • 詳解pycharm配置python解釋器的問(wèn)題

    詳解pycharm配置python解釋器的問(wèn)題

    這篇文章主要介紹了安裝好Pycharm后如何配置Python解釋器簡(jiǎn)易教程,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2020-10-10
  • django 前端頁(yè)面如何實(shí)現(xiàn)顯示前N條數(shù)據(jù)

    django 前端頁(yè)面如何實(shí)現(xiàn)顯示前N條數(shù)據(jù)

    這篇文章主要介紹了django 前端頁(yè)面如何實(shí)現(xiàn)顯示前N條數(shù)據(jù)。具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2020-03-03
  • Python?count()函數(shù)用法詳解

    Python?count()函數(shù)用法詳解

    這篇文章主要給大家介紹了關(guān)于Python?count()函數(shù)用法的相關(guān)資料,Python?count()方法用于統(tǒng)計(jì)字符串里某個(gè)字符出現(xiàn)的次數(shù),可選參數(shù)為在字符串搜索的開(kāi)始與結(jié)束位置,需要的朋友可以參考下
    2024-02-02
  • python和opencv構(gòu)建運(yùn)動(dòng)檢測(cè)器的實(shí)現(xiàn)

    python和opencv構(gòu)建運(yùn)動(dòng)檢測(cè)器的實(shí)現(xiàn)

    這篇文章主要介紹了python和opencv構(gòu)建運(yùn)動(dòng)檢測(cè)器的實(shí)現(xiàn),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2021-03-03
  • python網(wǎng)絡(luò)編程之UDP通信實(shí)例(含服務(wù)器端、客戶端、UDP廣播例子)

    python網(wǎng)絡(luò)編程之UDP通信實(shí)例(含服務(wù)器端、客戶端、UDP廣播例子)

    UDP,用戶數(shù)據(jù)報(bào)傳輸協(xié)議,它位于TCP/IP協(xié)議的傳輸層,是一種無(wú)連接的協(xié)議,它發(fā)送的報(bào)文不能確定是否完整地到達(dá)了另外一端
    2014-04-04
  • Python使用Py2neo創(chuàng)建Neo4j的節(jié)點(diǎn)和關(guān)系

    Python使用Py2neo創(chuàng)建Neo4j的節(jié)點(diǎn)和關(guān)系

    Neo4j是一款開(kāi)源圖數(shù)據(jù)庫(kù),使用Python語(yǔ)言訪問(wèn)Neo4j可以使用Py2neo。本文介紹了使用Py2neo訪問(wèn)Neo4j,批量創(chuàng)建節(jié)點(diǎn)和關(guān)系的方法
    2021-08-08
  • Python 使用多屬性來(lái)進(jìn)行排序

    Python 使用多屬性來(lái)進(jìn)行排序

    這篇文章主要介紹了Python 使用多屬性來(lái)進(jìn)行排序的方法,非常不錯(cuò),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2019-09-09
  • 詳解?PyTorch?Lightning模型部署到生產(chǎn)服務(wù)中

    詳解?PyTorch?Lightning模型部署到生產(chǎn)服務(wù)中

    這篇文章主要為大家介紹了如何將PyTorch?Lightning模型部署到生產(chǎn)服務(wù)中的詳細(xì)教程,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-09-09
  • Python新年炫酷煙花秀代碼

    Python新年炫酷煙花秀代碼

    大家好,本篇文章主要講的是Python新年炫酷煙花秀代碼,感興趣的同學(xué)趕快來(lái)看一看吧,對(duì)你有幫助的話記得收藏一下,方便下次瀏覽
    2022-01-01
  • Python如何在Word中查找并替換文本

    Python如何在Word中查找并替換文本

    這篇文章主要為大家詳細(xì)介紹了Python在Word中實(shí)現(xiàn)查找并替換文本的相關(guān)方法,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下
    2025-03-03

最新評(píng)論

亳州市| 石河子市| 甘泉县| 平果县| 库尔勒市| 寿阳县| 岱山县| 芜湖市| 茶陵县| 即墨市| 建宁县| 徐水县| 刚察县| 临夏市| 囊谦县| 连州市| 株洲市| 东宁县| 瑞丽市| 鄄城县| 唐海县| 琼海市| 朝阳县| 绥江县| 太仆寺旗| 尼玛县| 建昌县| 贵定县| 苏州市| 绥德县| 洪江市| 拉萨市| 惠来县| 报价| 台州市| 遵义市| 安康市| 神池县| 新沂市| 清流县| 浦县|