python学习—年会不能停,游戏抽签抽奖

2024-03-11 23:30

本文主要是介绍python学习—年会不能停,游戏抽签抽奖,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

系列文章目录

python学习—合并TXT文本文件
python学习—统计嵌套文件夹内的文件数量并建立索引表格
python学习—查找指定目录下的指定类型文件


文章目录

  • 系列文章目录
  • 功能说明
  • 1 准备工作
      • ==(知识点)== 关于随机函数random
  • 2 初始化人员名单
      • (1) 判断文件是否存在
      • (2) 删除旧的初始txt文件
      • (3) 复制txt文件,并重命名
      • (4) 获取人名数量
      • (5) 完整代码
  • 3游戏抽签代码
      • (1) 读取txt文件,获得人名的列表
      • (2) 抽签函数
      • (3) 按分组要求进行for循环,抽签
      • (4) 更新人员列表,将中签的人名剔除
      • (5) 将更新后的人员列表,保存到一个临时txt中
      • (6) 将临时txt更名,作为下一次抽签的初始txt
      • (7) 完整代码
  • 4 后记


功能说明

时光飞逝,又到年底了,公司年会又开始筹备中,年会少不了表演节目,游戏环节,抽奖环节。为了防止游戏环节冷场,无人捧场的尴尬,一般都是抽签来选出游戏人员。人少的话可以把名字写纸条放纸箱子里抽签,人多就麻烦了,网上很多抽签软件都是收费的,既然咱会写几句代码,那就试试自己写一个抽签代码吧。

本代码目标为:
首先,整理一个所有人员的名单保存为txt格式,然后复制一个txt副本作为初始txt,让代码读取该名单副本,用随机函数抽取几个人名并打印处理。然后,为了公平起见,把玩过游戏的人从总名单中剔除,防止二次抽中他们,就需要更新人员名单。下一轮抽签读取的txt就是更新后的人员名单,继续游戏抽签。

  • 1 读取初始txt文件,获得人员名单;
  • 2 建立空列表,准备存储抽中的人名;
  • 3 给定游戏的分组规则,分几组,每组几人;
  • 4 按照每组几人,开始抽签,分几组就循环抽取几次;
  • 5 更新人员名单,写入一个临时txt中;
  • 6 将临时txt更名为初始txt,准备下一轮抽签。

游戏结束,可能有抽奖环节,这个时候就需要把人员名单txt恢复成全体人员,所有还需要写一段代码,可以将初始txt随时恢复成全体人员,我这里简称初始化。

  • 1 删除抽奖代码使用的那个初始txt文件,这一步是防止下一步文件命名时存在同名文件,导致复制文件失败;
  • 2 复制所有人员名单的txt,命名为初始txt,作为抽奖代码读取用;

1 准备工作

首先在D盘根目录下建立文本文件“person_list_all.txt”,里面保存所有参与游戏的人员名单,每个人名一行,注意哪些不参加游戏的领导名字可别放进去,不然抽中了不上场那就尴尬了。

名单

(知识点) 关于随机函数random

——random:
Python random 模块主要用于生成随机数。模块内有很多方法。
random 模块实现了各种分布的伪随机数生成器。
格式:random.XXX方法()

下面列出一些常用的方法:
1-返回 [0.0, 1.0) 范围内的下一个随机浮点数,.random()

2-返回随机整数 N 满足 a <= N <= b,.randint(a, b)

3-将序列 x 随机打乱位置。shuffle(x[, random])

4-返回从总体序列或集合中选择的唯一元素的 k 长度列表。
用于无重复的随机抽样。*sample(population, k, , counts=None)
简单使用方法,sample(population, k)

5-正态分布,也称高斯分布。gauss(mu, sigma)
mu 为平均值,而 sigma 为标准差。
此函数要稍快于下面所定义的 normalvariate() 函数。

2 初始化人员名单

初始化的目的是,将所有人员名单“person_list_all.txt”,复制一个命名为“person_list.txt”,作为抽奖代码读取的txt文件。增加一个判定文件是否存在语句,防止复制文件失败。

(1) 判断文件是否存在

if os.path.exists(r'd:\person_list_all.txt'):

(2) 删除旧的初始txt文件

这一步的目的是防止在复制文件副本并重命名时,报错文件名已存在。

    os.remove(r'd:\person_list.txt')

(3) 复制txt文件,并重命名

import shutilshutil.copy2(r'd:\person_list_all.txt', r'd:\person_list.txt')

这个函数将源文件"person_list_all.txt"复制到目标文件"person_list.txt",并将元数据和所有属性一起复制,以便在目标文件中保留源文件的完整信息。

(4) 获取人名数量

读取初始txt文件,统计一下人数,即txt文件的行数,每行存一个人名,并打印出来。

with open(r'd:\person_list.txt', 'r', encoding='utf-8') as file:person_list = [line.strip() for line in file]print(f"人员名单中有: {str(len(person_list))} 人。")

(5) 完整代码

