查看完整版本: JAVA实现游戏编程[知识帖]

51testing 2007-11-16 14:52

JAVA实现游戏编程[知识帖]

[font=宋体]一提起[/font]JAVA,[font=宋体]可能大多数人都会想起如下几个词汇。运行慢,解释执行,绝对不适合桌面开发。更不要说开发游戏了。其实这些都是对[/font]JAVA[font=宋体]的偏见,[/font]JAVA[font=宋体]刚出来的时候你这样说还是可以的,但是现在的[/font]JAVA[font=宋体]已经是今非昔比了。[/font][font=宋体]
    本文就将带领大家用[/font]JAVA[font=宋体]设计出一个儿时熟悉的游戏:水果机。让大家对[/font]JAVA[font=宋体]有一个全新的认识,让大家知道其实不是[/font]JAVA[font=宋体]不行,是我们不会用而已,实现后,该程序运行的截图如下[/font]

[img=400,300]http://www.blogjava.net/images/blogjava_net/hadeslee/a.jpg[/img]
<!--[if !supportLists]-->1.
<!--[endif]-->JAVA2D[font=宋体]简介[/font]SUN[font=宋体]的[/font]API[font=宋体]对[/font]JAVA2D[font=宋体]的描述是这样的:[/font]
Java 2D API[font=宋体]([/font]Application Programming Interface[font=宋体],应用程序接口)是一套用于高级图形和图像处理的类。它将艺术线条、文本和图像囊括在一个综合模型中。该[/font] API [font=宋体]提供了对图像复合和[/font] alpha [font=宋体]通道图像的广泛支持,同时也提供了一套进行精确颜色空间定义和转换的类,以及大量面向显示的图像操作符。这些类以[/font] java.awt [font=宋体]和[/font] java.awt.image [font=宋体]包附件的形式提供(而不是单独的包)。[/font]
[font=宋体]其实[/font]Java 2D API[font=宋体]是[/font]JFC [font=宋体]([/font]Java Fundation Classes[font=宋体])的一员,主要的使用对象是[/font]java.awt.Graphics2D[font=宋体],它增强了传统的[/font]AWT[font=宋体]([/font] Abstract Windowing Toolkit [font=宋体])的描绘功能。在[/font] JDK1.2[font=宋体]中开始支持[/font]Java 2D [font=宋体]的使用。透过[/font]Java 2D API [font=宋体],我们程序员可以轻松地描绘出任意的几何图形、运用不同的填色效果、对图形做旋转([/font] rotate[font=宋体])、缩放([/font] scale[font=宋体])、扭曲([/font] shear[font=宋体])等。通过[/font]Graphics2D[font=宋体]我们可以简单地利用不同类型的线或是填色效果绘出统计图,以区分出不同的资料。当然,[/font] 2D API[font=宋体]还有许多增强[/font]SWING[font=宋体]能力的部分,比如处理图片的效果、对于任意的几何图形可以做碰撞检测、图形重叠混色计算([/font]composite[font=宋体])等功能。总之,[/font]JAVA2D[font=宋体]使[/font]JAVA[font=宋体]的图形处理能力得到了很大的提升,当然如果要单纯处理图片,可以利用[/font]JAVA[font=宋体]的[/font]JAI(Java Advanced Imaging)[font=宋体],还可以使用[/font]JMF[font=宋体]框架来处理视频以及音频,更可以使用[/font]JAVA3D[font=宋体]来渲染[/font]3D[font=宋体]的场景,随着[/font]JAVA[font=宋体]爱好者的努力,[/font]JAVA[font=宋体]在编程领域已经越来越强大了。[/font]

<!--[if !supportLists]-->2.
<!--[endif]-->[font=宋体]本文所涉及到的知识点[/font][font=宋体]为了制作出本游戏,我们需要了解如下知识点:[/font]
1,JAVA[font=宋体]线程模型[/font]

[font=宋体]了解[/font]JAVA[font=宋体]里面线程的工作原理。[/font]
2,java.util[font=宋体]包[/font]

[font=宋体]了解[/font]JAVA[font=宋体]里面的一些工具类,更有利于我们编程的效率。[/font]
3,java.awt[font=宋体]包[/font]

[font=宋体]了解[/font]JAVA[font=宋体]的抽象工具集,因为它是构建我们窗口的基本元素[/font]
4,java.awt.event[font=宋体]包[/font]

[font=宋体]了解[/font]JAVA[font=宋体]的事件模型以及处理事件的方法。[/font]
5,javax.swing

[font=宋体]此包是最新的[/font]JAVA[font=宋体]界面包,利用了良好的[/font]MVC[font=宋体]架构,有很强的扩展性,此包包括了所有的轻量级的界面的实现。[/font]

[font=宋体]另外还有简单的声音片段处理,因为我们在游戏的过程中是充满了声音效果的[/font],[font=宋体]还有JDK[/font]1.5[font=宋体]新增的泛型枚举等的编程。[/font]

[font=宋体]如果要加上联网功能的话,还需要掌据[/font]java.net[font=宋体]包,[/font]java.io[font=宋体]包,用以连接网络和读写输入输出流,我们今天只做一个单机版的,大家如果有兴趣的话可以自己下载源代码更改成一个联机版的。[/font]

51testing 2007-11-16 14:52

<!--[if !supportLists]-->3.      <!--[endif]-->游戏的开发与编码
在我们开发这个游戏之前,我们先讲一个这个游戏的实现所采用的方法,那就是经典的MVC模式,因为在开发游戏的时候,结构很重要,必须要理清楚每一块负责什么,每一个类负责什么,而MVC模式正好就是解决这种问题的很好的方案,我们可以把游戏的运行流程交由一个类去统一调度,游戏的呈现也就是绘图用专门一个类去负责,而绘图所需的数据可以从一个模型类里面去取,控制的类负责更改模型里面的数据并调用视图类去更新当前的视频,这样整个游戏的流程就很清晰明了。所以我们设计了如下几个类,它们之间互相交互,形成整个游戏的框架。

1,ClientControl

       顾名思义,这个类就是我们的控制端类,它负现整个游戏的流程控制以及事件处理。它在MVC里面的角色是C。

2,ClientModel

       它就是我们程序运行的时候,放数据的地方,它存放的数据并不是一般的数据,而是需要双方一起交互的数据,它只是做为一个桥梁,连接控制端和视图端的纽带。它是MVC的角色里面是M.。

3,ClientView

       它是我们今天需要重点讲解的地方,它是我们MVC里面的视图的实现,它负责呈现整个游戏的界面,并且它也受控制端ClientControl的支配,由ClientControl请求它重绘。它重绘的时候,一些数据将从ClientModel里面去取。

       那么我们重点来看一看ClientView的代码:

/*
* ClientView.java
*
* Created on 2007年10月2日, 下午2:00
* 此类专门负责视图的实现,此类中须定义从模型中
* 取出数据并重绘的方法
* To change this template, choose Tools | Template Manager
* and open the template in the editor.
*/

package com.hadeslee.apple.client;

import com.hadeslee.apple.common.Bet;
import java.awt.Color;
import java.awt.Cursor;
import java.awt.Font;
import java.awt.FontMetrics;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.Image;
import java.awt.MediaTracker;
import java.awt.Point;
import java.awt.RenderingHints;
import java.awt.Toolkit;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.swing.*;
import java.util.Vector;

/**
*
* @author lbf
*/
public class ClientView extends JPanel {

    private ClientModel cm; //模型类的一个对象
    private volatile boolean isStar;
    private Image starA; //表示当前星星的图片
    private Image[] star; //星星的数组
    private int x1;
    private int y1; //星星的座标
    private Image bg2; //表示底衬的那层
    private Image ratio; //赔率底衬的那层
    private int x;
    private int length; //表示跑马灯的位置

    /** Creates a new instance of ClientView */
    public ClientView(ClientModel cm) {
        this.cm = cm;
        initOther();
        x = 646;
        new RunStar().start();
        new Draw().start();
    }

    //初始化视图类的一些参数
    private void initOther() {
        try {
            star = new Image[3];
            MediaTracker mt = new MediaTracker(this);
            for (int i = 0; i < 3; i++) {
                star[i] = Toolkit.getDefaultToolkit().createImage(this.getClass().getResource("pic/game/star/" + (i + 1) + ".png"));
                mt.addImage(star[i], i);
            }
            bg2 = Toolkit.getDefaultToolkit().createImage(this.getClass().getResource("pic/game/bg2.png"));
            ratio = Toolkit.getDefaultToolkit().createImage(this.getClass().getResource("pic/game/ratio.png"));
            mt.addImage(bg2, 4);
            mt.addImage(ratio, 5);
            
            mt.waitForAll();

            starA = star[0];
            //把默认的鼠标改成我们自定义的鼠标形式,以配合主题
            Image icon = Toolkit.getDefaultToolkit().createImage(this.getClass().getResource("pic/login/icon.png"));
            Cursor cu = Toolkit.getDefaultToolkit().createCustomCursor(icon, new Point(0, 0), "my");
            this.setCursor(cu);
        } catch (InterruptedException ex) {
            Logger.getLogger(ClientView.class.getName()).log(Level.SEVERE, null, ex);
        }
    }
    //覆盖的方法
    protected void paintComponent(Graphics g) {
        //先调用父类的方法,清除以前画的内容
        super.paintComponent(g);
        //然后设置一些提示,比如屏幕抗锯齿,以及文字抗锯齿
        Graphics2D gd = (Graphics2D) g;
        gd.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
        gd.setRenderingHint(RenderingHints.KEY_TEXT_ANTIALIASING, RenderingHints.VALUE_TEXT_ANTIALIAS_ON);
        //画背景
        g.drawImage(cm.getBg(), 0, 0, this);
        g.drawImage(bg2, 0, 0, this); //再画第二个背景
        //画赔率的闪动
        if (cm.isRunning()) {
            drawRatio(g);
        }
        //再画桌面
        drawTable(g);
        //如果现在正在跑,那么就调用跑的那个方法
        if (cm.isRunning()) {
            drawRunning(g);
        }
        //如果现在正在赌剪刀石头布,那么就调用比倍的方法
        if (cm.isBetting()) {
            drawBetting(g);
        }
        //画出永远存在的星星
        if (isStar) {
            g.drawImage(starA, x1, y1, this);
        }
        //画出跑马灯,提示文字
        drawTip(g);
    }

    private void drawTip(Graphics g) {
        g.setFont(new Font("宋体", Font.PLAIN, 22));
        g.setColor(Color.RED);
        g.drawString(cm.getInfo().getTip(), x, 25);
        FontMetrics fm = g.getFontMetrics();
        length = (int) fm.getStringBounds(cm.getInfo().getTip(),g).getWidth();
    }

    //画出赔率
    private void drawRatio(Graphics g) {
        RatioA ra = cm.getRa();
        RatioB rb = cm.getRb();
        if (ra != null) {
            g.drawImage(ratio, ra.x, ra.y, this);
        }
        if (rb != null) {
            g.drawImage(ratio, rb.x, rb.y, this);
        }
    }

    //画出正在跑的方法
    private void drawRunning(Graphics g) {
        Vector<;PP> ps = cm.getP();
        for (PP p : ps) {
            g.drawImage(p.current, p.x, p.y, this);
        }
    }

    //画出跑完的方法
    private void drawRunOver(Graphics g) {
        Vector<;PP> ps = cm.getP();
        for (PP p : ps) {
            g.drawImage(p.current, p.x, p.y, this);
        }
    }

    //画出正在比倍的方法
    private void drawBetting(Graphics g) {
        g.drawImage(cm.getPKBG(), 172, 39, this);
        g.drawImage(cm.getPkA(), 267, 245, this);
        g.drawImage(cm.getPkB(), 386, 247, this);
    }

    //画桌面以及桌面上的一些信息
    private void drawTable(Graphics g) {
        g.drawImage(cm.getTable(), 0, 0, this);
        drawMoney(g);
        drawBet(g);
    }

