2020年1月26日日曜日

[SwE] テスト駆動開発(Kent Beck著)の第1章を写経するのにPythonを使ってみた話

「テスト駆動開発」(Kent Beck著)を読み進めてはいたんですが、どうもこう手を動かさないと学んでいる気がしないな、と思い写経を開始することに。
そもそも、TDDを何でやろうかな?と思ってるかというと。

  1. 設計としてテスト駆動開発を利用したい(いわゆるks設計はしたくない)
  2. ウォーターフォールに居る中での手法検討(どこが大変で導入コストとしてどこが受け入れられにくいのか)
  3. 暇つぶし


ただ、Java全然使ってない(業務ではC++、趣味とかでもPython)なのでどっちかで書こうかなと。とりあえずお手軽なPythonを選択。で、詰まった。「パッケージ構成どうしよう……?」

  1. いつもはワンライナー的な使い方やちょっとしたスクリプトとして運用している。
  2. パッケージ考えたことない……
  3. そもそもPythonのUnitTestプラットフォーム使ってない……

略/ProjectRoot---src---doller.py
                        test--test_doller.py

としてtest_doller.pyからfrom src.doller import Dollerとしてみたら、まあ動かない(そんなもんはない!って怒られる奴)。なんてことはなく、__init__.pyを置いてなかったせいなんですが。両方のディレクトリにとりあえず、__init__.pyを置いたら解決しました。
途中で.pth形式のファイルを置いてみたりしたんですけど、あんまり効果なかったですね。(実行はWindows10、Visual Studio Code、VSCode上のPowerShell)

あと本の途中で、型キャストをしているところがあったんですが、そこはtype()のチェック後、raise Exception("")無理やりやることにして試験したことにしました。
とりあえず1章抜ければ次はPythonコードで書いてあるのでそこを目指してやっていきます。では


メモ:
通常のアサート:
assert [Trueを期待する文]
例外発生確認:
with pytest.raises(Exception):
      [例外を期待する文]

2019年7月12日金曜日

クラスの基本

ブログをどう運用したらよいかわからなくなってきたので、自学用にPythonメモ。Pythonの何が良いかってすぐ試せるところ。ただ、メインとして使うのは、C++プログラマなのでそこは使い分けにしていきたい。

オブジェクト指向的な部分のメモ

クラスの記述方法

class Base:
    def __init__(self):
       print("this is base")


class Derive(Base):
    def __init__(self):
        self.hogehoge = 0


    def func(self):
        print(self.hogehoge)


def main():
   pass # Test Cases...


if __name__=="__main__":
   main() # 良く忘れるのはこの部分。


2019年3月23日土曜日

「リボハチ」リーグ8で使用中のかぐや姫デッキ本当に勝ててるのか、検証してみた


どうも。Twitterで同じ内容を連投しましたが、あとで見返せるようにブログ記事にしてみます。

「リボハチ」リーグ8で使用中のかぐや姫デッキ本当に勝ててるのか、検証してみた!

使用デッキはこちら。


先に結果を書くと、32戦19勝9敗4分で、引き分けを除いた勝率は67.9%。3回やれば2回勝ってる計算です。割と良い勝率だと思います。

ここから検証データ。
最も多い対戦相手は金太郎の9、次点が桃太郎の6で他それぞれは2~3回当たったのみです。負けた9試合は桃太郎1、金太郎1、赤ずきん2、かぐや姫2、マッチ売り1、シンデレラ1、裸の王様1です。
赤ずきんとかぐや姫ミラーは全敗。逆に、金太郎に対してはWIN-RATIO8:1と圧倒的です。反攻デッキは強襲デッキに強い、本当だった……。

主な負けパターンは2つ。
1.「裸の王様→赤ずきん」のミニオンを除去しつつ裸の王様がタワーのタゲを持つ形を止められなかった(→シンドバッドも同様)
範囲攻撃持ちオールマイティーを止められていない。
2.反攻タイミングでタワーもどきを出され、シンデレラのダッシュ攻撃はいらず…です。


それでも、 かぐや姫は少なくとも、リーグ8でやれる可能性が感じられました。来週でバフされることもありますし、期待せずにはいられません!


