3X3의 슬라이딩 퍼즐을 만들어봅니다.

강좌 6번의 뷰를 복사하여 CustomView를 하나더 만듭니다.

PuzzleView.java 와 SlidingPuzzleActivity를 만들었습니다.


기본적인 Idea는 2차원 배열을 만들고 

이동이되면 해당 배열을 계속해서 업데이트합니다.

그래고 2차원배열이 순서대로 되면 게임이 끝나는 것이 기본 idea입니다.


게임 2차원 배열을 만듭니다.

0

1

2

3

4

5

6

7

8

그리고 해당 내용에 대해 비트맵을 9개로 나누어 각각 가지고있습니다.

그리고 onDraw에서 각각의 퍼즐 블록을 그려주고 , 라인을 그려줍니다.

				    		  canvas.drawBitmap( mBitmapCube[i][j]
				    		   , mCubeRect[i][j].left
				    		   , mCubeRect[i][j].top
				    		   , paint);


그리고 각블록에 대해 Rect 정보를 가지고있습니다.

Rect는 left, right , top , bottom 값으로 사각형의 위치정보를 가지고있습니다.


Rect는 두가지로 mCubeOriginRect 원래위치 그리고 mCubeRect 

이번버전에는 빈칸이 위치한 부분에 대해서만 같은행 같은 열을 선택하였을떄 

해당 블록이 움직일수있게 처리해보았습니다.


클릭되었을경우 선택된 블록의 index 를 저장해둡니다.

				for( int i = 0 ; i < 3; i++ ) {
					for( int j = 0 ; j < 3 ; j++ ) {
						if( mCubeOriginRect[i][j].contains( startPoint.x , startPoint.y ) == false ) continue;
						
						mSelectedCubeHeightIndex = i;
						mSelectedCubeWidthIndex = j;
						invalidate();
						break;
					}
				}


그리고 MOVE이벤트가 발생했을경우 해당 CubeRect의 값을 바꿔줍니다.

	    		// 같은 행에 있으면
	    		if( mSpaceCubeHeightIndex ==  mSelectedCubeHeightIndex ) {
	    			int moveXpos = endPoint.x - startPoint.x;
	    			mCubeRect[mSelectedCubeHeightIndex][mSelectedCubeWidthIndex].left =
	    					mCubeOriginRect[mSelectedCubeHeightIndex][mSelectedCubeWidthIndex].left + moveXpos;
	    			mCubeRect[mSelectedCubeHeightIndex][mSelectedCubeWidthIndex].right = 
	    					mCubeOriginRect[mSelectedCubeHeightIndex][mSelectedCubeWidthIndex].right + moveXpos;
	    		}
	    		// 같은 열에 있으면
	    		if( mSpaceCubeWidthIndex ==  mSelectedCubeWidthIndex ) {
	    			int moveYpos = endPoint.y - startPoint.y;
	    			
	    			mCubeRect[mSelectedCubeHeightIndex][mSelectedCubeWidthIndex].top =
	    					mCubeOriginRect[mSelectedCubeHeightIndex][mSelectedCubeWidthIndex].top + moveYpos;
	    			mCubeRect[mSelectedCubeHeightIndex][mSelectedCubeWidthIndex].bottom = 
	    					mCubeOriginRect[mSelectedCubeHeightIndex][mSelectedCubeWidthIndex].bottom + moveYpos;
	    			
	    		}


실행화면


ShinExample_7.zip




Posted by App.SHIN
:

오늘은 커스텀 뷰를 만들고 Bitmap을 리소스로 부터 불러와서 표시합니다.

activity를 생성하고 layout에 커스텀 뷰를 설정하고 클래스를 만듭니다.

resource xml 설정

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
 		android:orientation="vertical"
 		android:layout_width="fill_parent"
 		android:layout_height="fill_parent"
 	>
<com.shin.view.CustomView
    android:id="@+id/custom_view"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    />
</LinearLayout>


CustomView를 Xml 파일에 입력을 했다면 변수가 필요합니다.

public CustomView(Context context,AttributeSet attrs)


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

이렇게 설정을하고 클래스 파일에서 리소스로 부터 Bitmap을 불러옵니다.


public CustomView(Context context,AttributeSet attrs) {
        super(context, attrs);
        orign = new Rect();
        dest = new Rect();
        
        bitmap = BitmapFactory.decodeResource(getResources(), R.drawable.ex1 );
        orign.left = 0;
        orign.right = bitmap.getWidth();
        orign.top = 0;
        orign.bottom = bitmap.getHeight();
        
        paint = new Paint();
        
	}

