タッチで石を置く

開発目標

このページの目標は、画面をタッチしたら、その場所に白黒の石が置かれるようにすることです。

ゲームを初期化する

タッチされたとき、ページがタイトルであれば、ゲームを初期化して、再描写します。再描写はinvalidate()で実行できます。つまりinvalidate()でonDraw()が1回実行されます。

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 int page = TITLE;
    private int turn;
    
    public ReversiView(Context context) {
        super(context);
    }
    
    //描写処理
    @Override
    public void onDraw(Canvas c) {
        …略…
    }
    
    //タッチ入力処理
    public boolean onTouchEvent(MotionEvent me) {
        int i;
        
        //タッチされた時
        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;
                board[44] = COM;
                board[45] = PLAYER;
                board[54] = PLAYER;
                board[55] = COM;
                turn = PLAYER;
                invalidate();
                break;
            …略…
            }
        }
        return true;
    }
}

ページの移動を制御する

今後のゲームの姿をイメージして、ページの移動を制御します。どのページでタッチされたら、どのページへ移動するのか決定します。

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 {
    …略…
    
    public ReversiView(Context context) {
        super(context);
    }
    
    //描写処理
    @Override
    public void onDraw(Canvas c) {
        int i;
        
        //ボードを表示
        …略…
        
        switch(page) {
        …略…
        case TURN:
            //ページ移動
            page = turn;
            invalidate();
            break;
        …略…
        case REVERS:
            //ページ移動
            page = CONTROL;
            invalidate();
            break;
        case CONTROL:
            //ターンを交代
            if(turn==PLAYER) turn = COM;
            else turn = PLAYER;
            //ページ移動
            page = TURN;
            invalidate();
            break;
        …略…
        }
    }
    
    //タッチ入力処理
    public boolean onTouchEvent(MotionEvent me) {
        int i;
        
        //タッチされた時
        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;
                board[44] = COM;
                board[45] = PLAYER;
                board[54] = PLAYER;
                board[55] = COM;
                //ページ移動
                page = TURN;
                invalidate();
                break;
            case PLAYER:
                //ページ移動
                page = REVERS;
                invalidate();
                break;
            case COM:
                //ページ移動
                page = REVERS;
                invalidate();
                break;
            …略…
            }
        }
        return true;
    }
}

タッチで石を置く

画面をタッチすれば、そこに石が置かれるようにします。

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 int turn;
    private int place;
    
    public ReversiView(Context context) {
        super(context);
    }
    
    //描写処理
    @Override
    public void onDraw(Canvas c) {
        int i;
        
        //ボードを表示
        …略…
        
        switch(page) {
        …略…
        case REVERS:
            //置いて裏返す
            reverse(turn, place);
            //ページ移動
            page = CONTROL;
            invalidate();
            break;
        …略…
        }
    }
    
    //タッチ入力処理
    public boolean onTouchEvent(MotionEvent me) {
        int i;
        int padX = (int)(me.getX()/48);
        int padY = (int)(me.getY()/48);
        
        //タッチされた時
        if(me.getAction()==MotionEvent.ACTION_DOWN) {
            switch(page) {
            …略…
            case PLAYER:
                place = padX+padY*10;
                //ページ移動
                page = REVERS;
                invalidate();
                break;
            case COM:
                place = padX+padY*10;
                //ページ移動
                page = REVERS;
                invalidate();
                break;
            …略…
            }
        }
        return true;
    }
    
    //置いて裏返す
    void reverse(int myCoin, int p) {
        int yourCoin = PLAYER;
        
        if(myCoin==PLAYER) yourCoin = COM;

        board[p] = myCoin;
    }
}

開発結果

これで画面タッチで石が置けるはずです。実行してみます。

タッチしてみます。

お、置けました。でも、ルール無視です。次回は、石を置けない所には、置けないようにします。