    //画下注的那九格下注数字
    private void drawBet(Graphics g) {
        Bet b = cm.getBet();
        drawNumber(80, 570, 12, 19, b.getBet(1), g, b.getWin(1));
        drawNumber(183, 570, 12, 19, b.getBet(2), g, b.getWin(2));
        drawNumber(252, 570, 12, 19, b.getBet(3), g, b.getWin(3));
        drawNumber(318, 570, 12, 19, b.getBet(4), g, b.getWin(4));
        drawNumber(424, 570, 12, 19, b.getBet(5), g, b.getWin(5));
        drawNumber(527, 570, 12, 19, b.getBet(6), g, b.getWin(6));
        drawNumber(597, 570, 12, 19, b.getBet(7), g, b.getWin(7));
        drawNumber(664, 570, 12, 19, b.getBet(8), g, b.getWin(8));
        drawNumber(767, 570, 12, 19, b.getBet(9), g, b.getWin(9));
    }

    //画有余额,赢的钱,用户ID,大小彩金等的方法
    private void drawMoney(Graphics g) {
        //画余额和赢的钱
        int allMoney = cm.getAllMoney();
        int winMoney = cm.getWinMoney();
        if (allMoney < 10000) {
            drawNumber(762, 88, 24, 38, allMoney, g);
        } else {
            drawNumber(762, 94, 18, 28, allMoney, g);
        }
        if (winMoney < 10000) {
            drawNumber(129, 86, 24, 38, winMoney, g);
        } else {
            drawNumber(129, 90, 18, 28, winMoney, g);
        }
        drawNumber(740, 208, 12, 19, cm.getId(), g); //画ID号
        //画大彩金和小彩金
        int smallBonus = cm.getInfo().getSmallBonus();
        int bigBonus = cm.getInfo().getBigBonus();
        if (smallBonus < 10000) {
            drawNumber(760, 390, 24, 38, smallBonus, g);
        } else {
            drawNumber(760, 396, 18, 28, smallBonus, g);
        }
        if (bigBonus < 10000) {
            drawNumber(128, 390, 24, 38, bigBonus, g);
        } else {
            drawNumber(128, 396, 18, 28, bigBonus, g);
        }
    }

    //定义两个重载的方法,分别针对于图放大的图片和一般大小的图片
    private void drawNumber(int startX, int startY, int num, Graphics g, boolean isWin) {
        drawNumber(startX, startY, 24, 38, num, g, isWin);
    }

    private void drawNumber(int startX, int startY, int width, int height, int num, Graphics g) {
        drawNumber(startX, startY, width, height, num, g, false);
    }

    private void drawNumber(int startX, int startY, int width, int height, int num, Graphics g, boolean isWin) {
        String ns = Integer.toString(num);
        int i = 0;
        for (int start = ns.length() - 1; start >= 0; start--) {
            i++;
            char c = ns.charAt(start);
            int index = c - 48;
            if (isWin) {
                g.drawImage(cm.getWinNumber(index), startX - (i * width), startY, width, height, this);
            } else {
                g.drawImage(cm.getNumber(index), startX - (i * width), startY, width, height, this);
            }
        }
    }

//此类专门用于后台调用重绘线程
    private class Draw extends Thread {

        public void run() {
            while (true) {
                try {
                    x -= 5;
                    if (x + length < 0) {
                        x = 800;
                    }
                    Thread.sleep(200);
                    repaint(x,0,length+20,30);
                } catch (Exception exe) {
                    exe.printStackTrace();
                }
            }
        }
    }

//此类专门用于跑星星的闪动
    private class RunStar extends Thread {

        private int total;

        public RunStar() {
            isStar = true;
            x1 = 339;
            y1 = 106;
        }

        public void run() {
            int index = 0;
            while (true) {
                try {
                    Thread.sleep(100);
                    if (index < star.length - 1) {
                        starA = star[++index];
                    } else {
                        starA = star[0];
                        index = 0;
                        total++;
                    }
                    if (total > 1) {
                        isStar = false;
                        repaint();
                        total = 0;
                        x1 = (int) (Math.random()*100-50) + 339;
                        y1 = (int) (Math.random()*100-50) + 106;
                        int sleep = (int) (Math.random()*3000) + 1000;
                        Thread.sleep(sleep);
                        isStar = true;
                    }else{
                        repaint(x1,y1,150,150);
                    }
                } catch (Exception exe) {
                    exe.printStackTrace();
                }
            }
        }
    }
}

代码其实不长,二百多行而已,我们先来看看如下几个代码片段:

Toolkit.getDefaultToolkit().createImage(this.getClass().getResource("pic/game/bg2.png"));

这句话有两个需要我们注意的地方:

一是我们如何把图片导入程序当中,二是我们如果把图片打包进JAR包,然后如何得到它们的URL。

我们先讲第一个,如何把图片导入程序中,在这里我们用的是Toolkit的方法createImage,它确实是一个很实用的方法,它是一个重载的方法,可以传入很多种参数,除了可以传入URL之处,还可以有如下的重载方法:

Image
createImage(byte[] imagedata)
          创建一幅图像,该图像对存储在指定字节数组中的图像进行解码。

abstract  Image
createImage(byte[] imagedata, int imageoffset, int imagelength)
          创建一幅图像,该图像对存储在指定字节数组中指定偏移量和长度处的图像进行解码。

abstract  Image
createImage(ImageProducer producer)
          使用指定的图像生成器创建一幅图像。

abstract  Image
createImage(String filename)
          返回从指定文件获取像素数据的图像。

abstract  Image
createImage(URL url)
          返回一幅图像,该图像从指定 URL 获取像素数据。




有一点需要注意的是,它的createImage是一个异步的方法,也就是说我们调用了这个方法以后,程序会立即返回,并不会等到图片完全加载进内存之后才返回,所以当我们用这种方法加载比较大的图片的时候,如果图片又没有完全进入内存,而我们却去draw它,这个时候就会出现撕裂的情况,大大影响了我们程序的性能以及可玩性,那怎么办呢?

办法有两种,一种是像我们在程序里实现的一样,用一个媒体跟踪器来跟踪我们要加载的图片,然后调用一个同步方法等待它们全部加载进入内存之后才继续往下运行,这样就可以保存在初始化以后,所需要用到的图片确实都全部加载进内存了,这样画的时候,才能保证效果。如下所示:



MediaTracker mt = new MediaTracker(this);



mt.addImage(star[i], i);

...
mt.waitForAll();



我们生成一个媒体跟踪器,然后把我们需要跟踪的图片放到里面去,然后等待所有的图片加载,mt.waitForAll()方法是会抛出一个InterruptedException的方法。我们需要捕获处理它。

    另外一种办法就是利用javax.imageio.ImageIO的方法,它的read方法可以同步的把图片完全读入内存,某些情况下这是更方便的方法,因为使用它免去了加媒体跟踪器的代码。javax.imageio.ImageIO的read方法也有很多重载的版本,它的方法如下:

static BufferedImage
read(File input)
          返回一个 BufferedImage,作为使用 ImageReader(它是从当前已注册 ImageReader 中自动选择的)解码所提供 File 的结果。

static BufferedImage
read(ImageInputStream stream)
          返回一个 BufferedImage,作为使用 ImageReader(它是从当前已注册 ImageReader 中自动选择的)解码所提供 ImageInputStream 的结果。

static BufferedImage
read(InputStream input)
          返回一个 BufferedImage,作为使用 ImageReader(它是从当前已注册 ImageReader 中自动选择的)解码所提供 InputStream 的结果。

static BufferedImage
read(URL input)
          返回一个 BufferedImage,作为使用 ImageReader(它是从当前已注册 ImageReader 中自动选择的)解码所提供 URL 的结果。


所以我们用read方法的话,会显得更加方一些,但是为什么我们在程序当中不使用它,而使用再加繁琐的Toolkit加上MediaTracker的方法呢?因为ImageIO读入内存的图片在呈现的过程中会有如下缺点:

<!--[if !supportLists]-->1,<!--[endif]-->当加载的图片是动态的gif图片的时候,图片在呈现的时候,将没有动画效果,它只会读取第一帧。

<!--[if !supportLists]-->2,<!--[endif]-->当加载的图片是半透明的时候,图片在呈现的时候,会比用Toolkit加载进来的图片更耗CPU。

所以我们选择了用Toolkit而不是ImageIO,当我们没有用到以上两种情况的图片的时候,是完全可以用ImageIO来加载图片的。

    图片导入程序中的问题解决了,我们现在来看一看如何把图片打包进JAR包,然后又如何在程序运行的时候把JAR包里面的资源提取出来。在这里我们用的是一个很有用的方法getResource(),它是定义在Class类里面的,当我们把我们的的图片提取出来的时候,可以用相对路径也可以用绝对路来来提取,当我们用相对路径的时候,路径就是相对于当前的class文件所在目录的路径,如果是用绝对路径的时候,路径就是从JAR内部的根目录开始算的。把图片等一些资源打入JAR包有很多好处,一是可以实现资源的初步隐藏,二是可以利用JAR的特性对文件进行一些压缩,因为JAR包就是一个压缩包,只不过后缀名改了而已。

    下面我们再来看一下paintComponent方法,它是一个重写的方法,它重写了父类JPanel里面的paintComponent方法,一般来说,当我们要绘制一些内容的时候,都是采用重写此方法的办法,在以前AWT的编程中,对重量型组件进行重写,一般重写的是paint方法,所以在用轻量级组件的时候,这一点要注意,最好不要再重写paint方法了,而是改为重写paintComponent。在它里面我们看到如下三句:



Graphics2D gd = (Graphics2D) g;

        gd.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);

        gd.setRenderingHint(RenderingHints.KEY_TEXT_ANTIALIASING, RenderingHints.VALUE_TEXT_ANTIALIAS_ON);



它的意思就是设置图形上下文在绘制的时候,要注意哪些方面,我们可以利用这个方法给图形上下文一些提示。在本文里面我们提示了两点,一点是图片抗锯齿打开,二是文本抗据齿我们也打开,除了这两个之外还要很多提示我们可以设置的,在兴趣的朋友可以查看java.awt.RenderingHints这个类。利用这个特性,我们可以使我们呈现的界面更加完美,不过完美是需要代价的,呈现的越清晰越完美就越需要更多的CPU的运算,所以当电脑的性能不太好的时候,我们可以把这两个提示去掉,让JVM自行把握绘制的质量。

    还有一点我们要注意的地方,那就是我们调用repaint的地方。在我们需要重绘的时候,我们可以调用repaint方法,它会发送一个重绘的请求,那个会把这个请求放到重绘线程里面去,在我们调用repaint的时候,有很重要的一点就是尽量不要去调用repaint的默认方法,而要调用repaint(int x,int y,int width,int height)方法,因为它只会请求重绘某一个区域,而repaint()则会重绘整个区域,所以为了性能着想,最好不要重绘整个区域,当你开发了有关JAVA2D的程序后,你会发现,程序的大部份CPU都耗在重绘上面,所以优化重绘区域对于优化整个程序的性能是很有效果的。[/i][/i][/i]

51testing 2007-11-16 14:53

下面我们再来看看ClientModel类,这个类负责保存游戏中的一些数据,这些数据可能需要Control类去更改然后需要由View类去呈现的,说白了,它就是一个包含有很多setter/getter的类.它的代码如下:

