python阴阳师_如何用Python找到阴阳师妖怪屋的最佳探索队伍!强不强?

程序由来

最初想要写这个小程序是因为,9月份那段时间我在玩妖怪屋。

因为刚开始抽卡,要啥啥没有,所以探索队伍也只是放了几个自己记得有关联的式神。

在网上有找到完整版的羁绊,但是怎么根据羁绊找到最佳的式神组合就成问题了。

当时我是通过手动算出来的结果,后来想到自己刚刚把python基础啃完,也许可以试试用python来实现。

万一后续改进的不错能放上简历呢?

于是就有了这个程序。

整体思路

获取使用者的式神录

找到可以组成的羁绊

组合上述的羁绊

根据条件(8人,buff最大)找到最优解

当时的想法:

一是羁绊是游戏中设定好的。可以通过先对各个羁绊的属性进行定义,然后确认是否有羁绊中的式神存在于使用者式神录中。

二是把各个羁绊组合的人数和增强buff算出来,然后排除不符合要求的情况。

编写过程

先按照思路把整个程序写出来,然后不断的把一些内容改成函数,把一些输出不规范会导致的错误一一解决,接着阅读整个程序的代码,并对注释进行改写。

今天比较仓促,详细的过程不知道后续有没有机会补上,请让我先放上完整代码。

写程序的过程中,我还在论坛里找了很多方法用在程序里,以保证程序是按照我的思路实现的。

包括通过集合去重,确认A是否属于B,通过combinations对羁绊进行组合,以及通过re替换非中文字等等。

在此谢谢各位大佬的奉献。

完整代码

onmyoji(主程序)

"""

本项目是基于阴阳师妖怪屋的探索玩法编写的。

目的是让使用者能够快速根据拥有的式神,组合出能让增强buff最大化的8人组合。

探索玩法可派遣8位式神进行不断探索。

不同式神可组成不同羁绊,羁绊在游戏中是固定的,式神组成羁绊可获得增强buff,即额外探索奖励。

本项目使用方法,只需规范输入内容,并进行分隔,在完成输入后以N或n结尾即可。

该项目结果只会出现第一个增强buff最大的组合,请知悉。

本项目计算过程:

1.获取使用者的式神录,进行处理后获得单个式神的集合,保存至使用者变量type中。

2.根据这些式神从式神字典中找到可以组成的羁绊,保存其在字典中位置至使用者变量loc中。

3.将不同羁绊可组成的组合(后续称为羁绊组合),占用人数,增强buff放在一个字典中,保存至使用者变量total中。

4.对total中每个可组成羁绊组合,进行对比,占用人数合规(8位),且增强等级最大的组合保存至best中,并输出。

"""

import function as fu

import dictionary as dic

import shiki as sk

#将我拥有的式神设为一个空的集合,方便后续添加式神

shiki_you = sk.Shiki(set(()))

#建立一个集合包括所有羁绊组合的式神

"""

白狼,茨木童子,大天狗,独眼小僧,鬼使白,鬼使黑,蝴蝶精,九命猫,酒吞童子,傀儡师,

镰鼬,孟婆,犬神,山兔,少羽大天狗,桃花妖,天邪鬼赤,天邪鬼黄,天邪鬼绿,天邪鬼青,铁鼠,

巫蛊师,雪女,阎魔,妖刀姬,樱花妖,萤草

"""

shiki_all = dic.shiki_all

#通过使用者录入,获取使用者的式神录

while True:

#获取使用者输入的式神

#输入中如果有汉字或N,n以外的字符,都replace为,号,并进行分隔。当输入为N或n时,结束输入。

shiki = input('Would you like to tell me your shiki name? please use \',\' to split.')

#对输入内容进行处理,判断input的内容是不是为N或n,即对方有否完成输入过程。N为完成输入。

if fu.check_go_on(shiki):

break

#对输入内容进行处理,保证输入内容合规后,更新至使用者的式神录

fu.input_shiki(shiki, shiki_you)

#通过计算获得可组成的最大增强buff的羁绊组合

#可以更改组队人数设定限制,即将fu.get_max_buff(shiki_you)的默认参数n进行改动

fu.get_max_buff(shiki_you)

shiki

from itertools import combinations

class Shiki():

#type是指拥有的式神,loc是指羁绊在diction2的位置,包括0,

#comb是指各羁绊能组合成的组合,使用loc来表示羁绊所处位置

