본문 바로가기

Android

Thread handler를 이용한 두더지게임- 2

Thread handler를 이용한 두더지게임 - 2


지난 포스팅에서 쓰레드를 이용해 스탑워치를 만들었다.
스탑워치를 이용해 30초라는 게임제한시간을 구현하고, 게임시작을 누르면 카운트다운이 되게 했다.
package com.example.pc_20.molegame;

import android.content.Intent;
import android.os.Handler;
import android.os.Message;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.ImageView;
import android.widget.TextView;

public class MainActivity extends AppCompatActivity {

TextView time ;
TextView count;
Button start;
ImageView img1;
ImageView img2;
ImageView img3;
ImageView img4;
ImageView img5;
ImageView img6;
ImageView img7;
ImageView img8;
ImageView img9;

Thread thread = null;

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);

time=findViewById(R.id.time);
count=findViewById(R.id.count);
start=findViewById(R.id.start);
img1=findViewById(R.id.imageView1);
img2=findViewById(R.id.imageView2);
img3=findViewById(R.id.imageView3);
img4=findViewById(R.id.imageView4);
img5=findViewById(R.id.imageView5);
img6=findViewById(R.id.imageView6);
img7=findViewById(R.id.imageView7);
img8=findViewById(R.id.imageView8);
img9=findViewById(R.id.imageView9);

time.setText("30초");
count.setText("0마리");


start.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {

start.setVisibility(View.GONE);
count.setVisibility(View.VISIBLE);

thread=new Thread(new timeCheck());
thread.start();
}
});


}

Handler handler = new Handler(){
@Override
public void handleMessage(Message msg) {

time.setText(msg.arg1+"초");

if(msg.arg1==0){
startActivity(new Intent(MainActivity.this, ResultActivity.class));
thread.interrupt();

}

}
};




public class timeCheck implements Runnable{

@Override
public void run() {
int i = 30;
while(true){
try {
Message msg = new Message();
msg.arg1=i--;
Thread.sleep(1000);
handler.sendMessage(msg);

} catch (InterruptedException e) {
e.printStackTrace();
return;
}
}
}
}


}


두더지게임을 위한 두더지사진 2장 (들어가있는 모습/튀어나온 모습) 을 구해 넣어놓고 배열에 아이디를 넣는다.
들어가 있는 두더지를 누르면 -1점, 튀어나온 두더지를 누르면 +1점이 되게 하였고,
각 두더지마다 쓰레드를 주고 랜덤으로 튀어나오는 횟수와 시간을 부여했다.

MainActivity.java
package com.example.pc_20.molegame;

import android.content.Intent;
import android.os.Handler;
import android.os.Message;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.ImageView;
import android.widget.TextView;
import android.widget.Toast;

import java.util.Random;

public class MainActivity extends AppCompatActivity {

TextView time;
TextView count;
Button start;

ImageView[] img_array = new ImageView[9];
int[] imageID = {R.id.imageView1, R.id.imageView2, R.id.imageView3, R.id.imageView4, R.id.imageView5, R.id.imageView6, R.id.imageView7, R.id.imageView8, R.id.imageView9};

final String TAG_ON = "on"; //태그용
final String TAG_OFF = "off";
int score = 0;

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);

time = (TextView)findViewById(R.id.time);
count = (TextView)findViewById(R.id.count);
start = (Button)findViewById(R.id.start);

for(int i = 0; i<img_array.length; i++){
/*int img_id = getResources().getIdentifier("imageView"+i+1, "id", "com.example.pc_20.molegame");*/
img_array[i] = (ImageView)findViewById(imageID[i]);
img_array[i].setImageResource(R.drawable.moledown);
img_array[i].setTag(TAG_OFF);

img_array[i].setOnClickListener(new View.OnClickListener() { //두더지이미지에 온클릭리스너
@Override
public void onClick(View v) {
if(((ImageView)v).getTag().toString().equals(TAG_ON)){
Toast.makeText(getApplicationContext(), "good", Toast.LENGTH_LONG).show();
count.setText(String.valueOf(score++));
((ImageView) v).setImageResource(R.drawable.moledown);
v.setTag(TAG_OFF);
}else{
Toast.makeText(getApplicationContext(), "bad", Toast.LENGTH_LONG).show();
if(score<=0){
score=0;
count.setText(String.valueOf(score));
}else{
count.setText(String.valueOf(score--));
}
((ImageView) v).setImageResource(R.drawable.moleup);
v.setTag(TAG_ON);
}
}
});
}

