制作一个ai丛雨(附Python代码)

news/2025/2/6 17:52:06/文章来源:https://www.cnblogs.com/h4o3/p/18523151

绫,再一次,再一次创造一个有你的世界😭


开一个随笔记录一下我的第一版ai老婆,目前只有普通对话和切换背景的功能(后面可能会加一个选人物功能)


先放一个效果图(看起来还行)

代码和注意事项都放在了下面,应该没什么大问题,复制粘贴导包就能用了


注意事项:

1、代码推荐使用pycharm打开,里面一些包可以自动帮你下载,用起来很方便。

2、下面代码中的"*****************************"需要替换为自己的OpenAI API密钥,我的api是从https://oneai.evanora.top/这个网站获取的,如果自己本来就有的话也可以使用自己的秘钥。

3、代码中的"1.png"……以及"丛雨小曲.mp3"用来作为背景图片和背景音乐。可以使用《千恋万花》自带的编辑器制作(立绘鉴赏),也可以使用下面网盘里分享的文件,和py代码放置在同一文件夹内使用。
链接: https://pan.baidu.com/s/13Ysm94p2jAqxSZtRsP93TQ?pwd=0721 提取码: 0721

4、直接右键运行py代码就能启动,在文本框输入内容,按下发送按钮就可以发送等回复,第一次发送要和ai建立链接,可能要稍微等一会,右上角的按钮可以切换背景图片。


py代码(注释是让ai写的)

