카테고리 없음

Android Card Game example, Part 4

Soul-Learner 2012. 5. 1. 13:30

Android Card Game example Part 4

6개의 카드 중에서 이용자가 터치한 2개의 카드가 동일한 색상인지 확인하여 동일한 경우에만 카드의 앞면을 보여주는 예

CardGameActivity.java

package test.android.cardgame;


import android.app.Activity;

import android.os.Bundle;


public class CardGameActivity extends Activity {

    @Override

    public void onCreate(Bundle savedInstanceState) { 

        super.onCreate(savedInstanceState);

        CardGameView view = new CardGameView(this);

        setContentView(view); 

    }

}


CardGameView.java

package test.android.cardgame;


import android.content.Context;

import android.graphics.Bitmap;

import android.graphics.BitmapFactory;

import android.graphics.Canvas;

import android.view.MotionEvent;

import android.view.View;


public class CardGameView extends View {


Bitmap bgImg;

Bitmap backsideImg;

Card [][] card = new Card[2][3];

// 게임상태의 구분

int STATUS_READY = 1;

int STATUS_GAME_ON = 2;

int STATUS_END = 3;

int status; // 게임의 상태

Card selCard1, selCard2;

public CardGameView(Context context) {

super(context);

bgImg = BitmapFactory.decodeResource(getResources(), R.drawable.background);

card[0][0] = new Card(getContext(),Card.COLOR_RED);

card[0][1] = new Card(getContext(),Card.COLOR_GREEN);

card[0][2] = new Card(getContext(),Card.COLOR_BLUE);

card[1][0] = new Card(getContext(),Card.COLOR_GREEN);

card[1][1] = new Card(getContext(),Card.COLOR_BLUE);

card[1][2] = new Card(getContext(),Card.COLOR_RED);

status = STATUS_READY;

}


@Override

protected void onDraw(Canvas canvas) {

super.onDraw(canvas);

canvas.drawBitmap(bgImg, 0, 0, null);

for(int y=0;y<2;y++) {

for(int x=0;x<3;x++) {

card[y][x].draw(canvas, 35+x*90, 150+y*130);

}

}

}


@Override

public boolean onTouchEvent(MotionEvent event) {

if(status==STATUS_READY) {

startGame();

status = STATUS_GAME_ON;

}else if(status==STATUS_GAME_ON) {

int x = (int) event.getX();

int y = (int) event.getY();

Card card = touchedCard(x,y);

if(card==null) return false;

card.status = Card.STATUS_TMPSHOW;

if(selCard1==null) {

selCard1 = card;

}

else {

selCard2 = card;

checkMatch();

}

}else if(status==STATUS_END) {

status=STATUS_READY;

}

invalidate();

return super.onTouchEvent(event);

}

public void startGame() {

for(int y=0;y<2;y++) {

for(int x=0;x<3;x++) {

card[y][x].status = Card.STATUS_CLOSE;

}

}

}

private Card touchedCard(int px, int py) {

for(int y=0;y<2;y++) {

for(int x=0;x<3;x++) {

if(card[y][x].isTouched(px, py)) return card[y][x];

}

}

return null;

}


public void checkMatch() {

if(selCard1.color == selCard2.color) {

selCard1.status = selCard2.status = Card.STATUS_MATCHED;

}else{

selCard1.status = selCard2.status = Card.STATUS_CLOSE;

}

selCard1 = selCard2 = null;

}

}


Card.java

package test.android.cardgame;


import android.content.Context;

import android.graphics.Bitmap;

import android.graphics.BitmapFactory;

import android.graphics.Canvas;

import android.graphics.Rect;


public class Card {

static int COLOR_RED = 1;

static int COLOR_GREEN = 2;

static int COLOR_BLUE = 3;

static int STATUS_CLOSE = 1;

static int STATUS_SHOW = 2;

static int STATUS_TMPSHOW = 3;

static int STATUS_MATCHED = 4;

Bitmap backsideImg;

Bitmap bitmap;


int color;

int status;

Rect region = new Rect();

public Card(Context ctx, int color){

this.color = color;

if(backsideImg==null)

backsideImg = BitmapFactory.decodeResource(ctx.getResources(), R.drawable.backside);

if(color==COLOR_RED)

bitmap = BitmapFactory.decodeResource(ctx.getResources(), R.drawable.front_red);

else if(color==COLOR_GREEN)

bitmap = BitmapFactory.decodeResource(ctx.getResources(), R.drawable.front_green);

else if(color==COLOR_BLUE)

bitmap = BitmapFactory.decodeResource(ctx.getResources(), R.drawable.front_blue);

}


public void draw(Canvas c, int x, int y){

region.left = x;

region.top = y;

region.right = x + 80;

region.bottom = y + 115;

if(status != STATUS_CLOSE) c.drawBitmap(bitmap, x, y, null);

else c.drawBitmap(backsideImg, x, y, null);

}

public boolean isTouched(int x, int y) {

return region.contains(x, y);

}

}