이번 시간에는 저번 포스팅에 이어서 하겠습니다.
8개의 이미지를 섞어서 버튼을 클릭하면 해당 이미지가
보이는 기능까지 구현했습니다. 이제 마무리로 클릭을
해서 첫 번째 이미지와 두 번째 이미지를 비교해서 같은지
다른지 비교하는 기능을 구현하겠습니다.
이전 포스팅은 아래 링크를 들어가시면 됩니다.
2022.04.04 - [안드로이드] - [안드로이드] 같은 그림 찾기 게임 만드는 방법 part3 - 클릭&뒤집기
- 수정 -
2-1 전역 변수 추가
//이전 카드 위치
int preCardPosition = -1;
2-2 updateModel: 뒤집힌 카드 체크 및 비교 로직 추가
//뒤집힌 카드: 이전에 뒤집힌 카드 0 또는 2개일때
if(preCardPosition == -1){
//카드 초기화
restoreCard();
//위치 저장
preCardPosition = position;
}else{ //이전에 뒤집힌 카드: 1개일때
//카드 비교
checkForMatch(preCardPosition, position);
preCardPosition = -1;
}
2-3 restoreCard(): 매치되지 않은 카드 초기화
private void restoreCard(){
for(int i = 0; i < cards.size(); i++){
//매치되지 않은거
if(!cards.get(i).isMatched()){
//이미지 앞으로
buttons[i].setImageResource(R.drawable.question);
//데이터 수정
cards.get(i).setFaceUp(false);
}
}
}
2-4 checkForMatch(): 카드 이미지 비교
private void checkForMatch(int prePosition, int position){
//처음 카드와 두번째 카드 이미지가 같다면
if(cards.get(prePosition).getImageId() == cards.get(position).getImageId()){
resultText.setText("매치 성공");
cards.get(prePosition).setMatched(true);
cards.get(position).setMatched(true);
//색상변경
buttons[prePosition].setAlpha(0.1f);
buttons[position].setAlpha(0.1f);
//완료 체크
checkCompletion();
}else{
resultText.setText("매치 실패");
}
}
2-5 checkCompletion(): 완료 체크
private void checkCompletion(){
int count = 0;
for(int i =0; i < cards.size(); i++){
if(cards.get(i).isMatched()){
count++;
}
}
//매치갯수가 카드갯수와 같다면 완료
if(count == cards.size()){
resultText.setText("게임 끝");
}
}
2-6 init(): 초기화 수정
//선명도 설정
buttons[i].setAlpha(1.0f);
//결과텍스트 초기화
resultText.setText("");
2-7 전체 코드
public class MainActivity extends AppCompatActivity implements View.OnClickListener{
//버튼 배열
private ImageButton[] buttons = new ImageButton[8];
//이미지 리스트
private ArrayList<Integer> imageList;
//카드 리스트
private ArrayList<MemoryCard> cards;
//결과 텍스트
private TextView resultText;
//초기화 버튼
private Button resetBtn;
//이전 카드 위치
int preCardPosition = -1;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
resultText = findViewById(R.id.result_text);
//초기화
init();
resetBtn = findViewById(R.id.reset_btn);
resetBtn.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
//초기화
init();
}
});
}//onClick
//초기화
public void init(){
imageList = new ArrayList<>();
//이미지 리스트에 데이터 등록
imageList.add(R.drawable.dog);
imageList.add(R.drawable.pig);
imageList.add(R.drawable.rabbit);
imageList.add(R.drawable.cat);
imageList.add(R.drawable.dog);
imageList.add(R.drawable.pig);
imageList.add(R.drawable.rabbit);
imageList.add(R.drawable.cat);
//순서 섞기
Collections.shuffle(imageList);
//카드 초기화
cards = new ArrayList<>();
// 버튼 초기화
for(int i = 0; i < buttons.length; i++){
String buttonID = "imageBtn" + i;
int resourceID = getResources().getIdentifier(buttonID, "id", getPackageName());
buttons[i] = findViewById(resourceID);
//각 버튼에 클릭이벤트 적용
buttons[i].setOnClickListener(this);
//카드 리스트에 이미지 담기
cards.add(new MemoryCard(imageList.get(i), false, false));
//각 버튼에 기본 이미지로 변경
buttons[i].setImageResource(R.drawable.question);
//선명도 설정
buttons[i].setAlpha(1.0f);
}
//결과텍스트 초기화
resultText.setText("");
}
//버튼 클릭이벤트
@Override
public void onClick(View view) {
int id = view.getId();
int position = 0;
if(id == R.id.imageBtn0){
position = 0;
}else if(id == R.id.imageBtn1){
position = 1;
}else if(id == R.id.imageBtn2){
position = 2;
}else if(id == R.id.imageBtn3){
position = 3;
}else if(id == R.id.imageBtn4){
position = 4;
}else if(id == R.id.imageBtn5){
position = 5;
}else if(id == R.id.imageBtn6){
position = 6;
}else if(id == R.id.imageBtn7){
position = 7;
}
//업데이트 모델
updateModel(position);
//업데이트 뷰
updateView(position);
}
//데이터 변경
private void updateModel(int position){
MemoryCard card = cards.get(position);
//나중에 카드 비교 할때 뒤집고 다시 클릭하는거 방지
if(card.isFaceUp()){
Toast.makeText(this, "이미 뒤집혔음", Toast.LENGTH_SHORT).show();
return;
}
//뒤집힌 카드: 이전에 뒤집힌 카드 0 또는 2개일때
if(preCardPosition == -1){
//카드 초기화
restoreCard();
//위치 저장
preCardPosition = position;
}else{ //이전에 뒤집힌 카드: 1개일때
//카드 비교
checkForMatch(preCardPosition, position);
preCardPosition = -1;
}
//반대의 값을 넣는다. 앞면 -> 뒷면 , 뒷면 -> 앞면
cards.get(position).setFaceUp(!card.isFaceUp());
}
//뷰 변경
private void updateView(int position){
MemoryCard card = cards.get(position);
//뒤집었음 랜덤 이미지로 보여준다.
if(card.isFaceUp()){
buttons[position].setImageResource(card.getImageId());
}else{ //기본 이미지
buttons[position].setImageResource(R.drawable.question);
}
}
/**
* 매치되지 않은 카드 초기화
*/
private void restoreCard(){
for(int i = 0; i < cards.size(); i++){
//매치되지 않은거
if(!cards.get(i).isMatched()){
//이미지 앞으로
buttons[i].setImageResource(R.drawable.question);
//데이터 수정
cards.get(i).setFaceUp(false);
}
}
}
/**
* 카드 이미지 비교
* @param prePosition 이전 카드 위치
* @param position 현재 카드 위치
*/
private void checkForMatch(int prePosition, int position){
//처음 카드와 두번째 카드 이미지가 같다면
if(cards.get(prePosition).getImageId() == cards.get(position).getImageId()){
resultText.setText("매치 성공");
cards.get(prePosition).setMatched(true);
cards.get(position).setMatched(true);
//색상변경
buttons[prePosition].setAlpha(0.1f);
buttons[position].setAlpha(0.1f);
//완료 체크
checkCompletion();
}else{
resultText.setText("매치 실패");
}
}
/**
* 완료 체크
*/
private void checkCompletion(){
int count = 0;
for(int i =0; i < cards.size(); i++){
if(cards.get(i).isMatched()){
count++;
}
}
//매치갯수가 카드갯수와 같다면 완료
if(count == cards.size()){
resultText.setText("게임 끝");
}
}
}//MainActivity
2022.03.23 - [안드로이드] - [안드로이드] tic-tac-toe 보드게임 만드는 방법 part1 - 화면 구성
2022.03.24 - [안드로이드] - [안드로이드] tic-tac-toe 보드게임 만드는 방법 part2- 기능 구현
2022.03.30 - [안드로이드] - [안드로이드] 야구게임 만드는 방법 part1 - 화면 구성 및 랜덤 숫자 생성
[안드로이드] 코드(MainActivity) 에서 배경색상 바꾸는 다양한 방법 (0) | 2022.04.07 |
---|---|
[안드로이드] RecyclerView 다중선택 하는 방법 (0) | 2022.04.06 |
[안드로이드] 같은 그림 찾기 게임 만드는 방법 part3 - 클릭&뒤집기 (0) | 2022.04.04 |
[안드로이드] 같은 그림 찾기 게임 만드는 방법 part2 - 이미지 섞기& 보여주기 (0) | 2022.04.03 |
[안드로이드] 같은 그림 찾기 게임 만드는 방법 part1 - 화면구성 (0) | 2022.04.02 |
댓글 영역