[size=13px][color=#0800]/*[/color][color=#0800]
* ClientModel.java
*
* Created on 2007年10月2日, 下午2:02
* 此类封装了一些公共的数据,为视图类提供模型
* To change this template, choose Tools | Template Manager
* and open the template in the editor.
[/color][color=#0800]*/[/color]
[color=#00ff]package[/color][color=#000] com.hadeslee.apple.client;

[/color][color=#0800]/**[/color][color=#0800]
*
* [/color][color=#808080]@author[/color][color=#0800] lbf
[/color][color=#0800]*/[/color]
[color=#00ff]import[/color][color=#000] com.hadeslee.apple.common.Bet;
[/color][color=#00ff]import[/color][color=#000] com.hadeslee.apple.common.INFO;
[/color][color=#00ff]import[/color][color=#000] java.awt.Image;
[/color][color=#00ff]import[/color][color=#000] java.util.Vector;
[/color][color=#00ff]import[/color]
[color=#00ff]static[/color][color=#000] com.hadeslee.apple.common.Constants.[/color][color=#000]*[/color][color=#000];
[/color][color=#00ff]public[/color]
[color=#00ff]class[/color][color=#000] ClientModel {
    [/color][color=#00ff]private[/color][color=#000] Image bg;[/color][color=#0800]//[/color][color=#0800]表示背景图片的对象[/color]

[color=#00ff]private[/color][color=#000] Image table;[/color][color=#0800]//[/color][color=#0800]表示下注桌面的对象
    [/color][color=#0800]//[/color][color=#0800]private Image runA,runB;[/color][color=#0800]//[/color][color=#0800]表示跑动的图像,A表示正在跑的,B表示跑停了的,仅当火车的时候B才有用,其余为null
    [/color][color=#0800]//[/color][color=#0800] private PP[] p;[/color][color=#0800]//[/color][color=#0800]表示当前的位置枚举表现形式,当长度为一时,则为普通情况,其余为特殊情况[/color]

[color=#00ff]private[/color][color=#000] Vector[/color][color=#000]<[/color][color=#000]PP[/color][color=#000]>[/color][color=#000] v;[/color][color=#0800]//[/color][color=#0800]表示当前的位置枚举表现形式,当长度为一时,则为普通情况,其余为特殊情况[/color]

[color=#00ff]private[/color][color=#000] Bet bet;[/color][color=#0800]//[/color][color=#0800]表示当前或者上一局下注的对象[/color]

[color=#00ff]private[/color][color=#000] INFO info;[/color][color=#0800]//[/color][color=#0800]表示当前的INFO对象,里面封装了要全速走的步数,大彩金,小彩金数[/color]

[color=#00ff]private[/color]
[color=#00ff]int[/color][color=#000] allMoney,winMoney;[/color][color=#0800]//[/color][color=#0800]表示当前用户所有的钱和本局赢的钱[/color]

[color=#00ff]private[/color]
[color=#00ff]int[/color][color=#000] id;[/color][color=#0800]//[/color][color=#0800]表示当前用户的ID号[/color]

[color=#00ff]private[/color][color=#000] Image[] number,winNumber;[/color][color=#0800]//[/color][color=#0800]表示数字的图像普通数组和赢了的数组[/color]

[color=#00ff]private[/color]
[color=#00ff]volatile[/color]
[color=#00ff]boolean[/color][color=#000] Running,Betting,hasRunB;[/color][color=#0800]//[/color][color=#0800]表示现在是否正在跑或者正在加时赌,是否有RunB[/color]

[color=#00ff]private[/color][color=#000] Image pkA,pkB;[/color][color=#0800]//[/color][color=#0800]表示两张正在PK的图[/color]

[color=#00ff]private[/color]
[color=#00ff]int[/color][color=#000] ratioA,ratioB;[/color][color=#0800]//[/color][color=#0800]表示A和B国的陪率[/color]

[color=#00ff]private[/color][color=#000] RatioA ra;[/color][color=#0800]//[/color][color=#0800]表增添A或B的枚举[/color]

[color=#00ff]private[/color][color=#000] RatioB rb;
    [/color][color=#00ff]private[/color][color=#000] Image pk;[/color][color=#0800]//[/color][color=#0800]表示PK的背景图[/color]

[color=#00ff]private[/color][color=#000] String infos;[/color][color=#0800]//[/color][color=#0800]表示跑马灯的文字信息[/color]

[color=#0800]/**[/color][color=#0800] Creates a new instance of ClientModel [/color][color=#0800]*/[/color]
[color=#00ff]public[/color][color=#000] ClientModel() {
        v[/color][color=#000]=[/color][color=#00ff]new[/color][color=#000] Vector[/color][color=#000]<[/color][color=#000]PP[/color][color=#000]>[/color][color=#000]();
        ra[/color][color=#000]=[/color][color=#000]RatioA.A_20;
        rb[/color][color=#000]=[/color][color=#000]RatioB.B_10;
    }
    [/color][color=#00ff]public[/color][color=#000] Image getPKBG(){
        [/color][color=#00ff]return[/color][color=#000] pk;
    }
    [/color][color=#00ff]public[/color]
[color=#00ff]void[/color][color=#000] setPKBG(Image bg){
        pk[/color][color=#000]=[/color][color=#000]bg;
    }
    [/color][color=#00ff]public[/color][color=#000] Image getBg() {
        [/color][color=#00ff]return[/color][color=#000] bg;
    }
    [/color][color=#00ff]public[/color]
[color=#00ff]int[/color][color=#000] getRatioA(){
        [/color][color=#00ff]return[/color][color=#000] ratioA;
    }
    [/color][color=#00ff]public[/color]
[color=#00ff]int[/color][color=#000] getRatioB(){
        [/color][color=#00ff]return[/color][color=#000] ratioB;
    }
    [/color][color=#00ff]public[/color]
[color=#00ff]void[/color][color=#000] setRatioA([/color][color=#00ff]int[/color][color=#000] a){
        ratioA[/color][color=#000]=[/color][color=#000]a;
    }
    [/color][color=#00ff]public[/color]
[color=#00ff]void[/color][color=#000] setRatioB([/color][color=#00ff]int[/color][color=#000] b){
        ratioB[/color][color=#000]=[/color][color=#000]b;
    }
    [/color][color=#00ff]public[/color]
[color=#00ff]void[/color][color=#000] setBg(Image bg) {
        [/color][color=#00ff]this[/color][color=#000].bg [/color][color=#000]=[/color][color=#000] bg;
    }
   
    [/color][color=#00ff]public[/color][color=#000] Image getTable() {
        [/color][color=#00ff]return[/color][color=#000] table;
    }
   
    [/color][color=#00ff]public[/color]
[color=#00ff]void[/color][color=#000] setTable(Image table) {
        [/color][color=#00ff]this[/color][color=#000].table [/color][color=#000]=[/color][color=#000] table;
    }
   
   [/color][color=#0800]/*[/color][color=#0800] public Image getRunA() {
        return runA;
    }
   
   
    public void setRunA(Image run) {
        this.runA = run;
    }
   
    public Image getRunB(){
        return runB;
    }
    public void setRunB(Image run){
        runB=run;
    }
    [/color][color=#0800]*/[/color]
[color=#00ff]public[/color][color=#000] Vector[/color][color=#000]<[/color][color=#000]PP[/color][color=#000]>[/color][color=#000] getP() {
        Vector[/color][color=#000]<[/color][color=#000]PP[/color][color=#000]>[/color][color=#000] vec[/color][color=#000]=[/color][color=#00ff]new[/color][color=#000] Vector[/color][color=#000]<[/color][color=#000]PP[/color][color=#000]>[/color][color=#000]();
        [/color][color=#00ff]for[/color][color=#000](PP p: v){
            vec.add(p);
        }
        [/color][color=#00ff]return[/color][color=#000] vec;
    }
   
    [/color][color=#00ff]public[/color]
[color=#00ff]void[/color][color=#000] addP(PP p){
        v.add(p);
    }
    [/color][color=#00ff]public[/color]
[color=#00ff]void[/color][color=#000] setP(PP p){
        [/color][color=#00ff]if[/color][color=#000](v.size()[/color][color=#000]>[/color][color=#000]0[/color][color=#000]){
            v.remove(v.size()[/color][color=#000]-[/color][color=#000]1[/color][color=#000]);
        }
        v.add(p);
    }
    [/color][color=#00ff]public[/color]
[color=#00ff]void[/color][color=#000] clearP(){
        v.removeAllElements();
    }
   
    [/color][color=#00ff]public[/color][color=#000] Bet getBet() {
        [/color][color=#00ff]return[/color][color=#000] bet;
    }
   
    [/color][color=#00ff]public[/color]
[color=#00ff]void[/color][color=#000] setBet(Bet bet) {
        [/color][color=#00ff]this[/color][color=#000].bet [/color][color=#000]=[/color][color=#000] bet;
    }
   
    [/color][color=#00ff]public[/color][color=#000] INFO getInfo() {
        [/color][color=#00ff]return[/color][color=#000] info;
    }
   
    [/color][color=#00ff]public[/color]
[color=#00ff]void[/color][color=#000] setInfo(INFO info) {
        [/color][color=#00ff]this[/color][color=#000].info [/color][color=#000]=[/color][color=#000] info;
    }
   
    [/color][color=#00ff]public[/color]
[color=#00ff]int[/color][color=#000] getAllMoney() {
        [/color][color=#00ff]return[/color][color=#000] allMoney;
    }
   
    [/color][color=#00ff]public[/color]
[color=#00ff]void[/color][color=#000] setAllMoney([/color][color=#00ff]int[/color][color=#000] allMoney) {
        [/color][color=#00ff]this[/color][color=#000].allMoney [/color][color=#000]=[/color][color=#000] allMoney;
    }
   
    [/color][color=#00ff]public[/color]
[color=#00ff]int[/color][color=#000] getWinMoney() {
        [/color][color=#00ff]return[/color][color=#000] winMoney;
    }
   
    [/color][color=#00ff]public[/color]
[color=#00ff]void[/color][color=#000] setWinMoney([/color][color=#00ff]int[/color][color=#000] winMoney) {
        [/color][color=#00ff]this[/color][color=#000].winMoney [/color][color=#000]=[/color][color=#000] winMoney;
    }
   
    [/color][color=#00ff]public[/color]
[color=#00ff]int[/color][color=#000] getId() {
        [/color][color=#00ff]return[/color][color=#000] id;
    }
   
    [/color][color=#00ff]public[/color]
[color=#00ff]void[/color][color=#000] setId([/color][color=#00ff]int[/color][color=#000] id) {
        [/color][color=#00ff]this[/color][color=#000].id [/color][color=#000]=[/color][color=#000] id;
    }
   
    [/color][color=#00ff]public[/color][color=#000] Image[] getNumber() {
        [/color][color=#00ff]return[/color][color=#000] number;
    }
   
    [/color][color=#00ff]public[/color]
[color=#00ff]void[/color][color=#000] setNumber(Image[] number) {
        [/color][color=#00ff]this[/color][color=#000].number [/color][color=#000]=[/color][color=#000] number;
    }
    [/color][color=#00ff]public[/color][color=#000] Image getNumber([/color][color=#00ff]int[/color][color=#000] i){
        [/color][color=#00ff]return[/color][color=#000] number[i];
    }
    [/color][color=#00ff]public[/color]
[color=#00ff]void[/color][color=#000] setWinNumber(Image[] winNumber){
        [/color][color=#00ff]this[/color][color=#000].winNumber[/color][color=#000]=[/color][color=#000]winNumber;
    }
    [/color][color=#00ff]public[/color][color=#000] Image getWinNumber([/color][color=#00ff]int[/color][color=#000] i){
        [/color][color=#00ff]return[/color][color=#000] winNumber[i];
    }
    [/color][color=#00ff]public[/color][color=#000] Image[] getWinNumber(){
        [/color][color=#00ff]return[/color][color=#000] winNumber;
    }
   
    [/color][color=#00ff]public[/color]
[color=#00ff]boolean[/color][color=#000] isRunning() {
        [/color][color=#00ff]return[/color][color=#000] Running;
    }
   
    [/color][color=#00ff]public[/color]
[color=#00ff]void[/color][color=#000] setRunning([/color][color=#00ff]boolean[/color][color=#000] Running) {
        [/color][color=#00ff]this[/color][color=#000].Running [/color][color=#000]=[/color][color=#000] Running;
    }
   
    [/color][color=#00ff]public[/color]
[color=#00ff]boolean[/color][color=#000] isBetting() {
        [/color][color=#00ff]return[/color][color=#000] Betting;
    }
   
    [/color][color=#00ff]public[/color]
[color=#00ff]void[/color][color=#000] setBetting([/color][color=#00ff]boolean[/color][color=#000] Betting) {
        [/color][color=#00ff]this[/color][color=#000].Betting [/color][color=#000]=[/color][color=#000] Betting;
    }
    [/color][color=#00ff]public[/color]
[color=#00ff]void[/color][color=#000] setHasRunB([/color][color=#00ff]boolean[/color][color=#000] b){
        hasRunB[/color][color=#000]=[/color][color=#000]b;
    }
    [/color][color=#00ff]public[/color]
[color=#00ff]boolean[/color][color=#000] getHasRunB(){
        [/color][color=#00ff]return[/color][color=#000] hasRunB;
    }
   
    [/color][color=#00ff]public[/color][color=#000] Image getPkA() {
        [/color][color=#00ff]return[/color][color=#000] pkA;
    }
   
    [/color][color=#00ff]public[/color]
[color=#00ff]void[/color][color=#000] setPkA(Image pkA) {
        [/color][color=#00ff]this[/color][color=#000].pkA [/color][color=#000]=[/color][color=#000] pkA;
    }
   
    [/color][color=#00ff]public[/color][color=#000] Image getPkB() {
        [/color][color=#00ff]return[/color][color=#000] pkB;
    }
   
    [/color][color=#00ff]public[/color]
[color=#00ff]void[/color][color=#000] setPkB(Image pkB) {
        [/color][color=#00ff]this[/color][color=#000].pkB [/color][color=#000]=[/color][color=#000] pkB;
    }

    [/color][color=#00ff]public[/color][color=#000] RatioA getRa() {
        [/color][color=#00ff]return[/color][color=#000] ra;
    }

    [/color][color=#00ff]public[/color]
[color=#00ff]void[/color][color=#000] setRa(RatioA ra) {
        [/color][color=#00ff]this[/color][color=#000].ra [/color][color=#000]=[/color][color=#000] ra;
    }

    [/color][color=#00ff]public[/color][color=#000] RatioB getRb() {
        [/color][color=#00ff]return[/color][color=#000] rb;
    }

    [/color][color=#00ff]public[/color]
[color=#00ff]void[/color][color=#000] setRb(RatioB rb) {
        [/color][color=#00ff]this[/color][color=#000].rb [/color][color=#000]=[/color][color=#000] rb;
    }
    [/color][color=#0800]//[/color][color=#0800]得到A国是否中奖[/color]

[color=#00ff]public[/color]
[color=#00ff]boolean[/color][color=#000] isAWin(){
        [/color][color=#00ff]for[/color][color=#000](PP p:v){
            [/color][color=#00ff]if[/color][color=#000](p.country[/color][color=#000]==[/color][color=#000]COUNTRY_A)
                [/color][color=#00ff]return[/color]
[color=#00ff]true[/color][color=#000];
        }
        [/color][color=#00ff]return[/color]
[color=#00ff]false[/color][color=#000];
    }
    [/color][color=#00ff]public[/color]
[color=#00ff]boolean[/color][color=#000] isBWin(){
        [/color][color=#00ff]for[/color][color=#000](PP p:v){
            [/color][color=#00ff]if[/color][color=#000](p.country[/color][color=#000]==[/color][color=#000]COUNTRY_B)
                [/color][color=#00ff]return[/color]
[color=#00ff]true[/color][color=#000];
        }
        [/color][color=#00ff]return[/color]
[color=#00ff]false[/color][color=#000];
    }
}
[/color][/size]

多它的好处就是,一个改一个呈现,分工明确,并且它里面也可以包含一些简单的逻辑,这一点就是仁者见仁了:)

51testing 2007-11-16 14:56

下面我们再来看看ClientControl类,这个类代码量是最多的,这个类负责整体的游戏流程和游戏逻辑,由于写这个游戏的时候并没有很好的思考,所以代码可能会比较乱:(,希望大家不要介意

[size=13px][color=#0800]/*[/color][color=#0800]
* ClientControl.java
*
* Created on 2007年10月2日, 下午2:02
* 此类是客户端中的关键类,此类专门负责整个程序的
* 流程和表现,负责对外通讯
* To change this template, choose Tools | Template Manager
* and open the template in the editor.
[/color][color=#0800]*/[/color]
[color=#00ff]package[/color][color=#000] com.hadeslee.apple.client;

[/color][color=#0800]/**[/color][color=#0800]
*
* [/color][color=#808080]@author[/color][color=#0800] lbf
[/color][color=#0800]*/[/color]
[color=#00ff]import[/color][color=#000] com.hadeslee.apple.common.Bet;
[/color][color=#00ff]import[/color][color=#000] com.hadeslee.apple.common.INFO;
[/color][color=#00ff]import[/color][color=#000] java.applet.Applet;
[/color][color=#00ff]import[/color][color=#000] java.applet.AudioClip;
[/color][color=#00ff]import[/color][color=#000] java.awt.BorderLayout;
[/color][color=#00ff]import[/color][color=#000] java.awt.DisplayMode;
[/color][color=#00ff]import[/color][color=#000] java.awt.GraphicsDevice;
[/color][color=#00ff]import[/color][color=#000] java.awt.GraphicsEnvironment;
[/color][color=#00ff]import[/color][color=#000] java.awt.Image;
[/color][color=#00ff]import[/color][color=#000] java.awt.MediaTracker;
[/color][color=#00ff]import[/color][color=#000] java.awt.Toolkit;
[/color][color=#00ff]import[/color][color=#000] java.awt.event.KeyEvent;
[/color][color=#00ff]import[/color][color=#000] java.awt.event.KeyListener;
[/color][color=#00ff]import[/color][color=#000] java.util.EnumMap;
[/color][color=#00ff]import[/color][color=#000] java.util.Iterator;
[/color][color=#00ff]import[/color][color=#000] java.util.Set;
[/color][color=#00ff]import[/color][color=#000] java.util.Vector;
[/color][color=#00ff]import[/color][color=#000] java.util.concurrent.ExecutorService;
[/color][color=#00ff]import[/color][color=#000] java.util.concurrent.Executors;
[/color][color=#00ff]import[/color][color=#000] javax.swing.JFrame;
[/color][color=#00ff]import[/color]
[color=#00ff]static[/color][color=#000] com.hadeslee.apple.common.Constants.[/color][color=#000]*[/color][color=#000];

[/color][color=#00ff]public[/color]
[color=#00ff]class[/color][color=#000] ClientControl [/color][color=#00ff]extends[/color][color=#000] Thread [/color][color=#00ff]implements[/color][color=#000] KeyListener {

    [/color][color=#00ff]private[/color][color=#000] ClientView cv; [/color][color=#0800]//[/color][color=#0800]表示视图的类[/color]

[color=#00ff]private[/color][color=#000] ClientModel cm; [/color][color=#0800]//[/color][color=#0800]表示模型的类[/color]

[color=#00ff]private[/color][color=#000] ExecutorService es; [/color][color=#0800]//[/color][color=#0800]表示一个线程池的对象[/color]

[color=#00ff]private[/color][color=#000] AudioClip[] betAu; [/color][color=#0800]//[/color][color=#0800]表示下注时的一个音频对象[/color]

[color=#00ff]private[/color][color=#000] AudioClip onceMore;
    [/color][color=#00ff]private[/color][color=#000] AudioClip xiu;
    [/color][color=#00ff]private[/color][color=#000] AudioClip loop;
    [/color][color=#00ff]private[/color][color=#000] AudioClip runA;
    [/color][color=#00ff]private[/color][color=#000] AudioClip runB;
    [/color][color=#00ff]private[/color][color=#000] AudioClip win;
    [/color][color=#00ff]private[/color][color=#000] AudioClip lose;
    [/color][color=#00ff]private[/color][color=#000] Bet bet; [/color][color=#0800]//[/color][color=#0800]缓存的上一局的下注记录[/color]

[color=#00ff]private[/color][color=#000] PP p [/color][color=#000]=[/color][color=#000] PP.p1;
    [/color][color=#00ff]private[/color]
[color=#00ff]volatile[/color]
[color=#00ff]boolean[/color][color=#000] canBet [/color][color=#000]=[/color]
[color=#00ff]true[/color][color=#000];
    [/color][color=#00ff]private[/color]
[color=#00ff]volatile[/color]
[color=#00ff]boolean[/color][color=#000] isRunning;
    [/color][color=#00ff]private[/color]
[color=#00ff]volatile[/color]
[color=#00ff]boolean[/color][color=#000] isBetting;
    [/color][color=#00ff]private[/color]
[color=#00ff]volatile[/color]
[color=#00ff]boolean[/color][color=#000] isBetted;
    [/color][color=#00ff]private[/color]
[color=#00ff]volatile[/color]
[color=#00ff]boolean[/color][color=#000] canMove [/color][color=#000]=[/color]
[color=#00ff]true[/color][color=#000]; [/color][color=#0800]//[/color][color=#0800]表示此时是否可以下注,是否正在附加赌[/color]

[color=#00ff]private[/color][color=#000] Image[] pkA;
    [/color][color=#00ff]private[/color][color=#000] Image[] pkB; [/color][color=#0800]//[/color][color=#0800]表示两个人物的图像数组[/color]

[color=#00ff]private[/color]
[color=#00ff]int[/color][color=#000] result; [/color][color=#0800]//[/color][color=#0800]表示PK的结果,定义在Constants类里面[/color]

[color=#00ff]private[/color][color=#000] Control con; [/color][color=#0800]//[/color][color=#0800]处理控制的类[/color]

[color=#00ff]private[/color]
[color=#00ff]int[/color][color=#000] allBet [/color][color=#000]=[/color]
[color=#000]1[/color][color=#000];
    [/color][color=#00ff]private[/color]
[color=#00ff]int[/color][color=#000] allWin [/color][color=#000]=[/color]
[color=#000]1[/color][color=#000]; [/color][color=#0800]//[/color][color=#0800]表示此人所有下注,所有赢的数,此数用于控制,不能赋0,除法会异常[/color]

[color=#00ff]private[/color][color=#000] AudioClip temp; [/color][color=#0800]//[/color][color=#0800]中间变量,用于放歌用的[/color]

[color=#00ff]private[/color]
[color=#00ff]volatile[/color]
[color=#00ff]boolean[/color][color=#000] go;
    [/color][color=#00ff]private[/color]
[color=#00ff]volatile[/color]
[color=#00ff]boolean[/color][color=#000] showMoney;
    [/color][color=#00ff]private[/color]
[color=#00ff]volatile[/color]
[color=#00ff]boolean[/color][color=#000] blinkRatio; [/color][color=#0800]//[/color][color=#0800]用以控制闪动线程的[/color]

[color=#00ff]private[/color]
[color=#00ff]volatile[/color]
[color=#00ff]boolean[/color][color=#000] isFullScreen; [/color][color=#0800]//[/color][color=#0800]指示此时是否是全屏[/color]

[color=#00ff]private[/color][color=#000] JFrame jf; [/color][color=#0800]//[/color][color=#0800]表示此游戏的窗口[/color]

[color=#0800]/**[/color][color=#0800] Creates a new instance of ClientControl [/color][color=#0800]*/[/color]
[color=#00ff]public[/color][color=#000] ClientControl() {
    }

    [/color][color=#00ff]public[/color][color=#000] ClientControl([/color][color=#00ff]int[/color][color=#000] id, [/color][color=#00ff]int[/color][color=#000] allMoney) {
        cm [/color][color=#000]=[/color]
[color=#00ff]new[/color][color=#000] ClientModel();
        cv [/color][color=#000]=[/color]
[color=#00ff]new[/color][color=#000] ClientView(cm);
        cm.setId(id);
        cm.setAllMoney(allMoney);
        cm.setInfo([/color][color=#00ff]new[/color][color=#000] INFO());
        [/color][color=#00ff]try[/color][color=#000] {
            cm.getInfo().setBigBonus([/color][color=#000]10000[/color][color=#000]);
            cm.getInfo().setSmallBonus([/color][color=#000]1000[/color][color=#000]);
            cm.getInfo().setTip([/color][color=#000]"[/color][color=#000]欢迎使用单机版!!谢谢![/color][color=#000]"[/color][color=#000]);
        } [/color][color=#00ff]catch[/color][color=#000] (Exception exe) {
            exe.printStackTrace();
        }
        initModel();
        initWindow();
        initOther();
        doShowAllMoney();
    }

    [/color][color=#0800]//[/color][color=#0800]初始化其它东西,比如声音片断[/color]

[color=#00ff]private[/color]
[color=#00ff]void[/color][color=#000] initOther() {
        con [/color][color=#000]=[/color]
[color=#00ff]new[/color][color=#000] Control();
        betAu [/color][color=#000]=[/color]
[color=#00ff]new[/color][color=#000] AudioClip[[/color][color=#000]10[/color][color=#000]];
        [/color][color=#00ff]for[/color][color=#000] ([/color][color=#00ff]int[/color][color=#000] i [/color][color=#000]=[/color]
[color=#000]1[/color][color=#000]; i [/color][color=#000]<[/color]
[color=#000]10[/color][color=#000]; i[/color][color=#000]++[/color][color=#000]) {
            betAu[i] [/color][color=#000]=[/color][color=#000] Applet.newAudioClip([/color][color=#00ff]this[/color][color=#000].getClass().getResource([/color][color=#000]"[/color][color=#000]sound/bet/bet[/color][color=#000]"[/color]
[color=#000]+[/color][color=#000] i [/color][color=#000]+[/color]
[color=#000]"[/color][color=#000].au[/color][color=#000]"[/color][color=#000]));
        }
        [/color][color=#0800]//[/color][color=#0800]初始化所有要使用的声音片段[/color]
[color=#000]        loop [/color][color=#000]=[/color][color=#000] Applet.newAudioClip([/color][color=#00ff]this[/color][color=#000].getClass().getResource([/color][color=#000]"[/color][color=#000]sound/loop.au[/color][color=#000]"[/color][color=#000]));
        runA [/color][color=#000]=[/color][color=#000] Applet.newAudioClip([/color][color=#00ff]this[/color][color=#000].getClass().getResource([/color][color=#000]"[/color][color=#000]sound/runA.au[/color][color=#000]"[/color][color=#000]));
        runB [/color][color=#000]=[/color][color=#000] Applet.newAudioClip([/color][color=#00ff]this[/color][color=#000].getClass().getResource([/color][color=#000]"[/color][color=#000]sound/runB.au[/color][color=#000]"[/color][color=#000]));
        onceMore [/color][color=#000]=[/color][color=#000] Applet.newAudioClip([/color][color=#00ff]this[/color][color=#000].getClass().getResource([/color][color=#000]"[/color][color=#000]sound/wu.au[/color][color=#000]"[/color][color=#000]));
        xiu [/color][color=#000]=[/color][color=#000] Applet.newAudioClip([/color][color=#00ff]this[/color][color=#000].getClass().getResource([/color][color=#000]"[/color][color=#000]sound/oncemore.au[/color][color=#000]"[/color][color=#000]));
        win [/color][color=#000]=[/color][color=#000] Applet.newAudioClip([/color][color=#00ff]this[/color][color=#000].getClass().getResource([/color][color=#000]"[/color][color=#000]sound/win/win.au[/color][color=#000]"[/color][color=#000]));
        lose [/color][color=#000]=[/color][color=#000] Applet.newAudioClip([/color][color=#00ff]this[/color][color=#000].getClass().getResource([/color][color=#000]"[/color][color=#000]sound/win/lose.au[/color][color=#000]"[/color][color=#000]));
        bet [/color][color=#000]=[/color]
[color=#00ff]new[/color][color=#000] Bet();
    }

    [/color][color=#0800]//[/color][color=#0800]初始化全屏[/color]

[color=#00ff]private[/color]
[color=#00ff]void[/color][color=#000] initWindow() {
        jf [/color][color=#000]=[/color]
[color=#00ff]new[/color][color=#000] JFrame([/color][color=#000]"[/color][color=#000]苹果机[/color][color=#000]"[/color][color=#000]);
        jf.getContentPane().add(cv, BorderLayout.CENTER);
        jf.setSize([/color][color=#000]800[/color][color=#000], [/color][color=#000]600[/color][color=#000]);
        jf.setUndecorated([/color][color=#00ff]true[/color][color=#000]);

        jf.setVisible([/color][color=#00ff]true[/color][color=#000]);
        jf.setAlwaysOnTop([/color][color=#00ff]true[/color][color=#000]);
        jf.setLocationRelativeTo([/color][color=#00ff]null[/color][color=#000]);[/color][color=#0800]//[/color][color=#0800]一条简便的语句,设置窗口居中显示[/color]
[color=#000]        jf.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        jf.addKeyListener([/color][color=#00ff]this[/color][color=#000]);
    }

    [/color][color=#0800]//[/color][color=#0800]初始化模型[/color]

[color=#00ff]private[/color]
[color=#00ff]void[/color][color=#000] initModel() {
        initImage();
        initModelOther();
    }

    [/color][color=#0800]//[/color][color=#0800]初始化图像[/color]

[color=#00ff]private[/color]
[color=#00ff]void[/color][color=#000] initImage() {
        MediaTracker mt [/color][color=#000]=[/color]
[color=#00ff]new[/color][color=#000] MediaTracker(cv);
        [/color][color=#00ff]int[/color][color=#000] index [/color][color=#000]=[/color]
[color=#000]0[/color][color=#000];
        Image[] number [/color][color=#000]=[/color]
[color=#00ff]new[/color][color=#000] Image[[/color][color=#000]10[/color][color=#000]];
        Image[] winNumber [/color][color=#000]=[/color]
[color=#00ff]new[/color][color=#000] Image[[/color][color=#000]10[/color][color=#000]];
        [/color][color=#00ff]for[/color][color=#000] ([/color][color=#00ff]int[/color][color=#000] i [/color][color=#000]=[/color]
[color=#000]0[/color][color=#000]; i [/color][color=#000]<[/color]
[color=#000]10[/color][color=#000]; i[/color][color=#000]++[/color][color=#000]) {
            number[i] [/color][color=#000]=[/color][color=#000] Toolkit.getDefaultToolkit().createImage([/color][color=#00ff]this[/color][color=#000].getClass().getResource([/color][color=#000]"[/color][color=#000]pic/game/number1/[/color][color=#000]"[/color]
[color=#000]+[/color][color=#000] i [/color][color=#000]+[/color]
[color=#000]"[/color][color=#000].png[/color][color=#000]"[/color][color=#000]));
            winNumber[i] [/color][color=#000]=[/color][color=#000] Toolkit.getDefaultToolkit().createImage([/color][color=#00ff]this[/color][color=#000].getClass().getResource([/color][color=#000]"[/color][color=#000]pic/game/number2/[/color][color=#000]"[/color]
[color=#000]+[/color][color=#000] i [/color][color=#000]+[/color]
[color=#000]"[/color][color=#000].png[/color][color=#000]"[/color][color=#000]));
            mt.addImage(number[i], index[/color][color=#000]++[/color][color=#000]);
            mt.addImage(winNumber[i], index[/color][color=#000]++[/color][color=#000]);
        }
        Image bg [/color][color=#000]=[/color][color=#000] Toolkit.getDefaultToolkit().createImage([/color][color=#00ff]this[/color][color=#000].getClass().getResource([/color][color=#000]"[/color][color=#000]pic/game/bg.jpg[/color][color=#000]"[/color][color=#000]));
        Image table [/color][color=#000]=[/color][color=#000] Toolkit.getDefaultToolkit().createImage([/color][color=#00ff]this[/color][color=#000].getClass().getResource([/color][color=#000]"[/color][color=#000]pic/game/table.png[/color][color=#000]"[/color][color=#000]));
        Image pkBg [/color][color=#000]=[/color][color=#000] Toolkit.getDefaultToolkit().createImage([/color][color=#00ff]this[/color][color=#000].getClass().getResource([/color][color=#000]"[/color][color=#000]pic/game/pk.jpg[/color][color=#000]"[/color][color=#000]));
        mt.addImage(bg, index[/color][color=#000]++[/color][color=#000]);
        mt.addImage(table, index[/color][color=#000]++[/color][color=#000]);
        mt.addImage(pkBg, index[/color][color=#000]++[/color][color=#000]);
        pkA [/color][color=#000]=[/color]
[color=#00ff]new[/color][color=#000] Image[[/color][color=#000]3[/color][color=#000]];
        pkB [/color][color=#000]=[/color]
[color=#00ff]new[/color][color=#000] Image[[/color][color=#000]3[/color][color=#000]];
        [/color][color=#00ff]for[/color][color=#000] ([/color][color=#00ff]int[/color][color=#000] i [/color][color=#000]=[/color]
[color=#000]0[/color][color=#000]; i [/color][color=#000]<[/color]
[color=#000]3[/color][color=#000]; i[/color][color=#000]++[/color][color=#000]) {
            pkA[i] [/color][color=#000]=[/color][color=#000] Toolkit.getDefaultToolkit().createImage([/color][color=#00ff]this[/color][color=#000].getClass().getResource([/color][color=#000]"[/color][color=#000]pic/game/pk/A[/color][color=#000]"[/color]
[color=#000]+[/color][color=#000] i [/color][color=#000]+[/color]
[color=#000]"[/color][color=#000].png[/color][color=#000]"[/color][color=#000]));
            pkB[i] [/color][color=#000]=[/color][color=#000] Toolkit.getDefaultToolkit().createImage([/color][color=#00ff]this[/color][color=#000].getClass().getResource([/color][color=#000]"[/color][color=#000]pic/game/pk/B[/color][color=#000]"[/color]
[color=#000]+[/color][color=#000] i [/color][color=#000]+[/color]
[color=#000]"[/color][color=#000].png[/color][color=#000]"[/color][color=#000]));
            mt.addImage(pkA[i], index[/color][color=#000]++[/color][color=#000]);
            mt.addImage(pkB[i], index[/color][color=#000]++[/color][color=#000]);
        }
        [/color][color=#00ff]try[/color][color=#000] {
            mt.waitForAll();
        } [/color][color=#00ff]catch[/color][color=#000] (Exception exe) {
            exe.printStackTrace();
        }
        cm.setBg(bg);
        cm.setNumber(number);
        cm.setWinNumber(winNumber);
        [/color][color=#0800]//[/color][color=#0800]cm.setRunA(PP.p1.other);[/color]
[color=#000]        cm.setTable(table);
        cm.setPkA(pkA[[/color][color=#000]0[/color][color=#000]]);
        cm.setPkB(pkB[[/color][color=#000]0[/color][color=#000]]);
        cm.setPKBG(pkBg);
    }

    [/color][color=#0800]//[/color][color=#0800]初始化模型其它部份[/color]

[color=#00ff]private[/color]
[color=#00ff]void[/color][color=#000] initModelOther() {
        Bet bet [/color][color=#000]=[/color]
[color=#00ff]new[/color][color=#000] Bet();
        cm.setBet(bet);
        cm.addP(PP.p1);
        [/color][color=#0800]//[/color][color=#0800]初始化线程池[/color]
[color=#000]        es [/color][color=#000]=[/color][color=#000] Executors.newCachedThreadPool();
    }

    [/color][color=#0800]//[/color][color=#0800]专门起一个线程用于更新余额的方法[/color]

[color=#00ff]private[/color]
[color=#00ff]void[/color][color=#000] doShowAllMoney() {
        es.execute([/color][color=#00ff]new[/color][color=#000] Runnable() {

            [/color][color=#00ff]public[/color]
[color=#00ff]void[/color][color=#000] run() {
                showMoney [/color][color=#000]=[/color]
[color=#00ff]true[/color][color=#000];
                [/color][color=#00ff]while[/color][color=#000] (showMoney) {
                    [/color][color=#00ff]try[/color][color=#000] {
                        Thread.sleep([/color][color=#000]80[/color][color=#000]);
                        cv.repaint([/color][color=#000]10[/color][color=#000], [/color][color=#000]661[/color][color=#000], [/color][color=#000]73[/color][color=#000], [/color][color=#000]107[/color][color=#000], [/color][color=#000]65[/color][color=#000]);
                    } [/color][color=#00ff]catch[/color][color=#000] (Exception exe) {
                        exe.printStackTrace();
                    }
                }
            }
        });
    }

    [/color][color=#0800]//[/color][color=#0800]专门处理下注的方法[/color]

[color=#00ff]private[/color]
[color=#00ff]synchronized[/color]
[color=#00ff]void[/color][color=#000] doBet([/color][color=#00ff]int[/color][color=#000] i) {
        [/color][color=#00ff]if[/color][color=#000] ([/color][color=#000]![/color][color=#000]isBetted) {
            isBetted [/color][color=#000]=[/color]
[color=#00ff]true[/color][color=#000];
            canMove [/color][color=#000]=[/color]
[color=#00ff]false[/color][color=#000];
            cm.getBet().clearWin();
            [/color][color=#0800]//[/color][color=#0800]doShowAllMoney();[/color]
[color=#000]        }
        cm.setAllMoney(cm.getAllMoney() [/color][color=#000]-[/color]
[color=#000]1[/color][color=#000]);
        [/color][color=#00ff]int[/color][color=#000] bet [/color][color=#000]=[/color][color=#000] cm.getBet().getBet(i);
        cm.getBet().setBet(i, bet [/color][color=#000]+[/color]
[color=#000]1[/color][color=#000]);
        betAu[i].play();
    }

    [/color][color=#0800]//[/color][color=#0800]专门用来设置赔率的方法[/color]

[color=#00ff]private[/color]
[color=#00ff]void[/color][color=#000] setRatio() {
        [/color][color=#00ff]int[/color][color=#000] rad [/color][color=#000]=[/color][color=#000] ([/color][color=#00ff]int[/color][color=#000]) (Math.random()[/color][color=#000]*[/color][color=#000]100[/color][color=#000]) [/color][color=#000]+[/color]
[color=#000]1[/color][color=#000];
        [/color][color=#00ff]if[/color][color=#000] (rad [/color][color=#000]>[/color]
[color=#000]95[/color][color=#000]) {
            cm.setRatioA([/color][color=#000]40[/color][color=#000]);
        } [/color][color=#00ff]else[/color]
[color=#00ff]if[/color][color=#000] (rad [/color][color=#000]>[/color]
[color=#000]85[/color][color=#000]) {
            cm.setRatioA([/color][color=#000]30[/color][color=#000]);
        } [/color][color=#00ff]else[/color][color=#000] {
            cm.setRatioA([/color][color=#000]20[/color][color=#000]);
        }
        rad [/color][color=#000]=[/color][color=#000] ([/color][color=#00ff]int[/color][color=#000]) (Math.random()[/color][color=#000]*[/color][color=#000]100[/color][color=#000]) [/color][color=#000]+[/color]
[color=#000]1[/color][color=#000];
        [/color][color=#00ff]if[/color][color=#000] (rad [/color][color=#000]>[/color]
[color=#000]95[/color][color=#000]) {
            cm.setRatioB([/color][color=#000]20[/color][color=#000]);
        } [/color][color=#00ff]else[/color]
[color=#00ff]if[/color][color=#000] (rad [/color][color=#000]>[/color]
[color=#000]85[/color][color=#000]) {
            cm.setRatioB([/color][color=#000]15[/color][color=#000]);
        } [/color][color=#00ff]else[/color][color=#000] {
            cm.setRatioB([/color][color=#000]10[/color][color=#000]);
        }
    }

    [/color][color=#0800]//[/color][color=#0800]专门处理开始跑的方法[/color]

[color=#00ff]private[/color]
[color=#00ff]void[/color][color=#000] doRun() {
        [/color][color=#00ff]try[/color][color=#000] {
            [/color][color=#0800]//[/color][color=#0800]此时先把赔率设置好[/color]
[color=#000]            setRatio();
            isRunning [/color][color=#000]=[/color]
[color=#00ff]true[/color][color=#000];
            canBet [/color][color=#000]=[/color]
[color=#00ff]false[/color][color=#000];
            canMove [/color][color=#000]=[/color]
[color=#00ff]false[/color][color=#000];
            showMoney [/color][color=#000]=[/color]
[color=#00ff]false[/color][color=#000];
            INFO inf [/color][color=#000]=[/color][color=#000] cm.getInfo();
            inf.setBigBonus(cm.getBet().getTotal() [/color][color=#000]/[/color]
[color=#000]50[/color]
[color=#000]+[/color][color=#000] inf.getBigBonus());
            inf.setSmallBonus(cm.getBet().getTotal() [/color][color=#000]/[/color]
[color=#000]100[/color]
[color=#000]+[/color][color=#000] inf.getSmallBonus());
            cv.repaint();
            es.execute([/color][color=#00ff]new[/color][color=#000] Runnable() {

                [/color][color=#00ff]public[/color]
[color=#00ff]void[/color][color=#000] run() {
                    runRun();
                }
            });
        } [/color][color=#00ff]catch[/color][color=#000] (Exception exe) {
            exe.printStackTrace();
        }
    }

    [/color][color=#00ff]public[/color]
[color=#00ff]void[/color][color=#000] keyPressed(KeyEvent ke) {
        [/color][color=#00ff]int[/color][color=#000] allMoney [/color][color=#000]=[/color][color=#000] cm.getAllMoney();
        [/color][color=#00ff]int[/color][color=#000] code [/color][color=#000]=[/color][color=#000] ke.getKeyCode();
        [/color][color=#0800]//[/color][color=#0800]先看看是不是CTRL+F,如果是的话,就表示全屏或者退出全屏了[/color]

[color=#00ff]if[/color][color=#000] (KeyEvent.VK_F [/color][color=#000]==[/color][color=#000] code [/color][color=#000]&&[/color][color=#000] (ke.getModifiersEx() [/color][color=#000]&[/color][color=#000] KeyEvent.CTRL_DOWN_MASK) [/color][color=#000]==[/color][color=#000] KeyEvent.CTRL_DOWN_MASK) {
            [/color][color=#00ff]if[/color][color=#000] (isFullScreen) {
                GraphicsDevice gd [/color][color=#000]=[/color][color=#000] GraphicsEnvironment.getLocalGraphicsEnvironment().getDefaultScreenDevice();
                [/color][color=#00ff]try[/color][color=#000] {
                    gd.setFullScreenWindow([/color][color=#00ff]null[/color][color=#000]);
                    isFullScreen[/color][color=#000]=[/color][color=#00ff]false[/color][color=#000];
                } [/color][color=#00ff]catch[/color][color=#000] (Exception exe) {
                    exe.printStackTrace();
                }
            } [/color][color=#00ff]else[/color][color=#000] {
                [/color][color=#0800]//[/color][color=#0800]得到图形设备,也就是显示器[/color]
[color=#000]                GraphicsDevice gd [/color][color=#000]=[/color][color=#000] GraphicsEnvironment.getLocalGraphicsEnvironment().getDefaultScreenDevice();
                [/color][color=#00ff]try[/color][color=#000] {
                    gd.setFullScreenWindow(jf);
                    gd.setDisplayMode([/color][color=#00ff]new[/color][color=#000] DisplayMode([/color][color=#000]800[/color][color=#000], [/color][color=#000]600[/color][color=#000], [/color][color=#000]16[/color][color=#000], [/color][color=#000]60[/color][color=#000]));
                    isFullScreen[/color][color=#000]=[/color][color=#00ff]true[/color][color=#000];
                } [/color][color=#00ff]catch[/color][color=#000] (Exception exe) {
                    exe.printStackTrace();
                }
            }
            [/color][color=#00ff]return[/color][color=#000];
        }
        [/color][color=#0800]//[/color][color=#0800]如果可以下注并且余额大于0才处理键盘事件[/color]

[color=#00ff]if[/color][color=#000] (allMoney [/color][color=#000]>[/color]
[color=#000]0[/color]
[color=#000]&&[/color][color=#000] canBet) {
            [/color][color=#00ff]if[/color][color=#000] (KeyEvent.VK_1 [/color][color=#000]==[/color][color=#000] code) {
                doBet([/color][color=#000]1[/color][color=#000]);
                cv.repaint([/color][color=#000]24[/color][color=#000], [/color][color=#000]566[/color][color=#000], [/color][color=#000]64[/color][color=#000], [/color][color=#000]31[/color][color=#000]);
            } [/color][color=#00ff]else[/color]
[color=#00ff]if[/color][color=#000] (KeyEvent.VK_2 [/color][color=#000]==[/color][color=#000] code) {
                doBet([/color][color=#000]2[/color][color=#000]);
                cv.repaint([/color][color=#000]129[/color][color=#000], [/color][color=#000]566[/color][color=#000], [/color][color=#000]64[/color][color=#000], [/color][color=#000]31[/color][color=#000]);
            } [/color][color=#00ff]else[/color]
[color=#00ff]if[/color][color=#000] (KeyEvent.VK_3 [/color][color=#000]==[/color][color=#000] code) {
                doBet([/color][color=#000]3[/color][color=#000]);
                cv.repaint([/color][color=#000]197[/color][color=#000], [/color][color=#000]566[/color][color=#000], [/color][color=#000]64[/color][color=#000], [/color][color=#000]31[/color][color=#000]);
            } [/color][color=#00ff]else[/color]
[color=#00ff]if[/color][color=#000] (KeyEvent.VK_4 [/color][color=#000]==[/color][color=#000] code) {
                doBet([/color][color=#000]4[/color][color=#000]);
                cv.repaint([/color][color=#000]264[/color][color=#000], [/color][color=#000]566[/color][color=#000], [/color][color=#000]64[/color][color=#000], [/color][color=#000]31[/color][color=#000]);
            } [/color][color=#00ff]else[/color]
[color=#00ff]if[/color][color=#000] (KeyEvent.VK_5 [/color][color=#000]==[/color][color=#000] code) {
                doBet([/color][color=#000]5[/color][color=#000]);
                cv.repaint([/color][color=#000]369[/color][color=#000], [/color][color=#000]566[/color][color=#000], [/color][color=#000]64[/color][color=#000], [/color][color=#000]31[/color][color=#000]);
            } [/color][color=#00ff]else[/color]
[color=#00ff]if[/color][color=#000] (KeyEvent.VK_6 [/color][color=#000]==[/color][color=#000] code) {
                doBet([/color][color=#000]6[/color][color=#000]);
                cv.repaint([/color][color=#000]474[/color][color=#000], [/color][color=#000]566[/color][color=#000], [/color][color=#000]64[/color][color=#000], [/color][color=#000]31[/color][color=#000]);
            } [/color][color=#00ff]else[/color]
[color=#00ff]if[/color][color=#000] (KeyEvent.VK_7 [/color][color=#000]==[/color][color=#000] code) {
                doBet([/color][color=#000]7[/color][color=#000]);
                cv.repaint([/color][color=#000]542[/color][color=#000], [/color][color=#000]566[/color][color=#000], [/color][color=#000]64[/color][color=#000], [/color][color=#000]31[/color][color=#000]);
            } [/color][color=#00ff]else[/color]
[color=#00ff]if[/color][color=#000] (KeyEvent.VK_8 [/color][color=#000]==[/color][color=#000] code) {
                doBet([/color][color=#000]8[/color][color=#000]);
                cv.repaint([/color][color=#000]610[/color][color=#000], [/color][color=#000]566[/color][color=#000], [/color][color=#000]64[/color][color=#000], [/color][color=#000]31[/color][color=#000]);
            } [/color][color=#00ff]else[/color]
[color=#00ff]if[/color][color=#000] (KeyEvent.VK_9 [/color][color=#000]==[/color][color=#000] code) {
                doBet([/color][color=#000]9[/color][color=#000]);
                cv.repaint([/color][color=#000]712[/color][color=#000], [/color][color=#000]566[/color][color=#000], [/color][color=#000]64[/color][color=#000], [/color][color=#000]31[/color][color=#000]);
            }
        }
        [/color][color=#00ff]if[/color][color=#000] (KeyEvent.VK_LEFT [/color][color=#000]==[/color][color=#000] code [/color][color=#000]&&[/color][color=#000] canMove) {
            [/color][color=#00ff]if[/color][color=#000] (cm.getAllMoney() [/color][color=#000]>[/color]
[color=#000]0[/color][color=#000]) {
                [/color][color=#00ff]if[/color][color=#000] (temp [/color][color=#000]!=[/color]
[color=#00ff]null[/color][color=#000]) {
                    temp.stop();
                }
                go [/color][color=#000]=[/color]
[color=#00ff]false[/color][color=#000];
                canBet [/color][color=#000]=[/color]
[color=#00ff]false[/color][color=#000];
                cm.setAllMoney(cm.getAllMoney() [/color][color=#000]-[/color]
[color=#000]1[/color][color=#000]);
                cm.setWinMoney(cm.getWinMoney() [/color][color=#000]+[/color]
[color=#000]1[/color][color=#000]);
                cv.repaint([/color][color=#000]30[/color][color=#000], [/color][color=#000]75[/color][color=#000], [/color][color=#000]107[/color][color=#000], [/color][color=#000]65[/color][color=#000]);
            }
        } [/color][color=#00ff]else[/color]
[color=#00ff]if[/color][color=#000] (KeyEvent.VK_RIGHT [/color][color=#000]==[/color][color=#000] code [/color][color=#000]&&[/color][color=#000] canMove) {
            [/color][color=#00ff]if[/color][color=#000] (cm.getWinMoney() [/color][color=#000]>[/color]
[color=#000]0[/color][color=#000]) {
                [/color][color=#00ff]if[/color][color=#000] (temp [/color][color=#000]!=[/color]
[color=#00ff]null[/color][color=#000]) {
                    temp.stop();
                }
                go [/color][color=#000]=[/color]
[color=#00ff]false[/color][color=#000];
                cm.setAllMoney(cm.getAllMoney() [/color][color=#000]+[/color]
[color=#000]1[/color][color=#000]);
                cm.setWinMoney(cm.getWinMoney() [/color][color=#000]-[/color]
[color=#000]1[/color][color=#000]);
                cv.repaint([/color][color=#000]30[/color][color=#000], [/color][color=#000]75[/color][color=#000], [/color][color=#000]107[/color][color=#000], [/color][color=#000]65[/color][color=#000]);
                [/color][color=#00ff]if[/color][color=#000] (cm.getWinMoney() [/color][color=#000]==[/color]
[color=#000]0[/color][color=#000]) {
                    canBet [/color][color=#000]=[/color]
[color=#00ff]true[/color][color=#000];
                    cm.setBet([/color][color=#00ff]new[/color][color=#000] Bet());
                    cm.setBetting([/color][color=#00ff]false[/color][color=#000]);
                    isBetting [/color][color=#000]=[/color]
[color=#00ff]false[/color][color=#000];
                    cv.repaint([/color][color=#000]0[/color][color=#000], [/color][color=#000]30[/color][color=#000], [/color][color=#000]800[/color][color=#000], [/color][color=#000]600[/color][color=#000]);
                }
            }
        }
    }

    [/color][color=#00ff]public[/color]
[color=#00ff]void[/color][color=#000] keyTyped(KeyEvent ke) {
    }

    [/color][color=#00ff]public[/color]
[color=#00ff]void[/color][color=#000] keyReleased(KeyEvent ke) {
        [/color][color=#00ff]int[/color][color=#000] code [/color][color=#000]=[/color][color=#000] ke.getKeyCode();
        [/color][color=#00ff]if[/color][color=#000] (KeyEvent.VK_ESCAPE [/color][color=#000]==[/color][color=#000] code) {
            System.exit([/color][color=#000]0[/color][color=#000]);
        }
        [/color][color=#0800]//[/color][color=#0800]如果是回车键则分为几种可能,只分两种可能,有分和没分,有分就下分,没分就跑[/color]

[color=#00ff]if[/color][color=#000] (KeyEvent.VK_ENTER [/color][color=#000]==[/color][color=#000] code) {
            [/color][color=#00ff]if[/color][color=#000] (isRunning) {
                ke.consume();
            } [/color][color=#00ff]else[/color][color=#000] {
                doEnter();
            }
        } [/color][color=#00ff]else[/color]
[color=#00ff]if[/color][color=#000] (KeyEvent.VK_NUMPAD1 [/color][color=#000]==[/color][color=#000] code [/color][color=#000]||[/color][color=#000] KeyEvent.VK_Q [/color][color=#000]==[/color][color=#000] code) {
            [/color][color=#00ff]if[/color][color=#000] (cm.getWinMoney() [/color][color=#000]>[/color]
[color=#000]0[/color]
[color=#000]&&[/color][color=#000] isBetting) {
                isBetting [/color][color=#000]=[/color]
[color=#00ff]false[/color][color=#000];
                result [/color][color=#000]=[/color][color=#000] A_WIN;
            }
        } [/color][color=#00ff]else[/color]
[color=#00ff]if[/color][color=#000] (KeyEvent.VK_NUMPAD3 [/color][color=#000]==[/color][color=#000] code [/color][color=#000]||[/color][color=#000] KeyEvent.VK_P [/color][color=#000]==[/color][color=#000] code) {
            [/color][color=#00ff]if[/color][color=#000] (cm.getWinMoney() [/color][color=#000]>[/color]
[color=#000]0[/color]
[color=#000]&&[/color][color=#000] isBetting) {
                isBetting [/color][color=#000]=[/color]
[color=#00ff]false[/color][color=#000];
                result [/color][color=#000]=[/color][color=#000] B_WIN;
            }
        }
        [/color][color=#0800]//[/color][color=#0800]要按键能出来PK界面,必须赢的钱要大于0,否则赌的没意义[/color]

[color=#00ff]if[/color][color=#000] (KeyEvent.VK_B [/color][color=#000]==[/color][color=#000] code) {
            [/color][color=#00ff]if[/color][color=#000] (cm.isBetting()) {
                [/color][color=#0800]//[/color][color=#0800]如果此时在PK,则无条件不显示[/color]
[color=#000]                cm.setBetting([/color][color=#00ff]false[/color][color=#000]);
                isBetting [/color][color=#000]=[/color]
[color=#00ff]false[/color][color=#000];
                cv.repaint([/color][color=#000]0[/color][color=#000], [/color][color=#000]30[/color][color=#000], [/color][color=#000]800[/color][color=#000], [/color][color=#000]600[/color][color=#000]);
            } [/color][color=#00ff]else[/color]
[color=#00ff]if[/color][color=#000] (cm.getWinMoney() [/color][color=#000]>[/color]
[color=#000]0[/color]
[color=#000]&&[/color][color=#000] canMove) {
                [/color][color=#0800]//[/color][color=#0800]设置为可以PK[/color]

[color=#00ff]if[/color][color=#000] (temp [/color][color=#000]!=[/color]
[color=#00ff]null[/color][color=#000]) {
                    temp.stop();
                }
                go [/color][color=#000]=[/color]
[color=#00ff]false[/color][color=#000];
                cm.setBetting([/color][color=#00ff]true[/color][color=#000]);
                doPK();
                cv.repaint([/color][color=#000]0[/color][color=#000], [/color][color=#000]30[/color][color=#000], [/color][color=#000]800[/color][color=#000], [/color][color=#000]600[/color][color=#000]);
            }
        }
    }

    [/color][color=#0800]//[/color][color=#0800]定义一个同步方法以防止两个线程共同起动跑[/color]

[color=#00ff]private[/color]
[color=#00ff]synchronized[/color]
[color=#00ff]void[/color][color=#000] doEnter() {
        [/color][color=#0800]//[/color][color=#0800]当前的可用分为0时,按回车就跑[/color]
[color=#000]        result [/color][color=#000]=[/color]
[color=#000]0[/color][color=#000];
        cm.setBetting([/color][color=#00ff]false[/color][color=#000]);
        isBetting [/color][color=#000]=[/color]
[color=#00ff]false[/color][color=#000];
        go [/color][color=#000]=[/color]
[color=#00ff]false[/color][color=#000];
        [/color][color=#00ff]if[/color][color=#000] (temp [/color][color=#000]!=[/color]
[color=#00ff]null[/color][color=#000]) {
            temp.stop();
        }
        [/color][color=#00ff]if[/color][color=#000] (cm.getWinMoney() [/color][color=#000]==[/color]
[color=#000]0[/color][color=#000]) {
            cm.clearP();
            resetPP(); [/color][color=#0800]//[/color][color=#0800]无论怎么样,都要在开始把PP的记录重置
            [/color][color=#0800]//[/color][color=#0800]如果已下注了,那就取下注的为准[/color]

[color=#00ff]if[/color][color=#000] (canBet) {

                [/color][color=#00ff]if[/color][color=#000] (isBetted) {
                    bet [/color][color=#000]=[/color][color=#000] cm.getBet();
                    doRun();
                    isBetted [/color][color=#000]=[/color]
[color=#00ff]false[/color][color=#000];
                } [/color][color=#00ff]else[/color][color=#000] {
                    [/color][color=#00ff]if[/color][color=#000] (cm.getAllMoney() [/color][color=#000]>=[/color][color=#000] bet.getTotal() [/color][color=#000]&&[/color][color=#000] bet.getTotal() [/color][color=#000]>[/color]
[color=#000]0[/color][color=#000]) {
                        bet.clearWin();
                        cm.setBet(bet);
                        cm.setAllMoney(cm.getAllMoney() [/color][color=#000]-[/color][color=#000] bet.getTotal());
                        doRun();
                    }
                }
                cv.repaint([/color][color=#000]0[/color][color=#000], [/color][color=#000]30[/color][color=#000], [/color][color=#000]800[/color][color=#000], [/color][color=#000]600[/color][color=#000]);
            }
        } [/color][color=#00ff]else[/color][color=#000] {
            allWin [/color][color=#000]+=[/color][color=#000] cm.getWinMoney();
            allBet [/color][color=#000]+=[/color][color=#000] cm.getBet().getTotal();
            cm.setAllMoney(cm.getAllMoney() [/color][color=#000]+[/color][color=#000] cm.getWinMoney());
            cm.setWinMoney([/color][color=#000]0[/color][color=#000]);
            cm.setBet([/color][color=#00ff]new[/color][color=#000] Bet());
            canBet [/color][color=#000]=[/color]
[color=#00ff]true[/color][color=#000];
            cv.repaint([/color][color=#000]0[/color][color=#000], [/color][color=#000]30[/color][color=#000], [/color][color=#000]800[/color][color=#000], [/color][color=#000]600[/color][color=#000]);
        }
    }

    [/color][color=#0800]//[/color][color=#0800]起PK线程,并且设置相当的布尔量
    [/color][color=#0800]//[/color][color=#0800]使之可以PK[/color]

[color=#00ff]private[/color]
[color=#00ff]void[/color][color=#000] doPK() {
        isBetting [/color][color=#000]=[/color]
[color=#00ff]true[/color][color=#000]; [/color][color=#0800]//[/color][color=#0800]此时才可以将这个设为真,因为不会再跑了,所以可以押大小了
        [/color][color=#0800]//[/color][color=#0800]doShowAllMoney();[/color]
[color=#000]        cm.setBetting([/color][color=#00ff]true[/color][color=#000]);
        es.execute([/color][color=#00ff]new[/color][color=#000] Runnable() {

            [/color][color=#00ff]public[/color]
[color=#00ff]void[/color][color=#000] run() {
                pkRun();
            }
        });
    }

    [/color][color=#0800]//[/color][color=#0800]处理PK的线程体[/color]

[color=#00ff]private[/color]
[color=#00ff]void[/color][color=#000] pkRun() {
        [/color][color=#00ff]int[/color][color=#000] indexA [/color][color=#000]=[/color]
[color=#000]0[/color][color=#000];
        [/color][color=#00ff]int[/color][color=#000] indexB [/color][color=#000]=[/color]
[color=#000]0[/color][color=#000];
        [/color][color=#00ff]while[/color][color=#000] (isBetting) {
            [/color][color=#00ff]try[/color][color=#000] {
                Thread.sleep([/color][color=#000]80[/color][color=#000]);
                [/color][color=#00ff]int[/color][color=#000] rand [/color][color=#000]=[/color][color=#000] ([/color][color=#00ff]int[/color][color=#000]) (Math.random()[/color][color=#000]*[/color][color=#000]100[/color][color=#000]);
                [/color][color=#00ff]if[/color][color=#000] (rand [/color][color=#000]%[/color]
[color=#000]2[/color]
[color=#000]==[/color]
[color=#000]0[/color][color=#000]) {
                    [/color][color=#00ff]if[/color][color=#000] (indexA [/color][color=#000]<[/color][color=#000] pkA.length [/color][color=#000]-[/color]
[color=#000]1[/color][color=#000]) {
                        cm.setPkA(pkA[[/color][color=#000]++[/color][color=#000]indexA]);
                    } [/color][color=#00ff]else[/color][color=#000] {
                        indexA [/color][color=#000]=[/color]
[color=#000]0[/color][color=#000];
                        cm.setPkA(pkA[[/color][color=#000]0[/color][color=#000]]);
                    }
                } [/color][color=#00ff]else[/color][color=#000] {
                    [/color][color=#00ff]if[/color][color=#000] (indexB [/color][color=#000]<[/color][color=#000] pkB.length [/color][color=#000]-[/color]
[color=#000]1[/color][color=#000]) {
                        cm.setPkB(pkB[[/color][color=#000]++[/color][color=#000]indexB]);
                    } [/color][color=#00ff]else[/color][color=#000] {
                        indexB [/color][color=#000]=[/color]
[color=#000]0[/color][color=#000];
                        cm.setPkB(pkB[[/color][color=#000]0[/color][color=#000]]);
                    }
                }
                cv.repaint([/color][color=#000]269[/color][color=#000], [/color][color=#000]274[/color][color=#000], [/color][color=#000]254[/color][color=#000], [/color][color=#000]132[/color][color=#000]);
            } [/color][color=#00ff]catch[/color][color=#000] (Exception exe) {
                exe.printStackTrace();
            }
        }
        [/color][color=#00ff]if[/color][color=#000] (Math.random() [/color][color=#000]*[/color]
[color=#000]10[/color]
[color=#000]>[/color]
[color=#000]1[/color][color=#000]) {
            [/color][color=#00ff]while[/color][color=#000] (indexA [/color][color=#000]==[/color][color=#000] indexB) {
                indexA [/color][color=#000]=[/color][color=#000] ([/color][color=#00ff]int[/color][color=#000]) (Math.random()[/color][color=#000]*[/color][color=#000]3[/color][color=#000]);
            }
        }
        cm.setPkA(pkA[indexA]);
        cm.setPkB(pkB[indexB]);
        cv.repaint([/color][color=#000]238[/color][color=#000], [/color][color=#000]258[/color][color=#000], [/color][color=#000]330[/color][color=#000], [/color][color=#000]152[/color][color=#000]);
        handleResult(indexA, indexB);
    }

    [/color][color=#0800]//[/color][color=#0800]处理结果的一个方法,针对传进来的A和B的下标,判断谁赢谁输[/color]

[color=#00ff]private[/color]
[color=#00ff]void[/color][color=#000] handleResult([/color][color=#00ff]int[/color][color=#000] a, [/color][color=#00ff]int[/color][color=#000] b) {
        [/color][color=#00ff]int[/color][color=#000] current [/color][color=#000]=[/color]
[color=#000]0[/color][color=#000];
        [/color][color=#0800]//[/color][color=#0800]当A为布时[/color]

[color=#00ff]if[/color][color=#000] (a [/color][color=#000]==[/color]
[color=#000]0[/color][color=#000]) {
            [/color][color=#00ff]if[/color][color=#000] (b [/color][color=#000]==[/color]
[color=#000]0[/color][color=#000]) {
                current [/color][color=#000]=[/color][color=#000] AB_TIE;
            } [/color][color=#00ff]else[/color]
[color=#00ff]if[/color][color=#000] (b [/color][color=#000]==[/color]
[color=#000]1[/color][color=#000]) {
                current [/color][color=#000]=[/color][color=#000] A_WIN;
            } [/color][color=#00ff]else[/color]
[color=#00ff]if[/color][color=#000] (b [/color][color=#000]==[/color]
[color=#000]2[/color][color=#000]) {
                current [/color][color=#000]=[/color][color=#000] B_WIN;
            }
        } [/color][color=#00ff]else[/color]
[color=#00ff]if[/color][color=#000] (a [/color][color=#000]==[/color]
[color=#000]1[/color][color=#000]) {
            [/color][color=#00ff]if[/color][color=#000] (b [/color][color=#000]==[/color]
[color=#000]0[/color][color=#000]) {
                current [/color][color=#000]=[/color][color=#000] B_WIN;
            } [/color][color=#00ff]else[/color]
[color=#00ff]if[/color][color=#000] (b [/color][color=#000]==[/color]
[color=#000]1[/color][color=#000]) {
                current [/color][color=#000]=[/color][color=#000] AB_TIE;
            } [/color][color=#00ff]else[/color]
[color=#00ff]if[/color][color=#000] (b [/color][color=#000]==[/color]
[color=#000]2[/color][color=#000]) {
                current [/color][color=#000]=[/color][color=#000] A_WIN;
            }
        } [/color][color=#00ff]else[/color]
[color=#00ff]if[/color][color=#000] (a [/color][color=#000]==[/color]
[color=#000]2[/color][color=#000]) {
            [/color][color=#00ff]if[/color][color=#000] (b [/color][color=#000]==[/color]
[color=#000]0[/color][color=#000]) {
                current [/color][color=#000]=[/color][color=#000] A_WIN;
            } [/color][color=#00ff]else[/color]
[color=#00ff]if[/color][color=#000] (b [/color][color=#000]==[/color]
[color=#000]1[/color][color=#000]) {
                current [/color][color=#000]=[/color][color=#000] B_WIN;
            } [/color][color=#00ff]else[/color]
[color=#00ff]if[/color][color=#000] (b [/color][color=#000]==[/color]
[color=#000]2[/color][color=#000]) {
                current [/color][color=#000]=[/color][color=#000] AB_TIE;
            }
        }
        [/color][color=#0800]//[/color][color=#0800]当两者相等,则说明猜中了[/color]

[color=#00ff]if[/color][color=#000] (result [/color][color=#000]==[/color][color=#000] current [/color][color=#000]||[/color][color=#000] current [/color][color=#000]==[/color][color=#000] AB_TIE) {
            win.play();
            cm.setWinMoney(cm.getWinMoney() [/color][color=#000]*[/color]
[color=#000]2[/color][color=#000]);
            cv.repaint([/color][color=#000]30[/color][color=#000], [/color][color=#000]75[/color][color=#000], [/color][color=#000]107[/color][color=#000], [/color][color=#000]65[/color][color=#000]);
            [/color][color=#00ff]try[/color][color=#000] {
                Thread.sleep([/color][color=#000]1000[/color][color=#000]);
                isBetting [/color][color=#000]=[/color]
[color=#00ff]true[/color][color=#000];
                result [/color][color=#000]=[/color]
[color=#000]0[/color][color=#000];
                pkRun();
            } [/color][color=#00ff]catch[/color][color=#000] (Exception exe) {
                exe.printStackTrace();
            }
        } [/color][color=#00ff]else[/color]
[color=#00ff]if[/color][color=#000] (result [/color][color=#000]==[/color]
[color=#000]0[/color][color=#000]) { [/color][color=#0800]//[/color][color=#0800]如果此时等于0,则说明没有猜拳
            [/color][color=#0800]//[/color][color=#0800]showMoney=false;[/color]
[color=#000]        } [/color][color=#00ff]else[/color][color=#000] {
            canBet [/color][color=#000]=[/color]
[color=#00ff]true[/color][color=#000];
            lose.play();
            cm.setWinMoney([/color][color=#000]0[/color][color=#000]);
            [/color][color=#0800]//[/color][color=#0800]showMoney=false;[/color]

[color=#00ff]try[/color][color=#000] {
                Thread.sleep([/color][color=#000]1000[/color][color=#000]);
                cm.setBetting([/color][color=#00ff]false[/color][color=#000]);
                isBetting [/color][color=#000]=[/color]
[color=#00ff]false[/color][color=#000];
                cm.setBet([/color][color=#00ff]new[/color][color=#000] Bet());
                cv.repaint([/color][color=#000]0[/color][color=#000], [/color][color=#000]30[/color][color=#000], [/color][color=#000]800[/color][color=#000], [/color][color=#000]600[/color][color=#000]);
            } [/color][color=#00ff]catch[/color][color=#000] (Exception exe) {
                exe.printStackTrace();
            }
        }
        result [/color][color=#000]=[/color]
[color=#000]0[/color][color=#000];
    }

    [/color][color=#0800]//[/color][color=#0800]计算当前的路径出发总共跑SUM步得到的结果[/color]

[color=#00ff]private[/color][color=#000] PP fromIndex(PP from, [/color][color=#00ff]int[/color][color=#000] sum, [/color][color=#00ff]boolean[/color][color=#000] isRun) {
        [/color][color=#00ff]if[/color][color=#000] (isRun) {
            [/color][color=#00ff]int[/color][color=#000] all [/color][color=#000]=[/color][color=#000] sum;
            PP[] ps [/color][color=#000]=[/color][color=#000] PP.values();
            [/color][color=#00ff]int[/color][color=#000] index [/color][color=#000]=[/color][color=#000] (all [/color][color=#000]+[/color][color=#000] p.ordinal()) [/color][color=#000]%[/color]
[color=#000]26[/color][color=#000];
            [/color][color=#00ff]return[/color][color=#000] ps[index];
        } [/color][color=#00ff]else[/color][color=#000] {
            [/color][color=#00ff]int[/color][color=#000] all [/color][color=#000]=[/color]
[color=#000]5[/color]
[color=#000]+[/color]
[color=#000]7[/color]
[color=#000]+[/color][color=#000] sum;
            PP[] ps [/color][color=#000]=[/color][color=#000] PP.values();
            [/color][color=#00ff]int[/color][color=#000] index [/color][color=#000]=[/color][color=#000] (all [/color][color=#000]+[/color][color=#000] p.ordinal()) [/color][color=#000]%[/color]
[color=#000]26[/color][color=#000];
            [/color][color=#00ff]return[/color][color=#000] ps[index];
        }
    }

    [/color][color=#00ff]private[/color][color=#000] PP fromIndex(PP from, [/color][color=#00ff]int[/color][color=#000] sum) {
        [/color][color=#00ff]int[/color][color=#000] all [/color][color=#000]=[/color]
[color=#000]5[/color]
[color=#000]+[/color]
[color=#000]7[/color]
[color=#000]+[/color][color=#000] sum;
        PP[] ps [/color][color=#000]=[/color][color=#000] PP.values();
        [/color][color=#00ff]int[/color][color=#000] index [/color][color=#000]=[/color][color=#000] (all [/color][color=#000]+[/color][color=#000] p.ordinal()) [/color][color=#000]%[/color]
[color=#000]26[/color][color=#000];
        [/color][color=#00ff]return[/color][color=#000] ps[index];
    }

    [/color][color=#0800]//[/color][color=#0800]跑大四喜的实现[/color]

[color=#00ff]private[/color]
[color=#00ff]void[/color][color=#000] doDaSiXi() {
        es.execute([/color][color=#00ff]new[/color][color=#000] Runnable() {

            [/color][color=#00ff]public[/color]
[color=#00ff]void[/color][color=#000] run() {
                runDaSiXi();
            }
        });
    }

    [/color][color=#0800]//[/color][color=#0800]跑大四喜的方法体实现[/color]

[color=#00ff]private[/color]
[color=#00ff]void[/color][color=#000] runDaSiXi() {
    }

    [/color][color=#0800]//[/color][color=#0800]随机跑的时间用到的线程执行体[/color]

[color=#00ff]private[/color]
[color=#00ff]void[/color][color=#000] runRun() {
        doBlinkRatio();
        RatioA ra [/color][color=#000]=[/color][color=#000] RatioA.A_20;
        RatioB rb [/color][color=#000]=[/color][color=#000] RatioB.B_10;
        [/color][color=#00ff]int[/color][color=#000] total [/color][color=#000]=[/color][color=#000] con.getSteps(AUTO_CONTROL);
        [/color][color=#00ff]int[/color][color=#000] sum [/color][color=#000]=[/color]
[color=#000]0[/color][color=#000]; [/color][color=#0800]//[/color][color=#0800]表示已经跑的数
        [/color][color=#0800]//[/color][color=#0800]PP p=PP.p1;[/color][color=#0800]//[/color][color=#0800]初始开始跑的位置[/color]
[color=#000]        cm.setRunning([/color][color=#00ff]true[/color][color=#000]); [/color][color=#0800]//[/color][color=#0800]把模型设为正在跑的模式[/color]
[color=#000]        cm.setP(p);
        [/color]