📄 shinterface.java
字号:
import java.awt.Color;
import java.awt.BorderLayout;
import java.awt.event.*;
import javax.swing.*;
import java.awt.*;
import java.awt.image.*;
import java.net.*;
import javax.swing.JComponent.*;
import java.awt.geom.*;
import java.io.*;
/*-------------------------------
This is a Shithead(card game) Program
@Author Sam Cavenagh
@Date 1/11/02
Overview:
I develop this program to extend my java skills and to implement something that to the
best of my knowledge had not been done before. I spend a good few months of my life
working on this project and have implemented most of the functionality that I had foreseen
in my initial plans. However, Shithead is a very adaptable game and many different versions
of it exist. I have received several emails requesting source code or changes to the
program. I myself feel I have spent enough time on this project and its time to move onto
other work (such as uni). Thus I am making the source code available to all who are brave
enough to attempt to improve this program!!
Important Note:
I will be the first to admit that the code is not in the best form and large aspect of the
program need to be re-architectured, however I do not have time to do this myself but if
someone else wants to do it great. I only have a few requests listed below.
1. Any new versions of the program I would like to remain open source
2. Improved versions are emailed to me so that can be added to my site for Shithead player
that don抰 have the time or skill to implement changes themselves
3. I'm still given some form of credit for the program's creation (even if only as a footnote)
Website: http://home.pacific.net.au/~cavenagh/SH/
Email: cavenaghweb@hotmail.com
-------------------------------*/
class SHinterface extends JFrame implements ActionListener,
MouseMotionListener, MouseListener, WindowListener {
JLabel image;
JTextArea msg;
JPanel panel;
JTextField input;
JScrollPane scrollPane;
int mouseX, mouseY;
JMenuBar menuBar;
JMenu menu;
JMenuItem menuItem;
JRadioButtonMenuItem rbMenuItem;
Image cardspic;
Image back;
Image backSW;
Image title;
Image pointer[] = new Image[4];
Image burntPic;
// Graphics buffer stuff
Graphics g;
BufferedImage offscreen;
ImageIcon imageI;
// for smaller screens
Image offscreen2;
Graphics g2;
Graphics2D g2d;
boolean player1 = false; // is 1 player game running
boolean player2 = false; // is 2 player game running
boolean myTurn = false; // is it my turn
boolean imServer = false;
ServerMessage servermsg = null;
Message message = null;
Dealer dealer = null;
Player player = null;
Score score;
String playersName = "unknown";
Hand hand;
// Points where to place cards
Point pointplayer1[] = new Point[3];
Point pointplayer2[] = new Point[3];
Point pointplayer3[] = new Point[3];
Point pointplayer4[] = new Point[3];
Point centre1;
Dimension screenSize;
SHinterface() {
// Loading Images
MediaTracker tracker = new MediaTracker(this);// Used to track loading
// of image
Toolkit toolkit = Toolkit.getDefaultToolkit();
// loading images from jar file
cardspic = toolkit.getImage(this.getClass().getResource("cards.gif"));
back = toolkit.getImage(this.getClass().getResource("back.gif"));
backSW = toolkit.getImage(this.getClass().getResource("backSW.gif"));
title = toolkit.getImage(this.getClass().getResource("SHtitle.jpg"));
pointer[0] = toolkit.getImage(this.getClass()
.getResource("pointer.gif"));
burntPic = toolkit.getImage(this.getClass().getResource("burnt.jpg"));
tracker.addImage(cardspic, 1);
tracker.addImage(back, 1);
tracker.addImage(backSW, 1);
tracker.addImage(title, 1);
tracker.addImage(pointer[0], 1);
tracker.addImage(burntPic, 1);
try {
// Waiting until image loaded.
tracker.waitForAll();
} catch (InterruptedException e) {
msg.setText("Load Error " + e);
}
pointer[3] = rotatePointer(pointer[0]);
pointer[2] = rotatePointer(pointer[3]);
pointer[1] = rotatePointer(pointer[2]);
offscreen = new BufferedImage(450, 550, BufferedImage.TYPE_3BYTE_BGR);
g = offscreen.getGraphics();
g.drawImage(title, -40, 120, this);
g.setColor(Color.white);
g.drawLine(0, 450, 450, 450);
hand = new Hand(this, back, g);
// screen resolution
screenSize = Toolkit.getDefaultToolkit().getScreenSize();
// screenSize.width = 800;
if (screenSize.width < 1024) {// resizing image if to big for screen
offscreen2 = new BufferedImage(338, 413,
BufferedImage.TYPE_3BYTE_BGR);
// offscreen2 = offscreen;
g2 = offscreen2.getGraphics();
g2d = (Graphics2D) g2;
AffineTransform at = new AffineTransform();
at.scale(0.75, 0.75);
// AffineTransform toCenterAt = new AffineTransform();
// toCenterAt.concatenate(at);
// toCenterAt.translate(-(r.width/2), -(r.height/2));
g2d.transform(at);
g2d.drawImage(offscreen, 0, 0, null);
// g2.drawImage(offscreen, 0, 0, 338, 413, null);
// offscreen2 = offscreen.getScaledInstance(338, 413,
// Image.SCALE_FAST);
imageI = new ImageIcon(offscreen2);
// offscreen2 = this.createImage(338, 413);
// setImageSize(338, 413);
// repaint();
// imageI = new ImageIcon(offscreen.getScaledInstance(338, 413,
// Image.SCALE_SMOOTH));
} else
imageI = new ImageIcon(offscreen);
image = new JLabel(imageI);
addMouseMotionListener(this);
addMouseListener(this);
requestFocus();
// Construction Menu
menuBar = new JMenuBar();
// Build the first menu.
menu = new JMenu("File");
menu.setMnemonic(KeyEvent.VK_F);
menu.getAccessibleContext().setAccessibleDescription(
"Game Options Can Be Found Here");
menuBar.add(menu);
// File group of JMenuItems
menuItem = new JMenuItem("1 Player", KeyEvent.VK_P);
menuItem.getAccessibleContext().setAccessibleDescription(
"Start Single Player Game");
menuItem.addActionListener(this);
menu.add(menuItem);
menuItem = new JMenuItem("Multi Player Server", KeyEvent.VK_S);
menuItem.getAccessibleContext().setAccessibleDescription(
"Be the server for a Multi player game");
menuItem.addActionListener(this);
menu.add(menuItem);
menuItem = new JMenuItem("Multi Player Client", KeyEvent.VK_C);
menuItem.getAccessibleContext().setAccessibleDescription(
"Connect to another Multi player Game");
menuItem.addActionListener(this);
menu.add(menuItem);
menuItem = new JMenuItem("Close Connections", KeyEvent.VK_L);
menuItem.getAccessibleContext().setAccessibleDescription(
"Close Game Connection");
menuItem.addActionListener(this);
menu.add(menuItem);
menuItem = new JMenuItem("Scoreboard", KeyEvent.VK_B);
menuItem.getAccessibleContext().setAccessibleDescription(
"Veiw Scoreboard");
menuItem.addActionListener(this);
menu.add(menuItem);
menuItem = new JMenuItem("Quit", KeyEvent.VK_Q);
menuItem.getAccessibleContext().setAccessibleDescription("Quit Game");
menuItem.addActionListener(this);
menu.add(menuItem);
// Build second menu in the menu bar.
menu = new JMenu("Options");
menu.getAccessibleContext().setAccessibleDescription("Game Options");
menuBar.add(menu);
menuItem = new JMenuItem("Redeal", KeyEvent.VK_R);
menuItem.getAccessibleContext().setAccessibleDescription(
"Redeal the deck");
menuItem.addActionListener(this);
menu.add(menuItem);
menuItem = new JMenuItem("Start Game", KeyEvent.VK_S);
menuItem.getAccessibleContext().setAccessibleDescription(
"Start game now");
menuItem.addActionListener(this);
menu.add(menuItem);
menuItem = new JMenuItem("AI Speed", KeyEvent.VK_A);
menuItem.getAccessibleContext().setAccessibleDescription(
"Time it takes for GameAI to make a move");
menuItem.addActionListener(this);
menu.add(menuItem);
// Build 3rd menu in the menu bar.
menu = new JMenu("About");
menu.getAccessibleContext().setAccessibleDescription("About the Game");
menuBar.add(menu);
menuItem = new JMenuItem("Rules", KeyEvent.VK_R);
menuItem.getAccessibleContext().setAccessibleDescription("Who to play");
menuItem.addActionListener(this);
menu.add(menuItem);
menuItem = new JMenuItem("Home Page", KeyEvent.VK_H);
menuItem.getAccessibleContext().setAccessibleDescription(
"View Home Page");
menuItem.addActionListener(this);
menu.add(menuItem);
menuItem = new JMenuItem("About", KeyEvent.VK_A);
menuItem.getAccessibleContext().setAccessibleDescription(
"About the Game");
menuItem.addActionListener(this);
menu.add(menuItem);
addWindowListener(this);
msg = new JTextArea("Welcome to Shithead the card game\n", 4, 20);
msg.setLineWrap(true);
msg.setEditable(false);
msg.setDisabledTextColor(Color.black);
input = new JTextField();
input.addActionListener(this);
scrollPane = new JScrollPane(msg,
JScrollPane.VERTICAL_SCROLLBAR_ALWAYS,
JScrollPane.HORIZONTAL_SCROLLBAR_AS_NEEDED);
// Testing if images loaded correctly - doesnt need to do this with jar
// file
// File f = new File("cards.gif");
// if (!f.exists() || !f.isFile() || !f.canRead())
// addMsg("Unable to load file " +f.getAbsolutePath());
panel = new JPanel();
GridBagLayout gridbag = new GridBagLayout();
GridBagConstraints c = new GridBagConstraints();
panel.setLayout(gridbag);
c.anchor = GridBagConstraints.WEST;
c.fill = GridBagConstraints.BOTH;
panel.setBackground(Color.white);
getContentPane().add(panel);
panel.add(menuBar, c);
c.gridy = 1;
panel.add(image, c);
c.gridy = 2;
panel.add(scrollPane, c);
c.gridy = 3;
panel.add(input, c);
addMsg("Detected Screen Size: " + screenSize.width + "x"
+ screenSize.height);
if (screenSize.width < 1024)
addMsg("For optimal graphics use 1024x768 resolution");
score = new Score(this);
}
public void actionPerformed(ActionEvent event) {
String label = event.getActionCommand();
if (label.equals("Quit")) {
// Closing Sockets on Quiting
if (servermsg != null)
servermsg.endConnection();
if (message != null)
message.endConnection();
if (dealer != null)
dealer.endConnection();
if (player != null)
player.endConnection();
System.exit(0); // terminates the program
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -