marunomaruno-memo

marunomaruno-memo

[Android] ○×ゲーム

2012年05月04日 | Android
[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>
---

                                                                            以上


最新の画像もっと見る

コメントを投稿