Memory Game

This commit is contained in:
Brian Buller 2016-02-20 11:29:21 -06:00
parent 9213fec0ba
commit 0ea5e8225c

184
memory/Memory.java Normal file
View 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("#");
}
}
}