【Python游戏】用Python实现一个测试你智商的小游戏——24点,过不了三关的都是细狗 | 附带源码

news2024/12/27 15:38:19

前言

好咯,包子们下午好
今天小编主要是过来测试一下大家的智商,没别的意思,不是看不起大家,我感觉今天实现的小游戏,可能大家真的过不了三关!
哈哈哈,废话不多说吧
直接开始我们的游戏实现功能

相关文件

关注小编,私信小编领取哟!
当然别忘了一件三连哟~~

源码点击蓝色字体领取
Python零基础入门到精通视频合集

【整整800集】Python爬虫项目零基础入门合集,细狗都学会了,你还不会?

开发工具

Python版本:3.7.8
相关模块:
pygame模块;
random模块;
pyttsx3模块;
以及一些python自带的模块。

环境搭建

安装Python并添加到环境变量,pip安装需要的相关模块即可。

效果展示

在这里插入图片描述
在这里插入图片描述

代码实现

导入模块

import os
import sys
import pygame
from cfg import *
from modules import *
from fractions import Fraction

检查控件是否被点击

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
        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

获取数字精灵组

def getNumberSpritesGroup(numbers):
    number_sprites_group = pygame.sprite.Group()
    for idx, number in enumerate(numbers):
        args = (*NUMBERCARD_POSITIONS[idx], str(number), NUMBERFONT, NUMBERFONT_COLORS, NUMBERCARD_COLORS, str(number))
        number_sprites_group.add(Card(*args))
    return number_sprites_group

获取运算符精灵组

def getOperatorSpritesGroup(operators):
    operator_sprites_group = pygame.sprite.Group()
    for idx, operator in enumerate(operators):
        args = (*OPERATORCARD_POSITIONS[idx], str(operator), OPERATORFONT, OPREATORFONT_COLORS, OPERATORCARD_COLORS, str(operator))
        operator_sprites_group.add(Card(*args))
    return operator_sprites_group

取按钮精灵组

def getButtonSpritesGroup(buttons):
    button_sprites_group = pygame.sprite.Group()
    for idx, button in enumerate(buttons):
        args = (*BUTTONCARD_POSITIONS[idx], str(button), BUTTONFONT, BUTTONFONT_COLORS, BUTTONCARD_COLORS, str(button))
        button_sprites_group.add(Button(*args))
    return button_sprites_group

计算

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))

主函数

def main():
    # 初始化, 导入必要的游戏素材
    pygame.init()
    pygame.mixer.init()
    screen = pygame.display.set_mode(SCREENSIZE)
    pygame.display.set_caption('24点 公众号:Python日志 Python学习交流群:494958217')
    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)

总结

说实话这些效果实现起来对于新人小伙伴来说有点难度,但是自己慢慢去思考的话还是不是很难理解的
源码的获取可以看相关文件哈

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/54563.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

五、【React-Router6】路由表 useRoutes() + Outlet

文章目录1、useRoutes() 介绍2、简单 CODING2.1、项目结构2.2、routes.js2.3、App.js2.4、Result3、嵌套 Outlet CODING3.1、项目结构3.2、routes.js3.3、Home.js3.4、App.js3.5、Result1、useRoutes() 介绍 原来写的路由管理如下 <Routes><Route path/about elemen…

codeforces:C. Almost All Multiples【构造 + 贪心】

目录题目截图题目分析ac code总结题目截图 题目分析 现在p1 x, pn 1如果我们一开始按1234…这样放字典序是最小的所以根据这个思路&#xff0c;我们还是按这个构造&#xff1a;那么我们的n被挤出来了&#xff0c;只能放到px上所以如果一开始x不能整除n的话&#xff0c;就直接…

Linux安装MySQL【Ubuntu20.04】

操作系统&#xff1a;Ubuntu20.04 使用工具&#xff1a;xshell7、xftp7 MySQL版本&#xff1a;5.7 一、删除Linux系统下自带的mariadb &#xff08;因为centos自带一个老版Mariadb 与MySQL冲突&#xff09; 如果没有找到Mariadb直接跳过 #查找Mariadb rpm -qa | grep maria…

面试总结2

用时&#xff1a;40min 自我介绍hashset存储对象怎么进行判断是否重复 Synchronized底层实现原理 Synchronized锁的升级过程 讲讲开发中常用到的spring注解spring事务&#xff0c;传播机制&#xff0c;隔离级别说一说你常用的git命令说一说你对IOC、AOP的理解1、hashset存储对…

[Linux打怪升级之路]-秒懂进程地址空间

前言 作者&#xff1a;小蜗牛向前冲 名言&#xff1a;我可以接受失败&#xff0c;但我不能接受放弃 如果觉的博主的文章还不错的话&#xff0c;还请点赞&#xff0c;收藏&#xff0c;关注&#x1f440;支持博主。如果发现有问题的地方欢迎❀大家在评论区指正。 目录 一、C/C下…

【GIT】常用操作总结

一、在本地仓库及远程仓库创建分支&#xff0c;并建立关联关系。 1、创建本地分支&#xff0c;如图&#xff1a; 2、填写分支名称&#xff0c;勾选Checkout branch&#xff1a; 3、提交本地分支到远程分支&#xff1a; 右键选择Git -- Repository -- push&#xff1a; push的时…

Python爬取的网页,需要解码怎么办

前言 本文是该专栏的第26篇,后面会持续分享python的爬虫干货知识,记得关注。 很多时候,在用爬虫采集数据的时候,采集到的源码内容并非我们想要的正确信息,使用正则或者Xpath匹配到的信息也需要我们再次解码才能拿到精准的数据。最近也正是球迷朋友们非常关注卡塔尔世界杯…

