[Android] ○×ゲーム ================================================================================ ○×ゲーム。 LinearLayout、TextView、Button だけでできるサンプル。 コードの解説はとくにない。 ▲ レイアウト LinearLayout、TextView、Button だけでで構成。 3x3 は、LinearLayout をネストさせている。 ボタンは、1~9 までの番号をつける。 □ res/layout/main.xml --- <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="fill_parent" android:layout_height="fill_parent" android:orientation="vertical" > <TextView android:layout_width="fill_parent" android:layout_height="wrap_content" android:text="@string/guide" android:textAppearance="?android:attr/textAppearanceMedium" /> <LinearLayout android:id="@+id/linearLayout1" android:layout_width="match_parent" android:layout_height="wrap_content" > <Button android:id="@+id/button1" android:layout_width="0dp" android:layout_height="wrap_content" android:layout_weight="1" android:onClick="onClickButtonHandler" android:textAppearance="?android:attr/textAppearanceLarge" /> <Button android:id="@+id/button2" android:layout_width="0dp" android:layout_height="wrap_content" android:layout_weight="1" android:onClick="onClickButtonHandler" android:textAppearance="?android:attr/textAppearanceLarge" /> <Button android:id="@+id/button3" android:layout_width="0dp" android:layout_height="wrap_content" android:layout_weight="1" android:onClick="onClickButtonHandler" android:textAppearance="?android:attr/textAppearanceLarge" /> </LinearLayout> <LinearLayout android:id="@+id/linearLayout2" android:layout_width="match_parent" android:layout_height="wrap_content" > <Button android:id="@+id/button4" android:layout_width="0dp" android:layout_height="wrap_content" android:layout_weight="1" android:onClick="onClickButtonHandler" android:textAppearance="?android:attr/textAppearanceLarge" /> <Button android:id="@+id/button5" android:layout_width="0dp" android:layout_height="wrap_content" android:layout_weight="1" android:onClick="onClickButtonHandler" android:textAppearance="?android:attr/textAppearanceLarge" /> <Button android:id="@+id/button6" android:layout_width="0dp" android:layout_height="wrap_content" android:layout_weight="1" android:onClick="onClickButtonHandler" android:textAppearance="?android:attr/textAppearanceLarge" /> </LinearLayout> <LinearLayout android:id="@+id/linearLayout3" android:layout_width="match_parent" android:layout_height="wrap_content" > <Button android:id="@+id/button7" android:layout_width="0dp" android:layout_height="wrap_content" android:layout_weight="1" android:onClick="onClickButtonHandler" android:textAppearance="?android:attr/textAppearanceLarge" /> <Button android:id="@+id/button8" android:layout_width="0dp" android:layout_height="wrap_content" android:layout_weight="1" android:onClick="onClickButtonHandler" android:textAppearance="?android:attr/textAppearanceLarge" /> <Button android:id="@+id/button9" android:layout_width="0dp" android:layout_height="wrap_content" android:layout_weight="1" android:onClick="onClickButtonHandler" android:textAppearance="?android:attr/textAppearanceLarge" /> </LinearLayout> <TextView android:id="@+id/textResult" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="" android:textAppearance="?android:attr/textAppearanceLarge" /> </LinearLayout> --- ▲ アクティビティ ゲームは、ボードの 3x3 のボタンの配置が 1 2 3 4 5 6 7 8 9 のとき、 1-2-3, 4-5-6, 7-8-9, 1-4-7, 2-5-8, 3-6-9, 1-5-9, 3-5-7 でがそろった方の勝ち。力技でチェックしている。 □ MaruBatsu01Activity.java --- package jp.marunomaruno.android.marubatsu; import java.util.Random; import jp.marunomaruno.android.marubatsu.R; import android.app.Activity; import android.os.Bundle; import android.view.View; import android.widget.Button; import android.widget.TextView; /** * ○×ゲーム * @author marunomaruno * */ public class MaruBatsu01Activity extends Activity { public static int SIZE = 3; // ボードのサイズ private static final int[] BOARD = { R.id.button1, R.id.button2, R.id.button3, R.id.button4, R.id.button5, R.id.button6, R.id.button7, R.id.button8, R.id.button9, }; private boolean isFinish = false; // ゲーム終了ならtrue /** Called when the activity is first created. */ @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); initialize(); } /** * ボードを初期化する。 */ private void initialize() { for (int id : BOARD) { Button button = (Button) findViewById(id); button.setText(R.string.blank); } } public void onClickButtonHandler(View view) { // ゲーム終了のときは何もしない if (isFinish) { return; } Button button = (Button) view; if (button.getText().equals(getString(R.string.blank))) { button.setText(R.string.maru); if (!complete()) { setBatsu(); complete(); } } } /** * ゲームが完了したかどうかを判断する。 * @return 完了したらtrue */ private boolean complete() { TextView textResult = (TextView) findViewById(R.id.textResult); // 1-2-3, 4-5-6, 7-8-9, // 1-4-7, 2-5-8, 3-6-9, // 1-5-9, 3-5-7 のいずれかが同じなら勝ち final int[][] PATTERN = { {0, 4, 8}, {2, 4, 6}, {0, 1, 2}, {3, 4, 5}, {6, 7, 8}, {0, 3, 6}, {1, 4, 7}, {2, 5, 8}, }; String winner = null; for (int[] pattern : PATTERN) { winner = judge(pattern); if (winner != null) { textResult.setText(winner + getString(R.string.win)); isFinish = true; return true; } } if (isDraw()) { textResult.setText(R.string.draw); isFinish = true; } return false; } /** * 引き分けかどうかを判定する。 * @return 引き分けのときtrue */ private boolean isDraw() { int count = 0; for (int id : BOARD) { Button button = (Button) findViewById(id); if (button.getText().equals(getString(R.string.blank))) { count++; } } // 空白ブロックが1個以下のときは引き分け return count <= 1; } /** * 「×」をランダムに配置する。 */ private void setBatsu() { int index = 0; Random random = new Random(); do { index = random.nextInt(SIZE * SIZE); } while (!isBlank(index)); Button button = (Button) findViewById(BOARD[index]); button.setText(R.string.batsu); } /** * 指定されたインデックスのボタンが空白かどうか判断する。 * @param index インデックス * @return 空白のときtrue */ private boolean isBlank(int index) { Button button = (Button) findViewById(BOARD[index]); return button.getText().equals(getString(R.string.blank)); } /** * 指定された組のボタンで、誰が勝ちかを判定する。 * @param pattern 勝ちパターンのインデックスの組 * @return 勝ちの人の名前。勝ちがないときはnull */ private String judge(int[] pattern) { assert pattern.length == SIZE; Button buttonA = (Button) findViewById(BOARD[pattern[0]]); Button buttonB = (Button) findViewById(BOARD[pattern[1]]); Button buttonC = (Button) findViewById(BOARD[pattern[2]]); if (buttonA.getText().equals(buttonB.getText()) && buttonB.getText().equals(buttonC.getText())) { if (buttonA.getText().equals(getString(R.string.maru))) { return getString(R.string.you); } else if (buttonA.getText().equals(getString(R.string.batsu))) { return getString(R.string.computer); } } return null; } } --- ▲ リソース □ res/values/strings.xml --- <?xml version="1.0" encoding="utf-8"?> <resources> <string name="hello">Hello World, MaruBatsu01Activity!</string> <string name="app_name">○×(まるばつ)</string> <string name="guide">あなたが○です。空いているところをクリックしてください。</string> <string name="win">の勝ち</string> <string name="draw">引き分け</string> <string name="you">あなた</string> <string name="computer">アンドロイド君</string> <string name="maru">○</string> <string name="batsu">×</string> <string name="blank"></string> </resources> --- 以上