おまけ。カード採用理由。
かぐや:対スペシャルスキル最終兵器。大抵のスペシャルスキルを無駄打ちにさせることができる。その上で、戦線維持を度外視した反攻を可能に。特にスペシャルスキルを打つときはかぐや自身は攻められているレーンの反対側に出すことでタンク役が可能なのが利点。
シンデレラ:細かくダメージを与えるダメージ源。残り1分までにシンデレラのダッシュ攻撃を1回以上打つことでラッシュに移る下地を作る。
金太郎:シンデレラ以上のダメージを一発で叩き込めるダメージ源その2。かつ、対シンデレラおよび赤ずきん迎撃用。赤ずきんをどうにかしておかないとミニオンによる迎撃が間に合わなくなる。
からす天狗の衆:対地上(というよりも対白雪姫)および第3のクイックアタッカー。
リリパット弓兵:対空中ユニット用の迎撃ミニオン。赤ずきんと入れ替えてもよい。
赤鬼:相手タワーへのプレッシャー用。意外とダメージが入るため、これで200~300くらい削りたい。
星の銀貨:汎用スペル。ミニオン処理に使う。
不思議な松明:攻めてきたミニオンの対処用および赤鬼や金太郎と同時進軍させての対ミニオンの護衛役として運用。

2019年3月21日木曜日

弱小プレイヤーによるスマホRTS「リボハチ」のススメ

どうも!リボハチ弱小プレイヤーの儀堂上櫻/SakuraNGです。ようやく、リーグ8※まであがりました。ここまでの間にプレイの壁、編成の壁があり、リーグをあげるのはかなり厳しかったのですが、ここにきて勝っても負けても試合展開を楽しめるようになってきました。
今回は、おもしろさと難しかったところを伝えようと思います。(あと良ければ来週のアップデートで導入されるフレンドに登録を待ってます。質問もね!)
※リボハチにはリーグ1からリーグ11まであります。プレーヤーは勝敗により増減するポイントによってリーグの所属は変動し、リーグ11は青天井のスーパーリーグ。なお、大体一ヶ月毎に切り替わるシーズン毎にポイントが一定数以上だと何かもらえる。リーグ8は高いように過半からすると高いように見える・・・・・・のですが、中堅の真ん中くらいです。全カード解放もまだされていません。 リボハチとは、正式名称はリボルバーズエイト。今年1月中旬に配信を開始したRTSジャンルのゲーム。プレイヤーはレーンを進軍するユニットを配置し、相手の拠点であるタワーの破壊を目指す というジャンルです。有名どころのゲームも先行していますが、キャラクターの魅力、能力にフィーチャーしている点が売りなのかな?と思います。
盤面の右側が自分側。
画面下に表示されているユニットを配置すると相手側陣地に自動的に攻めていく。
キャラクターはオリジナルではなく、昔話のキャラクターがアレンジされた形で登場!
バイクに乗るシンデレラは衝撃です。そして、物語中で端役ではないキャラクターたちは「ヒーロー」と呼ばれ、配置された後に使えるスキルを持ちます。その中でも、自分のデッキの中で1枚だけ指定できるリーダーはスペシャルスキルと呼ばれる奥義を持ちます。これらはカットインも含めて超豪華です。
衝撃のバイクに乗るシンデレラ。アイドル(志望?)
裸の王様はマッスル!ヘイトを集めてくれたりするスキルもある。
ゲームのキャラの魅力をきっかけに始めた私が、リボハチにおもしろさを感じる瞬間は
1.戦線管理をうまくやれたとき。
2.反射神経に依らない部分でプレイと思考の質の向上を明確に感じたとき。
3.賭けにでなければいけない状況に陥ったとき。
の3つです。(プラス勝った時のカットイン。かぐやはかなり、「わざとい」)
でも、戦線管理ってどうやるの?反射神経に依らないプレイの質って何よ?(3つめはやらないにこしたことないし・・・)ってなると思うんです。
このゲームにおける戦線管理を単純化していうとユニットと止まっている位置と使用したコストの総量です。そして、位置の基本的な考えとして、ユニットは相手のタワーに押しつければダメージが入ります。押しつけ切ってれば有利というものがあります。中途半端な位置にいると相手のタワーにダメージが入らないにも関わらず相手のタワーからのダメージをもらいます。不利です。
つまり、ユニットの居てほしい位置は下図のようになります。

