blogfiles.naver.net.png  

package kr.hews.picpuzzle;

import! android.app.Activity;
import! android.app.Alert!Dialog;
import! android.content.DialogInterface;
import! android.os.Bundle;
import! android.os.SystemClock;
import! android.view.View;
import! android.widget.Button;
import! android.widget.Chronometer;
import! android.widget.ImageButton;

//패널게임의 화면 제어클래스
public class PicturePuzzle extends Activity
{
  // (1)패널을 구성하는 버튼
  static final int mImageButtons[] R.id.image_button1, R.id.image_button2, R.id.image_button3, R.id.image_button4, 

                      R.id.image_button5, R.id.image_button6, R.id.image_button7, R.id.image_button8, R.id.image_button9 };

  // (2)패널에 표시할 화상의 초기상태
  static final int mInitialImages[] R.drawable.image1, R.drawable.image2, R.drawable.image3, R.drawable.image4, 

                      R.drawable.image5, R.drawable.image6, R.drawable.image7, R.drawable.image8, R.drawable.blank_image };

  /*
   * (3)교환가능한(근접한) 패널의 인덱스 예를 들면 0번(왼쪽 위)의 패널은 

   * 1번(중앙 위)의 패널과 3번(왼쪽 중앙)의 패널과 근접하고 있음을 {1, 3}으로 표시하고 있음
   */
  static final int mNextPanelIndex[][] { { 1}04}1}04}135}

                                              24}3}46}7} };

  // (4)버튼을 제어하기 위한 컨트롤러 배열
  PanelController mPanels[] new PanelController[mImageButtons.length];

  // 버튼을 제어하기 위한 컨트롤러
  class PanelController implements View.OnClickListener
  {

ImageButton mButton; // 제어하는 버튼
    int mCurrentImage = 0// 표시하고 있는 화상리소스ID
    final int mNext[]// 이동가능한 패널

    // 제어할 버튼, 화상, 교환가능한 패널을 지정
    public PanelController(ImageButton button, int resid, final int next[])
    {
      mButton = button;
      mNext = next;
      setImageResource(resid);
      mButton.setOnClickListener(this);
    }

    // (5)새로운 화상의 리소스ID를 설정하다
    // 현재 설정하고 있는 화상의 리소스ID를 반환하다
    public int setImageResource(int resid)
    {
      int old = mCurrentImage;
      mCurrentImage = resid;
      mButton.setImageResource(resid);
      return old;
    }

    // 현재 설정하고 있는 화상의 리소스ID를 반환하다
    public int getImageResource()
    {
      return mCurrentImage;
    }

    // 표시하고 있는 것이 공백화상이라면 true를 반환하다
    public boolean isBlank()
    {
      return mCurrentImage == R.drawable.blank_image;
    }

    // (6)다른 패널과 화상을

public void swapImage(PanelController other)
    {
      int previous = other.setImageResource(mCurrentImage);
      setImageResource(previous);
    }

    // (7)버튼이 Tap되었을 때 동작
    public void onClick(View v)
    {
      for (int i = 0; i < mNext.length; ++i)
      {
        // 근접하는 패널이 공백화상이라면 화상을 교환하다
        if (mPanels[mNext[i]].isBlank())
        {
          swapImage(mPanels[mNext[i]]);
          break;
        }
      }
      if (isCompleted())
        complete();
    }
  }

  // (8) 어플리케이션 기동 때에 호출되는 메소드
  @Override
  public void onCreate(Bundle icicle)
  {
    super.onCreate(icicle);

    setContentView(R.layout.main);
    createPanelController();
    setShuffleButtonListener();

  }

  // (9) 각각의 버튼에 PanelController를 등록하다
  private void createPanelController()
  {

      ImageButton b = (ImageButtonfindViewById(mImageButtons[i]);
      mPanels[inew PanelController(b, mInitialImages[i], mNextPanelIndex[i]);
    }
  }

  // (10) 패널의 화상이 최초 상태와 일치하면 완성이라고 판단하다
  private boolean isCompleted()
  {
    for (int i = 0; i < mInitialImages.length; ++i)
    {
      if (mInitialImages[i!= mPanels[i].getImageResource())
        return false;
    }
    return true;
  }

  // (11) 패널을 섞다(shuffle)
  private void shuffle()
  {
    int size = mInitialImages.length;
    for (int i = 0; i < size - 1; ++i)
    {
      int swap = (int) (Math.random() (size - i));
      mPanels[i].swapImage(mPanels[i + swap]);
    }
  }

  // (12) 현재 시각을 설정하고 타이머를 시작하다
  private void startChronometer()
  {
    Chronometer c = (ChronometerfindViewById(R.id.chronometer);
    c.setBase(SystemClock.elapsedRealtime());
    c.start();
  }

  // (13) 타이머를 정지하고 경과시간을 반환하다
  private long stopChronometer()
  {Chronometer c = (ChronometerfindViewById(R.id.chronometer);
    c.stop();
    return SystemClock.elapsedRealtime() - c.getBase();
  }

  // (14) Shuffle Button을 눌러졌을 때의 처리
  private void setShuffleButtonListener()
  {
    // shuffle Button을 불러내다
    Button b = (ButtonfindViewById(R.id.shuffle_button);
    // Tap 때에 호출되는 리스너를 등록하다
    b.setOnClickListener(new View.OnClickListener()
    {
      public void onClick(View v)
      {
        shuffle();
        startChronometer();
      }
    });
  }

  // (15)완성 때에 다이알로그를 표시하다
  private void complete()
  {
    long msec = stopChronometer();
    Alert!Dialog.Builder b = new Alert!Dialog.Builder(this);
    b.setTitle(R.string.complete_title);
    b.setMessage(msec / 1000 " sec");
    b.setIcon(R.drawable.congratulations);
    b.setPositiveButton(R.string.complete_button, new DialogInterface.OnClickListener()
    {
      // 버튼이 눌러지면 다이알로그를 닫는다
      public void onClick(DialogInterface dialog, int which)
      {
        dialog.dismiss();
      }
    });
    b.show();
  }
}

AndroidManifest.xml

 

<?xml version="1.0" encoding="utf-8"?>
 <!-- PicturePuzzle -->
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
 package="kr.hews.picpuzzle" android:versionCode="1" android:versionName="1.0.0">
 <application android:icon="@drawable/icon" android:label="@string/app_name">
  <!-- 표시방향을 Portlait로 고정 -->
  <activity android:name="PicturePuzzle" android:label="@string/app_name"
   android:screenOrientation="portrait" android:configChanges="keyboard|keyboardHidden|orientation">
   <intent-filter>
    <action android:name="android.intent.action.MAIN" />
    <category android:name="android.intent.category.LAUNCHER" />
   </intent-filter>
  </activity>
 </application>
 <uses-sdk android:minSdkVersion="3"></uses-sdk>
</manifest>

 

/res/layout/main.xml

 

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

 <!-- 퍼즐을 중심으로 배치하기위한 상대레이아웃 -->
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
 android:layout_width="fill_parent" android:layout_height="fill_parent">

 <!-- 퍼즐의 본체 -->
 <LinearLayout android:id="@+id/body" android:layout_width="wrap_content"
  android:layout_height="wrap_content" android:layout_centerInParent="true"
  android:orientation="vertical">

  <!-- 길의 시점 영역 -->
  <FrameLayout android:id="@+id/top_frame" android:foreground="@drawable/top_frame"
   android:layout_margin="1px" android:layout_width="244px"
   android:layout_height="40px" />

  <!-- 퍼즐 테이블 -->
  <TableLayout android:id="@+id/table" android:layout_marginTop="1px"
   android:layout_width="wrap_content" android:layout_height="wrap_content">

   <TableRow android:id="@+id/row1" android:layout_width="wrap_content"
    android:layout_height="wrap_content">

<!--  각각의 퍼즐 -->
    <ImageButton android:id="@+id/image_button1"
     android:layout_margin="1px" android:layout_width="80px"
     android:layout_height="80px" />
    <ImageButton android:id="@+id/image_button2"
     android:layout_margin="1px" android:layout_width="80px"
     android:layout_height="80px" />
    <ImageButton android:id="@+id/image_button3"
     android:layout_margin="1px" android:layout_width="80px"
     android:layout_height="80px" />
   </TableRow>

   <TableRow android:id="@+id/row2" android:layout_width="wrap_content"
    android:layout_height="wrap_content">
    <ImageButton android:id="@+id/image_button4"
     android:layout_margin="1px" android:layout_width="80px"
     android:layout_height="80px" />
    <ImageButton android:id="@+id/image_button5"
     android:layout_margin="1px" android:layout_width="80px"
     android:layout_height="80px" />
    <ImageButton android:id="@+id/image_button6"
     android:layout_margin="1px" android:layout_width="80px"
     android:layout_height="80px" />
   </TableRow>

   <TableRow android:id="@+id/row3" android:layout_width="wrap_content"
    android:layout_height="wrap_content">
    <ImageButton android:id="@+id/image_button7"
     android:layout_margin="1px" android:layout_width="80px"
     android:layout_height="80px" />
    <ImageButton android:id="@+id/image_button8"
     android:layout_margin="1px" android:layout_width="80px"
     android:layout_height="80px" />
    <ImageButton android:id="@+id/image_button9"
     android:layout_margin="1px" android:layout_width="80px"
     android:layout_height="80px" />
   </TableRow>

 

 android:layout_margin="1px" android:layout_width="80px"
     android:layout_height="80px" />
   </TableRow>

   <TableRow android:id="@+id/row3" android:layout_width="wrap_content"
    android:layout_height="wrap_content">
    <ImageButton android:id="@+id/image_button7"
     android:layout_margin="1px" android:layout_width="80px"
     android:layout_height="80px" />
    <ImageButton android:id="@+id/image_button8"
     android:layout_margin="1px" android:layout_width="80px"
     android:layout_height="80px" />
    <ImageButton android:id="@+id/image_button9"
     android:layout_margin="1px" android:layout_width="80px"
     android:layout_height="80px" />
   </TableRow>
  </TableLayout>

  <!-- 길의 종점 영역 -->
  <FrameLayout android:id="@+id/bottom_frame" android:layout_margin="1px"
   android:foreground="@drawable/bottom_frame" android:layout_width="244px"
   android:layout_height="40px" />

  <!-- 타임과 Shuffle 버튼을 포함하는 리니어레이아웃 -->
  <LinearLayout android:id="@+id/control_frame"
   android:layout_width="fill_parent" android:layout_height="wrap_content"
   android:orientation="horizontal" android:gravity="right">
   <!-- 초과시간표시 타이머 -->
   <Chronometer android:id="@+id/chronometer" android:layout_width="wrap_content"
    android:layout_height="wrap_content" android:format="@string/chronometer_format" />
   <!-- Shuffle 버튼 -->
   <Button android:id="@+id/shuffle_button" android:layout_width="wrap_content"
    android:layout_height="wrap_content" android:text="@string/shuffle" />
  </LinearLayout>
 </LinearLayout>
</RelativeLayout>

 

創作者介紹
創作者 shadow 的頭像
shadow

資訊園

shadow 發表在 痞客邦 留言(0) 人氣()