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));
}
こんな感じになった。結局なんか同じ感じのコードが並んじゃったなぁ。
なんなんだろね、いまいち消化不良だ。
