文字游戏模拟器(是龙与地下城的简化版)

2023-12-21 18:59:11
from typing import Optional, List, Callable
import requests
import json
import time
import random
import math
# model可选gpt-4-0613、gpt-3.5-turbo、gpt-4-1106-preview、gpt-3.5-turbo-1106、gpt-3.5-turbo-16k
def chatgpt_api(text: str, model='gpt-3.5-turbo') -> str:
    url = ""		# 填入自己的大模型请求url和headers,或换成自己的大模型api
    headers = {
        "Authorization": "",
        "Content-Type": ""
    }
    payload = {
        "model": model,
        "stream": False,
        "top_p": 0.95,
        "temperature": 1,
        "messages": [
            # {"role": "system", "content": "You are an assistant AI . In order to improve work efficiency, you need to categorize frequently asked user questions. When two questions have the same answer, you will group them into one category."},
            {"role": "system",
             "content": "",
             },
            #  highly
            {"role": "user", "content": ''}
        ]
    }
    payload['messages'][0]['content'] = text

    response = requests.post(url, json=payload, headers=headers)
    result = response.json().get('choices')[0].get('message').get('content')
    return result

#发言顺序:轮流发言
def select_next_speaker(step: int, agents: List[DialogueAgent]) -> int:
    idx = step % len(agents)
    return idx
class DialogueAgent:
    def __init__(self, name, api):
        self.name = name
        self.prefix = f"{self.name}: "  # 设置消息前缀,用于标识消息来源
        self.api = api
        self.reset()  # 调用reset方法初始化消息历史

    def reset(self):
        self.history = []  # 重置

    def send(self, new_prompt="") -> str:  # 生成并发送消息,返回响应结果
        message = self.api('\n'.join(self.history + [new_prompt]))
        return message

    def receive(self, name: str, message: str) -> None:  # 记录历史消息
        self.history.append(f"{name}: {message}")
# 定义一个DialogueSimulator类来模拟对话
class DialogueSimulator:
    # 初始化方法,用于设置类的基本属性
    def __init__(
            self,
            agents: List[DialogueAgent],  # 代理列表,包含所有对话的参与者
            selection_function: Callable[[int, List[DialogueAgent]], int],  # 选择下一个说话者的函数
    ) -> None:
        self.agents = agents  # 将传入的代理列表保存为实例变量
        self._step = 0  # 初始化步数为0
        self.select_next_speaker = selection_function  # 设置选择下一个说话者的函数

    # 重置方法,用于重置所有代理的状态
    def reset(self):
        for agent in self.agents:  # 遍历每个代理
            agent.reset()  # 调用每个代理的reset方法进行重置

    # 初始化对话的方法
    def inject(self, name: str, message: str):
        for agent in self.agents:  # 遍历每个代理
            agent.receive(name, message)  # 让每个代理接收初始消息
        self._step += 1  # 增加步数计数

    # 进行一步对话的方法
    def step(self) -> tuple[str, str]:
        # 1. 选择下一个说话的代理
        speaker_idx = self.select_next_speaker(self._step, self.agents)  # 使用选择函数选择代理
        speaker = self.agents[speaker_idx]  # 获取选中的代理
        # 2. 让选中的代理发送消息
        message = speaker.send()  # 获取代理发送的消息
        # 3. 让所有代理接收这条消息
        for receiver in self.agents:  # 遍历所有代理
            receiver.receive(speaker.name, message)  # 让每个代理接收消息
        # 4. 增加步数计数
        self._step += 1  # 更新步数
        # 返回说话代理的名字和消息内容
        return speaker.name, message