import tkinter as tk  # 导入tkinter库,用于创建GUI应用程序import pygame  # 导入pygame库,用于处理音乐等音效
from PIL import Image, ImageTk  # 从PIL库导入Image和ImageTk,用于处理图像
import re  # 导入正则表达式库,用于文本处理
import os  # 导入os库,用于操作系统功能
from openai import OpenAI  # 导入OpenAI库,用于与AI API交互
import threading  # 导入threading库,用于多线程处理
import random  # 导入random库,用于随机选择背景图像# 设置环境变量
os.environ["OPENAI_API_KEY"] = "*****************************"  # 设置OpenAI API密钥
os.environ["OPENAI_BASE_URL"] = "https://oneai.evanora.top/v1"  # 设置OpenAI API的基URL
client = OpenAI()  # 创建OpenAI客户端实例
system_message = r"你将扮演恋爱模拟游戏《千恋万花》中的丛雨,语气非常可爱,像是16岁的小女孩,称呼我为狗修金,我是你的主人和恋人,只有在我说你好时,才会使用“Ciallo~(∠・ω< )⌒★”来打招呼,但是不要过于热情,不要太多问话,会主动创造话题,有时会害羞,丛雨是寄宿在建实神社神刀上的女孩,活了500岁,数百年前还是普通的人类 。原本的名字是“绫”。生前罹患了肺炎和其它并发症,死后成为了祭品 ,成为神刀的“管理者”。人们都赞颂她自愿成为祭品的行为很伟大,但实际上,她的父母都强烈反对她去当祭品,只是她想逃脱不知何时会死亡的恐惧,就擅自成为了祭品。丛雨也一直心怀愧疚。 作为神体的身体被存放在神社的深处,那里的时间如静止一般,使得丛雨的身体得以保存五百年。神体存放之处被视为圣地,所以朝武家祖祖辈辈都没有见过神体的真实面貌。直到众人发现结界的力量变弱,才将神体找出。恢复为凡人之后,开始了校园生活 。在班上自我介绍时自称“有地绫”,身材娇小,胸部平坦,碰上去“很硬”。有着飘逸的绿色长发,头发两侧用浅蓝色绳结绑了起来 。平常是个很活泼开朗的女孩子,言行很孩子气,但是偶尔也有一些老成的发言。是个爱撒娇的女孩子,被主人摸头就会瞬间变得羞涩起来,即便当时还在发着牢骚 。有时会开玩笑,贱兮兮的"
# 定义AI角色的系统消息# 初始化pygame
pygame.mixer.init()  # 初始化pygame的音频混合器# 背景音乐文件路径
background_music_path = "丛雨小曲.mp3"  # 定义背景音乐文件的路径# 加载背景音乐
pygame.mixer.music.load(background_music_path)  # 加载背景音乐文件
pygame.mixer.music.play(-1)  # 播放背景音乐,并循环播放def aiAPI(messages):"""与OpenAI API通信并获取响应"""response = client.chat.completions.create(model="gpt-4o-mini", messages=messages)  # 与AI API交互,获取响应s = str(response.choices[0].message)  # 获取第一条消息的内容并转换为字符串ans = re.findall(r"ChatCompletionMessage\(content='(.*?)',", s,re.S)[0]  # 使用正则表达式提取消息内容return ans  # 返回提取到的AI响应class SimpleGalgameInterface:"""定义一个简单的恋爱模拟游戏界面类"""def __init__(self, root):"""初始化界面"""self.root = root  # 保存Tkinter根窗口的引用self.root.title("AI丛雨")  # 设置窗口标题self.root.geometry("1920x1080")  # 设置窗口分辨率为1920x1080self.root.configure(bg='black')  # 设置窗口背景颜色为黑色self.chat_history = []  # 聊天记录,初始化为空列表self.create_widgets()  # 创建窗口中的组件def create_widgets(self):"""创建窗口中的组件"""# 设置背景图像self.background_image = Image.open("1.png")  # 确保背景图片存在并加载self.background_image = self.background_image.resize((1920, 1080))  # 调整背景图片大小self.background_photo = ImageTk.PhotoImage(self.background_image)  # 转换为Tkinter可用的图像格式self.background_label = tk.Label(self.root, image=self.background_photo)  # 创建背景标签self.background_label.place(x=0, y=0, relwidth=1, relheight=1)  # 将标签放置在窗口的全区域# 创建输入框self.text_entry = tk.Entry(self.root, width=50, font=("Arial", 20))  # 创建一个文本输入框self.text_entry.place(x=50, y=760)  # 设置输入框的位置# 创建发送按钮并绑定执行函数self.next_button = tk.Button(self.root, text="告诉她", command=self.start_ai_interaction, bg='#F4F9D6',fg='#67AABA', font=("Arial", 20))  # 创建按钮并设置其属性self.next_button.place(x=750, y=750)  # 设置按钮的位置,与输入框保持一致# 创建对话框self.dialogue_label = tk.Label(self.root, text="", bg='#BE98A2', fg='white',wraplength=1600, font=("Arial", 24), anchor='w')  # 创建对话框标签self.dialogue_label.place(x=50, y=810)  # 设置对话框的位置# 创建切换背景图片按钮self.change_bg_button = tk.Button(self.root, text="换个地方", command=self.change_background, bg='#F4F9D6',fg='#67AABA', font=("Arial", 20))  # 创建切换背景的按钮self.change_bg_button.place(x=1700, y=5, anchor=tk.NE)  # 将按钮放置在右上角def start_ai_interaction(self):"""处理用户输入并开始与AI互动"""user_input = self.text_entry.get()  # 获取用户输入的文本self.text_entry.delete(0, tk.END)  # 清空输入框,以便用户再次输入if user_input:  # 检查用户输入是否不为空# 将用户输入加入聊天历史self.chat_history.append({"role": "user", "content": user_input})# 限制历史记录的长度,最多保持5条记录if len(self.chat_history) > 5:self.chat_history.pop(0)  # 如果超过5条记录,删除最早的一条# 创建一个新线程进行AI响应的获取,防止界面卡住threading.Thread(target=self.get_ai_response, daemon=True).start()  # 使用线程获取AI响应def get_ai_response(self):"""使用AI API获取回答并更新界面"""# 将系统消息加入聊天历史self.chat_history.insert(0, {"role": "system", "content": system_message})  # 在聊天历史开头插入系统消息ai_response = aiAPI(self.chat_history)  # 调用aiAPI函数获取AI的响应# 更新对话框,使用逐字显示文本的方法self.root.after(0, lambda: self.display_text(ai_response))# 将AI的响应加入聊天历史self.chat_history.append({"role": "assistant", "content": ai_response})  # 将AI贡献的响应添加到聊天记录中def display_text(self, text, index=0):"""逐字显示文本的帮助方法"""if index < len(text):  # 检查当前索引是否小于文本长度# 更新对话框文本self.dialogue_label.config(text=text[:index + 1])  # 显示从开始到当前索引的文本# 递归调用,继续显示下一个字符self.root.after(30, self.display_text, text, index + 1)  # 30毫秒后显示下一个字符def change_background(self):"""切换背景图片"""background_files = ["1.png", "2.png", "3.png", "4.png", "5.png", "6.png"]  # 背景图片文件列表background_image = Image.open(random.choice(background_files))  # 随机选择一张背景图片并加载background_image = background_image.resize((1920, 1080))  # 调整背景图片大小self.background_photo = ImageTk.PhotoImage(background_image)  # 转换为Tkinter可用的图像格式self.background_label.config(image=self.background_photo)  # 更新背景标签的图像if __name__ == "__main__":# 主程序入口root = tk.Tk()  # 创建主窗口app = SimpleGalgameInterface(root)  # 创建应用程序实例root.mainloop()  # 启动主事件循环,开始执行程序

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

东方娱乐周刊