리소스파일

결과 화면

결과파일


ShinExample_06.zip



Posted by App.SHIN
:

안녕하세요 지난시간에 이어 계산하는 부분을 추가하는데요.


StringTokenizer 클래스를 사용합니다.


생성을 할때 내용과 딜리미터를 전달합니다.

예를 들어  내용이 A_B_C  딜리미터가 _ 라면 

StringTokenizer st = new StringTokenizer( "A_B_C" , "_" ); 

이렇게 사용하시면 됩니다. 게다가 딜리미터의경우 멀티로도 가능합니다. 

예를들면 StringTokenizer("A+B-C/D", "+-/") 이런 식으로 사용이가능하가는 거지요~

while( st.hasMoreTokens() ) {
          double number = Double.parseDouble(st.nextToken());
          numberList.add( number );
          Log.d("aaa", String.valueOf(number) );
}



계산기의 기본 아이디어를 설명드리겠습니다.


StringTokenizer로 숫자부분은 얻을수있습니다. 하지만  Operator( +-/* )는 얻을수가 없어요

그래서 숫자, 오퍼레이터는 내용에 추가합니다.


사용자가 1+1/10 이런식으로 입력했다면 TextView에 계속해서 추가해줍니다.

사용자가 오퍼레이터 입력시 operatorList 변수를 만들어 해당 operator를 저장시킵니다.


그리고 계산을 누르게되면 TextView 내용에대해 StringTokenizer를 이용하여 숫자부분만 뽑아냅니다.

그리고 Operator같은 경우는 정상적인 경우라면


만약 사용자가 10+20/30 을 입력했다면 OperatorList 와 NumberList는 아래와 같습니다.

OperatorList는 사용자가 기호를 입력할때마다 add 시켜주면 저렇게 입력이되구요

+입력될때 operatorList 에 입력 / 입력될때 입력이 됩니다.

NumberList는 StringTokenizer 를 이용하여 nextToken으로 값을 뽑아내면 아래와같이 입력됩니다.

 

사용자입력

10

+

20

/

30

OperatorList

0

1

 

 

 

+

/

 

 

 

NumberList

0

1

2

 

 

 

10

20

30

 

 

         








가. NumberList[0], NumberList[1] 에대해 OperatorList[0]계산 -> 10 , 20 에 대한 + 계산  => 30 

나. 가.의 결과 , NumberList[2] 에 대해 OperatorList[1]계산 -> 30 , 30 에 대한 / 계산 => 1

의 형식으로 됩니다.


아래는 Calc 함수내용입니다.


private String calc(String exp) {
		
		
		ArrayList<Double> numberList = new ArrayList<Double>();
		StringTokenizer st = new StringTokenizer(exp,"X/+-");
		
		
		while( st.hasMoreTokens() ) {
			double number = Double.parseDouble(st.nextToken());
			numberList.add( number );
			Log.d("aaa", String.valueOf(number) );
		}
		
		double result = numberList.get(0);
		Log.d("aaa", String.valueOf(result) );
		for( int i = 0 ; i < operatorList.size() ; i++ ) {
			String operator = operatorList.get(i);
			
			if( "*".equals(operator)){
				result = ( result * numberList.get(i+1));
			}else if( "/".equals(operator)){
				result = ( result / numberList.get(i+1));
			}else if( "+".equals(operator)){
				result = ( result + numberList.get(i+1));
			}else if( "-".equals(operator)){
				result = ( result - numberList.get(i+1));
			}
		}
		operatorList.clear();
		numberList.clear();
		
		return String.valueOf(result);
	}



ShinExample_05.zip


Posted by App.SHIN
:

BLOG main image
by App.SHIN

공지사항

카테고리

분류 전체보기 (27)
안드로이드 (12)
추천앱 (0)
맛집 (0)
영화 (0)
핫이슈 (2)
서버 (2)
mac os 적응기 (8)
java (1)
mysql (1)
tomcat (1)

최근에 올라온 글

최근에 달린 댓글

최근에 받은 트랙백

글 보관함

달력

«   2025/07   »
1 2 3 4 5
6 7 8 9 10 11 12
13 14 15 16 17 18 19
20 21 22 23 24 25 26
27 28 29 30 31
Total :
Today : Yesterday :