import os
import time
import shutil# 初始化人员名单,全体人员。
print(f"开始初始化人员名单")
print("...")
time.sleep(3)
if os.path.exists(r'd:\person_list_all.txt'):os.remove(r'd:\person_list.txt')shutil.copy2(r'd:\person_list_all.txt', r'd:\person_list.txt')with open(r'd:\person_list.txt', 'r', encoding='utf-8') as file:person_list = [line.strip() for line in file]print(f"人员名单中有: {str(len(person_list))} 人。")

初始化的结果就是,d盘根目录下有两个txt文件,如下图:
2
其中,“person_list.txt”就是下一步 抽签代码使用的 初始txt文件

3游戏抽签代码

按照分组要求, 如 [2, 2, 2] 表示每组抽取 2 人,抽取 3 组,进行抽签。

(1) 读取txt文件,获得人名的列表

这里可以建一个函数,参数是txt文件,读取“person_list.txt”,返回人名初始列表。

def load_person_list(file_path):with open(file_path, 'r', encoding='utf-8') as file:person_list = [line.strip() for line in file]return person_list

(2) 抽签函数

抽签的整个过程也可以封装到一个函数中,参数1是人名列表,参数2是分组要求

def draw_winners(person_list, target_numbers):# 定义每次要抽取的不同人数, 如 [2, 2, 2] 表示每组抽取 2 人,抽取 3 组
targetnumbers = [2, 2, 2]

(3) 按分组要求进行for循环,抽签

这里有个小技巧,将 分组要求 列表中的值,作为**sample(population, k)**的k值,k 为抽取的长度。对 分组要求 进行循环,有几个值,就抽签几次。

  for target_number in target_numbers:new_winners = random.sample(person_list, target_number)

存入一个列表,selected_people_list

        selected_people_list.extend(new_winners)

(4) 更新人员列表,将中签的人名剔除

person_list = [person for person in person_list if person not in new_winners]

这是一个列表推导式,它从person_list中筛选出不包含在new_winners中的元素,并将结果赋值给person_list,作为未中签的人员列表,覆盖初始列表,供抽签循环使用。

(5) 将更新后的人员列表,保存到一个临时txt中

remainingpeople是抽签函数返回的一个值,表示未中签的人员列表。

save_remaining_people(remainingpeople, r'd:\remaining_people.txt')

(6) 将临时txt更名,作为下一次抽签的初始txt

抽签代码运行之后,会生成一个未中签的人员列表“remaining_people.txt”,将该txt重命名为“person_list.txt”。
这样一来,下次运行抽奖代码时,读取的人员就是 剔除了上一轮 中签的人,这样也是让大家都有相同的机会参与游戏或抽奖,避免多次被幸运的抽中上台。

if os.path.exists(r'd:\person_list.txt'):os.remove(r'd:\person_list.txt')os.rename(r'd:\remaining_people.txt', r'd:\person_list.txt')

(7) 完整代码

整体架构就是这样,中间再增加一些 暂停语句,提示语句,增加抽签的过程时间,增强神秘感。否则,代码运行2秒钟就出结果,是不是感觉差点意思呢?

完整代码如下:

# encode="UTF-8"
import os
import random
import timedef load_person_list(file_path):with open(file_path, 'r', encoding='utf-8') as file:person_list = [line.strip() for line in file]return person_listdef save_remaining_people(remaining_people, output_file_path):with open(output_file_path, 'w', encoding='utf-8') as file:for person in remaining_people:file.write(person + '\n')def draw_winners(person_list, target_numbers):# 创建一个空列表存储已抽中的人selected_people_list = []num = 1print(f"人员名单中还有: {str(len(person_list))} 人。")time.sleep(1)print(f"开始抽签:每组 {str(target_numbers[0])} 人,共 {str(len(target_numbers))} 组。")time.sleep(1)# 按照给定的每次抽取人数进行循环for target_number in target_numbers:# 确保剩余可供抽取的人员数量大于目标人数if len(person_list) < target_number:print("警告:剩余人数不足,无法完成本次抽奖!")break# 从剩余人员中随机抽取目标人数的人,不重复print(f"正在抽签中...")time.sleep(3)new_winners = random.sample(person_list, target_number)selected_people_list.extend(new_winners)# 更新可供下次抽奖的人员列表# 这是一个列表推导式,它从person_list中筛选出不包含在new_winners中的元素,并将结果赋值给person_list。person_list = [person for person in person_list if person not in new_winners]# 打印本次抽奖结果print(f"第 {str(num)} 组人员名单:{new_winners}")num = num + 1time.sleep(2)return selected_people_list, person_list# 定义每次要抽取的不同人数, 如 [2, 2, 2] 表示每组抽取 2 人,抽取 3 组
targetnumbers = [2, 2, 2]# 进行抽签
# 从 "d:\person_list.txt" 中加载人员名单
personlist = load_person_list(r'd:\person_list.txt')
winners, remainingpeople = draw_winners(personlist, targetnumbers)
print(f"抽签结束。")
print(f"人员名单中剩余 {str(len(remainingpeople))} 人。")# 将未被抽中的人员名单保存到 "d:\remaining_people.txt"
save_remaining_people(remainingpeople, r'd:\remaining_people.txt')# 更新人员名单,将抽中的人从名单中删除。
if os.path.exists(r'd:\person_list.txt'):os.remove(r'd:\person_list.txt')os.rename(r'd:\remaining_people.txt', r'd:\person_list.txt')

