コンピュータに打たせる

開発目標

このページの目標は、これからリバーシの思考ルーチンを作っていくために、とにかくコンピュータに打たせることです。

思考ルーチン用のクラスを作る

思考ルーチン用に普通のクラスを作ります。

フォルダ構成

[ HariboteReversi ]
    [ src ]
        [ com.hp3200.boco.reversi ]
            HariboteReversi.java
            ReversiAI.java
            ReversiView.java
    [ gen ]
    [ Android 1.6 ]
    [ assets ]
    [ res ]
    AndroidManifest.xml
    default.properties
    proguard.cfg

こんな内容にします。構造の簡略化や今後の発展のために、setBoard()で現在の盤をセットして、think()で手を考えて、getPlace()で最善手を与えるというシステムにします。

ReversiAI.java

//リバーシ思考ルーチン
//2011/09/25  by boco.hp3200.com
//--------------------------------------------------------------------------
package com.hp3200.boco.reversi;

public class ReversiAI {
    private final int WALL = -1;
    private final int BLANK = 0;
    private final int PLAYER = 1;
    private final int COM = 2;
    
    private int[] board = new int[100];
    private int bestPlace;

    //コンストラクタ
    public ReversiAI() {
    }

    //処 理:盤を初期化する
    //引 数:startBoard……初めの盤
    //戻り値:なし
    public void setBoard(int[] startBoard) {
        for(int i=0;i<100;i++) {
            board[i] = startBoard[i];
        }
    }

    //処 理:最善手を返す
    //引 数:なし
    //戻り値:最善手
    public int getPlace() {
        return bestPlace;
    }
    
    //処 理:最善手を考える
    //引 数:myCoin……PLAYER or COM
    //戻り値:なし
    public void think(int myCoin) {
        int i;
        
        for(i=11;i<=88;i++) {
            if(board[i]==BLANK) {
                bestPlace = i;
            }
        }
    }

}

ReversiViewから読み出す

ReversiViewから今作ったReversiAIクラスを使ってCOMの指し手にします。具体的には、ReversiAIのオブジェクトを作って、そのオブジェクトを通して3つのメソッドを順に実行します。onDraw()とonTouchEvent()のCOMページを変更しましょう。

ReversiView.java

package com.hp3200.boco.reversi;

import android.content.Context;
import android.content.res.Resources;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.Canvas;
import android.graphics.Paint;
import android.view.MotionEvent;
import android.view.View;

class ReversiView extends View {
    …略…
    
    //描写処理
    @Override
    public void onDraw(Canvas c) {
        …略…
        
        switch(page) {
        …略…
        case COM:
            ai.setBoard(board);
            ai.think(COM);
            place = ai.getPlace();
            //ページ移動
            page = REVERS;
            invalidate();
            break;
        …略…
        }
    }
    
    //タッチ入力処理
    public boolean onTouchEvent(MotionEvent me) {
        …略…
        //タッチされた時
        if(me.getAction()==MotionEvent.ACTION_DOWN) {
            switch(page) {
            …略…
            case COM:
                break;
            …略…
            }
        }
        return true;
    }
    
    …略…
}

開発結果

これで思考ルーチンの雛形が出来ました。コンピュータが自動で石を置いてくれます。実行してみます。

完全にルール無視ですが、とにかく自動で石を置いてくれました。次回からは、思考ルーチンを育てます。まずはリバーシのルールを教えましょう。