Untitled
unknown
java
8 months ago
9.7 kB
8
Indexable
package com.natividad.memorygame;
import android.animation.Animator;
import android.animation.AnimatorListenerAdapter;
import android.animation.AnimatorSet;
import android.animation.ObjectAnimator;
import android.os.Bundle;
import android.os.CountDownTimer;
import android.util.Log;
import android.view.View;
import android.widget.ImageView;
import android.widget.TextView;
import android.widget.Button;
import android.widget.Toast;
import androidx.appcompat.app.AppCompatActivity;
import java.util.ArrayList;
import java.util.Collections;
public class MainActivity extends AppCompatActivity implements View.OnClickListener {
TextView tv_status, tv_timer, tv_score;
Button bt_start;
private CountDownTimer timerCountdown;
private boolean gameStarted = false;
private boolean gameCompleted = false;
private long timeRemaining; // Store remaining time
private final int[] iv_CardIds = {
R.id.iv_Card0, R.id.iv_Card1, R.id.iv_Card2, R.id.iv_Card3,
R.id.iv_Card4, R.id.iv_Card5, R.id.iv_Card6, R.id.iv_Card7,
R.id.iv_Card8, R.id.iv_Card9, R.id.iv_Card10, R.id.iv_Card11,
R.id.iv_Card12, R.id.iv_Card13, R.id.iv_Card14, R.id.iv_Card15
};
private final int[] drawableCardIds = {
R.drawable.card1, R.drawable.card2, R.drawable.card3, R.drawable.card4,
R.drawable.card5, R.drawable.card6, R.drawable.card7, R.drawable.card8
};
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
tv_status = findViewById(R.id.tv_status);
tv_score = findViewById(R.id.tv_score);
tv_timer = findViewById(R.id.tv_timer);
bt_start = findViewById(R.id.bt_start);
bt_start.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
if (!gameStarted) {
gameStarted = true;
setupNewGame();
bt_start.setText("Restart");
} else {
setupNewGame();
}
}
});
disableGame();
}
private void setupNewGame() {
gameCompleted = false;
tv_status.setText("Finish the game before time runs out :)");
if (tv_score != null) {
tv_score.setText("Score: 0"); // Reset score UI
}
if (timerCountdown != null) {
timerCountdown.cancel();
}
startGameTimer();
ArrayList<Integer> shuffledDrawableIds = new ArrayList<>();
for (int drawableId : drawableCardIds) {
shuffledDrawableIds.add(drawableId);
shuffledDrawableIds.add(drawableId);
}
Collections.shuffle(shuffledDrawableIds);
for (int i = 0; i < shuffledDrawableIds.size(); i++) {
int iv_Id = iv_CardIds[i];
int drawableId = shuffledDrawableIds.get(i);
CardInfo cardInfo = new CardInfo(iv_Id, drawableId);
ImageView imageView = findViewById(iv_Id);
imageView.setImageResource(R.drawable.covered_tile);
imageView.setTag(cardInfo);
imageView.setOnClickListener(this);
}
cardInfo1 = null;
matchCount = 0;
isWaiting = false;
}
private void startGameTimer() {
timerCountdown = new CountDownTimer(30000, 1000) {
@Override
public void onTick(long millisUntilFinished) {
timeRemaining = millisUntilFinished; // Save time left
tv_timer.setText("Time Left: " + millisUntilFinished / 1000 + "s");
}
@Override
public void onFinish() {
if (!gameCompleted) {
tv_status.setText("Time's up! Try again.");
disableGame();
}
}
}.start();
}
private void disableGame() {
for (int id : iv_CardIds) {
findViewById(id).setOnClickListener(null);
}
}
CardInfo cardInfo1 = null;
int matchCount = 0;
boolean isWaiting = false;
private void coverCard(CardInfo cardInfo) {
ImageView imageView = findViewById(cardInfo.getImageViewId());
imageView.setImageResource(R.drawable.covered_tile);
cardInfo.setFlipped(false);
cardInfo.setMatched(false);
}
private void calculateScore() {
long timeUsed = 30000 - timeRemaining;
int timeUsedSeconds = (int) (timeUsed / 1000);
int score;
if (timeUsedSeconds <= 20) {
score = 5;
} else if (timeUsedSeconds <= 25) {
score = 2;
} else {
score = 0;
}
tv_status.setText("Game Over! You scored: " + score + " points.");
tv_score.setText("Score: " + score); // Update new score TextView
Toast.makeText(this, "You scored: " + score + " points!", Toast.LENGTH_LONG).show();
}
@Override
public void onClick(View v) {
if (!isWaiting) {
ImageView imageView = (ImageView) v;
CardInfo cardInfo = (CardInfo) imageView.getTag();
Log.d("demo", "onClick: " + cardInfo);
if (!cardInfo.isFlipped() && !cardInfo.isMatched()) {
flipCard(imageView, cardInfo.getDrawableId(), new Runnable() {
@Override
public void run() {
cardInfo.setFlipped(true);
if (cardInfo1 == null) {
cardInfo1 = cardInfo;
} else {
if (cardInfo.getDrawableId() == cardInfo1.getDrawableId()) {
matchCount++;
cardInfo1.setMatched(true);
cardInfo.setMatched(true);
tv_status.setText("Match Count: " + matchCount);
matchAnimation(imageView, findViewById(cardInfo1.getImageViewId()));
if (matchCount == 8) {
gameCompleted = true;
timerCountdown.cancel();
calculateScore(); // Call the scoring method
}
cardInfo1 = null;
} else {
isWaiting = true;
mismatchAnimation(imageView, findViewById(cardInfo1.getImageViewId()));
imageView.postDelayed(new Runnable() {
@Override
public void run() {
flipCard(imageView, R.drawable.covered_tile, null);
flipCard(findViewById(cardInfo1.getImageViewId()), R.drawable.covered_tile, null);
cardInfo.setFlipped(false);
cardInfo1.setFlipped(false);
cardInfo1 = null;
isWaiting = false;
}
}, 100);
}
}
}
});
}
}
}
private void flipCard(final ImageView card, final int newImageResId, final Runnable onEnd) {
ObjectAnimator flipOut = ObjectAnimator.ofFloat(card, "scaleX", 1f, 0f);
ObjectAnimator flipIn = ObjectAnimator.ofFloat(card, "scaleX", 0f, 1f);
flipOut.setDuration(200);
flipIn.setDuration(200);
flipOut.addListener(new AnimatorListenerAdapter() {
@Override
public void onAnimationEnd(Animator animation) {
card.setImageResource(newImageResId);
flipIn.start();
}
});
flipIn.addListener(new AnimatorListenerAdapter() {
@Override
public void onAnimationEnd(Animator animation) {
if (onEnd != null) {
onEnd.run();
}
}
});
flipOut.start();
}
private void matchAnimation(View card1, View card2) {
AnimatorSet animatorSet = new AnimatorSet();
ObjectAnimator scaleX = ObjectAnimator.ofFloat(card1, "scaleX", 1f, 1.2f, 1f);
ObjectAnimator scaleY = ObjectAnimator.ofFloat(card1, "scaleY", 1f, 1.2f, 1f);
ObjectAnimator scaleX2 = ObjectAnimator.ofFloat(card2, "scaleX", 1f, 1.2f, 1f);
ObjectAnimator scaleY2 = ObjectAnimator.ofFloat(card2, "scaleY", 1f, 1.2f, 1f);
animatorSet.playTogether(scaleX, scaleY, scaleX2, scaleY2);
animatorSet.setDuration(300);
animatorSet.start();
}
private void mismatchAnimation(View card1, View card2) {
ObjectAnimator shake1 = ObjectAnimator.ofFloat(card1, "translationX", 0, 10, -10, 10, -10, 0);
ObjectAnimator shake2 = ObjectAnimator.ofFloat(card2, "translationX", 0, 10, -10, 10, -10, 0);
shake1.setDuration(300);
shake2.setDuration(300);
AnimatorSet animatorSet = new AnimatorSet();
animatorSet.playTogether(shake1, shake2);
animatorSet.start();
}
}
Editor is loading...
Leave a Comment