じゃんけんアプリ RPS-101を実装したい

スポンサーリンク
スポンサーリンク

RPS-101 101手あるじゃんけん

じゃんけんアプリ色々
じゃんけんアプリ本を読んでいたらじゃんけんアプリの決定表を用いた実装方法が載っていた。目からウロコだったので書いてみたくなった。初学者に教育する流れとしてよく使われるらしいので周知の物みたいだけど。関係ないけど新しくアプリ作ろうとしたら選択...

の続き。

スポンサーリンク

もうちょっと整形するんじゃ

いくつか調べてみたところ、JavaにはMapというものがあるみたい。連想配列っていうみたい。他にList っていうのもある。この前の表をもうちょい整形して、csvとかにしてAndroidStudioで読み込んでやれば扱えそう。多次元配列でもいいんかな。例えば

ResultSentence[1][2] = "OUTCLASSES TORNADO"
ResultSentence[1][3] = "CLEARS QUICKSAND"
…
ResultSentence[101][50] = "FLIES OVER SPIDER"

みたいな?うーん。Map使ったことないから使ってみたいな。ということで、

Sub setno()

    For i = 101 To 1 Step -1
    
        Columns(i).Insert Shift:=xlToRight, CopyOrigin:=xlFormatFromLeftOrAbove
    
        For j = 2 To 51
        
            Dim hand As Long
        
            If j + i - 1 > 101 Then
                hand = j + i - 102
            Else
                hand = j + i - 1
            End If
            
            Cells(j, i).Value = CStr(i) & "_" & CStr(hand)
            
        Next j

    Next i
    
End Sub

こんなんと、

Sub move()

    For i = 3 To 201 Step 2
        rc = Cells(Rows.Count, 1).End(xlUp).Row
        
        Range(Cells(1, i), Cells(50, i + 1)).Copy Range("A" & rc + 1)
        Range(Cells(1, i), Cells(50, i + 1)).ClearContents
    Next i

End Sub

こんなん書いて、カンマ区切りcsvで出力して、

https://dalomo.net/blog/files/ResultSentence.csv

こんなんできました。ついでに

https://dalomo.net/blog/files/Hands.csv

出し手のマスタも作った。

コードに書いてないけど、Trimで消えないスペースとセル上で見えない改行に悩まされた。Chr(13)とChr(32)とChrW(160)あたりをReplaceするんや。

参考

Excel TRIM関数で消えない謎の半角スペースをVBAでなんとかする - t-hom’s diary
先日、仕事で受け取ったExcelデータにTRIM関数で除去できない謎の半角スペースが混じっていた。その現象を再現したのがこちら。 A1セルとA2セルは全く同じに見えるが、A1セルの1文字目はトリムできない謎のスペース。A2セルの方は通常のス...
なぜか消せない空白を削除する | Life Design Edit
スポンサーリンク

CSVの読み込み

public Map CSV2Map(String TargetCSV) {
    Map<String, String> map = new HashMap<>();

    try {
        InputStream inputStreamResult = getResources().getAssets().open(TargetCSV);
        InputStreamReader inputStreamReader = new InputStreamReader(inputStreamResult);
        BufferedReader bufferedReader = new BufferedReader(inputStreamReader);

        String line;
        while ((line = bufferedReader.readLine()) != null) {
            String[] strArray = line.split(",");
            map.put(strArray[0], strArray[1]);
        }

    } catch (IOException e) {
        e.printStackTrace();
    }

    return map;
}
ResultSentence = CSV2Map("ResultSentence.csv");

こんなコードを書いて、csvからMapに格納する。これそういえばjson読み込む時にやったな。忘れてるなー。

参考

Java Mapの使い方 - Qiita
はじめにスッキリわかるサーブレット&JSP入門にて勉強していて何気なく使っていたHashMapがわかったつもりになっていたのでまとめてみた。Mapの使い方マップ(Map)は、2つの情報をキー…
【Android】CSV読み込みの実装 – 読書大好きプログラマーの記録
AndroidでAssetsにあるCSVファイルを読み込むサンプルプログラム
AndroidでCSVファイルを読み込みたいと思いいろいろと調べていました調べるといろいろとでてきますが、もっと使いやすくならないかなぁということで自分なりに使いやすいCSVファイルのプログラムを作ってみたので記事にしておきます
StringTokenizer (Java Platform SE 8)
splitメソッド | Javaコード入門
Java入門の基礎知識からコード確認、索引、目的別検索までWebエンジニアの為Javaコード辞典。
スポンサーリンク