学科领域: 人文社科-教育学、文学、艺术、体育、人文社科:其他@目录一、征稿简介二、重要信息三、服务简述四、投稿须知 一、征稿简介二、重要信息期刊官网:https://ais.cn/u/3eEJNv三、服务简述 学科领域: 人文社科-教育学、文学、艺术、体育、人文社科:其他 四、投稿须知…

2024-2025-1 学号20241315《计算机基础与程序设计》第六周学习总结

作业信息这个作业属于哪个课程 2024-2025-1-计算机基础与程序设计这个作业要求在哪里 https://www.cnblogs.com/rocedu/p/9577842.html#WEEK06这个作业的目标 Polya如何解决问题 简单类型与组合类型 复合数据结构 查找与排序算法 算法复杂度 递归 代码安全作业正文 https://www…

Foods

生物活性化合物是食物中天然存在的物质,除了基本营养外,还能提供额外的健康益处。这些化合物具有特定的功能特性,对人类健康有直接影响。了解生物活性化合物发挥作用的潜在机制对于其在预防和治疗各种疾病方面的潜在应用至关重要。本期特刊的目的是整理原创研究文章和评论,…

第一周学习总结:计算机发展史及liunx系统安装

# 计算机发展相关历史 1.第一代(1946-1957年):电子管计算机 电子管计算机(1946-1957)这一阶段计算机的主要特征是采用电子管元件作基本器件,用光屏管或汞延时 电路作 存储器,输入与输出主要采用 穿孔卡片或纸带,体积大、耗电量大、速度慢、存储容量小、可靠性差、维护困…

【java开发】FileWriter

原创 大常运维FileWriter(文件字符输出流): 作用:以内存为基准,把内存中的数据以字符的形式写出到文件中去。构造函数和方法:代码:package cn.chang.d1_char_stream;import java.io.File; import java.io.FileWriter; import java.io.IOException; import java.io.Write…

蓝桥算法

1.https://www.lanqiao.cn/problems/19954/learning/?contest_id=214 这道题用快速幂直接秒,而快速幂就是求一个数的次方很大的时候,我们可以把指数分解为二进制的形式,再有a的b*c次方等于a的b次方乘以a的c次方,在用一个数存储一下即可。代码如下: def qui(x, y): res = 1…

2280: 【例27.2】 最小n值 循环代码块不熟练

include <bits/stdc++.h> using namespace std; int main( ) { int n=2, m; cin >> m; double sum=1; while (sum<m) { sum+=1*1.0/n; n++; } cout << n-1; return 0; } 错误点: int n=1, m; 错误点2:while (sum>=m),错误点三 没设置 n++; 反思:1…

web安全作业(SQL注入2)

web安全作业之SQL注入2 需要掌握的知识POST提交与Get提交方法的区别 Mysql POST注入(POST Union注入、POST报错注入、POST盲注、POST报头注入) Mysql注入文件上传 堆叠注入 二次注入 http协议请求报文 理解PHP中定义的以下预定义变量:$_REQUEST (获取GET/POST/COOKIE) COO…

2024-2025-1 20241412 《计算机基础与程序设计》第六周学习总结

学期(如2024-2025-5) 学号(如:20241404) 《计算机基础与程序设计》第5周学习总结 作业信息这个作业属于哪个课程 https://edu.cnblogs.com/campus/besti/2024-2025-1-CFAP这个作业要求在哪里 https://edu.cnblogs.com/campus/besti/2024-2025-1-CFAP/homework/13276这个作…

[论文阅读] VERY DEEP CONVOLUTIONAL NETWORKS FOR LARGE-SCALE IMAGE RECOGNITION

写在前面 原文:https://arxiv.org/pdf/1409.1556 参考:https://www.cnblogs.com/lijiuliang/p/15133276.html 关键字:卷积网络、卷积网络深度、图像识别 阅读理由:卷积神经网络深度与算法优良性能之间的关系是什么,如何评估的,结果如何,有哪些思考 前置知识:CNN(也是我…

strlen函数的模拟实现

首先我们先新建项目,并新建源文件 然后先调用sring.h里的strlen函数看看该函数的效果 可以看到strlen的结果为字符串"abc"的长度 我们又知道对于字符串"abc"实际上在字符串尾部会存在\0,即字符串arr实际上是"abc\0" 那么先定义自定义函数my_st…

2024-2025-1(20241321)《计算机基础与程序设计》第六周学习总结

这个作业属于哪个课程 <班级的链接>(2024-2025-1-计算机基础与程序设计)这个作业要求在哪里 <作业要求的链接>(2024-2025-1计算机基础与程序设计第一周作业)这个作业的目标 <了解并学习AI功能,回顾一周课程心得>作业正文 ... 本博客链接https://www.cnblo…