public class Card {
	public static final int CARD_SHOW=0;
	public static final int CARD_CLOSE=1;
	public static final int CARD_PLAYEROPEN=2;
	public static final int CARD_MATCHED=3;
	public int m_state;
	public static final int IMG_RED=1;
	public static final int IMG_GREEN=2;
	public static final int IMG_BLUE=3;
	public int m_Color;
	public Card(int _Color){
	m_state=CARD_SHOW;
	m_Color= _Color;
	}
}
import android.app.Activity;
import android.os.Bundle;
public class CardCard extends Activity {
     @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(new CardKingView(this));
    }
}
public class CardKingThread extends Thread {
	CardKingView m_View;
	CardKingThread(CardKingView _View){
		m_View= _View;
	}
	public void run(){
		while(true){
			m_View.checkMatch();
		}
	}
}
import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.Canvas;
import android.graphics.Rect;
import android.view.MotionEvent;
import android.view.View;
public class CardKingView extends View {
	public static final int STATE_READY=0;
	public static final int STATE_GAME=1;
	public static final int STATE_END=2;
	
	private int m_state = STATE_READY;
	
	Bitmap m_BackGroundImage;
	Bitmap m_Card_BackSide;
	
	Bitmap m_Card_Red;
	Bitmap m_Card_Blue;
	Bitmap m_Card_Green;
	
	Card m_Shuffle[][];	
	
	private Card m_SelectCard_1 = null;
	private Card m_SelectCard_2 = null;
	
	public CardKingView(Context context) {
		super(context);
		m_BackGroundImage = BitmapFactory.decodeResource(getResources(),R.drawable.background,null);	
		m_Card_BackSide = BitmapFactory.decodeResource(getResources(), R.drawable.backside,null);
		m_Card_Red = BitmapFactory.decodeResource(getResources(), R.drawable.front_red,null);
		m_Card_Green = BitmapFactory.decodeResource(getResources(), R.drawable.front_green,null);
		m_Card_Blue = BitmapFactory.decodeResource(getResources(), R.drawable.front_blue,null);
		m_Shuffle = new Card[3][2];
		SetCardShuffle();
		
		CardKingThread _thread = new CardKingThread(this);
		_thread.start();
	}
	public void onDraw(Canvas canvas)
	{
		canvas.drawBitmap(m_BackGroundImage, 0,0,null);
		for(int y=0; y<2; y++){
			for(int x=0; x<3; x++)
				if(m_Shuffle[x][y].m_state==Card.CARD_SHOW || m_Shuffle[x][y].m_state==Card.CARD_PLAYEROPEN||
				m_Shuffle[x][y].m_state==Card.CARD_MATCHED){
					if(m_Shuffle[x][y].m_Color ==Card.IMG_RED)
					canvas.drawBitmap(m_Card_Red, 60+x*120, 280+y*170,null);
					else if(m_Shuffle[x][y].m_Color ==Card.IMG_GREEN)
						canvas.drawBitmap(m_Card_Green, 60+x*120, 280+y*170,null);
					else if(m_Shuffle[x][y].m_Color ==Card.IMG_BLUE)
						canvas.drawBitmap(m_Card_Blue, 60+x*120, 280+y*170,null);
				}
					else
						canvas.drawBitmap(m_Card_BackSide, 60+x*120, 280+y*170,null);
				}
		}
	
	public void SetCardShuffle(){
		m_Shuffle[0][0] = new Card(Card.IMG_RED);
		m_Shuffle[0][1] = new Card(Card.IMG_BLUE);
		m_Shuffle[1][0] = new Card(Card.IMG_GREEN);
		m_Shuffle[1][1] = new Card(Card.IMG_GREEN);
		m_Shuffle[2][0] = new Card(Card.IMG_BLUE);
		m_Shuffle[2][1] = new Card(Card.IMG_RED);
	
	}
	public boolean onTouchEvent(MotionEvent event)
	{
		if(m_state==STATE_READY)
		{
			startGame();
			m_state=STATE_GAME;
		}
		else if(m_state==STATE_GAME){
			if(m_SelectCard_1 != null && m_SelectCard_2 !=null)
				return true;
			int px=(int)event.getX();
			int py=(int)event.getY();
			for(int y=0; y<2; y++){
				for(int x=0; x<3; x++){
					Rect box_card = new Rect(60+x*120, 280+y*170,60+x*120+80, 280+y*170+115);
					if(box_card.contains(px,py))
						if(m_Shuffle[x][y].m_state != Card.CARD_MATCHED)
						if(m_SelectCard_1 ==null){
							m_SelectCard_1=m_Shuffle[x][y];
							m_SelectCard_1.m_state=Card.CARD_PLAYEROPEN;
						}
						else{
							if(m_SelectCard_1 != m_Shuffle[x][y]){
								m_SelectCard_2 = m_Shuffle[x][y];
								m_SelectCard_2.m_state = Card.CARD_PLAYEROPEN;
							}							
						
						}
				
				}
			}
		}else if(m_state==STATE_END){
			m_state=STATE_READY;
		}
		
		
		invalidate();
		return true;
	}
	public void startGame(){
		m_Shuffle[0][0].m_state=Card.CARD_CLOSE;
		m_Shuffle[0][1].m_state=Card.CARD_CLOSE;
		m_Shuffle[1][0].m_state=Card.CARD_CLOSE;
		m_Shuffle[1][1].m_state=Card.CARD_CLOSE;
		m_Shuffle[2][0].m_state=Card.CARD_CLOSE;
		m_Shuffle[2][1].m_state=Card.CARD_CLOSE;
		invalidate();
	}
	public void checkMatch(){
		if(m_SelectCard_1 == null || m_SelectCard_2 ==null)
			return;
		if(m_SelectCard_1.m_Color==m_SelectCard_2.m_Color){
			m_SelectCard_1.m_state=Card.CARD_MATCHED;
			m_SelectCard_2.m_state=Card.CARD_MATCHED;
			m_SelectCard_1=null;
			m_SelectCard_2=null;
		}else{
			try{
				Thread.sleep(500);
			}catch(InterruptedException e){
			}
			m_SelectCard_1.m_state=Card.CARD_CLOSE;
			m_SelectCard_2.m_state=Card.CARD_CLOSE;
			
			m_SelectCard_1=null;
			m_SelectCard_2=null;
		}
		postInvalidate();
	}
}
<구현완료>
구현은 완료되었지만 아직 교재 그대로 보고 코딩한 수준이기에 소스를 완벽히 다 이해하지 못했다. 몇번 계속 짝맞추기 게임을 만들면서 소스를 이해해야겠다.