読み込んだCSVをSpinnerにセットする

手数分ボタンを設置するわけにいかんので、なんかないかなーと調べてみたらSpinnerというのがあった。ドロップダウンリストみたいなもんみたい。ところが、Spinnerを作成する時にはAdapterが必要なんだけど、AdapterはResourceに配列か、データベースクエリかで、配列の場合Listか文字列Resource(String.xmlとか)でないと駄目っぽい。なんだと…。ここら辺よく分かってない。.createFromResourceだと駄目で、.Addする分には大丈夫なのかな。試しにとりあえず書いてみたけど

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_rps101);

    ResultSentence = CSV2Map("ResultSentence.csv");
    Hands = CSV2Map("Hands.csv");

    spinner = findViewById(R.id.spinner);
    arrayAdapter.add(Hands.get("1")); ←ここでエラー。
}

駄目でした。

やっぱMapじゃなくて配列のがいいのか。そもそもcreatefromresourceってやんなきゃあかんのかな。それかnew?つーことで

public String[] CSV2Array(String TargetCSV) {
    String[] rtarray = new String[102];

    try {
        InputStream inputStreamResult = getResources().getAssets().open(TargetCSV);
        InputStreamReader inputStreamReader = new InputStreamReader(inputStreamResult);
        BufferedReader bufferedReader = new BufferedReader(inputStreamReader);

        String line;
        while ((line = bufferedReader.readLine()) != null) {
            String[] strArray = line.split(",");
            rtarray[Integer.parseInt(strArray[0])] = strArray[1];
        }

    } catch (IOException e) {
        e.printStackTrace();
    }

    return rtarray;
}

CSV2Mapをコピペし配列っぽくしてみる。んで

protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_rps101);

    ResultSentence = CSV2Map("ResultSentence.csv");
    Hands = CSV2Array("Hands.csv");

    spinner = findViewById(R.id.spinner);
    arrayAdapter = new ArrayAdapter<>(this, R.layout.support_simple_spinner_dropdown_item, Hands);
    spinner.setAdapter(arrayAdapter);

}

こう。

ふむ。できた。

参考

アプリにスピナーを追加する  |  Views  |  Android Developers
ArrayAdapter  |  Android Developers
404 File Not Found
スポンサーリンク

Spinnerで選択したものを取得

spinner.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() {
    @Override
    public void onItemSelected(AdapterView<?> adapterView, View view, int i, long l) {
        myHand = i;
        
    }

    @Override
    public void onNothingSelected(AdapterView<?> adapterView) {

    }
});

こんな…?int i がpositionっぽいのでそれを取得しとけば数値で扱えそう…。なんかだんだん不安になってきたな。

参考

ブログが見つかりません
Blogger は Google のブログ公開ツールで、世界中のユーザーとアイデアの共有を簡単に行うことができます。Blogger では、テキスト、写真、動画を個人のブログやチーム ブログに簡単に投稿することができます。
スポンサーリンク

ボタンを押して勝負する

選択時にそのまま勝負でもいいかなと思ったんだけど、なんとなくボタンを押して勝負する感じに。

public void Bout(View view) {
    Toast toast;
    Random rand = new Random();
    int eneNum;
    int resNum;
    String resKey = null;
    String winHand = null;

    if (myHand < 1 || myHand > 101) {
        toast = Toast.makeText(this, "select hand", Toast.LENGTH_SHORT);
        toast.show();
        return;
    }

    eneNum = rand.nextInt(101) + 1;
    tvEnemy.setText(Hands[eneNum]);

    resNum = (myHand - eneNum + 101) % 101;

    if (resNum == 0) {
        tvResult.setText("draw");
    } else if (resNum >= 1 && resNum <= 50) {
        tvResult.setText("lose");
        winHand = Hands[eneNum];
        resKey = eneNum + "_" + myHand;
    } else if (resNum >= 51) {
        tvResult.setText("win");
        winHand = Hands[myHand];
        resKey = myHand + "_" + eneNum;
    }

    tvResultSentence.setText(winHand + " " + ResultSentence.get(resKey));
}

こんな感じになった。結局なんか同じ感じのコードが並んじゃったなぁ。

なんなんだろね、いまいち消化不良だ。

コメント

タイトルとURLをコピーしました