Main.java
unknown
plain_text
2 years ago
22 kB
8
Indexable
import javax.swing.*;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.ArrayList;
import java.util.Random;
import java.awt.image.BufferedImage;
import java.io.IOException;
import java.net.URL;
import javax.imageio.ImageIO;
class ImagePanel extends JPanel {
private BufferedImage backgroundImage;
public ImagePanel(String imagePath) {
try {
URL resource = getClass().getResource(imagePath);
if (resource != null) {
backgroundImage = ImageIO.read(resource);
}
} catch (IOException e) {
e.printStackTrace();
}
}
@Override
protected void paintComponent(Graphics g) {
super.paintComponent(g);
if (backgroundImage != null) {
g.drawImage(backgroundImage, 0, 0, getWidth(), getHeight(), this);
}
}
}
public class Main {
private JFrame frame;
private JPanel topPanel;
private JPanel bottomPanel;
private boolean isFirstMode = true;
private JLabel betLabel;
private JLabel balanceLabel;
int betOffsetIndex = 0;
int betAmount = 0;
static ArrayList<Bets> bets = new ArrayList<>();
ArrayList<JLabel> displayedBets = new ArrayList<>(); // Store displayed bets
public static ArrayList<Cards> cards = new ArrayList<>();
public static ArrayList<Cards> playerCards = new ArrayList<>();
public static ArrayList<Cards> dealerCards = new ArrayList<>();
public static ArrayList<ImageIcon> cardIcons = new ArrayList<>();
// Using two sums for the case where Ace is both 1 and 11.
public static int playerS1 = 0;
public static int playerS2 = 0;
public static int dealerS1 = 0;
public static int dealerS2 = 0;
public static int balance = 1000;
public static int winner; // 0 = player, 1 = dealer, 2 = tie
public static int dealerMaxSum = 0;
String[] ranks = {"2", "3", "4", "5", "6", "7", "8", "9", "10", "J", "Q", "K", "A"};
String[] suits = {"Hearts", "Diamonds", "Clubs", "Spades"};
Random rng = new Random();
int numberOfDecks = 3;
public Main() {
frame = new JFrame("Blackjack");
frame.setLayout(new BorderLayout());
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setSize(1000, 700);
frame.setResizable(false);
topPanel = new ImagePanel("/background.png"); // Replace with your image path
topPanel.setLayout(null);
bottomPanel = new JPanel();
bottomPanel.setLayout(new FlowLayout(FlowLayout.CENTER));
bottomPanel.setPreferredSize(new Dimension(frame.getWidth(), 40));
betLabel = new JLabel("Bet: " + betAmount);
balanceLabel = new JLabel("Balance: " + balance);
switchMode();
frame.add(topPanel, BorderLayout.CENTER);
frame.add(bottomPanel, BorderLayout.SOUTH);
frame.setVisible(true);
}
private void switchMode() {
bottomPanel.removeAll(); // Clear previous components
if (isFirstMode) {
topPanel.removeAll();
topPanel.revalidate();
topPanel.repaint();
displayedBets.clear();
betAmount = 0;
betOffsetIndex = 0;
betLabel.setText("Bet: " + betAmount);
balanceLabel.setText("Balance: " + balance);
bottomPanel.setBackground(Color.decode("#3d3d3d"));
if (balance == 0) {
topPanel.removeAll(); // Clear previous components // YOU LOST SCREEN NOT WORKING
topPanel = new ImagePanel("/youlost.png");
topPanel.revalidate(); // Refresh the layout
topPanel.repaint(); // Repaint the panel to update changes
}
for (Bets bet : bets) {
JButton betButton = new JButton(String.valueOf(bet.betAmmount));
bottomPanel.add(betButton);
if (!"Deal Cards!".equals(betButton.getText())) { // Exclude "Deal cards" button from processing
betButton.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
int clickedBet = Integer.parseInt(betButton.getText());
if (balance >= clickedBet) {
addIconAtPosition(bet.icon, 163, 277 + betOffsetIndex);
betAmount += clickedBet;
balance -= clickedBet;
betLabel.setText("Bet: " + betAmount);
balanceLabel.setText("Balance: " + balance);
betOffsetIndex -= 12;
}
// Update buttons' enabled status based on the available balance
for (Component comp : bottomPanel.getComponents()) {
if (comp instanceof JButton) {
JButton button = (JButton) comp;
if (!"Deal Cards!".equals(button.getText())) { // Exclude "Deal cards" button
int buttonBet = Integer.parseInt(button.getText());
button.setEnabled(balance >= buttonBet);
}
}
}
}
});
// Initially disable buttons that exceed the available balance
betButton.setEnabled(balance >= bet.betAmmount);
}
}
bottomPanel.add(betLabel);
bottomPanel.add(balanceLabel);
betLabel.setForeground(Color.WHITE);
balanceLabel.setForeground(Color.WHITE);
JButton switchModeButton = new JButton("Deal Cards!");
switchModeButton.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
if(betAmount != 0) {
isFirstMode = !isFirstMode;
switchMode();
}
}
});
bottomPanel.add(switchModeButton);
}
else
{
playerCards.clear();
dealerCards.clear();
JLabel dealerLabel = new JLabel("Dealer: ");
JLabel playerLabel = new JLabel("You: ");
JLabel betLabel = new JLabel("Bet: " + betAmount);
bottomPanel.add(dealerLabel);
bottomPanel.add(playerLabel);
bottomPanel.add(betLabel);
betLabel.setForeground(Color.WHITE);
dealerLabel.setForeground(Color.WHITE);
playerLabel.setForeground(Color.WHITE);
JButton hitButton = new JButton("Hit");
JButton standButton = new JButton("Stand");
JButton switchModeButton = new JButton("Play Again!");
switchModeButton.setEnabled(false);
hitButton.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
if(playerS1 < 21 || playerS2 < 21 && playerS1 != 21 && playerS2 != 21) {
hit();
if(playerS1 > 21 && playerS2 > 21) {
winner = 1;
bottomPanel.setBackground(Color.decode("#e03d27"));
playerLabel.setForeground(Color.WHITE);
dealerLabel.setForeground(Color.WHITE);
betLabel.setForeground(Color.WHITE);
hitButton.setForeground(Color.decode("#e03d27"));
standButton.setForeground(Color.decode("#e03d27"));
switchModeButton.setForeground(Color.decode("#e03d27"));
switchModeButton.setEnabled(true);
hitButton.setEnabled(false);
standButton.setEnabled(false);
}
}
displayPlayerCards(topPanel);
playerLabel.setText("You: " + playerS1 + " / " + playerS2);
topPanel.revalidate();
topPanel.repaint();
}
});
standButton.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
dealerMaxSum = Math.max(dealerS1, dealerS2);
while(dealerMaxSum <= 16) {
dealerHit();
dealerSum();
dealerLabel.setText("Dealer: " + dealerS1 + " / " + dealerS2);
dealerMaxSum = Math.max(dealerS1, dealerS2);
displayDealerCards(topPanel);
}
hitButton.setEnabled(false);
standButton.setEnabled(false);
switchModeButton.setEnabled(true);
checkWinner();
if(winner == 0) {
balance += 2 * betAmount;
betAmount = 0;
bottomPanel.setBackground(Color.decode("#1bbc2e"));
playerLabel.setForeground(Color.WHITE);
dealerLabel.setForeground(Color.WHITE);
betLabel.setForeground(Color.WHITE);
hitButton.setForeground(Color.decode("#1bbc2e"));
standButton.setForeground(Color.decode("#1bbc2e"));
switchModeButton.setForeground(Color.decode("#1bbc2e"));
}
else if(winner == 1) {
betAmount = 0;
bottomPanel.setBackground(Color.decode("#e03d27"));
playerLabel.setForeground(Color.WHITE);
dealerLabel.setForeground(Color.WHITE);
betLabel.setForeground(Color.WHITE);
hitButton.setForeground(Color.decode("#e03d27"));
standButton.setForeground(Color.decode("#e03d27"));
switchModeButton.setForeground(Color.decode("#e03d27"));
}
else if(winner == 2){
balance += betAmount;
betAmount = 0;
bottomPanel.setBackground(Color.decode("#f2c033"));
playerLabel.setForeground(Color.WHITE);
dealerLabel.setForeground(Color.WHITE);
betLabel.setForeground(Color.WHITE);
hitButton.setForeground(Color.decode("#f2c033"));
standButton.setForeground(Color.decode("#f2c033"));
switchModeButton.setForeground(Color.decode("#f2c033"));
}
topPanel.revalidate();
topPanel.repaint();
}
});
bottomPanel.add(hitButton);
bottomPanel.add(standButton);
switchModeButton.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
isFirstMode = !isFirstMode;
switchMode();
}
});
bottomPanel.add(switchModeButton);
ImageIcon icon;
// Resetting array lists at the start of a new game
playerCards.clear();
dealerCards.clear();
cards.clear();
for (String rank : ranks) {
for (String suit : suits) {
String iconAddress = rank + suit;
icon = new ImageIcon (new ImageIcon(this.getClass().getResource(iconAddress + ".png")).getImage().getScaledInstance(1700, 1000, java.awt.Image.SCALE_SMOOTH));
Cards card = new Cards(suit, rank, numberOfDecks, icon);
cards.add(card);
}
}
hit();
dealerHit();
hit();
playerLabel.setText("You: " + playerS1 + " / " + playerS2);
dealerLabel.setText("Dealer: " + dealerS1 + " / " + dealerS2);
displayPlayerCards(topPanel);
displayDealerCards(topPanel);
}
bottomPanel.revalidate(); // Refresh the layout
bottomPanel.repaint(); // Repaint the panel
}
private void addIconAtPosition(ImageIcon icon, int x, int y) {
JLabel displayBet = new JLabel(icon);
displayBet.setBounds(x, y, icon.getIconWidth(), icon.getIconHeight());
displayedBets.add(displayBet); // Store the displayed bet label
topPanel.removeAll(); // Clear the panel
// Add displayed bets in reverse order (from last to first) to maintain the correct layering
for (int i = displayedBets.size() - 1; i >= 0; i--) {
JLabel bet = displayedBets.get(i);
topPanel.add(bet);
}
topPanel.revalidate();
topPanel.repaint();
}
public static void displayDealerCards(JPanel panel) {
int x = 350; // Starting X position for the card icons
int y = 120; // Y position for the card icons
int cardWidth = 70; // Width for the card icons
int cardHeight = 95; // Height for the card icons
for (Cards card : dealerCards) {
Image resizedImage = card.icon.getImage().getScaledInstance(cardWidth, cardHeight, Image.SCALE_SMOOTH);
ImageIcon resizedIcon = new ImageIcon(resizedImage);
JLabel cardLabel = new JLabel(resizedIcon);
cardLabel.setBounds(x, y, cardWidth, cardHeight);
// Set the Z-order of the cardLabel to the topmost layer (highest Z-order)
panel.add(cardLabel, Integer.valueOf(0));
// Increment X position to display the next card icon
x += 75;
// Ensure the cardLabel is brought to the front after setting Z-order
cardLabel.repaint();
}
panel.revalidate();
panel.repaint();
}
public static void displayPlayerCards(JPanel panel) {
int x = 350; // Starting X position for the card icons
int y = 400; // Y position for the card icons
int cardWidth = 70; // Width for the card icons
int cardHeight = 95; // Height for the card icons
for (Cards card : playerCards) {
Image resizedImage = card.icon.getImage().getScaledInstance(cardWidth, cardHeight, Image.SCALE_SMOOTH);
ImageIcon resizedIcon = new ImageIcon(resizedImage);
JLabel cardLabel = new JLabel(resizedIcon);
cardLabel.setBounds(x, y, cardWidth, cardHeight);
// Set the Z-order of the cardLabel to the topmost layer (highest Z-order)
panel.add(cardLabel, Integer.valueOf(0));
// Increment X position to display the next card icon
x += 75;
// Ensure the cardLabel is brought to the front after setting Z-order
cardLabel.repaint();
}
panel.revalidate();
panel.repaint();
}
// Hit method
public static void hit() {
Random rng = new Random();
Boolean cardFound = false;
while(!cardFound) {
int randomIndex = rng.nextInt(52);
if(cards.get(randomIndex).numberOfCards > 0) {
Cards card = cards.get(randomIndex);
card.useCard();
playerCards.add(card);
cardFound = true;
}
}
playerSum();
}
// dealerHit method
public static void dealerHit() {
Random rng = new Random();
Boolean cardFound = false;
while(!cardFound) {
int randomIndex = rng.nextInt(52);
if(cards.get(randomIndex).numberOfCards > 0) {
Cards card = cards.get(randomIndex);
card.useCard();
dealerCards.add(card);
cardFound = true;
}
}
dealerSum();
}
// Player Cards Sum method
public static void playerSum() {
playerS1 = 0;
playerS2 = 0;
for( Cards card : playerCards ) {
switch(card.rank) {
case "2":
playerS1 += 2;
playerS2 += 2;
break;
case "3":
playerS1 += 3;
playerS2 += 3;
break;
case "4":
playerS1 += 4;
playerS2 += 4;
break;
case "5":
playerS1 += 5;
playerS2 += 5;
break;
case "6":
playerS1 += 6;
playerS2 += 6;
break;
case "7":
playerS1 += 7;
playerS2 += 7;
break;
case "8":
playerS1 += 8;
playerS2 += 8;
break;
case "9":
playerS1 += 9;
playerS2 += 9;
break;
case "10":
playerS1 += 10;
playerS2 += 10;
break;
case "J":
playerS1 += 10;
playerS2 += 10;
break;
case "Q":
playerS1 += 10;
playerS2 += 10;
break;
case "K":
playerS1 += 10;
playerS2 += 10;
break;
case "A":
playerS1 += 1;
playerS2 += 11;
break;
}
}
}
// Dealer Cards Sum method
public static void dealerSum() {
dealerS1 = 0;
dealerS2 = 0;
for( Cards card : dealerCards ) {
switch(card.rank) {
case "2":
dealerS1 += 2;
dealerS2 += 2;
break;
case "3":
dealerS1 += 3;
dealerS2 += 3;
break;
case "4":
dealerS1 += 4;
dealerS2 += 4;
break;
case "5":
dealerS1 += 5;
dealerS2 += 5;
break;
case "6":
dealerS1 += 6;
dealerS2 += 6;
break;
case "7":
dealerS1 += 7;
dealerS2 += 7;
break;
case "8":
dealerS1 += 8;
dealerS2 += 8;
break;
case "9":
dealerS1 += 9;
dealerS2 += 9;
break;
case "10":
dealerS1 += 10;
dealerS2 += 10;
break;
case "J":
dealerS1 += 10;
dealerS2 += 10;
break;
case "Q":
dealerS1 += 10;
dealerS2 += 10;
break;
case "K":
dealerS1 += 10;
dealerS2 += 10;
break;
case "A":
dealerS1 += 1;
dealerS2 += 11;
break;
}
}
}
public static void checkWinner() {
if(playerS2 > 21) {
if(playerS1 > 21) {
System.out.println("You lost!\n");
winner = 1;
}
else if(playerS1 <= 21 && playerS1 < dealerMaxSum) {
System.out.println("You lost!\n");
winner = 1;
}
else if(playerS1 <= 21 && playerS1 > dealerMaxSum) {
System.out.println("You won!\n");
winner = 0;
}
else if(playerS1 <= 21 && playerS1 == dealerMaxSum) {
System.out.println("Tie!\n");
winner = 2;
}
}
else if(playerS2 == 21) {
if(playerS2 > dealerMaxSum || dealerMaxSum > 21) {
System.out.println("You won!\n");
winner = 0;
}
else if(dealerMaxSum == 21) {
System.out.println("Tie!\n");
winner = 2;
}
}
else if(playerS2 < 21) {
if(dealerMaxSum > 21) {
System.out.println("You won!\n");
winner = 0;
}
else if(playerS2 > dealerMaxSum) {
System.out.println("You won!\n");
winner = 0;
}
else if(playerS2 < dealerMaxSum) {
System.out.println("You lost!\n");
winner = 1;
}
else if(playerS2 == dealerMaxSum) {
System.out.println("Tie!\n");
winner = 2;
}
}
}
public static void main(String[] args) {
Main instance = new Main();
Bets bet10 = new Bets(10, new ImageIcon (new ImageIcon(instance.getClass().getResource("Chip10.png")).getImage().getScaledInstance(70, 70, java.awt.Image.SCALE_SMOOTH)));
Bets bet50 = new Bets(50, new ImageIcon (new ImageIcon(instance.getClass().getResource("Chip50.png")).getImage().getScaledInstance(70, 70, java.awt.Image.SCALE_SMOOTH)));
Bets bet100 = new Bets(100, new ImageIcon (new ImageIcon(instance.getClass().getResource("Chip100.png")).getImage().getScaledInstance(70, 70, java.awt.Image.SCALE_SMOOTH)));
Bets bet500 = new Bets(500, new ImageIcon (new ImageIcon(instance.getClass().getResource("Chip500.png")).getImage().getScaledInstance(70, 70, java.awt.Image.SCALE_SMOOTH)));
bets.add(bet10);
bets.add(bet50);
bets.add(bet100);
bets.add(bet500);
SwingUtilities.invokeLater(new Runnable() {
@Override
public void run() {
new Main();
}
});
}
}Editor is loading...
Leave a Comment