#total是集合了羁绊组合,组合占用人数和增强buff的字典

def __init__(self,type):

self.type = type

self.loc = []

self.total = {}

self.best_max = 0

self.best = {}

#获取所有羁绊可以组成的组合,请注意当i=1时,羁绊可组成的组合只有一个

#而元组中只包含一个元素时,需要在元素后面添加逗号,否则括号会被当作运算符使用

def combine(self):

'''根据n获得列表中的所有可能组合(n个元素为一组)'''

temp_list2 = []

end_list = []

for i in range(len(self.loc)):

for c in combinations(self.loc,i):

temp_list2.append(c)

#print(i,c,len(c))

temp_list2.append(tuple(self.loc))

#temp_list2 = sorted(list(set(temp_list2)))

return temp_list2

dictionary

(不得不承认这个diction。。真的有点丑)

#diction是一个列表,把每一个羁绊的各属性都单独放在一个字典中

import shiki as sk

#将所有羁绊组合的属性放入一个字典中,并将所有羁绊组合的字典放入一个列表中

"""

羁绊组合字典属性说明

namet:羁绊简称

tram_per:羁绊所包含的式神

person:羁绊占用人数

level:羁绊获得的buff值

name:羁绊名称

"""

#diction是一个列表,把各属性key和各羁绊的对应属性值value放在一个字典中,其中value属性值也是一个列表

diction = [

{'namet':['tram1','tram2','tram3','tram4','tram5','tram6','tram7''tram8',

'tram9','tram10','tram11','tram12','tram13','tram14','tram15','tram16']},

{'tram_per':[{'樱花妖','桃花妖'},{'酒吞童子','茨木童子'},{'山兔','孟婆'},{'鬼使黑','鬼使白'},

{'镰鼬','铁鼠'},{'少羽大天狗','大天狗'},{'鬼使黑','鬼使白','阎魔'},{'白狼','妖刀姬','萤草'},

{'白狼','妖刀姬'},{'傀儡师','阎魔'},{'独眼小僧','蝴蝶精'},

{'天邪鬼黄','天邪鬼赤','天邪鬼青','天邪鬼绿'},{'大天狗','雪女'},{'萤草','白狼'},{'九命猫','犬神'},

{'蝴蝶精','巫蛊师'}]},

{'person':[2,2,2,2,2,2,3,3,2,2,2,4,2,2,2,2]},

{'level':[2,4,2,2,2,4,3,4,3,3,2,2,3,2,2,2]},

{'name':['whereisspring','drinkthewine','runningfrogandpan','whiteandblack','repeathappily','fromthesky',

'bosspleasesay','girlshouldbestrong','girlgroup','onedaytravelatthree','Icanchant','F4','FORjustice',

'myidol','catordog','monstercatchingbutterfly']}

]

shiki_all = sk.Shiki({'白狼','茨木童子','大天狗','独眼小僧','鬼使白','鬼使黑','蝴蝶精','九命猫','酒吞童子','傀儡师',

'镰鼬','孟婆','犬神','山兔','少羽大天狗','桃花妖','天邪鬼赤','天邪鬼黄','天邪鬼绿','天邪鬼青',

'铁鼠','巫蛊师','雪女','阎魔','妖刀姬','樱花妖','萤草'})

function

import dictionary as dic

import re

#判断input的内容是不是为N或n,即对方不愿意继续分享其拥有的式神名称

def check_go_on(shiki):

Out = False

if shiki == 'N' or shiki == 'n':

Out = True

return Out

#对输入内容进行处理,确认其符合要求

def check_list(shiki):

#将输入内容中所有非中文部分都替换为','

mark = re.compile(r'[^\u4e00-\u9fa5]')

a = re.sub(mark, ',', shiki)

#根据分隔符',',对输入内容进行分隔去重

shiki = list(set(a.split(',')))

#对输入内容的每一个文字内容进行判定,确认其是否为式神录中的式神名称。

for a in shiki.copy():

#如是,继续判断下一个;

if {a}.issubset(dic.shiki_all.type):

continue

#如不是,删掉该部分。

else:

shiki.remove(a)

#返回处理过的输入内容,当前内容应不包含任何不存在于式神录的文字及符号

return shiki

#

def input_shiki(shiki,shiki_you):

#将输入的式神列表改为集合,方便进行判定和去重