[操作系统笔记]基本分段存储管理

内容系听课复习所做笔记&#xff0c;图例多来自课程截图 分段原理 与“分页”最大的区别就是&#xff1a;离散分配时所分配地址空间的基本单位不同 分页是不管程序的逻辑的&#xff0c;规定了页大小就是这么多&#xff0c;但是分段是依据程序自身逻辑来划分的&#xff08;分页的…

micro-app-源码解析4-数据通信篇-终篇

沙箱篇官方讲解地址 https://github.com/micro-zoe/micro-app/issues/21 1. 带着问题进行阅读 在做框架的时候&#xff0c;没法避免的遇见父子通信和兄弟通信的问题&#xff0c;但是如何实现通信这是个每个框架需要解决的问题。1.1 如何选择父子通信的方式 最好的方式应该是…

IOC操作Bean管理(基于注解方式)

IOC 控制反转&#xff0c;把创建对象过程交给Spring进行管理。 目录 什么是注解 Bean 管理注解方式&#xff08;创建对象&#xff09; 基于注解方式实现对象创建 第一步&#xff1a;引入依赖 第二步&#xff1a;开启组件扫描 创建类&#xff0c;在类上面添加创建对象注解…

Python爬虫实战,request+Matplotlib模块,Python绘制一个足球运动员的数据可视化图表

前言 用Python和Matplotlib绘制一个足球运动员的数据可视化图表。 Let’s start happily 开发工具 Python版本&#xff1a; 3.6.4 相关模块&#xff1a; bs4模块 requests模块 pandas模块 matplotlib模块 json模块 numpy模块 环境搭建 安装Python并添加到环境变量…

Sqoop数据导入 第2关:Mysql导入数据至HDFS上

为了完成本关任务,你需要掌握: 1、数据库( MySQL )建表。 2、Mysql 数据导入至 HDFS 中。 数据库( MySQL )建表 用命令进入 MySQL 客户端。 mysql -uroot -p123123 -h127.0.0.1 创建数据库hdfsdb(格式默认为utf8),并在数据库内建立表student,其表结构如下: mys…

通过求解数学模型来选择编码节点的最佳数量和位置(Matlab代码实现)

&#x1f352;&#x1f352;&#x1f352;欢迎关注&#x1f308;&#x1f308;&#x1f308; &#x1f4dd;个人主页&#xff1a;我爱Matlab &#x1f44d;点赞➕评论➕收藏 养成习惯&#xff08;一键三连&#xff09;&#x1f33b;&#x1f33b;&#x1f33b; &#x1f34c;希…

【✨十五天搞定电工基础】电阻电路的分析方法

本章要求1. 掌握支路电流法、叠加原理和戴维宁定理等电路的基本分析方法; 2. 了解实际电源的两种模型及其等效变换; 3. 了解非线性电阻元件的伏安特性及静态电阻、动态电阻的概念&#xff0c;以及简单非线性电阻电路 的图解分析法。 目录 一、电阻串并联连接的等效变换 1、…

企业如何有效的防爬虫?

防爬虫&#xff0c;简单来说&#xff0c;就是在尽量减少对正常用户的干扰的情况下尽可能的加大爬虫的成本。 而反防爬虫&#xff0c;或者说制造隐蔽性强的爬虫&#xff0c;就是尽量模拟正常用户的行为。 这两者是动态博弈的。大公司基本都有防爬的项目&#xff0c;以保护数据…

一图了解es6常用数据迭代函数map,filter,fill,reduce

一、一图胜千言 前端开发中&#xff0c;js数组处理是最常用的&#xff0c;除了for循环外&#xff0c;随着es6的普及&#xff0c;像reduce()、filter()、map()、some()、every()以及…展开属性都是最常用到的。 今天偶然从网上看到这张图&#xff0c;真是眼前一亮&#xff0c;真…

盘点JAVA中延时任务的几种实现方式

场景描述 ①需要实现一个定时发布系统通告的功能&#xff0c;如何实现&#xff1f; ②支付超时&#xff0c;订单自动取消&#xff0c;如何实现&#xff1f; 实现方式 一、挂起线程 推荐指数&#xff1a;★★☆ 优点&#xff1a; JDK原生(JUC包下)支持&#xff0c;无需引入新…

RabbitMQ之集群管理

1、在node2、node3、node4三台Linux虚拟机中安装RabbitMQ。 2、从node2拷贝.erlang.cookie到node3、node4的相应目录 如果没有该文件&#xff0c;手动创建/var/lib/rabbitmq/.erlang.cookie &#xff0c;生成Cookie字符串&#xff0c;或者启动一次RabbitMQ自动生成该文件。生产…

五年Java编程生涯,大专学历最终逆袭阿里,面试+学习+经历分享

五年时间&#xff0c;对于程序员来说&#xff0c;真的非常非常宝贵&#xff0c;掉的头发都够塞满键盘的缝隙了。就说新一代偶像 TFboys 吧&#xff0c;你应该知道这个组合吧&#xff0c;黄金合作期也就三五年的时间&#xff0c;现在基本上就处于各自单飞&#xff08;solo&#…

深度学习笔记之受限玻尔兹曼机(一)玻尔兹曼分布介绍

机器学习笔记之受限玻尔兹曼机——玻尔兹曼分布介绍引言回顾&#xff1a;Hammersley-Clifford定理玻尔兹曼分布的物理意义引言 从本节开始&#xff0c;将介绍受限玻尔兹曼机。本节将从马尔可夫随机场开始&#xff0c;介绍玻尔兹曼机分布。 回顾&#xff1a;Hammersley-Cliffo…