package com.accp; import java.awt.Image; import java.util.HashMap; import java.util.Map; /** * 游戏上下文环境(保持游戏要使用的图片) * @author SC * */ public class GameContext { private static Map<String, Image> map = new HashMap<String, Image>(); private GameContext() { } /** * 添加一张图 * @param name 名字 * @param image 图片对象 */ public static void addImage(String name, Image image){ map.put(name, image); } /** * 检索一张图 * @param name 名字 * @return 图片对象 */ public static Image getImage(String name) { return map.get(name); } }
package com.accp; /** * 扑克 * @author SC * */ public class Poker { private Card[] cards = new Card[52]; public Poker() { String[] suites = {"黑桃", "红心", "草花", "方块"}; int[] faces = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13}; for(int i = 0; i < cards.length; i++) { cards[i] = new Card(suites[i / 13], faces[i % 13]); } } /** * 洗牌(随机乱序) */ public void shuffle() { for(int i = 0; i < cards.length; i++) { int pos = (int) (Math.random() * cards.length); Card temp = cards[i]; cards[i] = cards[pos]; cards[pos] = temp; } } /** * 发牌 * @param index 第几张牌的位置索引 * @return 指定位置的那张牌 */ public Card deal(int index) { return cards[index]; } }
package com.accp; import java.awt.Color; import java.awt.Font; import java.awt.Graphics; /** * 卡片(一张扑克) * @author SC * */ public class Card { private String suite; // 花色 private int face; // 点数 public Card(String suite, int face) { this.suite = suite; this.face = face; } public String getSuite() { return suite; } public int getFace() { return face; } /** * 绘制卡片 * @param g 画笔 * @param x 横坐标 * @param y 纵坐标 */ public void draw(Graphics g, int x, int y) { // 从上下文环境中取出边框图片进行绘制 g.drawImage(GameContext.getImage("边框"), x, y, 100, 150, null); // 从上下文环境中取出花色对应的图片进行绘制 g.drawImage(GameContext.getImage(suite), x + 10, y + 10, null); String str = ""; switch(face) { case 1: str += "A"; break; case 11: str += "J"; break; case 12: str += "Q"; break; case 13: str += "K"; break; default: str += face; } // 设置画笔颜色 if(suite.equals("黑桃") || suite.equals("草花")) { g.setColor(Color.BLACK); } else { g.setColor(Color.RED); } // 设置画笔字体 g.setFont(new Font("Times New Roman", Font.BOLD, 14)); // 绘制点数 g.drawString(str, x + 30, y + 30); } }
package com.accp; import java.awt.FlowLayout; import java.awt.Graphics; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.util.ArrayList; import java.util.List; import javax.swing.JButton; import javax.swing.JFrame; @SuppressWarnings("serial") public class GameFrame extends JFrame { private boolean initialized = false; // 是否完成预加载图片 private String[] names = {"边框", "草花", "方块", "红心", "黑桃"}; private String[] filenames = {"border.jpg", "club.jpg", "diamond.jpg", "heart.jpg", "spade.jpg"}; private Poker p = new Poker(); // 创建一副扑克 private int index = 0; // 发牌的位置 private Card currentCard = null; // 当前发的那张扑克 private List<Card> list = new ArrayList<Card>(); // 保存三张扑克的容器 private JButton nextButton, resetButton, nextThreeButton; public GameFrame() { for(int i = 0; i < filenames.length; i++) { GameContext.addImage(names[i], getToolkit().getImage(filenames[i])); } p.shuffle(); this.setTitle("扑克游戏"); this.setSize(800, 600); this.setResizable(false); this.setLocationRelativeTo(null); this.setDefaultCloseOperation(EXIT_ON_CLOSE); // 给窗口设置一个流式布局管理器 this.setLayout(new FlowLayout()); nextButton = new JButton("下一张"); nextButton.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { if(index < 52) { currentCard = p.deal(index++); if(index == 52) { nextButton.setEnabled(false); nextThreeButton.setEnabled(false); resetButton.setEnabled(true); } repaint(); // 重绘窗口 } } }); this.add(nextButton); resetButton = new JButton("重置"); resetButton.setEnabled(false); resetButton.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { list.clear(); p.shuffle(); index = 0; currentCard = null; resetButton.setEnabled(false); nextButton.setEnabled(true); nextThreeButton.setEnabled(true); repaint(); } }); this.add(resetButton); nextThreeButton = new JButton("发三张"); nextThreeButton.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { currentCard = null; list.clear(); for(int i = 1; i <= 3 && index < 52; i++) { list.add(p.deal(index++)); } if(index >= 52) { nextThreeButton.setEnabled(false); nextButton.setEnabled(false); resetButton.setEnabled(true); } repaint(); } }); this.add(nextThreeButton); } public void paint(Graphics g) { super.paint(g); if(!initialized) { // 先在窗口不可见区域预先加载图片 for(int i = 0; i < names.length; i++) { g.drawImage(GameContext.getImage(names[i]), -1000, -1000, null); } initialized = true; // 预加载只执行一次 } if(currentCard != null) { // 画一张扑克 currentCard.draw(g, 300, 200); } else { // 画三张扑克 for(int i = 0; i < list.size(); i++) { list.get(i).draw(g, 150 + i * 125, 200); } } } public static void main(String[] args) { new GameFrame().setVisible(true); } }
package com.accp; public class Play { public static void main(String[] args) { Poker p = new Poker(); p.shuffle(); for(int i = 0; i < 52; i++) { System.out.println(p.deal(i)); } } }