time.setText("30초");
count.setText("0마리");

start.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {

start.setVisibility(View.GONE);
count.setVisibility(View.VISIBLE);

new Thread(new timeCheck()).start();

for(int i = 0; i<img_array.length; i++){
new Thread(new DThread(i)).start();
}
}
});
}

Handler onHandler = new Handler(){
@Override
public void handleMessage(Message msg) {
img_array[msg.arg1].setImageResource(R.drawable.moleup);
img_array[msg.arg1].setTag(TAG_ON); //올라오면 ON태그 달아줌
}
};

Handler offHandler = new Handler(){
@Override
public void handleMessage(Message msg) {
img_array[msg.arg1].setImageResource(R.drawable.moledown);
img_array[msg.arg1].setTag(TAG_OFF); //내려오면 OFF태그 달아줌

}
};

public class DThread implements Runnable{ //두더지를 올라갔다 내려갔다 해줌
int index = 0; //두더지 번호

DThread(int index){
this.index=index;
}

@Override
public void run() {
while(true){
try {
Message msg1 = new Message();
int offtime = new Random().nextInt(5000) + 500 ;
Thread.sleep(offtime); //두더지가 내려가있는 시간

msg1.arg1 = index;
onHandler.sendMessage(msg1);

int ontime = new Random().nextInt(1000)+500;
Thread.sleep(ontime); //두더지가 올라가있는 시간
Message msg2 = new Message();
msg2.arg1= index;
offHandler.sendMessage(msg2);

} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}

Handler handler = new Handler() {
@Override
public void handleMessage(Message msg) {

time.setText(msg.arg1 + "초");
}
};

public class timeCheck implements Runnable {
final int MAXTIME = 30;

@Override
public void run() {
for (int i = MAXTIME; i >= 0; i--) {
Message msg = new Message();
msg.arg1 = i;
handler.sendMessage(msg);

try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
Intent intent = new Intent(MainActivity.this, ResultActivity.class);
intent.putExtra("score", score);
startActivity(intent);
finish();
}
}
}






게임 화면.








게임이 끝나면 결과성적을 가지고 ResultActivity.java로 이동하게 하였다.

ResultActivity.java
package com.example.pc_20.molegame;

import android.content.Intent;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.TextView;

public class ResultActivity extends AppCompatActivity {

TextView sub_result ;
Button sub_retry;

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_result2); //주소로 알고있는 xml을 눈에 보이는 view로 바꿔줌 ->InfLate

sub_result = findViewById(R.id.sub_result);
sub_retry = findViewById(R.id.sub_retry);

int score = getIntent().getIntExtra("score",-1);
sub_result.setText(String.valueOf(score));

sub_retry.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Intent intent = new Intent(ResultActivity.this, MainActivity.class);
startActivity(intent);
finish();




}
});

}
}


기록을 저장하기 위해 SharedPreference 을 사용하여, 신기록을 달성하는 경우 문구를 띄워주게 하였다.

package com.example.pc_20.molegame;

import android.content.Intent;
import android.content.SharedPreferences;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.TextView;

public class ResultActivity extends AppCompatActivity {

TextView sub_result;
Button sub_retry;
SharedPreferences spf = null;

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_result2); //주소로 알고있는 xml을 눈에 보이는 view로 바꿔줌 ->InfLate

spf = getSharedPreferences("spfScore",MODE_PRIVATE); // 키값이 또 있으면 덮어쓰겠다

sub_result = findViewById(R.id.sub_result);
sub_retry = findViewById(R.id.sub_retry);

int score = getIntent().getIntExtra("score", -1);
sub_result.setText(String.valueOf(score));

if(spf.getInt("spfscore",0) < score){ //내점수가 저번 점수보다 크면
spf.edit().putInt("spfscore",score).commit(); //반영의 commit(). 현재상태 저장
sub_result.setText("신기록달성\n"+score);
}


sub_retry.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Intent intent = new Intent(ResultActivity.this, MainActivity.class);
startActivity(intent);
finish();


}
});

}
}