守る場合の位置。タワーも防衛に参加させる
攻める場合の位置。タワーに攻撃を入れる。
そのためには、押し切れるなら前に、引きたいなら後ろの方にユニットを配置すると良いです。
使用したコストについて。コスト1のトランプ兵に対してコスト5の空飛ぶトランクを使った場合、使用したコストの差は4です。ということは、その4コストで他のことができます。何となくでよいので使用したコストをイーブン以上にするのを意識すると良いです。また、位置の話とも関わりますが、味方のタワーも攻撃できる位置まで引き込んでから相手のユニットを止めるとタワーはコスト0なのでうまく有利をとれます。
下側にゲージと持っている使用可能なコストが表示されている。ついでに前項の話だが、上はあんまりよくない位置。相手から見てタワーも防衛に参加させることができている。
質の向上について。 こちらは抽象論。さっきの話も含め、何か目標ができるようになることです!このゲームは比較的反射神経要素が薄いので、プレイ動画でみたプレイができるようになるとかなりいい感じになります。 勝てなくなったり、苦手だと思う相手のデッキ 、異様に強いと感じるヒーローがでてきたら、その名前をyoutube等で「リボハチ、ヒーロー」で検索すると対戦動画があがっているのでそれを見るとよいです。何をされたらイヤだという話は使っている側の方がはなしてくれるので。その後、そこではなされたことだけを頭に入れて試してみます。10個あったら10個取り入られるわけではないですが、1つでもできるようになると楽しいですよ!
あと、友人にプライベートマッチに乗ってくれる人がいると助かります。本当に。(移動中とか直後に移動とかで受けられないこともあるんですが)
あと、その他2つです。
このゲーム、ログボその他で貰える課金石の使い道はパックに相当するものを買うより、基本的には勝利した時のパックを開けるための時間を短縮するように使ったほうが早く強くなります。(未プレイだと何を言ってるかわからないと思いますが、ゲームを始めるとわかるはず……)
リーグを上げたときのボーナス課金は買う余裕があれば買ったほうがいいです。5倍お得とか出てますが、実際問題お得です。
ギルドに入った後はカード寄付はしたほうがお得…なのでトランプ兵とか使わない奴は寄付しちゃいましょう!(でもみんな本当に欲しいカードのほうをリクエストするので寄付できない……)

さて、ここまで話してきましたが、リーグを上げる間にデッキの組み方がわからない、という場合には以下のデッキを参考にしてみてください。といいつつ、私も大体紹介を受けたデッキです。でも、壁にぶち当たって停滞すると(特にリーグ4くらい)カード種類も増えないのでつらさが・・・となるので一応載せておきます。

リーグ3くらいまでのデッキ。オーソドックスな強襲デッキで、ガンガン攻めていきましょう!
リーグ4くらいからのデッキ。もともと紹介を受けたデッキで、赤鬼はハチ、松明はトランクでした。シンデレラ強い。
今はその辺を突破して「使いにくい」という噂のかぐやさんのデッキを組もうと試行錯誤しています。プレイ回数を重ねればきっとオリジナルの信じられるデッキが組めるようになるはず、なので、勝てないーとなったときに参考にしてみてください。

それでは、良きリボハチライフを。

2018年11月10日土曜日

[技術系]PyQ始めました→1週間の結果

11/2に下書きを書いて一週間。
PyQを続けた結果、どこまでクエストが消化できたのかとか
何ができるようになったのかとかを書きます。

(こっから11/2)
今先ほど、PyQを始めました。

理由は、C++という言語そのものに縛られたくないから。
言語は選択肢にしたいんだけれども、使う場面がないとどんどん置いて行かれてしまうので、Pythonも触ることにしました。実務で役立つかは謎です。
ただ、Pythonでシューティングとか作れると楽しいだろうぁ……。UnitTestとかが楽そうだし、ロジックの確認とかがスクリプト系なのでMATLABと同じように扱えそうでよさそうだな、と。

