`
idealab
  • 浏览: 197757 次
  • 性别: Icon_minigender_1
  • 来自: 成都
社区版块
存档分类
最新评论

多线程的弹球游戏实现

    博客分类:
  • Java
阅读更多
大二开始学习Java的时候做的一个弹球游戏,共享于此。
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;

public class BallGame extends JApplet {
    private JMenu controlBar,speedBar;;// 3个主控菜单
    private JMenuItem startItem,exitItem;// control下的开始结束菜单
    private JRadioButtonMenuItem stepItem[];// 难易程度
    private ButtonGroup Group,speedGroup;//组件组
    private JPanel gameJP;// 添加游戏区容器
    private int dx,dy,randomNum;// 球的移动量和球撞到滑板上的随机量
    private JButton RecBox;//滑板作为Button来操作,好处在于可以直接对此组                                                                                                                                                                                            件添加KeyListener
    private Rectangle Rect;//滑板矩形框的定义
    private ImageIcon backGround;//背景图片声明
    private int xRec,widRec,SPEED,heiRec,
width,height,Height,delay,xcenter,ycenter,r,marks;// parament                                                                 // of drawings
    public BallGame(){
        xcenter=200;ycenter=25;r=10;// 球的参数
        dx=0;dy=0;// 球的移动量
        randomNum=(int)Math.random()*5;//调节小球碰到滑板时的随机反弹
        SPEED=20;delay=SPEED;// 速度因数,delay变量,speed常量
        width=400;height=300;Height=275;// JFrame框长宽,Height表示游   戏框的高(菜单栏占了25的高度)
        xRec=160;widRec=80;heiRec=15;// 滑板框参数
        marks=0;// 初始得分
        RecBox=new JButton();
        backGround=new ImageIcon("Thank.gif");
        Rect=new Rectangle(xRec,realY(heiRec),widRec,heiRec);
        RecBox.setBounds(Rect);
        RecBox.setBackground(Color.black);
    }
    public void init(){
        setSize(width,height);//背景图片
        gameJP=new JPanel(){// 只有把 JPanel当作一个组件来加入到Applet
才能和菜单栏共存,
                            // 否则paint()所画图形会被菜单界面盖住~~~~
            public void paint(Graphics g){
                backGround.paintIcon(this, g, 0, 0);
                g.setColor(Color.red);
                g.drawArc(xcenter-r,realY(ycenter+r),
2*r,2*r,0,360);// 画圆球
                g.fillArc(xcenter-r,realY(ycenter+r),2*r,2*r,0,360);
                String tag="******Your Marks******* ";
                g.drawString(tag, 280, 10);
                String mark=Integer.toString(marks);
                g.drawString(mark, 330, 20);
            }
        };
        add(RecBox);
        add(gameJP);
        // 向menuJP板中添加controlBar
        controlBar=new JMenu("Console");// 创建主控
        controlBar.setMnemonic('C');
        Group=new ButtonGroup();
        startItem=new JMenuItem("Start");
        startItem.setMnemonic('S');
        startItem.addActionListener(
            new ActionListener(){
                public void  actionPerformed(ActionEvent evt){
                    dx=0;dy=0;
                    BallThread Ball=new BallThread();
                    Ball.start();// 球的线程启动
                    KeyThr board=new KeyThr();
                    board.start();
                }
            }
        );
        Group.add(startItem);
        controlBar.add(startItem);
        // 向controlBar中添加speed
        speedGroup=new ButtonGroup();
        speedBar=new JMenu("Speed");
        speedBar.setMnemonic('S');
        
        String StepValues[]={"1 level","2 level","3 level"};// 添加速度的选择项
        stepItem=new JRadioButtonMenuItem[StepValues.length];
        for(int count=0;count<stepItem.length;count++){
            stepItem[count]=new JRadioButtonMenuItem(StepValues[count]);
            speedBar.add(stepItem[count]);
            speedGroup.add(stepItem[count]);
            stepItem[count].addActionListener(new SpeedHandler());
        }
        stepItem[0].setSelected(true);
        
        controlBar.add(speedBar);
        controlBar.addSeparator();// 添加分隔线
        
        exitItem=new JMenuItem("Exit");// 添加退出选项
        exitItem.setMnemonic('E');
        exitItem.addActionListener(// 响应退出事件
            new ActionListener(){
                public void actionPerformed(ActionEvent evt){
                    System.exit(0);
                }
            }
        );
        
        
        Group.add(exitItem);
        controlBar.add(exitItem);
        JMenuBar Bar=new JMenuBar();
        setJMenuBar(Bar);
        Bar.add(controlBar);
        setVisible(true);
        showStatus("Goal: "+marks);
    }
    public int realY(int a){return height-25-a;}
    // 球的响应事件线程
    class  BallThread extends Thread{
        
        @SuppressWarnings("deprecation")
        public synchronized void run(){
            for(;;){
              try{Thread.sleep(delay);
               }catch(InterruptedException e){return;}
              if(dx==0&&dy==0){// 起步时
                  double a=(-101+Math.random()*200);
                  if(a==0) a=(-101+Math.random()*200);
                  double b=(1+Math.random()*100);
                  double ang=Math.abs(a)<=b?a/b:b/a;
                  double Angle=Math.acos(ang);
                  dx=(int)(Math.cos(Angle)*5);
                  dy=(int)(Math.sin(Angle)*5);
                  xcenter=xcenter+dx;
                  ycenter=ycenter+dy;
                  repaint();
              }
              else{
                  if(xcenter-r>=0&&xcenter+r<=width
&&ycenter+r<=Height&&ycenter-r>0){
                      xcenter=xcenter+dx;
                      ycenter=ycenter+dy;
                      repaint();
                  }
                  else if(xcenter-r<=0||xcenter+r>=width){// 超出左右边界
                      ycenter=ycenter+dy;
                      xcenter=xcenter-dx;
                      dx=(-dx);
                      repaint();
                  }
                  else if(ycenter+r>=Height){// 超出上界
                      ycenter=ycenter-dy;
                      xcenter=xcenter+dx;
                      dy=(-dy);
                      repaint();
                  }
                  else if(xcenter+r>=xRec && xcenter-r<=xRec+widRec && ycenter-r<=r+heiRec){// 弹到滑板上
                      ycenter=ycenter-dy;
                      if(dx>0){
                        xcenter=xcenter+dx+randomNum;
                        dy=(-dy+randomNum);
                      }
                      else {
                          xcenter=xcenter+dx-randomNum;
                          dy=(-dy-randomNum);
                      }
                      marks+=10;
                      repaint();
                  }
                  else if(ycenter<=r){// 超出下界
                      JOptionPane.showMessageDialog(null, "Game     over","Game result",JOptionPane.INFORMATION_MESSAGE);
            marks=0;xcenter=200;ycenter=25;                        BallGame.this.RecBox.setLocation(160,realY(15));
                      repaint();
                     interrupt();
                  }
              }
           }
        }
    }
    public  class SpeedHandler implements ActionListener{
        public void actionPerformed(ActionEvent evt){
            for(int count=0;count<stepItem.length;count++){
                if(stepItem[count].isSelected()){
                   if(marks>50&&marks<=600)
                       delay=SPEED/(count+1)-marks/50;//随着分数的越来越高,球运动的也越来越快
                   else delay = SPEED/(count+1);
                }
            }
       }
    }
        
    public class KeyThr extends Thread {//滑板移动线程
        public void run(){
           RecBox.addKeyListener(new Keyhandler());
        }
    }
    //滑板的移动响应事件
    public class Keyhandler extends KeyAdapter {
        
        public void keyPressed(KeyEvent evt){
        JButton button=(JButton)evt.getSource();//evt.getSource()表示返回最初发生event的对象,即RecBox滑板
       xRec=button.getBounds().x;//xRec必须是全局变量,因为有另一个线程调用此变量
             if (evt.getKeyCode() == KeyEvent.VK_RIGHT) {
                xRec=xRec+4;
                if(xRec>=width-widRec) xRec=width-widRec;
                button.setLocation(xRec,realY(heiRec));
                repaint();
             }
             else if (evt.getKeyCode() == KeyEvent.VK_LEFT) {
                 xRec=xRec-4;
                 if(xRec<=0) xRec=0;
                 button.setLocation(xRec,realY(heiRec));
                 repaint();
             }
             
        }
    }
    public void update(Graphics g){paint(g);}//消除抖动
}
2
0
分享到:
评论
2 楼 idealab 2009-04-20  
C_J 写道

厉害,我大二那会在啃 win sdk,后来就没往那个方向发展了

我这只是做来练练手,要做桌面应用还得是C这一套哈。不过现在Sun又开始发力JavaFX了,也很强大啊!
1 楼 C_J 2009-04-20  
厉害,我大二那会在啃 win sdk,后来就没往那个方向发展了

相关推荐

    JAVA编写的多线程小弹球测试

    这个程序的特点是弹球会随机出现、随机选择颜色,并且在碰到边界时能自动反弹,充分展示了多线程技术在游戏和图形用户界面中的应用。 首先,我们需要理解Java中的线程。在Java中,每个运行的程序都至少有一个线程,...

    java弹球小游戏,多线程

    Java弹球小游戏是一款基于Java编程语言开发的简单游戏,它运用了多线程技术来实现游戏的流畅运行。在这个游戏中,通常会有至少两个线程在同时工作:一个是控制游戏主循环,另一个则处理用户输入或其他特定的游戏逻辑...

    多线程实例:桌面智能弹球小游戏

    标题中的“多线程实例:桌面智能弹球小游戏”表明这是一个使用多线程技术开发的桌面应用程序,旨在提供一个互动的弹球游戏体验。在这个游戏中,小球具有一定的智能性,能够根据规则自行决策,而不仅仅是简单的物理...

    MFC弹球游戏(多线程编程)

    MFC弹球游戏是利用MFC框架实现的一款简单但有趣的桌面游戏,它通过多线程技术提升游戏体验,使其运行更加流畅。 在MFC中,多线程编程是一项关键技能,尤其在需要同时处理多个任务或不希望主界面因后台处理而卡顿时...

    多线程弹球代码案例

    总的来说,"多线程弹球代码案例"是一个很好的教学工具,它将抽象的线程概念与直观的游戏场景相结合,使学习者能够以一种更生动的方式掌握多线程编程的核心概念和技巧。通过实践这个案例,你可以提高你的并发编程能力...

    基于Java多线程的弹球游戏程序.zip

    在本项目中,“基于Java多线程的弹球游戏程序”是一个典型的计算机编程示例,它利用了Java语言的多线程特性来实现一个交互式的弹球游戏。在这个游戏中,可能包括了球的运动、碰撞检测、用户输入响应等多个并发执行的...

    弹球游戏(java程序)

    【标题】:“弹球游戏(Java程序)”是一款基于Java编程语言开发的桌面游戏,它利用了Swing库和多线程技术来实现动态的弹球运动效果。 【描述】:该程序是在Eclipse集成开发环境中创建的,利用了SwingDesigner工具...

    JAVA Swing图形用户界面编程 多线程编程 弹球游戏

    用户能通过GUI组件指定生成小球的...鼠标在界面中显示为方块状,玩家需来回移动鼠标以避开运动的小球及屏幕四周,如果鼠标碰到任一小球或者窗口四周,则游戏结束。 程序需提供计时功能,并最终显示玩家能坚持多少秒。

    Java程序设计实验报告2(弹球游戏)[1]1.pdf

    Java 程序设计实验报告之弹球游戏实现 本实验报告的目的是掌握 Java 语言的图形用户界面编程、事件处理、多线程编程等技术,并培养独立查找资料、解决问题的能力。实验任务是设计并实现一个弹球游戏,用户可以通过 ...

    弹球游戏 JavaAWT制作

    7. **多线程**: 为了实现游戏的流畅运行,开发者可能采用了多线程。游戏逻辑运行在一个独立的线程上,而用户交互则在主线程中处理,这样可以避免阻塞UI,提高用户体验。 8. **游戏逻辑**: 弹球游戏的规则和行为是...

    Java程序设计实验报告2(弹球游戏)

    实验中,多线程被用来独立控制每个小球的运动,实现动画效果。 - **Runnable接口**: 小球的运动逻辑可以通过实现Runnable接口来定义,然后通过Thread或ExecutorService来创建和管理线程。 - **ExecutorService**: ...

    linux下基于socket和curses的双人弹球游戏

    总结来说,"linux下基于socket和curses的双人弹球游戏"是一个综合性的项目,涵盖了网络编程、终端界面设计、多线程处理、并发编程以及游戏逻辑实现等多个领域的知识。通过这个项目,开发者可以提升自己的技术能力,...

    java弹球游戏源码已编译

    总之,这个Java弹球游戏项目是学习Java GUI编程、多线程处理和基本物理模拟的一个很好的实践案例。通过分析源代码,我们可以深入理解这些核心概念,并将它们应用到其他更复杂的项目中。对于初学者来说,这是一个不错...

    弹球小游戏java实现.zip

    通过这个弹球小游戏的开发,你可以深入理解Java的面向对象编程、GUI设计、多线程、事件处理以及基本的物理模拟。这不仅是提升编程技能的好途径,也是对软件工程实践经验的积累。无论是作为课程设计的一部分,还是...

    c# 弹球游戏源码

    4. **线程与定时器**:为了实现流畅的游戏循环,可能会使用Timer组件或者后台线程来定期更新游戏状态,绘制新帧并处理游戏逻辑。 5. **对象和类的设计**:游戏中的元素,如弹球、挡板和边界,可以被建模为类。每个...

    linux编程_弹球游戏_bounce(有错误版本)

    6. **多线程编程**:在弹球游戏中,可能使用了多线程来实现游戏逻辑和用户界面的分离。一个线程负责更新游戏状态,另一个线程则负责渲染和显示。这样可以避免在复杂计算时阻塞用户界面。 7. **错误调试**:既然项目...

    java多线程源码,仅供参考

    同步机制是Java多线程中解决竞态条件的关键,主要包含`synchronized`关键字、`Lock`接口及其实现类、`wait()`和`notify()`等方法。`synchronized`可以保证同一时刻只有一个线程访问特定的代码块,防止数据的不一致。...

    java桌面弹球游戏源代码

    6. **线程与并发**:为了实现流畅的游戏体验,通常会使用多线程。游戏的主循环(更新和渲染)会在一个独立的线程上运行,以避免阻塞UI线程。 7. **物理模拟**:弹球的运动遵循基本物理定律,如动量守恒和弹性碰撞。...

    java弹球游戏

    8. **多线程**:为了在弹球运动的同时处理用户输入或其他后台任务,可能需要使用多线程。主线程负责UI更新,而另一个线程负责游戏逻辑的运行。 9. **异常处理**:在游戏中可能会遇到各种错误,如资源加载失败、用户...

    Android studio 小游戏,弹球小游戏

    这个游戏通常包含一个弹球和多个障碍物,玩家通过控制挡板来反射弹球,避免弹球掉落,从而得分。在这款游戏中,我们可以学习到许多Android编程的基础知识和游戏开发技巧。 首先,我们要了解Android Studio的项目...

Global site tag (gtag.js) - Google Analytics