Notice
Recent Posts
Recent Comments
Link
관리 메뉴

설.현.아빠

[Game_Puzzle] 본문

안드로이드/Game

[Game_Puzzle]

설.현.아빠 2011. 2. 11. 10:28




 

<?xml version="1.0" encoding="utf-8"?>

 

<!-- main.xml -->


<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    >
<RelativeLayout
    android:layout_width="fill_parent" 
    android:layout_height="fill_parent" 
    >
    
    <Button android:id="@+id/btStart"
     android:layout_width="145px"
     android:layout_height="wrap_content"
     android:layout_centerHorizontal="true"
     android:layout_marginTop="48px"
     android:text="START"
     />
     
    <Button android:id="@+id/btNum1"
     android:layout_width="48px"
     android:layout_height="48px"
     android:text="1"
     android:layout_below="@id/btStart"
     android:layout_alignLeft="@id/btStart"
     />
     
    <Button android:id="@+id/btNum2"
     android:layout_width="48px"
     android:layout_height="48px"
     android:text="2"
     android:layout_below="@id/btStart"
     android:layout_toRightOf="@id/btNum1"
     />
     
    <Button android:id="@+id/btNum3"
     android:layout_width="48px"
     android:layout_height="48px"
     android:text="3"
     android:layout_below="@id/btStart"
     android:layout_toRightOf="@id/btNum2"
     />
     
    <Button android:id="@+id/btNum4"
     android:layout_width="48px"
     android:layout_height="48px"
     android:text="4"
     android:layout_below="@id/btNum1"
     android:layout_alignLeft="@id/btStart"
     />
     
    <Button android:id="@+id/btNum5"
     android:layout_width="48px"
     android:layout_height="48px"
     android:text="5"
     android:layout_below="@id/btNum2"
     android:layout_toRightOf="@id/btNum4"
     />
     
    <Button android:id="@+id/btNum6"
     android:layout_width="48px"
     android:layout_height="48px"
     android:text="6"
     android:layout_below="@id/btNum3"
     android:layout_toRightOf="@id/btNum5"
     />
     
    <Button android:id="@+id/btNum7"
     android:layout_width="48px"
     android:layout_height="48px"
     android:text="7"
     android:layout_below="@id/btNum4"
     android:layout_alignLeft="@id/btStart"
     />   
    <Button android:id="@+id/btNum8"
     android:layout_width="48px"
     android:layout_height="48px"
     android:text="8"
     android:layout_below="@id/btNum5"
     android:layout_toRightOf="@id/btNum7"
     />

    <Button android:id="@+id/btBlank"
     android:layout_width="48px"
     android:layout_height="48px"
     android:text=""
     android:layout_below="@id/btNum6"
     android:layout_toRightOf="@id/btNum8"
     />                                 
</RelativeLayout>
</LinearLayout>

 

 

// PuzzleEx2Ativity.java

 

package lee.myandroid.puzzle;

import java.util.Random;

import android.app.Activity;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;

public class PuzzleEx2Ativity extends Activity {
    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        
        // 9개의 Button을 Listener와 연결
        _Button[0]=(Button)findViewById(R.id.btNum1);
        _Button[1]=(Button)findViewById(R.id.btNum2);
        _Button[2]=(Button)findViewById(R.id.btNum3);
        _Button[3]=(Button)findViewById(R.id.btNum4);
        _Button[4]=(Button)findViewById(R.id.btNum5);
        _Button[5]=(Button)findViewById(R.id.btNum6);
        _Button[6]=(Button)findViewById(R.id.btNum7);
        _Button[7]=(Button)findViewById(R.id.btNum8);
        _Button[8]=(Button)findViewById(R.id.btBlank);
        
        int i;
        for(i=0;i<8;i++) {
         _Button[i].setOnClickListener(bt_Num);
        }
        
        // Start Button을 Listener와 연결
        ((Button)findViewById(R.id.btStart)).setOnClickListener(bt_Start);
    }
    
    private Button _Button[] = new Button[9];
    
    private View.OnClickListener bt_Start = new View.OnClickListener() {
  
  @Override
  public void onClick(View v) {
   int x, y;
   int btStart_left; //Start Button의 Left값
   int btStart_bottom; //Start Button의 Bottom값
   btStart_bottom=((Button)findViewById(R.id.btStart)).getBottom();
   for(y=0;y<3;y++) {
    btStart_left=((Button)findViewById(R.id.btStart)).getLeft();
    for(x=0;x<3;x++) {
     // 9개 버튼의 위치 설정. Start Button을 기준으로 잡았다.
     _Button[y*3+x].layout(btStart_left, btStart_bottom, btStart_left+48, btStart_bottom+48);
     btStart_left=btStart_left+48;
    }
    btStart_bottom=btStart_bottom+48;
   }   
   
   Random _Random = new Random();
   int i;
   for(i=0;i<1000;i++) {
    //Random으로 섞어주기 위해서 bt_Num.onClick을 통해 1000번 doSwap해줌.
    bt_Num.onClick(_Button[_Random.nextInt(8)]);
   }
  }
 };
 
 private boolean is_vertical(Button A, Button B) {
  //두 버튼의 Left값을 비교하여 같은 세로줄인지 확인하고, 두 버튼이 붙어있는지 확인한다.
  //0~47px크기의 버튼과 48~95px크기의 버튼을 서로 빼면 음수가 나올 수 있으므로 Math.abs(절대값)처리를 하였으며
  //48-0=48이므로 뺀 값이 <=48 이거나 <49, <50 으로 하여도 상관없다.
  return (A.getLeft()==B.getLeft() && Math.abs(A.getTop()-B.getTop()) <50);
 }
 
 private boolean is_horizontal(Button A, Button B) {
  //is_vertical()함수와 동일.가로줄 비교
  return (A.getTop()==B.getTop() && Math.abs(A.getLeft()-B.getLeft()) <50);
 }
 
 private void doSwap(Button A, Button B) {
  //9개의 Button을 섞어주기 위한 함수
  int left = A.getLeft();
  int top = A.getTop();
  int right = A.getRight();
  int bottom = A.getBottom();
  
  A.layout(B.getLeft(), B.getTop(), B.getRight(), B.getBottom());
  B.layout(left, top, right, bottom);
 }
 
 private View.OnClickListener bt_Num = new View.OnClickListener() {
  
  @Override
  public void onClick(View v) {
   Button A = (Button)v; // Click된 Button
   Button B = (Button)findViewById(R.id.btBlank); // Blank Button
   if(is_vertical(A,B) || is_horizontal(A,B)) {
    //대각선상의 퍼즐이나 두칸 이상의 퍼즐은 Change되지 않도록 조건 설정.
    doSwap(A,B);
   }
  }
 };
}


Comments