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

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

https://dalomo.net/blog/2019/05/30/464/

の続き。

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

いくつか調べてみたところ、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するんや。

参考

https://thom.hateblo.jp/entry/2016/09/20/150650

https://www.lifedesignedit.com/note/remove_white-space_in_vba

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読み込む時にやったな。忘れてるなー。

参考

https://qiita.com/atsuk0r0/items/8d6e4b57821817b65bd0

https://www.programming-shimomura.com/2017/06/23/%E3%80%90android%E3%80%91csv%E8%AA%AD%E3%81%BF%E8%BE%BC%E3%81%BF%E3%81%AE%E5%AE%9F%E8%A3%85%EF%BC%88%E3%82%B5%E3%83%B3%E3%83%97%E3%83%AB%E4%BB%98%E3%81%8D%EF%BC%89/

https://www.autumn-color.com/archives/1506

https://docs.oracle.com/javase/jp/8/docs/api/java/util/StringTokenizer.html

http://java-code.jp/799

読み込んだ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);

}

こう。

ふむ。できた。

参考

https://developer.android.com/guide/topics/ui/controls/spinner?hl=ja

https://developer.android.com/reference/android/widget/ArrayAdapter.html?hl=ja

https://www.javadrive.jp/android/arrayadapter/index2.html

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っぽいのでそれを取得しとけば数値で扱えそう…。なんかだんだん不安になってきたな。

参考

https://advancement-of-it-dwarfs.blogspot.com/2018/01/android-spinner-how-to-get-select-event.html

ボタンを押して勝負する

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

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));
}

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

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

カテゴリー: したい タグ: , , , , パーマリンク

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です