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.autumn-color.com/archives/1506
https://docs.oracle.com/javase/jp/8/docs/api/java/util/StringTokenizer.html
読み込んだ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)); }
こんな感じになった。結局なんか同じ感じのコードが並んじゃったなぁ。
なんなんだろね、いまいち消化不良だ。