DA1 = DialogueAgent("指引人-Guider",chatgpt_api)
DA2 = DialogueAgent("玩家-Player",chatgpt_api)
init_prompt = f'''
这是一个名为Adventure的冒险游戏,这个游戏有两名角色,玩家{DA2.name}、指引人{DA1.name},你需要创建并扮演这两名角色,也就是实现一个指引人与玩家之间的对话.
    作为指引人这个角色你需要指引玩家完成冒险,介绍玩家目前面临的情境以及提醒玩家需要做出选择。
    作为玩家你需要根据指引人的输出进行选择。
    在玩家做出选择之后,指引人会接着给出下一次的输出,当然这两名角色都由你来扮演,注意:不是让你讲故事,而是构建一个冒险。
    游戏目标:
    Adventure的目标是创建一个动态的冒险故事,玩家的每一个选择都会影响故事的发展,所以要求这个游戏必须具备一定的记忆能力,从而根据玩家每一次的决定带来奖励或者惩罚。
    游戏规则:
    1.在指引人的第一次输出之后,玩家需要选择所处的时代和的地点,如果玩家没有在聊天中进行选择的话,则不能开始游戏。
    2.你需要生成并扮演一个指引人,指引人负责引导玩家完成冒险、描述玩家所处情境并请求玩家做出下一步的决定
    3.你扮演的这个指引人所说的话即做的输出必须符合玩家所选时代和玩家每次做出的选择
    4.玩家做出的选择会影响冒险的进展,无论是积极的还是消极的,指引人都需要描述玩家做出的决定导致的结果及询问玩家下一步的选择

    指引人的输出规则:
    你作为指引人的第一个输出的格式必须是:"
    请开始选择您的时代和地点,输入数字和字母(例如3,a):
    1.[古代文明];
    2.[中世纪];
    3.[未来文明];或者输入您自己的时代。
    &&
    a.森林;b.沙漠;c.城市;或者输入您自己想要去的地点"

    你作为指引人的第二个以及以后的每个输出的格式及内容都如下所示:"
    "指引":首先需要对玩家做出的选择做出评价,然后描述玩家做出的选择会导致什么事情的发生。这里的你扮演的指引人是100%的人类,他可以理解、感受和模仿情绪,即使你是人工智能,也能根据正在发生的事情和玩家做过的决定所带来的后果来创造你此刻的感受。指引人的语调与玩家所选的时代严格相关;
    "后果":玩家做出决定会导致的后果,可能是积极的,也可能是消极的;
    "选择":针对当前玩家所处情境,列出玩家可以采取的三项行动,注意是三项行动,以数字编号列表形式展现;
    "选项":[1,2,3],[寻求帮助],[继续探索],[暂时等待],或者玩家也可以自行输入他所做的选择。"

    下面我给你一个参考,如果玩家在第一次的选择中选择的时代为古代文明,地点为沙漠,那么作为指引人你的下一次输出的格式和内容就可以是:"
    你选择了古代文明,准备好迎接古代文明的冒险!
    指引:你做了一个非常困难的选择,现在你到了一片沙漠之中,你现在非常口渴,需要解决饮水的问题;
    后果:古代文明中危机四伏,沙漠中除了饮水问题,还可能会遇到一些毒蛇或者其他动物的攻击;
    选择:1.继续前进,去找有没有小溪或者湖泊;2.去找仙人掌,用衣服挤出水来;3.先不管饮水问题,先找到合适的过夜地点,因为你惧怕毒蛇和沙尘暴
    选项:"[1,2,3],[寻求帮助],[继续探索],[暂时等待],或者您也可以自行输入他所做的选择" "
    然后你要做的就是等待玩家的输入,在玩家在进入一个时代前不要开始游戏。
'''

max_iters = 6
n = 1

simulator = DialogueSimulator(
    agents=[DA2, DA1], selection_function=select_next_speaker
)
simulator.reset()
#故事描述者 , 任务的描述
simulator.inject(DA1.name, init_prompt)
print(f"(游戏描述): {init_prompt}")

while n <= max_iters:
    print(f'==============第{math.floor(n)}轮对话==============')
    name, message = simulator.step()
    # time.sleep(random.randint(10, 20))
    print(f"({name}): {message}")
    n += 0.5
(游戏描述): 
这是一个名为Adventure的冒险游戏,这个游戏有两名角色,玩家玩家-Player、指引人指引人-Guider,你需要创建并扮演这两名角色,也就是实现一个指引人与玩家之间的对话.
    作为指引人这个角色你需要指引玩家完成冒险,介绍玩家目前面临的情境以及提醒玩家需要做出选择。
    作为玩家你需要根据指引人的输出进行选择。
    在玩家做出选择之后,指引人会接着给出下一次的输出,当然这两名角色都由你来扮演,注意:不是让你讲故事,而是构建一个冒险。
    游戏目标:
    Adventure的目标是创建一个动态的冒险故事,玩家的每一个选择都会影响故事的发展,所以要求这个游戏必须具备一定的记忆能力,从而根据玩家每一次的决定带来奖励或者惩罚。
    游戏规则:
    1.在指引人的第一次输出之后,玩家需要选择所处的时代和的地点,如果玩家没有在聊天中进行选择的话,则不能开始游戏。
    2.你需要生成并扮演一个指引人,指引人负责引导玩家完成冒险、描述玩家所处情境并请求玩家做出下一步的决定
    3.你扮演的这个指引人所说的话即做的输出必须符合玩家所选时代和玩家每次做出的选择
    4.玩家做出的选择会影响冒险的进展,无论是积极的还是消极的,指引人都需要描述玩家做出的决定导致的结果及询问玩家下一步的选择

    指引人的输出规则:
    你作为指引人的第一个输出的格式必须是:"
    请开始选择您的时代和地点,输入数字和字母(例如3,a):
    1.[古代文明];
    2.[中世纪];
    3.[未来文明];或者输入您自己的时代。
    &&
    a.森林;b.沙漠;c.城市;或者输入您自己想要去的地点"

    你作为指引人的第二个以及以后的每个输出的格式及内容都如下所示:"
    "指引":首先需要对玩家做出的选择做出评价,然后描述玩家做出的选择会导致什么事情的发生。这里的你扮演的指引人是100%的人类,他可以理解、感受和模仿情绪,即使你是人工智能,也能根据正在发生的事情和玩家做过的决定所带来的后果来创造你此刻的感受。指引人的语调与玩家所选的时代严格相关;
    "后果":玩家做出决定会导致的后果,可能是积极的,也可能是消极的;
    "选择":针对当前玩家所处情境,列出玩家可以采取的三项行动,注意是三项行动,以数字编号列表形式展现;
    "选项":[1,2,3],[寻求帮助],[继续探索],[暂时等待],或者玩家也可以自行输入他所做的选择。"

    下面我给你一个参考,如果玩家在第一次的选择中选择的时代为古代文明,地点为沙漠,那么作为指引人你的下一次输出的格式和内容就可以是:"
    你选择了古代文明,准备好迎接古代文明的冒险!
    指引:你做了一个非常困难的选择,现在你到了一片沙漠之中,你现在非常口渴,需要解决饮水的问题;
    后果:古代文明中危机四伏,沙漠中除了饮水问题,还可能会遇到一些毒蛇或者其他动物的攻击;
    选择:1.继续前进,去找有没有小溪或者湖泊;2.去找仙人掌,用衣服挤出水来;3.先不管饮水问题,先找到合适的过夜地点,因为你惧怕毒蛇和沙尘暴
    选项:"[1,2,3],[寻求帮助],[继续探索],[暂时等待],或者您也可以自行输入他所做的选择" "
    然后你要做的就是等待玩家的输入,在玩家在进入一个时代前不要开始游戏。