shiki = {i for i in list(check_list(shiki))}

#将输入的式神列表放入使用者的式神录中

shiki_you.type.update(shiki)

return

#获取使用者式神可组成的所有羁绊,并保存羁绊在字典中的位置至变量loc

def get_dic(shiki_you):

#确认使用者式神录是否能够组成diction中的羁绊

for i in dic.diction[1]['tram_per']:

#如果使用者式神录存在可组成羁绊的式神,保存该羁绊在字典中的指针

#因为该指针可便于获取该羁绊在diction其他字典中的对应值

if i.issubset(shiki_you.type):

shiki_you.loc.append(dic.diction[1]['tram_per'].index(i))

return shiki_you

#记录羁绊组合的各项属性值

def comp_buff_assign(shiki_you,type_shiki,buff,memberc):

shiki_you.total['pers'].append(len(type_shiki))

shiki_you.total['team'].append(type_shiki)

shiki_you.total['level'].append(buff)

shiki_you.total['usecomb'].append(memberc)

return

#对每个羁绊组合的占用人数,增强buff等相关信息都进行获取和录入

def comp_buff(shiki_you,n):

#对于每一个羁绊组合都进行计算

for i in shiki_you.total['comb']:

buff = 0

type_shiki = set(())

memberc = []

#当羁绊的组合方式为空,可对各项属性值进行初始定义

if len(i) == 0:

comp_buff_assign(shiki_you, type_shiki, buff, memberc)

continue

#每个羁绊组合进行x(拥有羁绊数量)次的重复,以计算每种羁绊组合的属性

for x in range(len(i)):

# y用于获取羁绊组合在diction中的所处位置

y = int(i[x])

# type_shiki用于获取羁绊组合要占用的人数,并自动去重

# memberc是获取使用到的羁绊,buff为增强buff的数值

type_shiki.update(dic.diction[1]['tram_per'][y])

memberc.append(dic.diction[1]['tram_per'][y])

buff += dic.diction[3]['level'][y]

#记录羁绊组合占用人数不大于设定的羁绊组合

if len(type_shiki) <= n:

comp_buff_assign(shiki_you, type_shiki, buff, memberc)

return shiki_you

#输出可组成的增强buff最大的羁绊组合信息

def print_best(shiki_you,best):

print('\n根据您现有的式神,当前可获得最大增强buff的羁绊组合信息如下:')

print('最大Buff值:', shiki_you.best_max)

print('组合占用人数:', len(shiki_you.best))

print('使用到的羁绊:', shiki_you.total['usecomb'][best])

print('使用到的式神:',shiki_you.best)

print('\nBases on your shikis, we can provide below group details which can make you get maximum benefit:')

print('Buff Level:', shiki_you.best_max)

print('Number of Shiki:', len(shiki_you.best))

print('Combination Used:', shiki_you.total['usecomb'][best])

print('Shiki Used:',shiki_you.best)

# 对每个羁绊组合的增强buff进行比较,获得buff最大值的羁绊组合,保存在使用者的变量best,best_max中

def compare_buff(shiki_you):

best=0

# 开始对每组的数据进行比较,先设定一个保存最大值的变量

shiki_you.best_max = shiki_you.total['level'][0]

# shiki_you.total = {羁绊组合'comb':shiki_you.comb,

# 占用人数'pers':[],'team':[],增强等级'level':[],'usecomb':[]}

for i in range(len(shiki_you.total['level'])):

if shiki_you.best_max < shiki_you.total['level'][i]:

shiki_you.best_max = shiki_you.total['level'][i]

shiki_you.best = shiki_you.total['team'][i]

best = i

print_best(shiki_you,best)

return shiki_you

#通过计算获得可组成的最大增强buff的羁绊组合

def get_max_buff(shiki_you,n=8):

# 获取使用者式神可组成的所有羁绊,并保存羁绊在字典中的位置至变量loc

get_dic(shiki_you)

# 将可组成的所有羁绊进行自由组合,并定义部分初始变量并保存相关信息在total字典中。

"""

comb保存自由组合成的羁绊组合(在字典中的位置)

pers保存每种羁绊组合的占用人数

team保存每种羁绊组合所使用到的式神

level保存每种羁绊组合可获得的buff增强值

usecomb保存每种羁绊组合所使用到的羁绊

"""

