introductionToProgramming/week6/Card.java
Daniel Bulant 631623009b
add week 6
2025-10-11 18:38:36 +02:00

141 lines
4.1 KiB
Java

package week6;
public class Card {
public enum Suit {
Clubs,
Diamonds,
Hearts,
Spades;
public static final String CLUBS = "";
public static final String DIAMONDS = "";
public static final String HEARTS = "";
public static final String SPADES = "";
public String sprint() {
switch(this) {
case Clubs: return CLUBS;
case Diamonds: return DIAMONDS;
case Hearts: return HEARTS;
case Spades: return SPADES;
}
throw new NullPointerException();
}
}
public Suit suit;
public int value;
public Card(Suit suit, int value) {
this.suit = suit;
this.value = value;
}
// Print a single character for the value
// Only a single character is returned so that we can format
// the card output correctly and easily
public char sprintValue() {
assert this.value > 0 && this.value < 14;
if(this.value == 1) {
return 'A';
} else if(this.value == 11) {
return 'J';
} else if(this.value == 12) {
return 'Q';
} else if(this.value == 13) {
return 'K';
} else if(this.value == 10) {
// UTF-8 character that looks like a 10
// but uses only one character width
return '⒑';
}
// asserted 0 < x < 14, we handled 1, 10-13
// the only valid values here are 2-9
return Integer.toString(this.value).charAt(0);
}
// Print the card to a string to be later processed (or printed).
// Approximates 'normal' card deck look
// Numbered cards have their suit symbol repeated based on their value.
// Face cards are empty.
public String sprintCard() {
var output = "";
var value = this.sprintValue();
var suit = this.suit.sprint();
// Generate the top (and bottom) of a card
// this will show the value of the card on each edge
var top = "";
top += value;
if(this.value > 10) {
// face cards are empty
top += " ";
} else {
// and for numbered cards, show the suit characters
top += this.value >= 4 ? suit : " ";
top += this.value < 4 && this.value > 1 ? suit : " ";
top += this.value >= 4 ? suit : " ";
}
top += value;
top += "\n";
output += top;
if(this.value > 10) {
// face cards get suits on the side, right above and under their values
// numbered cards are empty on their sides
output += suit + " " + suit + "\n";
output += suit + " " + suit + "\n";
} else {
// normal cards have either 3 or 4 rows of suits in 1-3 columns,
// with the middle one sometimes floating.
// we have to have a set size and can't have floating characters,
// so this is a best effort approximation
// instead of using 3 rows we have a gap in the 3rd row
output += " ";
output += this.value >= 6 ? suit : " ";
// odd or 10 have a symbol in the middle
output += this.value % 2 == 1 || this.value == 10 ? suit : " ";
output += this.value >= 6 ? suit : " ";
output += " ";
output += "\n";
output += " ";
output += this.value >= 8 ? suit : " ";
output += this.value == 10 ? suit : " ";
output += this.value >= 8 ? suit : " ";
output += " ";
output += "\n";
}
output += top;
return output;
}
// Shows cards next to each other (left to right)
// for visuals, assumes that sprintCard returns the same width for each card (and each row of a card)
// for correctness, assumes that sprintCard always returns 4 rows (is asserted)
public static String sprintCards(Card[] cards) {
String[] output = { "", "", "", "" };
// split each card into it's 4 rows
// save the row into relevant output
for(var i = 0; i < cards.length; i++) {
var cardstr = cards[i].sprintCard().split("\n");
assert output.length == cardstr.length;
for(var x = 0; x < cardstr.length; x++) {
output[x] += cardstr[x] + " ";
}
}
// and join the rows together with a newline
var outputstr = "";
for(var i = 0; i < output.length; i++) {
outputstr += output[i] + "\n";
}
return outputstr;
}
}