설.현.아빠
[Game_Puzzle] 본문
<?xml version="1.0" encoding="utf-8"?> <!-- main.xml --> <Button android:id="@+id/btBlank" // PuzzleEx2Ativity.java package lee.myandroid.puzzle; import java.util.Random; import android.app.Activity; public class PuzzleEx2Ativity extends Activity {
<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"
/>
android:layout_width="48px"
android:layout_height="48px"
android:text=""
android:layout_below="@id/btNum6"
android:layout_toRightOf="@id/btNum8"
/>
</RelativeLayout>
</LinearLayout>
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
/** 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);
}
}
};
}