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で出力して、
こんなんできました。ついでに
出し手のマスタも作った。
コードに書いてないけど、Trimで消えないスペースとセル上で見えない改行に悩まされた。Chr(13)とChr(32)とChrW(160)あたりをReplaceするんや。
参考
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読み込む時にやったな。忘れてるなー。
参考
読み込んだ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); }
こう。
ふむ。できた。
参考
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っぽいのでそれを取得しとけば数値で扱えそう…。なんかだんだん不安になってきたな。
参考
ボタンを押して勝負する
選択時にそのまま勝負でもいいかなと思ったんだけど、なんとなくボタンを押して勝負する感じに。
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)); }
こんな感じになった。結局なんか同じ感じのコードが並んじゃったなぁ。
なんなんだろね、いまいち消化不良だ。
コメント