shiki_you.total = {'comb': shiki_you.combine(), 'pers': [], 'team': [], 'level': [], 'usecomb': []}

# 对每个羁绊组合的占用人数,增强buff等相关信息都进行获取和录入

comp_buff(shiki_you,n)

# 对每个羁绊组合的增强buff进行比较,获得buff最大值的羁绊组合,输出并保存在使用者的变量best,best_max中

compare_buff(shiki_you)

这个程序真的是改了又改,虽然不够复杂,没有好看的界面,甚至包含废话。但是说不定下一个程序用途就更加广泛了呢!

如果各位有改进方法或者好的教程,请抛给我!谢谢!

PS:如有需要Python学习资料的小伙伴可以加点击下方链接自行获取

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

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

相关文章

Android iOS防录屏截屏

目录Android防录屏和截屏关于WindowManager.LayoutParams.FLAG_SECURE关于Display.FLAG_SECUREiOS防录屏和截屏监听截屏录屏监听需求与安全总是对立的&#xff0c;有新的需求&#xff0c;就有新的接口开放&#xff0c;但随之而来的就是利用新接口或者新接口的使用者&#xff08…

work节点使用外部包_AFLSmart工具简单分析及使用介绍

AFLSmart 是一个在 AFL 基础上&#xff0c;结合了 Peach 的结构化输入组件的灰盒 smart fuzz 工具。AFLSmart 链接&#xff1a;https://github.com/aflsmart/aflsmart参考资料&#xff1a;《Smart Greybox Fuzzing》什么是 AFLSmart灰盒 smart fuzz灰盒测试是基于程序运行时刻的…

Android adb 启动APP