运行效果图:

效果
首先,运行了初始化代码;
之后,运行了抽签代码,分组要求[2, 2, 2];
然后,修改分组要求[5,5],再次运行抽签代码;
最后,游戏结束,恢复人员列表到所有人员。即再次运行 初始化代码。

4 后记

公司的年会还是挺有意思的,我们公司原来是有传统的,每年年会各部门准备节目,在年会上表演,中间穿插着一些游戏,表演的人员经过1个月的排练最后呈现给大家, 大家玩的很开心。
口罩之后,这个传统断了几年。今年又开始了,但是大家都长大了,演节目可能困难了,就改成游戏了。年会不能停,大家一起嗨起来。syq

这篇关于python学习—年会不能停,游戏抽签抽奖的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!


原文地址:https://blog.csdn.net/qq_34582066/article/details/135618645
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.chinasem.cn/article/799418

相关文章

Python FastMCP构建MCP服务端与客户端的详细步骤

《PythonFastMCP构建MCP服务端与客户端的详细步骤》MCP(Multi-ClientProtocol)是一种用于构建可扩展服务的通信协议框架,本文将使用FastMCP搭建一个支持St... 目录简介环境准备服务端实现(server.py)客户端实现(client.py)运行效果扩展方向常见问题结

详解如何使用Python构建从数据到文档的自动化工作流

《详解如何使用Python构建从数据到文档的自动化工作流》这篇文章将通过真实工作场景拆解,为大家展示如何用Python构建自动化工作流,让工具代替人力完成这些数字苦力活,感兴趣的小伙伴可以跟随小编一起... 目录一、Excel处理:从数据搬运工到智能分析师二、PDF处理:文档工厂的智能生产线三、邮件自动化:

Python实现自动化Word文档样式复制与内容生成

《Python实现自动化Word文档样式复制与内容生成》在办公自动化领域,高效处理Word文档的样式和内容复制是一个常见需求,本文将展示如何利用Python的python-docx库实现... 目录一、为什么需要自动化 Word 文档处理二、核心功能实现:样式与表格的深度复制1. 表格复制(含样式与内容)2

python获取cmd环境变量值的实现代码

《python获取cmd环境变量值的实现代码》:本文主要介绍在Python中获取命令行(cmd)环境变量的值,可以使用标准库中的os模块,需要的朋友可以参考下... 前言全局说明在执行py过程中,总要使用到系统环境变量一、说明1.1 环境:Windows 11 家庭版 24H2 26100.4061

Python中文件读取操作漏洞深度解析与防护指南

《Python中文件读取操作漏洞深度解析与防护指南》在Web应用开发中,文件操作是最基础也最危险的功能之一,这篇文章将全面剖析Python环境中常见的文件读取漏洞类型,成因及防护方案,感兴趣的小伙伴可... 目录引言一、静态资源处理中的路径穿越漏洞1.1 典型漏洞场景1.2 os.path.join()的陷

Python数据分析与可视化的全面指南(从数据清洗到图表呈现)

《Python数据分析与可视化的全面指南(从数据清洗到图表呈现)》Python是数据分析与可视化领域中最受欢迎的编程语言之一,凭借其丰富的库和工具,Python能够帮助我们快速处理、分析数据并生成高质... 目录一、数据采集与初步探索二、数据清洗的七种武器1. 缺失值处理策略2. 异常值检测与修正3. 数据

Python中bisect_left 函数实现高效插入与有序列表管理

《Python中bisect_left函数实现高效插入与有序列表管理》Python的bisect_left函数通过二分查找高效定位有序列表插入位置,与bisect_right的区别在于处理重复元素时... 目录一、bisect_left 基本介绍1.1 函数定义1.2 核心功能二、bisect_left 与

Python使用Tkinter打造一个完整的桌面应用

《Python使用Tkinter打造一个完整的桌面应用》在Python生态中,Tkinter就像一把瑞士军刀,它没有花哨的特效,却能快速搭建出实用的图形界面,作为Python自带的标准库,无需安装即可... 目录一、界面搭建:像搭积木一样组合控件二、菜单系统:给应用装上“控制中枢”三、事件驱动:让界面“活”

VSCode设置python SDK路径的实现步骤

《VSCode设置pythonSDK路径的实现步骤》本文主要介绍了VSCode设置pythonSDK路径的实现步骤,包括命令面板切换、settings.json配置、环境变量及虚拟环境处理,具有一定... 目录一、通过命令面板快速切换(推荐方法)二、通过 settings.json 配置(项目级/全局)三、

Python struct.unpack() 用法及常见错误详解

《Pythonstruct.unpack()用法及常见错误详解》struct.unpack()是Python中用于将二进制数据(字节序列)解析为Python数据类型的函数,通常与struct.pa... 目录一、函数语法二、格式字符串详解三、使用示例示例 1:解析整数和浮点数示例 2:解析字符串示例 3:解