반응형
Notice
Recent Posts
Recent Comments
«   2024/05   »
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
Archives
Today
Total
관리 메뉴

Do Something IT

안드로이드 퍼즐 만들기 본문

Android

안드로이드 퍼즐 만들기

아낙시만더 2010. 5. 24. 12:14
반응형

처음으로 쫌 만들어본 안드로이드 퍼즐 게임
혼자서 한건 아니고 다른분 강의를 보면서 만들었지만 참 재미있었던거 같다.
게임 플레이는 이러했다.
스타트 버튼을 누르면 번호 8개와 이동할 구멍 하나가 자동으로 셔풀된다.
셔풀된 번호를 다시 1번부터 순서대로 마추는것이다.
아직 공부하는 학생입장으로 이번에 이것을 해봄으로써 많은것을 알게 되었다.


안드로이드를 간략하게 보니 xml 화면 작업을 통하고 그 리소스를 R.java이 되고  액티비자바에서 액션리스너를 통하여 R.java의 리소스에서 값을 받아와 컨트롤 하면 이렇게 만들수있다. 아직 소규모 프로그램이라.  간단한거 같다.
중요 소스를 간단히 살펴보자.
일단 화면을 구성하는 main.mxl이다.

보면 두개의 LinearLayout과 AbsoluteLayout로 나누었다. 그라고 버튼들을 삽입하여 화면을 꾸미었다. 이렇게 만들어진 화면구성들은 아이디를 가지는 데 그 아이디 명과 정보는 R.java에 저장될것이다.
다음은 R.java의 소스 화면이다.
보시다시피 R.java에는 xml의 버튼과 레이아웃 텍스트의 id가 저장되어 있음을 알수 있다. 이 정보를 이용하여 액티비티 탬플리에서 각각의 버튼에 동작을 줄수있다.

보는 소스가 액티비티 탬플릿의 소스이다.
package myandroid.com;                  
import java.util.Random;
import android.app.Activity;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.TextView;// 여기까지는 필요한 라이브러리를 참조하기위하여 import한다.

public class AndTest1 extends Activity {//Activity의 상속을 받는다.
 /** Called when the activity is first created. */
 @Override
 public void onCreate(Bundle savedInstanceState) {// Activityd의 onCreate메소드가 오버라이딩 되어
  super.onCreate(savedInstanceState);                  // 우리는 그것을 새로 정의 할수있다. 
  setContentView(R.layout.main);                         //savedinstanceState는  액티비티 간 데이터를
  _buttons[0]=(Button)findViewById(R.id.Button01);// 교환하는 수단이자 한 액티비티의 여러 인스턴스가
  _buttons[1]=(Button)findViewById(R.id.Button02);// 데이터를 저장하고 공유하는 수단이다.
  _buttons[2]=(Button)findViewById(R.id.Button03);//setContentView(R.layout.main)은 안드로이드에
//서 레이아웃으로 화면을 구성하며 .res/layout 디렉토리 아래 main.xml이 안드로이드 SDK가 기본으로
//생성하는 파일이다. 또 자동으로 생성된 R.java파일에는 .res아래 있는 각 리소스에 대한 참조가 들어있
//다. R.java는 리소스를 추가하거나 수정 삭제 할때마다 안드로이드 SDK가 알아서 수정하기때문에
//편집할 필요가 전혀없다. 즉 이 setContentView(R.layout.main)은 그 main.xml에 저장된 정보를
//view로 만들어준다.

  _buttons[3]=(Button)findViewById(R.id.Button04);
  _buttons[4]=(Button)findViewById(R.id.Button05);//옆에 _buttons[]배열은 각 버튼 아이디를 찾아
//와 view에 나타 날수있는 즉 심볼 같은것으로 만들어준다. 이는 변수 처럼 이용할수있다. 이렇게 변수로
//만들어지면 그변수를 통하여 이벤트 적용이가능하다.

  _buttons[5]=(Button)findViewById(R.id.Button06);
  _buttons[6]=(Button)findViewById(R.id.Button07);
  _buttons[7]=(Button)findViewById(R.id.Button08);
  _buttons[8]=(Button)findViewById(R.id.Blank);// 구멍 버튼

  for(int i=0;i<8;i++)_buttons[i].setOnClickListener(On_Click);//위에서 만들어진 버튼 배열들에 각각
//눌러졌을때 On_Click 리스너가 발동하게 하는 소스이다. for문은 처음 시작시 모두 돌아
//모든 버튼들이 이벤트 대기 시켜준다.

  ((Button)findViewById(R.id.Btstart)).setOnClickListener(On_Start);// 타트 버튼 이벤트이다.
 }