目录启动命令一 常规命令 包名/activity二 常规命令 包名命令关闭App获取包名和activity的路径代码获取1 命令获取( 需要app运行在前台&#xff0c;停留在启动界面)2命令获取(先执行命令&#xff0c;再点击app启动)启动命令 一 常规命令 包名/activity adb shell am start…

python语言使用什么语句实现上下文管理协议_Python 上下文管理器

上下文管理器在使用Python编程中&#xff0c;可以会经常碰到这种情况&#xff1a;有一个特殊的语句块&#xff0c;在执行这个语句块之前需要先执行一些准备动作&#xff1b;当语句块执行完成后&#xff0c;需要继续执行一些收尾动作。例如&#xff1a;当需要操作文件或数据库的…

Android日志[基础篇]Android Log日志输出

Android日志[基础篇]二 Android Studio修改LogCat日志的颜色 android.util.Log输出日志的常用方法如下&#xff1a; Log.v(String tag, String msg)Log.d(String tag, String msg)Log.i(String tag, String msg)Log.w(String tag, String msg)Log.e(String tag, String msg) …

python函数应用_python 函数应用

#函数的参数就是个变量#定义函数的时候&#xff0c;使用关键字参数&#xff0c;可以指定默认值def hello(namereboot,age1):return hello %s,your age is %s %(name,age)print hello(reboot,3)print hello(3,reboot)#print hello(age3,namereboot)print hello(reboot)def f(n):…

Android日志[基础篇]二 Android Studio修改LogCat日志的颜色

上一篇提到Android日志的5个级别的日志输出&#xff0c;在logcat里面设置自己喜欢或习惯的颜色&#xff0c;本文不只讲Android Sudio修改logcat的日志颜色。 代码和效果 代码 private void logColor(){Log.v(TAG,"logColor verbose");Log.d(TAG,"logColor de…

readfile函数使用方法_1分钟学会LOOKUP函数,有网友说使用这个方法,初学者秒变大神...

Hi&#xff0c;大家好&#xff0c;本专栏将会从零开始和大家用图文的方式&#xff0c;30天让你从不会到熟练使用函数&#xff0c;0基础开始学习Excel函数&#xff0c;让你喜欢上它&#xff01;有兴趣的小伙伴可以持续关注我&#xff0c;或者在专栏进行查看学习&#xff0c;愿与…

Android JNI Attempt to remove non-JNI local reference, dumping thread

Attempt to remove non-JNI local reference, dumping thread 解决办法&#xff1a; 去除Jni代码 env->DeleteLocalRef(javaObject);注意&#xff1a;是java层传递给jni层的对象不需用了DeleteLocalRef来进行对象删除&#xff0c;jni层创建的对象仍然需要保留代码。 这个…

背景图层和普通图层的区别_图层样式(一)—高级混合选项

一、图层顺序为了便于说明&#xff0c;首先建立例子&#xff0c;新建图层&#xff0c;用画笔随便画个圈&#xff0c;新建蒙版随便画一笔&#xff0c;然后把所有图层样式加给它。可以看到样式从上到下的顺序&#xff0c;这也是它们混合的图层顺序。图层顺序我的效果&#xff0c;…

Android9.0 http网络请求失败问题的处理

目录处理方法(任意一种)&#xff1a;APP改用https请求targetSdkVersion 降到27以下配置network-security-config&#xff08;推荐&#xff09;原因出错案例处理方法(任意一种)&#xff1a; APP改用https请求 这种方式是最佳方法&#xff0c;需要前后端协调&#xff0c;后端得…

代码里无图片地址_项目实战:爬高清图片

↑ 关注 星标 &#xff0c;后台回复【大礼包】送你2TPython自学资料好消息&#xff1a;Python学习交流群&#xff0c;已经建立&#xff0c;猛戳加入之前我发过一些爬虫的文章&#xff0c;不过一直没发过爬取图片的&#xff0c;今天就给大家分享一篇吧&#xff01;/1 前言/上篇…

Android TextView通过SpannableString设置字体、大小、颜色、样式、超级链接

代码应该都能看明白 public class MainActivity extends ActionBarActivity {private TextView tv, tv2;private SpannableString sStr, sStr2;Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.act…

winform项目_winform项目——仿QQ即时通讯程序01:原理及项目分析

即时通讯程序&#xff0c;腾讯QQ可以说是一家独大&#xff0c;虽然市场上仍然有类似QQ的即时通讯程序&#xff0c;但是基本上面向的对象都是特定人群。那么&#xff0c;现在做一个即时通讯的软件还有意义吗&#xff1f;在我看来&#xff0c;意义非常大。作为一个学习编程的人&a…

Android面试基础一

Android面试基础二-原理及常见问题 目录1、四大组件1&#xff09;Activity2&#xff09;Service3&#xff09;ContentProvider4&#xff09;Broadcast Receiver2、四大组件的生命周期和简单用法1&#xff09;Activity2&#xff09;Service3&#xff09;BroadcastReceiver4&…

python怎么用大数据分析师_如何七周成为数据分析师18:Python的新手教程

本文是《怎样七周成为数据剖析师》的第十八篇教程&#xff0c;假定想要了解写作初衷&#xff0c;能够先行阅读七周指南。温馨提示&#xff1a;假定您曾经熟习Python&#xff0c;大可不用再看这篇文章&#xff0c;或只选择部分。Python是近年来最火爆的言语&#xff0c;曾经作为…

Android面试基础二-原理及常见问题

Android 面试基础一 目录Android源码相关分析1、Android属性动画实现原理2、补间动画实现原理3、Android各个版本API的区别4、Requestlayout&#xff0c;onlayout&#xff0c;onDraw&#xff0c;DrawChild区别与联系5、invalidate和postInvalidate的区别及使用6、Activity-Wind…

python数据展示库_收藏!盘点很实用的数据科学Python库

数据科学是一门研究数据并从中挖掘信息的学科。它不要求自创或学习新的算法&#xff0c;只需要知道怎么样研究数据并解决问题。这一过程的关键点之一就在于使用合适的库。本文概述了数据科学中常用的、并且有一定重要性的库。在进入正题之前&#xff0c;本文先介绍了解决数据科…

Android日志[进阶篇]二-分析堆栈轨迹(调试和外部堆栈)

Android日志[进阶篇]一-使用 Logcat 写入和查看日志 Android日志[进阶篇]二-分析堆栈轨迹(调试和外部堆栈) Android日志[进阶篇]三-Logcat命令行工具 Android日志[进阶篇]四-获取错误报告 Android日志[进阶篇]五-阅读错误报告 目录调试中的堆栈轨迹从外部来源打开堆栈轨迹监控剪…

python股票数据分析实验报告_Python实验报告

一、实验原理(要求、任务等)(一)、Python的开发环境Python诞生于20世纪90年代初&#xff0c;是一种解释型、面向对象、动态数据类型的高级程序设计语言&#xff0c;是最受欢迎的程序设计语言之一。编写、编译和运行Python程序有以下3种方法。1.使用交互式解释器2.使用Windows命…