Java 扑克游戏

来源:互联网 发布:mac os sierra beta4 编辑:程序博客网 时间:2024/04/27 02:09
//游戏上下文环境:
package com.accp;import java.awt.Image;import java.util.HashMap;import java.util.Map;/** * 游戏上下文环境(保持游戏要使用的图片) * @author 骆昊 * */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 骆昊 * */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 骆昊 * */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() {@Overridepublic 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() {@Overridepublic 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() {@Overridepublic 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);}}


原创粉丝点击