2017年11月25日土曜日

Kotolin in Android アプリ

Android版勝率カウンタですが、前にも言った通りKotlinという言語で書いてます。
便利だなー、と思うところをつらつらと書いていきます。

ソース見ながら適当に書くので順番は適当です。

EventListnerが簡単に書ける。
findViewById<Button>(R.id.buttonKill).setOnClickListener{
    kill++
    updateText() 
}
Killボタン押したときの動作ですね。
簡単な動作をシンプルに書けます。

when:場合分けがわかりやすく書ける
nowArp -=when (nowArp){
    in 0..99->0
    in 100..299->5
    in 300..699->6
    in 700..1199->10
    in 1200..1999->15
    else ->20
負けた時のARPの変化です。
現在のランクによって減るポイントが異なるのですが、範囲を条件にできるので簡潔に書けます。
また、値を返すことができるのも便利ですね。
ランクの割り出しも場合分けが多いですが同様にやってます。

コレクションの操作が楽しい
setRate(R.id.forestRate,{it.stage==textForest})
setRate(R.id.forestTodayRate,{isToday(it.date)&&it.stage==textForest})
private fun setRate(id:Int,f:(Record)->Boolean) {
    val r=app.records.filter { f(it)}
    val win=r.count{it.result==textWin}
    val count=r.count()
    val s =if (count != 0) {"%.1f%%".format(win * 100.0 / count)} else ""
    findViewById<EditText>(id).setText(s)
}
勝率の計算はこんな感じでやってます。

recordsが RecordクラスのListになっていて、全結果を保持しています。
そこでステージ、日付、結果でfilterをかけて当日、トータルの勝率を割り出しています。
コレクションの操作自体はC#のLINQで知ったのですが、こちらの書式のほうが好きですね。

コレクション操作でもう一個肝なのがグラフ作成時ですね
val list= mutableListOf<CandleEntry>()
val dayList=app.records.map{ Record.getDay(it.date)}.toSet()

val yAxis= mutableListOf<String>()

for((index,day) in dayList.withIndex()){
    val dayData=app.records.filter { Record.getDay(it.date)==day }
    val start=dayData.first().old_arp
    val end=dayData.last().arp
    val max=dayData.maxBy{it.arp}!!.arp
    val min=dayData.minBy{it.arp}!!.arp
    list.add(CandleEntry(index.toFloat(),max.toFloat(),min.toFloat(),start.toFloat(),end.toFloat()))
    yAxis.add(day)
}
ろうそく足チャート用のデータ作成です。
まずX軸用のラベルdayListを作成。mapで日付だけのリストをつくってtoSetで重複削除。
Y軸用データは日付ごとのRecordリスト:dayDataを取得してその中から開始値、終了値、最大値、最小値を割り出していきます。

後、ちょこちょこと出てきてますが強力な型推論は便利です。
変数定義時に型名を書かなきゃいけないのはほとんどないし、間違えるとすぐ警告が出るので助かります。

実際のところ、そんなにプログラムの知識もないし深く考えないので、これでいいのかどうか不安になりつつやってます。
解説にもなってないとは思いますがこんな感じで楽しくいじっています。

2017年11月23日木曜日

12月バトルアリーナ更新

前々から12月にバトルアリーナのアップデートがあるという話がありましたが、ようやく内容が発表されました。

武器3種の入れ替えと新ステージの追加。
慣れ親しんだ弓とお別れは辛いですが・・・あれ?ステージの追加ということは勝率カウンタも?
ってことで早速仮に実装しました。
画面がかなり狭くなってきました。
情報もごちゃごちゃした感じで見づらい?
あと、ほんとにステージ追加だったのかステージ更新だったかちょっと自信がないです。

もうちょっと何とかならないかな、と思ってもいいアイデアが浮かばない・・・。

2017年11月19日日曜日

バトルアリーナ勝率カウンタ進捗

ゲーム内では、負けまくってレジェンドから落ちたり、かろうじて復帰したりとドタバタしてますが、アプリも相変わらずプログラム中。



今日は勝率を追加。一応、ライブラリのほうで拡大縮小も出来るみたい。これに任せればいいかな?
この他、場所別の勝率とかも追加しようと思うんだけど、どうやって表示させようかな

2017年11月18日土曜日

バトルアリーナ勝率カウンタのその後

PSO2バトルアリーナの勝率記録するアプリのAndroid版、どうしたもんかなぁとソースをこねくり回していたところ、いいものを見つけました。

MPAndroidChart
https://github.com/PhilJay/MPAndroidChart

グラフを表示してくれるライブラリです。
これでアプリ上でグラフにすれば手軽に情報が見れていいかも。
アプリの構成をどうするかは要検討ですが。

ってことで、簡単に実装してみて、実際に記録してるデータをどうにかぶっこんで表示したのがこちら
面白そうだったのでろうそく足チャートにしてみました。
なかなかカオスなことがわかりますね。

ただ、このままデータが増えると表示しきれないだろうから月ごと表示とかいろいろ考えないとダメっぽいですね。
ログ自体もそれなりに容量食うはずなので管理も考えないと。
実用に耐えるレベルになるまでバトルアリーナ続くかな・・・。

2017年11月3日金曜日

10月のバトルアリーナ

というわけで、PSO2バトルアリーナ10月の成績です。

右肩下がりですね…
勝率も最終的に5割割ってます。

試合内容的にも味方に勝たせてもらった的なことも多く、また自分が最後にやられたことで負けることもしばしば。
精進しないとです。

また、こうやってグラフにまとめてるときにデータ形式もちょっと不満あったので少し調整中。
どうやって落ち着けようかな。

2017年11月2日木曜日

PSO2のバトルアリーナにハマり中

ずいぶんと放置してたけど久々に書いてみる

SEGAのファンタシースターオンライン2にハマっています。
https://pso2.jp/

ログを見る限り2012/07/10に開始したので、前回の投稿の少しあとからずっとやってることになりますね。
ゲーム本編、オフラインイベントなどなどいろいろな要素もありますが、現在特にハマってるのが対人コンテンツであるバトルアリーナ。
6人対6人、ランダムに与えられる武器でポイントを集めながら戦うコンテンツになります。
正直バランスはどうなのかと思いつつも、楽しいのでひたすらやりこんでいます。
ついでに動画配信なんかも始めてしまったり。


で、ここからが本題なのですが画面右に移ってるツール。
どこのステージでどれくらい勝ってるか記録しているのですが、当然自作です。
勉強もかねてC#で組んであります。
データをListにしてLinQで加工して表示する単純なもの。
CSVで保存してあるので、あとからExcelでグラフ化もできるかな、と。

などと作ってるうちに今度聞きつけたのがKotlinなる言語がAndroidに正式採用されたというニュース。
[商品価格に関しましては、リンクが作成された時点と現時点で情報が変更されている場合がございます。]
Kotlinスタートブック 新しいAndroidプログラミング [ 長澤太郎 ]
価格:3780円(税込、送料無料) (2017/11/2時点)

[商品価格に関しましては、リンクが作成された時点と現時点で情報が変更されている場合がございます。]
Kotlinイン・アクション [ Dmitry Jemerov ]
価格:4114円(税込、送料無料) (2017/11/2時点)


どんなのかな?と調べてるうちにこの勝率カウントツールをAndroidで作ったら面白いかもしれない、と思い作ってみました。
基本的に同じことしているものですが、CSVを共有ボタンからGoogleドライブにあげればGoogleスプレッドシートで編集できるのでこれは面白いかもと思ってます。
自己満足で終わるか、公開するか。どうしようかな。