(こっから今書いてる部分)
で、どれくらいやったか。PyQのいいところはそのあたりが記録されているところ。

土日挟んで1週間で7.7時間やってこのくらいでした!


で、木曜日にポーカーの勝率計算をするスクリプトが書きたいなと思い、デッキをシャッフルしてドローするところまで実装してみました。プラスアルファでクラスの作成方法だけ勉強しています。

こっからモンテカルロ的に勝率計算をして、行列表示してみようかなと思います!では!

playingcard.py
import random

suitType = ['Spade', 'Heart', 'Club', 'Diamond']
numberType = [2,3,4,5,6,7,8,9,10,11,12,13,14]

class deck:
    def initialize(self):
        self.sortedDeck = []
        for suit in suitType:
            for number in numberType:
                self.sortedDeck.append({'Suit':suit,'Number':number})

    def shuffle(self):
        self.shuffledDeck = []
        for _ in range(len(self.sortedDeck)):
            card = self.sortedDeck.pop(random.randint(0, len(self.sortedDeck)-1))
            self.shuffledDeck.append(card)
    
    def draw(self):
        return self.shuffledDeck.pop()

    def __init__(self):
        self.initialize()

class view:
    def __init__(self):
        dummy = 0
    def print(self, hand):
        stringHand = []
        for card in hand:
            if card['Number'] == 14:
                number = 'A'
            elif card['Number'] == 13:
                number = 'K'
            elif card['Number'] == 12:
                number = 'Q'
            elif card['Number'] == 11:
                number = 'J'
            elif card['Number'] == 10:
                number = 'T'
            else:
                number = str(card['Number'])
            stringHand.append((card['Suit'],str(number)))
        print(stringHand)


def main():
    # 使用法的な感じ
    # deckクラスを生成、shuffleしてdrawする
    # viewerはAKQJTを1文字化する
    # card(hand配列の1要素)は辞書型であり、
    # keyは'Suit':strと'Number':int
    gameDeck = deck()
    viewer = view() 
    gameDeck.shuffle()

    hand = []
    hand.append(gameDeck.draw())
    hand.append(gameDeck.draw())

    viewer.print(hand)


if __name__ == '__main__':
    main()

2018年10月8日月曜日

[LOL]構成がよくわからず、世界戦を見るためにメモしてみた。

Eyes氏のLoL Team構成講座を聞きながらまとめてみました。

* 基本COMP(構成)
#凡例
#+ 構成名
# - 概要
#   @ 中心となるチャンピオン
#   # その他
 + プロテクトADC構成
  - ADCを守って集団戦でダメージを出してもらう。
    @ コグ=マウ、トゥイッチ等
 + シージ構成
   - 集団戦を避けて、直接タワーを殴る。
    @ ケイトリン
 + ポーク構成
   - 集団戦を避けて、体力差を一方的に作ってオブジェクトにつなげる。
    @ ゼラス
 + スプリットプッシュ構成
   - トップレーナ―を1v1の強さを使ってタワーを狙う。
    @ フィオラ、トリンダメア
 + 集団戦構成
   - エンゲージ、ディスエンゲージ、ゾーニングの組み合わせにより5v5が強い。
    @ ザック、アリスター
 + 少数戦(ピックアップ)構成
   - 1人捕まえて順番に倒す。
    @ ブリッツクランク、シンドラ、マルザハール
   # 捕まえる、1人フォーカスして倒す。
 + 1:3:1構成
   - 現在は中盤の戦術として使われる。1v1を2か所作る。
    @ アーリ、エコー、ルブラン、タロン、アカリ
-----------------------------------------------------------
* Tactics(戦術)
 + エンゲージ
  - 相手に仕掛ける。
 + ディスエンゲージ
  - 相手の行動をはねのける。
 + ゾーニング
  - 相手の行動位置を制限する。
