人間対人間リバーシの完成!

開発目標

このページの目標は、タイトルを付けて、人間対人間のリバーシゲームを完成させることです。

タイトル画像を用意する

タイトル画像を作ります。タイトルに黒(先攻)か白(後攻)かの選択を与えることにします。

画像は、[ res ]→[ drawable-hdpi ]の中に入れます。

フォルダ構成

[ HariboteReversi ]
    [ src ]
    [ gen ]
    [ Android 1.6 ]
    [ assets ]
    [ res ]
        [ drawable-hdpi ]
            black.gif
            board.gif
            icon.png
            light.gif
            title.gif
            white.gif
        [ drawable-ldpi ]
        [ drawable-mdpi ]
        [ layout ]
        [ values ]
    AndroidManifest.xml
    default.properties
    proguard.cfg

タイトル画像を読み込んで表示する

タイトル画像を読み込んで表示します。

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 {
    …略…
    private final Bitmap IMG_LIGHT = BitmapFactory.decodeResource(res, R.drawable.light);
    private final Bitmap IMG_TITLE = BitmapFactory.decodeResource(res, R.drawable.title);
    
    …略…
    
    //描写処理
    @Override
    public void onDraw(Canvas c) {
        …略…
        
        switch(page) {
        case TITLE:
            //タイトル表示
            c.drawBitmap(IMG_TITLE, 0, 0, paint);
            break;
        …略…
        }
    }
    
    …略…
}

黒(先攻)か白(後攻)かの選択

タイトル画面でプレイヤーが黒になるか白になるか選択できるようにします。でも、現在はプレイヤーとコンピュータに区別がないのであまり意味ありませんが。

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 {
    …略…
    private final int[] MOVE = {-11, -10, -9, -1, 1, 9, 10, 11};
    private final int BLACK = 0;
    private final int WHITE = 1;
    
    …略…
    private int[] placeMap = new int[100];
    private int playerColor;
    
    …略…
    
    //描写処理
    @Override
    public void onDraw(Canvas c) {
        int i;

        //ボードを表示
        c.drawBitmap(IMG_BOARD, 0, 0, paint);
        for(i=11;i<=88;i++) {
            if(playerColor==BLACK) {
                if(board[i]==PLAYER) c.drawBitmap(IMG_BLACK, 48*(i%10), 48*(i/10), paint);
                if(board[i]==COM) c.drawBitmap(IMG_WHITE, 48*(i%10), 48*(i/10), paint);
            } else {
                if(board[i]==PLAYER) c.drawBitmap(IMG_WHITE, 48*(i%10), 48*(i/10), paint);
                if(board[i]==COM) c.drawBitmap(IMG_BLACK, 48*(i%10), 48*(i/10), paint);
            }
        }
        
        …略…
    }
    
    //タッチ入力処理
    public boolean onTouchEvent(MotionEvent me) {
        …略…
        
        //タッチされた時
        if(me.getAction()==MotionEvent.ACTION_DOWN) {
            switch(page) {
            case TITLE:
                //ゲームの初期化
                for(i=0;i<100;i++) board[i] = 0;
                for(i=0;i<10;i++) board[i] = -1;
                for(i=1;i<9;i++) board[i*10] = -1;
                for(i=1;i<9;i++) board[i*10+9] = -1;
                for(i=0;i<10;i++) board[i+90] = -1;
                //黒(先攻)を選択
                if(2<=padX && padX<=3 && 7<=padY && padY<=8){
                    playerColor = BLACK;
                    board[44] = COM;
                    board[45] = PLAYER;
                    board[54] = PLAYER;
                    board[55] = COM;
                    turn = PLAYER;
                    makePlaceMap(turn);
                    //ページ移動
                    page = TURN;
                    invalidate();
                }
                //白(後攻)を選択
                if(6<=padX && padX<=7 && 7<=padY && padY<=8){
                    playerColor = WHITE;
                    board[44] = PLAYER;
                    board[45] = COM;
                    board[54] = COM;
                    board[55] = PLAYER;
                    turn = COM;
                    makePlaceMap(turn);
                    //ページ移動
                    page = TURN;
                    invalidate();
                }
                break;
            …略…
            }
        }
        return true;
    }
    
    …略…
}

開発結果

やったー。リバーシが完成しました!実行してみます。

さあ、ここからCOMの思考ルーチン開発に入ります。次回は、ルール無視で、とにかくCOMに打たせます。

関連ページ

コンピュータに打たせる
Android用リバーシゲームの作り方