 private Button[] _buttons= new Button[10];//버튼들을 변수화 시키기위해 버튼형 배열객체를 만들었다.
//do_swap 메소드는 버튼이 눌러졌을때 그버튼을 Blank 즉 구멍 버튼과 함께 서로 자리를 교체 하는
//메소드이다

 private void do_swap(Button A, Button B){
  int Aleft=A.getLeft();
  int Atop=A.getTop();
  int Aright=A.getRight();
  int Abottom=A.getBottom();

  A.layout(B.getLeft(), B.getTop(), B.getRight(), B.getBottom());
  B.layout(Aleft, Atop, Aright, Abottom);
 }

//do_width 와 do_high는 눌러진 버튼이 구멍 좌우위아레에 있는 버튼인지를 검사한다. 즉 구멍
//좌우상하에 있는 버튼만 구멍으로 이동가능해지게 한다.

 private boolean do_width(Button A, Button B){
  return (A.getLeft()==B.getLeft())&&(Math.abs(A.getTop()-B.getTop())<50);
 }
 private boolean do_high(Button A, Button B){  
   return (A.getTop()==B.getTop())&&(Math.abs(A.getLeft()-B.getLeft())<50);
 }
// 본격적인 액션 리스너 객체를 생성한다. 이 액션 객체는 버튼이 눌러졌을때 발동되는 매소드임을 말한
//다. On_Click 객체는 버튼이 눌러졌을때 해당 버튼과 구멍 버튼의 자리를 바꾸는 이벤트 객체이다.
// 여기에 필요한 버튼은 지금 눌러지고있는 버튼 과 구멍 버튼이다. 구멍버튼을 받아오고 눌러지는 버튼
//은 view v에 매개변수로 받아진다. v는 view형이므로 (button)으로 형변환 해야한다. 아레에
//  if(do_high((Button) v,Blank) || do_width((Button) v,Blank))do_swap((Button)v,Blank);에서 
//두버튼의 상하 좌우를 비교하여 바꿔주는 do_swap메소드를 호출한다.

 private View.OnClickListener On_Click = new View.OnClickListener(){
  public void onClick(View v) {
   Button Blank=(Button)findViewById(R.id.Blank);
   if(do_high((Button) v,Blank) || do_width((Button) v,Blank))do_swap((Button)v,Blank);
  }
 };
//On_start OnClick리스너 객체는 스타트 버튼이 눌러졌을때 버튼을 정렬 시키는 액티비티와 버튼을
//셔풀하는 역활을 한다. 이 알고리즘은 심오했다.

 private View.OnClickListener On_Start = new View.OnClickListener(){
  public void onClick(View v) {
   int y,x;
   for(y=0;y<3;y++){
    for(x=0;x<3;x++){     
     _buttons[y*3+x].layout(x*48, y*48, x*48+48, y*48+48);//자리배정
    }
   }
   Random _Random =new Random();
   for(int i=0;i<1000;i++)On_Click.onClick(_buttons[_Random.nextInt(8)]);//셔풀
  }
 };

이렇게 구성되었고 남은 숙제는 이것을 이용하여 다른 프로그램을 만들어보자.
곧 다시 올리도록 하겠다.


 www.droiddraw.org

안드로이드 디자인을 미리 만들어 볼수있다.

main.xml에서 create 를 이용하여 편리하게 인터페이스를 구축할수 있다.

 


반응형

'Android' 카테고리의 다른 글

움직이는 네모  (0) 2010.06.21
기념일자 찾기  (0) 2010.06.17
안드로이드 애플리케이션 구성요소  (0) 2010.06.08
안드로이드 구조  (0) 2010.06.08
fill_parent 와 wrap_content의 차이점  (0) 2010.06.04
Comments