-----------------------------------------------------------
* 応用構成
 + 構成は組み合わせが発生する。
  - ポークシージ構成
   @ ケイトリンとゼラスとかを取る。
  - 少数戦スプリットプッシュ構成
   @ スレッシュとフィオラとかを取る。
  # ここからは、組み合わせ無限大。
  # 複数の機能要素がこなせると評価が高いかもしれない。
 + 弱点とか相性はあるか。
  - 例:ポークシージ(ケイトリン、ラックス)
   @ 両者:エンゲージされたら弱そう。距離を一気に詰められるとやばそう。
   @ 相手:集団戦の強い、エンゲージができるチャンピオンを取ったら強そう。
   @ 自分:じゃあ、ディスエンゲージができるようにしたほうがよさそう。
  - 例:スプリットプッシュ(フィオラ)
   @ 両者:フィオラの1v1は強いよね。
   @ 相手:1v2以上を作っていけば、浮いてるはずだから倒せるよね。
   @ 相手:少数戦が強いキャッチができるチャンピオンを取ったほうがよさそう。
  - 例:プロテクトADC構成
   # 3コア完成までは弱いから、そこまで耐えられるようにしよう。

2018年8月15日水曜日

レンタルスペースの紹介記事

ゲームショップにある「レンタルスペース」を紹介します!
休日、ゲームやろうと思ったけど場所が無い!とか、いつも使ってる場所が使えない!とかいう場合に「こういう場所もあるよ!」という提案です。

使ったことが無い場所について、書いても無責任なので、紹介は私が個人的に使ったことある場所にしておこうと思います。

注意事項として、「お店でイベント等がある場合」は、勿論そちらが優先です。使用できない場合があるので、その場合は大人しく、別の場所を探すようにしましょう。前もって確認も有りだと思います。



イエローサブマリン 秋葉原店
平日:300円/1人(先着順)
休日:3000円/1テーブル(予約可)

秋葉原のイエローサブマリン、そのRPGショップに併設されたスペースです。テーブルが大体10個くらいあり、それぞれ最大6人まで使えたと記憶しています。
閉店30分前まで借りることが出来ます。私は先日、S.W.2.5をやるのに利用しました。ルールブックもその場で買えておススメ。なお、飲み物は自販機がありますが、軽食は売っていないのでお腹が空きそうなら買っていきましょう。匂いのあるものや汚れやすいものは駄目ですよ。

借りるときは、お金を握りしめてレジで「プレイスペースを借りたいです!」と言いましょう。

なお、1つ下のフロアにはTCGショップがあるので、MTGや遊戯王、W/S、Z/X等々をやりたい場合はそちらを。



ゲームショップとど
平日:300円/(1人・1時間)上限1500円
休日:400円/(1人・1時間)上限2000円

高田馬場駅から歩いて3分にあるボードゲームショップです。テーブルはうろ覚えですが5~6個(席数は22席)くらいだったと思います。こちらは、時間当たりで支払うシステムです。なので、確か後金制だったと思います。こちらはマジック・ザ・ギャザリングのお店でもあるため、MTGを遊んでも大丈夫です。



ゲームスペース 柏木
平日:1000円/1人
休日:1000円/1人 + 5時間オーバーで500円追加

新宿と新大久保の間にあるゲームスペースです。
挨拶が超大事なスペース。(どこでもそうなんですけどね!)
最近利用していないので雰囲気は、過去のものですが、いろんなゲームが遊ばれていた記憶があります。ドミニオンとか、カタンとか、ポーカーとか。
ここは、「ショップ」ではないので、一寸雰囲気的には違うかもしれません。
分からないこと、やっていいこと、悪いこと等の確認はしっかりしましょう。



番外:カラオケ
JOYSOUND 新宿西口店
平日:550円/1人 + ワンドリンクオーダー or ドリンクバー(600円)
休日:980円/1人 + ワンドリンクオーダー or ドリンクバー(600円)
(フリータイム料金:11:00~18:00/5:00~20:00)

カラオケです。他のショップには無い利点は、大体開いていること、ドリンク飲み放題であること、そして空調が最強で個室であることです。最悪、予定が決まっていれば予約しておく手があります。
デメリットは比較的高いこと、ボードゲーム等は完全持ち込み前提であることです。後、テーブルがちょっと小さいかもしれません。

私が案内された部屋は、ミラーボールとかもなく、通常照明だったのでTCGや軽ゲームをやるには向いていると思いますよ!

他にも、色々あるとは思いますが今回はこのあたりで!
良いリアルゲームライフを!