2017年3月28日火曜日

リストから文字列結合 【Python】

"".join(list)


非常に便利なjoinです。今まで使ったことがなかったのが不思議なぐらい

""の間に結合する文字を入れます。どういうことかというと例の通り

# ハイフン"-"で結合
moji =["py","tho","n"]
print ("-".join(moji)) #=> py-tho-n
# なにもなしで結合
moji =["py","tho","n"]
print ("".join(moji)) #=> python
view raw 03281 hosted with ❤ by GitHub



これでpython入門だったときに疑問だった文字列結合方法がクリアされました。

ちなみに入門のときはfor文とif文を使って頑張って結合していました

n = input()
nn = int(n)
a =[]
for i in range(nn):
a.append(input())
for i in range(nn):
print(a[i],end="")
if i < nn-1:
print(",", end="")
elif i == nn-1:
print(".", end="")
view raw 03282 hosted with ❤ by GitHub


まわりくどすぎるわ!wwwwwww

日本語で説明すると
----------
文字列をインプットして、インプットした文字列をintにして、空のリストを作って、数字をリストに追加していき、ループで数字をprintして、最後の文字でなければカンマ","を書いて改行しないようにループ、最後の文字であればカンマを入れず改行もしない
----------

まぁたしかにできなくもないですが、いろいろ大変なことになってますね
入門の頃の試行錯誤でできた作品でした。



今なら同じようなものでも次のように書けます

print ("-".join(list(map(int,input().split(" ")))))
view raw 03283 hosted with ❤ by GitHub


まさかのワンライナーwww

11行のプログラムコードを1行にまとめることができました!



さて、久しぶりに勉強枠の記事でした。
問題解いていないとメソッド忘れちゃいますねぇ。定着するまでちゃんと復習しましょう


2017年3月21日火曜日

FC版ドラクエ1 りゅうおうとの戦いシミュレーション【Python】 その5 ~ベホイミ回復のタイミング~

その4までのプログラミングコードを書いてしまえば、あとは変数"z"を好きなパラメータに置き換えるだけでいろいろな条件を考察できるようになります

さて、今までは初期条件としてHPが48以下になったらベホイミで回復としていました。これは竜王の攻撃によってゆうしゃに与えるダメージの最大値が48であるためです。
しかし実際には最大値の48を食らうことは少なく、ベホイミを掛けられる回数からもなるべくMPを温存すべきです。

そこで、HP24~48の間で、どのタイミングで回復をすれば最良かを計算しました

結果が以下の図です




おお!きれいな図!

勝率最大値を見ると・・・若干グラフがずれていますがHP45が最大値!!

ちなみに
HP45で回復 勝率 38.906%
HP46で回復 勝率 37.326%
HP47で回復 勝率 34.985%
HP48で回復 勝率 32.563%

45と48の差はなんと6%以上!!



~~~結論(初期HPだけで考えたとき)~~~
FC2ドラクエ1,RTAレベル18ルートでは
HP45以下になったらベホイミで回復が最良!!
#なお条件が実機と同じであると仮定ですので、RTAで竜王に勝てなくても当ブログ筆者は一切の責任を負いません (笑)






FC版ドラクエ1 りゅうおうとの戦いシミュレーション【Python】 その4 ~ゆうしゃの初期HPと勝率の関係~

FC版ドラクエ1、りゅうおう第二形態との戦いをシミュレーションしています。

前回は勇者の初期HPを変えたときの勝率を求めました。

今回は前回に引き続き、初期HPが1のときから最大値の115までの条件を一気に計算するようにコードを書き換えました。

修正点をメモ書きで書いております

# -*- coding: utf-8 -*-
"""
基礎データ
ゆうしゃ
HP115
MP100
こうげきとベホイミのみ
こうげき 6~12のランダム
ベホイミ 85~100のランダム
りゅうおう
HP130
こうげき 24~48
ほのお 42~48
確率半分とする
ルーチーン
HP49以上ならこうげき
HP48以下になったらMPが尽きるまでベホイミで回復
"""
import random
import matplotlib.pyplot as plt #グラフを描くためにmatplotlibをインポート
katilist=[] #勝率を格納するための空のリストを作成、負け率はいらないので消しました
joukenlist=[] #グラフの横軸になる値を格納する空のリストを作成
step = 100000
for z in range(1,115):
kati = 0
for i in range(step):
myHP = z
myMP = 100
HP = 130
syouhiMP = 10
try:
while HP > 0:
if myHP >48:
damage = random.randint(6,12)
HP -= damage
if HP <= 0:
kati +=1
raise Exception
elif myHP >0:
if myMP >= 10:
behoimi = random.randint(85,100)
myHP += behoimi
myMP -= syouhiMP
if myHP >115:
myHP =115
else:
damage = random.randint(6,12)
HP -= damage
if HP <= 0:
kati +=1
raise Exception
ryucommand = random.randint(0,1)
if ryucommand == 0:
mydamage = random.randint(24,48)
myHP -= mydamage
elif ryucommand == 1:
mydamage = random.randint(42,48)
myHP -= mydamage
if myHP < 0:
raise Exception
except Exception:
pass
katilist.append(kati/step*100) #勝率をリストに入れていく
joukenlist.append(z) #横軸の値をリストに入れていく
plt.plot(joukenlist,katilist,'o') #↑で得られたリストをグラフ化
plt.show #グラフ表示
view raw 03211 hosted with ❤ by GitHub




1条件につき10万回繰り返し、115条件の計算をしました
1150万回の計算です。さすがにそろそろ計算速度も考えてプログラミングしないと計算時間がかかるようになってきました。

基本的にfor,if文は短縮余地があるので今後改良予定です

計算結果は以下のグラフの通りです



前回は"単純なグラフにはならない"ことを示しましたが、

今回はHP48を下回ると一気に勝率が下がることを示しました。

RTAをやってるときに第2形態戦闘開始時にHP48以下だったら絶望しかないですね(たぶん実際はあまりないと思いますが)



<<<   FC版ドラクエ1 りゅうおうとの戦いシミュレーション【Python】 その3