Create a Java card game program, named pisti. The user will play the game with t
ID: 3724940 • Letter: C
Question
Create a Java card game program, named pisti. The user will play the game with the computer.
--------------------------
*****THIS IS THE FULL PROJECT AND DOES NOT LACK ANY INSUFFICIENT CONTEXT!!!!!******
PLEASE READ THE WHOLE DESCRIPTION, THANKS!
YOU CAN USE ANY GUI TOOL, PLEASE DO NOT REPORT AS INCOMPLETE!
--------------------------
Project name: Pis(h)ti
Project Proposal: Create a card game program, pisti. The user will play the game with the computer. The rules of the game added below.
Requirements: Create classes for appropriate objects such as deck, card, player (bot and person). Use ArrayLists, Arrays, exception handling. Create a GUI that displays the cards in the center, and the player’s cards. At the end of the game, the scores should be calculated and winner should be announced.
--------------------------
Introduction:
Pisti (pronounced "pishti"), is a popular Turkish card game, using a standard 52 card pack. The direction of play is counter-clockwise.
Cards are played to a central pile, which can be captured by matching the previous card played or playing a jack. Points are scored for certain captured cards. The word "pisti", which means "burnt", describes a capture of a pile containing only one card, for which extra points are scored.
The dealer turns one card of the four in the center of the table face up, to start the discard pile. If it is a jack, the cards should be shuffled and start the game again.
The Play:
The player to dealer's right begins, and the turn to play passes counter-clockwise (For our project the user will play, then bot plays). A turn consists of playing one card from your hand face up on top of the discard pile.
If rank of the played card matches the rank of the previous card on the pile, the playing team captures the whole pile. The captured cards are stored face down in front of one member of the team. The next player will then start a new discard pile by playing a card face up to the empty table.
Playing a jack also captures the whole pile, no matter what card is on top of it.
If the played card is not a jack and is not equal to the previous top card of the pile, the played card is simply added to the top of the pile.
The team which makes the first capture also gets the cards which were dealt to the center of the table. Both members of the capturing team can look at these cards, but the other team are not allowed to see them.
When everyone has played their last four cards, any cards remaining in the discard pile are given to the last team that made a capture. The play of the hand is now over, and the teams score for the cards they have captured.
Pisti:
If the pile consists of just one card and the next player captures it by playing a matching card (not a jack), the capturing team scores a 10 point bonus for a pisti. The capturing card is placed face up in the team's capture pile as a way of remembering the 10 points when scoring.
If the pile consists of just a single jack and you capture it with another jack, this counts as a double pisti, worth 20 points. A pisti can happen at any stage of the game, except that you cannot score a pisti for the very first card played by the player to dealer's right (capturing the original center cards) nor for the very last card played by the dealer (just before the hand is scored).
Scoring:
Points are scored for particular cards, for the majority of cards, and for each pisti as follows: (see attached picture)
Each J,Q,K,10 1 point . . . 1 point 2 points 3 points Majority of cards 3 points Each ace 10 Each piti Each J piti . .. 10 points . . 20 pointsExplanation / Answer
import javafx.application.Application;
import javafx.geometry.Insets;
import javafx.geometry.Pos;
import javafx.scene.Scene;
import javafx.scene.control.Button;
import javafx.scene.image.Image;
import javafx.scene.image.ImageView;
import javafx.scene.layout.*;
import javafx.scene.paint.Color;
import javafx.scene.shape.Rectangle;
import javafx.scene.text.Text;
import javafx.stage.Stage;
import java.util.ArrayList;
public class Pishti extends Application
{
private GridPane top;
private GridPane bottom;
private BorderPane pane;
private ArrayList<Image> playerHand;
private ArrayList<Image> botHand;
private Deck deck;
private Player player;
private Player bot;
private Rectangle table;
private Image blankCard = new Image("card.png");
private Stack stack;
private StackPane flow;
private StackPane left;
private StackPane centerStack;
private ImageView card1;
private ImageView card2;
private ImageView card3;
private ImageView card4;
private int topCard;
private int lastCard;
private ArrayList<Integer> ArrayList<>();
private ArrayList<Integer> playerWin = new ArrayList<>();
private ArrayList<Integer> botWin = new ArrayList<>();
private int playerPishti = 0;
private int botPishti = 0;
private int playerScore = 0;
private int botScore = 0;
private int moved = 0;
private int playerNumber = 0;
private Pane cPane1 = new Pane();
private Pane cPane2 = new Pane();
private Pane cPane3 = new Pane();
private Pane cPane4 = new Pane();
private int moveNumber = 48;
private boolean playerLastWin;
private Text winner;
private Button btn;
private BorderPane finalScreen = new BorderPane();
private final int JACK_OF_SPADES = 11;
private final int JACK_OF_HEARTS = 24;
private final int JACK_OF_DIAMONDS = 37;
private final int JACK_OF_CLUBS = 50;
private final int TWO_OF_CLUBS = 41;
private final int TEN_OF_DIAMONDS = 36;
private boolean gameOver = false;
public void start(Stage primaryScene)
{
/* Make the GUI */
top = new GridPane();
bottom = new GridPane();
pane = new BorderPane();
flow = new StackPane();
left = new StackPane();
centerStack = new StackPane();
top.setAlignment(Pos.CENTER);
bottom.setAlignment(Pos.CENTER);
top.setVgap(5.5);
top.setHgap(5.5);
bottom.setHgap(5.5);
bottom.setVgap(5.5);
pane.setPadding(new Insets(11,11,11,11));
table = new Rectangle(450,200);
table.setStroke(Color.BLACK);
table.setFill(Color.BURLYWOOD);
flow.getChildren().add(table);
left.setAlignment(Pos.CENTER);
left.setPadding(new Insets(0,0,0,350));
flow.getChildren().add(left);
flow.setAlignment(Pos.CENTER);
flow.getChildren().add(centerStack);
deck = new Deck();
deck.shuffleCards();
stack = new Stack(deck);
makeStack();
makePlayerHand();
makeBotHand();
makeCenterStack();
/* Check if the top card will be a Jack, if so reshuffle */
if (stack.getCardNumber(3) == JACK_OF_SPADES || stack.getCardNumber(3) == JACK_OF_HEARTS ||
stack.getCardNumber(3) == JACK_OF_DIAMONDS || stack.getCardNumber(3) == JACK_OF_CLUBS)
{
deck.shuffleCards();
stack = new Stack(deck);
makeStack();
makePlayerHand();
makeBotHand();
makeCenterStack();
}
/* Add player hand to bottom of screen */
bottom.add(cPane1, 3, 4);
bottom.add(cPane2, 4, 4);
bottom.add(cPane3, 5, 4);
bottom.add(cPane4, 6, 4);
/* Set GUI to screen */
pane.setTop(top);
pane.setCenter(flow);
pane.setBottom(bottom);
/* Check if card is clicked */
cPane1.setOnMouseClicked(event ->
{
moveCard(card1,0);
botMove();
moved++;
if (moved == 4)
{
playerNumber += 8;
removeMoveNumber();
checkWin();
if (!gameOver)
{
makePlayerHand();
makeBotHand();
left.getChildren().remove(0, 7);
moved = 0;
}
}
});
cPane2.setOnMouseClicked(event ->
{
moveCard(card2, 1);
botMove();
moved++;
if (moved == 4)
{
playerNumber += 8;
removeMoveNumber();
checkWin();
if (!gameOver)
{
makePlayerHand();
makeBotHand();
left.getChildren().remove(0, 7);
moved = 0;
}
}
});
cPane3.setOnMouseClicked(event ->
{
moveCard(card3, 2);
botMove();
moved++;
if (moved == 4)
{
playerNumber += 8;
removeMoveNumber();
checkWin();
if (!gameOver)
{
makePlayerHand();
makeBotHand();
left.getChildren().remove(0, 7);
moved = 0;
}
}
});
cPane4.setOnMouseClicked(event ->
{
moveCard(card4, 3);
botMove();
moved++;
if (moved == 4)
{
playerNumber += 8;
removeMoveNumber();
checkWin();
if (!gameOver)
{
makePlayerHand();
makeBotHand();
left.getChildren().remove(0, 7);
moved = 0;
}
}
});
/* Make and display scene */
Scene scene = new Scene(pane, 1000, 600);
primaryScene.setTitle("Pishti");
primaryScene.setScene(scene);
primaryScene.show();
}
private void makePlayerHand() //Makes a hand for the Player
{
player = new Player(deck, playerNumber, playerNumber + 2, playerNumber + 4, playerNumber + 6); //Makes player with hand
playerHand = player.getHand();
card1 = new ImageView(playerHand.get(0));
card2 = new ImageView(playerHand.get(1));
card3 = new ImageView(playerHand.get(2));
card4 = new ImageView(playerHand.get(3));
/* Clears panes */
cPane1.getChildren().clear();
cPane2.getChildren().clear();
cPane3.getChildren().clear();
cPane4.getChildren().clear();
/* Adds cards to separate panes */
cPane1.getChildren().add(card1);
cPane2.getChildren().add(card2);
cPane3.getChildren().add(card3);
cPane4.getChildren().add(card4);
}
private void makeBotHand() //Makes a hand for the bot
{
bot = new Player(deck, playerNumber + 1, playerNumber + 3, playerNumber + 5, playerNumber + 7);
botHand = bot.getHand();
/* Adds hidden cards to top row */
top.add(new ImageView(blankCard), 3, 0);
top.add(new ImageView(blankCard), 4, 0);
top.add(new ImageView(blankCard), 5, 0);
top.add(new ImageView(blankCard), 6, 0);
}
private void makeStack()
{
for (int count = 0; count < 48; count++)
left.getChildren().add(new ImageView(blankCard));
}
private void makeCenterStack()
{
for (int count = 0; count < 4; count++)
stack.getCardsLeft().remove(0);
onTable.add(stack.getCardNumber(0));
onTable.add(stack.getCardNumber(1));
onTable.add(stack.getCardNumber(2));
onTable.add(stack.getCardNumber(3));
centerStack.getChildren().add(new ImageView(blankCard));
centerStack.getChildren().add(new ImageView(blankCard));
centerStack.getChildren().add(new ImageView(blankCard));
Image top = new Image("card/" + stack.getCardNumber(3) + ".png");
centerStack.getChildren().add(new ImageView(top));
topCard = stack.getCardNumber(3);
}
private void moveCard(ImageView card, int number)
{
centerStack.getChildren().add(card);
lastCard = topCard;
topCard = player.getHandNumber(number);
bottom.getChildren().remove(card);
onTable.add(player.getHandNumber(number));
/* Checks if card is the same */
if (topCard == (lastCard + 13) || topCard == (lastCard + 26) || topCard == (lastCard + 39) ||
topCard == (lastCard - 13) || topCard == (lastCard - 26) || topCard == (lastCard - 39))
{
/* If there is only one other card, add points to Pishti */
if (onTable.size() == 2)
playerPishti++;
for (Integer anOnTable : onTable) playerWin.add(anOnTable);
onTable.clear();
centerStack.getChildren().clear();
pane.setLeft(new ImageView(blankCard));
topCard = -140;
lastCard = -140;
playerLastWin = true;
}
else if (lastCard != -140 && (topCard == JACK_OF_SPADES || topCard == JACK_OF_HEARTS ||
topCard == JACK_OF_DIAMONDS || topCard == JACK_OF_CLUBS))
{
/* If only one other card on the table */
if (onTable.size() == 2)
if (lastCard == JACK_OF_SPADES || lastCard == JACK_OF_HEARTS || lastCard == JACK_OF_DIAMONDS ||
lastCard == JACK_OF_CLUBS)
playerPishti += 2;
for (Integer anOnTable : onTable)
playerWin.add(anOnTable);
onTable.clear();
centerStack.getChildren().clear();
pane.setLeft(new ImageView(blankCard));
topCard = -140;
lastCard = -140;
playerLastWin = true;
}
}
private void botMove() //Bot AI moves
{
/* Makes bots hand easier to control */
int botCard1 = bot.getHandNumber(0);
int botCard2 = bot.getHandNumber(1);
int botCard3 = bot.getHandNumber(2);
int botCard4 = bot.getHandNumber(3);
/* If the card is still in play and is the same as the card on top */
if (botCard1 != -1 && (botCard1 == (topCard + 13) || botCard1 == (topCard + 26) ||
botCard1 == (topCard + 39) || botCard1 == (topCard - 13) || botCard1 == (topCard - 26) ||
botCard1 == (topCard - 39)))
{
onTable.add(botCard1);
for (Integer anOnTable : onTable) botWin.add(anOnTable);
onTable.clear();
centerStack.getChildren().clear();
top.getChildren().remove(0);
bot.setHandNumber(0, -1);
pane.setRight(new ImageView(blankCard));
topCard = -140;
playerLastWin = false;
}
/*Else if second card is in play and is same as top card */
else if (botCard2 != -1 && (botCard2 == (topCard + 13) || botCard2 == (topCard + 26) ||
botCard2 == (topCard + 39) || botCard2 == (topCard - 13) || botCard2 == (topCard - 26) ||
botCard2 == (topCard - 39)))
{
/* Same as above */
onTable.add(botCard2);
for (Integer anOnTable : onTable) botWin.add(anOnTable);
onTable.clear();
centerStack.getChildren().clear();
top.getChildren().remove(0);
bot.setHandNumber(1, -1);
pane.setRight(new ImageView(blankCard));
topCard = -140;
playerLastWin = false;
}
/*Else if third card is in play and is same as top card */
else if (botCard3 != -1 && (botCard3 == (topCard + 13) || botCard3 == (topCard + 26) ||
botCard3 == (topCard + 39) || botCard3 == (topCard - 13) || botCard3 == (topCard - 26) ||
botCard3 == (topCard - 39)))
{
/* Same as above */
onTable.add(botCard3);
for (Integer anOnTable : onTable) botWin.add(anOnTable);
onTable.clear();
centerStack.getChildren().clear();
top.getChildren().remove(0);
bot.setHandNumber(2, -1);
pane.setRight(new ImageView(blankCard));
topCard = -140;
playerLastWin = false;
}
/*Else if fourth card is in play and is same as top card */
else if (botCard4 != -1 && (botCard4 == (topCard + 13) || botCard4 == (topCard + 26) ||
botCard4 == (topCard + 39) || botCard4 == (topCard - 13) || botCard4 == (topCard - 26) ||
botCard4 == (topCard - 39)))
{
/* Same as above */
onTable.add(botCard4);
for (Integer anOnTable : onTable) botWin.add(anOnTable);
onTable.clear();
centerStack.getChildren().clear();
top.getChildren().remove(0);
bot.setHandNumber(3, -1);
pane.setRight(new ImageView(blankCard));
topCard = -140;
playerLastWin = false;
}
else
{
if (topCard == -140)
{
if (botCard1 != -1)
{
centerStack.getChildren().add(new ImageView(botHand.get(0))); //Add card to center
topCard = botCard1;
onTable.add(botCard1);
top.getChildren().remove(0);
bot.setHandNumber(0, -1);
}
else if (botCard2 != -1) //Card two is in play
{
centerStack.getChildren().add(new ImageView(botHand.get(1)));
topCard = botCard2;
onTable.add(botCard2);
top.getChildren().remove(0);
bot.setHandNumber(1, -1);
}
else if (botCard3 != -1)
{
centerStack.getChildren().add(new ImageView(botHand.get(2)));
topCard = botCard3;
onTable.add(botCard3);
top.getChildren().remove(0);
bot.setHandNumber(2, -1);
}
else if (botCard4 != -1) //Card four is in play
{
centerStack.getChildren().add(new ImageView(botHand.get(3)));
topCard = botCard4;
onTable.add(bot.getHandNumber(3));
top.getChildren().remove(0);
bot.setHandNumber(3, -1);
}
}
else if ((botCard1 == JACK_OF_SPADES || botCard1 == JACK_OF_HEARTS || botCard1 == JACK_OF_DIAMONDS ||
botCard1 == JACK_OF_CLUBS))
{
onTable.add(bot.getHandNumber(0));
for (Integer anOnTable : onTable) botWin.add(anOnTable);
onTable.clear();
centerStack.getChildren().clear();
top.getChildren().remove(0);
bot.setHandNumber(0, -1);
pane.setRight(new ImageView(blankCard));
topCard = -140;
playerLastWin = false;
}
else if ((botCard2 == JACK_OF_SPADES || botCard2 == JACK_OF_HEARTS || botCard2 == JACK_OF_DIAMONDS ||
botCard2 == JACK_OF_CLUBS))
{
onTable.add(bot.getHandNumber(1));
for (Integer anOnTable : onTable) botWin.add(anOnTable);
onTable.clear();
centerStack.getChildren().clear();
top.getChildren().remove(0);
bot.setHandNumber(1, -1);
pane.setRight(new ImageView(blankCard));
topCard = -140;
playerLastWin = false;
}
else if ((botCard3 == JACK_OF_SPADES || botCard3 == JACK_OF_HEARTS || botCard3 == JACK_OF_DIAMONDS ||
botCard3 == JACK_OF_CLUBS))
{
onTable.add(bot.getHandNumber(2));
for (Integer anOnTable : onTable) botWin.add(anOnTable);
onTable.clear();
centerStack.getChildren().clear();
top.getChildren().remove(0);
bot.setHandNumber(2, -1);
pane.setRight(new ImageView(blankCard));
topCard = -140;
playerLastWin = false;
}
else if ((botCard4 == JACK_OF_SPADES || botCard4 == JACK_OF_HEARTS || botCard4 == JACK_OF_DIAMONDS ||
botCard4 == JACK_OF_CLUBS))
{
onTable.add(bot.getHandNumber(3));
for (Integer anOnTable : onTable) botWin.add(anOnTable);
onTable.clear();
centerStack.getChildren().clear();
top.getChildren().remove(0);
bot.setHandNumber(3, -1);
pane.setRight(new ImageView(blankCard));
topCard = -140;
playerLastWin = false;
}
else
{
if (botCard1 != -1)
{
centerStack.getChildren().add(new ImageView(botHand.get(0)));
topCard = botCard1;
onTable.add(bot.getHandNumber(0));
top.getChildren().remove(0);
bot.setHandNumber(0, -1);
}
else if (botCard2 != -1)
{
centerStack.getChildren().add(new ImageView(botHand.get(1)));
topCard = botCard2;
onTable.add(bot.getHandNumber(1));
top.getChildren().remove(0);
bot.setHandNumber(1, -1);
}
else if (botCard3 != -1)
{
centerStack.getChildren().add(new ImageView(botHand.get(2)));
topCard = botCard3;
onTable.add(bot.getHandNumber(2));
top.getChildren().remove(0);
bot.setHandNumber(2, -1);
}
else if (botCard4 != -1)
{
centerStack.getChildren().add(new ImageView(botHand.get(3)));
topCard = botCard4;
onTable.add(bot.getHandNumber(3));
top.getChildren().remove(0);
bot.setHandNumber(3, -1);
}
}
}
}
private void removeMoveNumber()
{
moveNumber -= 8;
}
private void checkWin() //Checks if game is over
{
if (moveNumber == 8)
flow.getChildren().remove(left);
else if (moveNumber == 0)
{
gameOver = true;
if (playerLastWin)
{
for (Integer anOnTable : onTable) playerWin.add(anOnTable);
onTable.clear();
centerStack.getChildren().clear();
pane.setLeft(new ImageView(blankCard));
}
else
{
for (Integer anOnTable : onTable) botWin.add(anOnTable);
onTable.clear();
centerStack.getChildren().clear();
pane.setRight(new ImageView(blankCard));
}
getScores();
}
}
private void getScores()
{
int Ten = 10;
int Jack = 11;
int Queen = 12;
int King = 13;
int Ace = 1;
for (int count = 0; count < 4; count++)
{
/* If card is in player/bot win Array, add points to player/bot */
if (playerWin.contains(Ten))
playerScore++;
if (playerWin.contains(Jack))
playerScore++;
if (playerWin.contains(Queen))
playerScore++;
if (playerWin.contains(King))
playerScore++;
if (playerWin.contains(Ace))
playerScore++;
if (botWin.contains(Ten))
botScore++;
if (botWin.contains(Jack))
botScore++;
if (botWin.contains(Queen))
botScore++;
if (botWin.contains(King))
botScore++;
if (botWin.contains(Ace))
botScore++;
/* Make numbers the next suit */
Ten += 13;
Jack += 13;
Queen += 13;
King += 13;
Ace += 13;
}
if (playerWin.contains(TWO_OF_CLUBS))
playerScore += 2;
else
botScore += 2;
if (playerWin.contains(TEN_OF_DIAMONDS))
playerScore += 2;
else
botScore += 3;
if (playerWin.size() > botWin.size())
playerScore += 3;
else
botScore += 3;
playerScore += (playerPishti * 10);
botScore += (botPishti * 10);
displayWinner();
}
private void displayWinner() //Displays the winner
{
if (playerScore > botScore)
{
pane.getChildren().clear();
winner = new Text("Player wins with " + playerScore + " points!");
winner.setUnderline(true);
winner.setStroke(Color.BLACK);
winner.setScaleX(3);
winner.setScaleY(3);
btn = new Button("Thanks for playing!");
btn.setAlignment(Pos.CENTER);
finalScreen.setTop(winner);
finalScreen.setBottom(btn);
finalScreen.setPadding(new Insets(200,0,200,450));
btn.setOnMouseClicked(event -> {
System.exit(0); //Quit program
});
pane.setCenter(finalScreen);
}
/* Same as above */
else if (botScore > playerScore)
{
pane.getChildren().clear();
winner = new Text("Bot wins with " + botScore + " points, better luck next time.");
winner.setUnderline(true);
winner.setStroke(Color.BLACK);
winner.setScaleX(3);
winner.setScaleY(3);
btn = new Button("Thanks for playing!");
btn.setAlignment(Pos.CENTER);
finalScreen.setTop(winner);
finalScreen.setBottom(btn);
finalScreen.setPadding(new Insets(200,0,200,400));
btn.setOnMouseClicked(event -> {
System.exit(0);
});
pane.setCenter(finalScreen);
}
else
{
pane.getChildren().clear();
winner = new Text("You tied with " + botScore + " points, better luck next time.");
winner.setUnderline(true);
winner.setStroke(Color.BLACK);
winner.setScaleX(3);
winner.setScaleY(3);
btn = new Button("Thanks for playing!");
btn.setAlignment(Pos.CENTER);
finalScreen.setTop(winner);
finalScreen.setBottom(btn);
finalScreen.setPadding(new Insets(200,0,200,400));
btn.setOnMouseClicked(event -> {
System.exit(0);
});
pane.setCenter(finalScreen);
}
}
public static void main(String[] args)
{
launch(args);
}
}
--------------------------------------------------------------------------------------------------
import java.util.ArrayList;
public class Deck
{
private ArrayList<Card> cards = new ArrayList<>();
private Card card;
Deck()
{
for (int count = 0; count < 52; count++)
{
card = new Card(count + 1);
cards.add(card);
}
cards.trimToSize();
}
public Card getCards(int number)
{
return cards.get(number);
}
public ArrayList<Card> getCards()
{
return cards;
}
public ArrayList shuffleCards()
{
java.util.Collections.shuffle(cards);
return cards;
}
public int cardNumber(int number)
{
return cards.get(number).getNumber();
}
}
------------------------------------------------------------------------------------------------------
public class Card
{
int number;
Card(int number)
{
this.number = number;
}
public int getNumber()
{
return number;
}
}
--------------------------------------------------------------------------------------------------
import javafx.scene.image.Image;
import java.util.ArrayList;
public class Player {
private ArrayList<Image> hand = new ArrayList<>();
private ArrayList<Integer> handNumber = new ArrayList<>();
Player(Deck deck, int one, int two, int three, int four) {
Image card1 = new Image("card/" + deck.cardNumber(one) + ".png");
Image card2 = new Image("card/" + deck.cardNumber(two) + ".png");
Image card3 = new Image("card/" + deck.cardNumber(three) + ".png");
Image card4 = new Image("card/" + deck.cardNumber(four) + ".png");
hand.add(card1);
hand.add(card2);
hand.add(card3);
hand.add(card4);
handNumber.add(deck.getCards(one).getNumber());
handNumber.add(deck.getCards(two).getNumber());
handNumber.add(deck.getCards(three).getNumber());
handNumber.add(deck.getCards(four).getNumber());
}
public ArrayList getHand() {
return hand;
}
public int getHandNumber(int number) {
return handNumber.get(number);
}
public void setHandNumber(int where, int number) {
handNumber.set(where, number);
}
}
--------------------------------------------------------------------------------------------------
import java.util.ArrayList;
public class Stack
{
private ArrayList<Card> cardsLeft;
Stack(Deck deck)
{
cardsLeft = deck.getCards();
}
public ArrayList getCardsLeft()
{
return cardsLeft;
}
public int getCardNumber(int number)
{
return cardsLeft.get(number).getNumber();
}
}