そこに置くことができるのか?

開発目標

このページの目標は、石を置けないマスには、置けないように制限をかけることです。ついでに、置けるマスには色を着けてみます。

置けるところと置けないところ

今のままでは、どこでもコインを置けるので、ルールを設定して、置けない所には置けないようにします。

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 RESULT = 7;
    private final int[] MOVE = {-11, -10, -9, -1, 1, 9, 10, 11};
    
    …略…
    private int turn;
    private int[] placeMap = new int[100];
    
    …略…
    
    //描写処理
    @Override
    public void onDraw(Canvas c) {
        …略…
        
        switch(page) {
        …略…
            break;
        case PLAYER:
            makePlaceMap(PLAYER);
            break;
        case COM:
            makePlaceMap(COM);
            break;
        …略…
        }
    }
    
    //タッチ入力処理
    public boolean onTouchEvent(MotionEvent me) {
        …略…
        
        //タッチされた時
        if(me.getAction()==MotionEvent.ACTION_DOWN) {
            switch(page) {
            …略…
            case PLAYER:
                if(placeMap[padX+padY*10]>0) {
                    place = padX+padY*10;
                    //ページ移動
                    page = REVERS;
                    invalidate();
                }
                break;
            case COM:
                if(placeMap[padX+padY*10]>0) {
                    place = padX+padY*10;
                    //ページ移動
                    page = REVERS;
                    invalidate();
                }
                break;
            …略…
            }
        }
        return true;
    }
    
    …略…
    
    //どこに置けるか?
    public boolean makePlaceMap(int myCoin) {
        int yourCoin = PLAYER;
        int i, j;
        boolean pass = true;
        
        if(myCoin==PLAYER) yourCoin = COM;
        
        for(int p=0;p<100;p++) {
            placeMap[p] = 0;
            if(0<p && p<100 && board[p]==0) {
                for(i=0;i<8;i++) {
                    if(board[p+MOVE[i]]==yourCoin) {
                        for(j=2;j<8;j++) {
                            if(board[p+MOVE[i]*j]==myCoin) {
                                placeMap[p] += j-1;
                                pass = false;
                                break;
                            } else if(board[p+MOVE[i]*j]==yourCoin) {
                            } else {
                                break;
                            }
                        }
                    }
                }
            }
        }
        return pass;
    }
}

置けるところ表示する

置けるところを黄色く表示してみます。

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 PLAYER:
            makePlaceMap(PLAYER);
            //置ける所を表示
            for(i=11;i<=88;i++) {
                if(placeMap[i]>0) c.drawBitmap(IMG_LIGHT, 48*(i%10), 48*(i/10), paint);
            }
            break;
        case COM:
            makePlaceMap(COM);
            //置ける所を表示
            for(i=11;i<=88;i++) {
                if(placeMap[i]>0) c.drawBitmap(IMG_LIGHT, 48*(i%10), 48*(i/10), paint);
            }
            break;
        …略…
        }
    }
    
    …略…
}

開発結果

これでどこでも置ける訳ではなくなりました。実行してみます。

いっぱい画面をタッチして、確認してみます。

ちゃんとルールは守られているようです。次回は、裏返す石を、裏返すルールを実装します。これが終われば、リバーシっぽい物から、リバーシへの昇格です。