Memory Game
This commit is contained in:
parent
9213fec0ba
commit
0ea5e8225c
184
memory/Memory.java
Normal file
184
memory/Memory.java
Normal file
@ -0,0 +1,184 @@
|
|||||||
|
import java.util.*;
|
||||||
|
|
||||||
|
public class Memory {
|
||||||
|
static final String ANSI_CLS = "\u001b[2J";
|
||||||
|
static final String ANSI_HOME = "\u001b[H";
|
||||||
|
|
||||||
|
public static void main(String[] args) {
|
||||||
|
Game g = new Game();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
class Game {
|
||||||
|
boolean quit = false;
|
||||||
|
int numCards = 16;
|
||||||
|
Card[] cards;
|
||||||
|
Random rnd = new Random(new Date().getTime());
|
||||||
|
int gameState = 0;
|
||||||
|
int selRow1, selCol1, selRow2, selCol2;
|
||||||
|
int foundMatches = 0;
|
||||||
|
int badMatches = 0;
|
||||||
|
String errMessage = "";
|
||||||
|
|
||||||
|
public Game() {
|
||||||
|
initializeDeck();
|
||||||
|
resetInput();
|
||||||
|
|
||||||
|
while(!quit) {
|
||||||
|
clearScreen();
|
||||||
|
drawScreen();
|
||||||
|
int inp = getUserInput();
|
||||||
|
handleInput(inp);
|
||||||
|
}
|
||||||
|
System.out.println("Thanks for playing!");
|
||||||
|
System.out.println("");
|
||||||
|
}
|
||||||
|
|
||||||
|
public void initializeDeck() {
|
||||||
|
cards = new Card[numCards];
|
||||||
|
for(int i = 0; i < numCards; i++) {
|
||||||
|
cards[i] = new Card(-1);
|
||||||
|
}
|
||||||
|
for(int i = 0; i < numCards/2; i++) {
|
||||||
|
int idx = rnd.nextInt(numCards);
|
||||||
|
while(cards[idx].value != -1) {
|
||||||
|
idx = rnd.nextInt(numCards);
|
||||||
|
}
|
||||||
|
cards[idx].value = i;
|
||||||
|
while(cards[idx].value != -1) {
|
||||||
|
idx = rnd.nextInt(numCards);
|
||||||
|
}
|
||||||
|
cards[idx].value = i;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public void drawScreen() {
|
||||||
|
printScore();
|
||||||
|
if(gameState == 0 || gameState == 2) {
|
||||||
|
System.out.println(" 0 1 2 3");
|
||||||
|
} else {
|
||||||
|
System.out.println(" ");
|
||||||
|
}
|
||||||
|
System.out.println(" v v v v");
|
||||||
|
int row = 0;
|
||||||
|
for(int i = 0; i < numCards; i++) {
|
||||||
|
int sqrt = (int)Math.sqrt(numCards);
|
||||||
|
if(i % sqrt == 0) {
|
||||||
|
if(gameState == 1 || gameState == 3) {
|
||||||
|
System.out.print(row+">");
|
||||||
|
} else {
|
||||||
|
System.out.print(" >");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
System.out.print(" ");
|
||||||
|
cards[i].Draw();
|
||||||
|
if(i % sqrt == sqrt-1) {
|
||||||
|
System.out.println("");
|
||||||
|
row++;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if(!"".equals(errMessage)) {
|
||||||
|
System.out.println(errMessage);
|
||||||
|
}
|
||||||
|
if(gameState == 0 || gameState == 2) {
|
||||||
|
System.out.print("Select Column: ");
|
||||||
|
} else if(gameState == 1 || gameState == 3) {
|
||||||
|
System.out.print("Select Row: ");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public void resetInput() {
|
||||||
|
selRow1 = selCol1 = -1;
|
||||||
|
selRow2 = selCol2 = -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void handleInput(int i) {
|
||||||
|
int sqrt = (int)Math.sqrt(numCards);
|
||||||
|
if(gameState == 0) {
|
||||||
|
selCol1 = i;
|
||||||
|
hideUnsolvedCards();
|
||||||
|
errMessage = "";
|
||||||
|
} else if(gameState == 1) {
|
||||||
|
selRow1 = i;
|
||||||
|
cards[(selRow1*sqrt)+selCol1].visible = true;
|
||||||
|
} else if(gameState == 2) {
|
||||||
|
selCol2 = i;
|
||||||
|
} else if(gameState == 3) {
|
||||||
|
selRow2 = i;
|
||||||
|
cards[(selRow2*sqrt)+selCol2].visible = true;
|
||||||
|
int crd1 = (selRow1*sqrt)+selCol1;
|
||||||
|
int crd2 = (selRow2*sqrt)+selCol2;
|
||||||
|
if(selRow1 == selRow2 && selCol1 == selCol2) {
|
||||||
|
errMessage = "That's the same card...";
|
||||||
|
} else {
|
||||||
|
if(cards[crd1].value == cards[crd2].value) {
|
||||||
|
cards[crd1].solved = true;
|
||||||
|
cards[crd2].solved = true;
|
||||||
|
foundMatches++;
|
||||||
|
} else {
|
||||||
|
badMatches++;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
resetInput();
|
||||||
|
if(foundMatches >= numCards) {
|
||||||
|
quit = true;
|
||||||
|
System.out.println("YOU WIN!");
|
||||||
|
printScore();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
gameState = (gameState+1) % 4;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void printScore() {
|
||||||
|
System.out.println("Matches: "+foundMatches+"/"+(numCards/2)+" ("+badMatches+" Incorrect)");
|
||||||
|
}
|
||||||
|
|
||||||
|
public void clearScreen() {
|
||||||
|
System.out.println(Memory.ANSI_CLS+Memory.ANSI_HOME);
|
||||||
|
System.out.flush();
|
||||||
|
}
|
||||||
|
|
||||||
|
public void hideUnsolvedCards() {
|
||||||
|
for(int i = 0; i < numCards; i++) {
|
||||||
|
cards[i].visible = false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public int getUserInput() {
|
||||||
|
Scanner r = new Scanner(System.in);
|
||||||
|
String inp = "";
|
||||||
|
int ret = -1;
|
||||||
|
while(ret == -1) {
|
||||||
|
inp = r.nextLine();
|
||||||
|
if("q".equals(inp) || "quit".equals(inp) || "exit".equals(inp)) {
|
||||||
|
quit = true;
|
||||||
|
ret = -2;
|
||||||
|
} else {
|
||||||
|
try {
|
||||||
|
ret = Integer.parseInt(inp);
|
||||||
|
} catch(Exception e) {
|
||||||
|
ret = -1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
class Card {
|
||||||
|
boolean visible = false;
|
||||||
|
boolean solved = false;
|
||||||
|
int value;
|
||||||
|
|
||||||
|
public Card(int v) {
|
||||||
|
this.value = v;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void Draw() {
|
||||||
|
if(this.visible || this.solved) {
|
||||||
|
System.out.print(this.value);
|
||||||
|
} else {
|
||||||
|
System.out.print("#");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
Loading…
Reference in New Issue
Block a user