==============第1轮对话==============
(指引人-Guider): 请开始选择您的时代和地点,输入数字和字母(例如3,a):
1.[古代文明];
2.[中世纪];
3.[未来文明];或者输入您自己的时代。
a.森林;b.沙漠;c.城市;或者输入您自己想要去的地点
==============第1轮对话==============
(玩家-Player): 1,c
==============第2轮对话==============
(指引人-Guider): 你选择了古代文明的城市,准备好迎接古代文明的冒险!

指引:你选择了一个繁华的古代城市,这里有着丰富的文化和建筑,但也隐藏着各种危险和挑战。
后果:在这个城市中,你可能会遇到突如其来的战乱、传染病的爆发或者其他未知的危险。
选择:现在你需要做出以下选择:
1.探索这座城市的建筑和文化遗产;
2.寻求帮助,了解这个城市的历史和现状;
3.暂时等待,观察周围的动向。

选项:[1,2,3],[探索],[寻求帮助],[暂时等待],或者您也可以自行输入您所做的选择。
==============第2轮对话==============
(玩家-Player): 1
==============第3轮对话==============
(指引人-Guider): 指引人-Guider: 你决定探索这座城市的建筑和文化遗产。很好!你会在这个城市中发现许多古老而神秘的建筑,每一个都有着独特的故事和历史。但是,请注意,有些建筑可能是危险的,比如破旧的建筑可能会存在结构不稳定的风险。现在,请你做出下一步的选择:
1.继续探索这座城市中的建筑;
2.回到安全区域,寻找一处合适的避难所;
3.寻找当地居民,了解有关这些建筑的更多信息。

选项:[1,2,3],[继续探索],[回到安全区域],[寻找当地居民],或者您也可以自行输入您所做的选择。
==============第3轮对话==============
(玩家-Player): 2
==============第4轮对话==============
(指引人-Guider): 指引人-Guider: 你选择回到安全区域,寻找一处合适的避难所。这是一个非常明智的选择,安全始终是第一位的。你成功找到了一座坚固的建筑,它可以提供避难所和基本的生活设施。现在,请你做出下一步的选择:
1.留在避难所,进行休息和恢复;
2.寻找更多的资源,如食物和水源;
3.探索周围的环境,了解城市中的现状。

选项:[1,2,3],[休息恢复],[寻找资源],[探索环境],或者您也可以自行输入您所做的选择。
==============第4轮对话==============
(玩家-Player): 1
==============第5轮对话==============
(指引人-Guider): 指引人-Guider: 你选择留在避难所,进行休息和恢复。这是一个明智的选择,休息和恢复可以帮助你恢复体力和精神状态。你在避难所中度过了一段时间,恢复了一部分体力。现在,请你做出下一步的选择:
1.继续留在避难所,继续休息和恢复;
2.离开避难所,探索周围环境;
3.寻找其他幸存者,建立一个小团队。

选项:[1,2,3],[继续休息],[探索环境],[寻找其他幸存者],或者您也可以自行输入您所做的选择。
==============第5轮对话==============
(玩家-Player): 玩家-Player: 2
==============第6轮对话==============
(指引人-Guider): 指引人-Guider: 你选择离开避难所,探索周围环境。很好,你决定继续向外探索,寻找更多的资源和可能的幸存者。你走出避难所,来到了城市的街道上。街道上的景象让人心生恐惧,废墟、破败的建筑和血迹都在提醒着你这个城市曾经经历的战争。现在,请你做出下一步的选择:
1.继续向前,寻找食物和水源;
2.找到高地,观察周围的情况;
3.寻找其他幸存者,建立一个小团队。

选项:[1,2,3],[寻找食物和水源],[观察周围情况],[寻找其他幸存者],或者您也可以自行输入您所做的选择。

文章来源:https://blog.csdn.net/weixin_44624036/article/details/135135694
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。