Exercise16_22.java
import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
public class Exercise16_22 extends JFrame { 
  final static int NUMBER_OF_SLOTS = 9;
  final static int NUMBER_OF_ROWS = NUMBER_OF_SLOTS - 2;
private int shift = 0;
  private int[] slots = new int[NUMBER_OF_SLOTS];
  private int numberOfBallsDropped = 0;
  private int moveCount = 0;
  private int position = 0;
private BeanMachinePanel paintPanel = new BeanMachinePanel();
  private Timer timer = new Timer(200, new ActionListener() {
    public void actionPerformed(ActionEvent e) {
      moveCount++;
      if (moveCount <= NUMBER_OF_ROWS) {
        if (Math.random() < 0.5) 
          paintPanel.moveRedBallLeft();
        else {
          paintPanel.moveRedBallRight();
          position++;
        }
      }
      else {
        slots[position]++;
        paintPanel.startRedBall();
        shift = 0;
        moveCount = 0;
        position = 0;
numberOfBallsDropped++;
        if (numberOfBallsDropped == 10) {
          timer.stop();
          paintPanel.hideRedBall();
        }
      }
    }
  });
public Exercise16_22() {
    add(paintPanel);
    timer.start();
  }
class BeanMachinePanel extends JPanel {
    final static int HGAP = 20;
    final static int VGAP = 20;
    final static int RADIUS = 5;
    final static int LENGTH_OF_SLOTS = 40;
    final static int LENGTH_OF_OPENNING = 15;
    final static int Y_FOR_FIRST_NAIL = 50;
    final static int RED_BALL_START_Y = Y_FOR_FIRST_NAIL - RADIUS;
private int yRed = RED_BALL_START_Y;
    private boolean hideRedBall = false;
/** Move the red ball down left */
    public void moveRedBallLeft() {
      shift -= HGAP / 2;
      yRed += VGAP;
      repaint();
    }
/** Move the red ball down right */
    public void moveRedBallRight() {
      shift += HGAP / 2;
      yRed += VGAP;
      repaint();
    }
/** Move the red ball down right */
    public void startRedBall() {
      yRed = RED_BALL_START_Y;
      hideRedBall = false;
      repaint();
    }
/** Move the red ball down right */
    public void hideRedBall() {
      hideRedBall = true;
      repaint();
    }
/** Paint message */
    protected void paintComponent(Graphics g) {
      super.paintComponent(g);
int y = Y_FOR_FIRST_NAIL;
      int xCenter = getWidth() / 2;
// Draw the red ball
      if (!hideRedBall) {
        g.setColor(Color.RED);
        int xRed = xCenter + shift;
        g.fillOval(xRed - RADIUS, yRed - RADIUS, 2 * RADIUS, 2 * RADIUS);
      }
// Draw pegs in multiple lines
      g.setColor(Color.GREEN);
      for (int i = 0; i < NUMBER_OF_ROWS; i++) {
        y += VGAP;
        for (int k = 0; k <= i; k++) {
          g.fillOval(xCenter - i * HGAP / 2 + k * HGAP - RADIUS, y - RADIUS, 2 * RADIUS, 2 * RADIUS);
        }
      }
// Draw vertical lines for slots
      g.setColor(Color.BLACK);
      y = y + RADIUS;
      for (int i = 0; i < NUMBER_OF_SLOTS; i++) {
        int x = xCenter - (NUMBER_OF_ROWS - 1) * HGAP / 2 + (i - 1) * HGAP;
        g.drawLine(x, y, x, y + LENGTH_OF_SLOTS);
      }
// Draw a horizontal line for bottom
      g.drawLine(xCenter - (NUMBER_OF_ROWS - 1) * HGAP / 2 - HGAP, y + LENGTH_OF_SLOTS, 
        xCenter - (NUMBER_OF_ROWS - 1) * HGAP / 2 + NUMBER_OF_ROWS * HGAP, y + LENGTH_OF_SLOTS);
      // Draw two side lines
      g.drawLine(xCenter + HGAP / 2, Y_FOR_FIRST_NAIL + RADIUS, xCenter - (NUMBER_OF_ROWS - 1) * HGAP / 2 + NUMBER_OF_ROWS * HGAP, y);
      g.drawLine(xCenter - HGAP / 2, Y_FOR_FIRST_NAIL + RADIUS, xCenter - (NUMBER_OF_ROWS - 1) * HGAP / 2 - HGAP, y);
      // Draw two vertical lines for the openning
      g.drawLine(xCenter - HGAP / 2, Y_FOR_FIRST_NAIL + RADIUS, xCenter - HGAP / 2, Y_FOR_FIRST_NAIL - LENGTH_OF_OPENNING);
      g.drawLine(xCenter + HGAP / 2, Y_FOR_FIRST_NAIL + RADIUS, xCenter + HGAP / 2, Y_FOR_FIRST_NAIL - LENGTH_OF_OPENNING);
// Paint the balls in the slots
      g.setColor(Color.RED);      
      for (int i = 0; i < slots.length; i++) {
        int x = xCenter - (NUMBER_OF_ROWS) * HGAP / 2 + i * HGAP;
        for (int j = 0; j < slots[i]; j++) {
          g.fillOval(x - RADIUS, y + LENGTH_OF_SLOTS - 2 * RADIUS - j * 2 * RADIUS, 2 * RADIUS, 2 * RADIUS);
        }
      }
    }
  }
public static void main(String[] args) {
    JFrame frame = new Exercise16_22();
    frame.setTitle("Exercise16_22");
    frame.setSize(300, 300);
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    frame.setLocationRelativeTo(null);
    frame.setVisible(true);
  }
}
Exercise16_22.java的更多相关文章
- Spark案例分析
		
一.需求:计算网页访问量前三名 import org.apache.spark.rdd.RDD import org.apache.spark.{SparkConf, SparkContext} /* ...
 - 故障重现(内存篇2),JAVA内存不足导致频繁回收和swap引起的性能问题
		
背景起因: 记起以前的另一次也是关于内存的调优分享下 有个系统平时运行非常稳定运行(没经历过大并发考验),然而在一次活动后,人数并发一上来后,系统开始卡. 我按经验开始调优,在每个关键步骤的加入如 ...
 - Elasticsearch之java的基本操作一
		
摘要 接触ElasticSearch已经有一段了.在这期间,遇到很多问题,但在最后自己的不断探索下解决了这些问题.看到网上或多或少的都有一些介绍ElasticSearch相关知识的文档,但个人觉得 ...
 - 论:开发者信仰之“天下IT是一家“(Java .NET篇)
		
比尔盖茨公认的IT界领军人物,打造了辉煌一时的PC时代. 2008年,史蒂夫鲍尔默接替了盖茨的工作,成为微软公司的总裁. 2013年他与微软做了最后的道别. 2013年以后,我才真正看到了微软的变化. ...
 - 故障重现, JAVA进程内存不够时突然挂掉模拟
		
背景,服务器上的一个JAVA服务进程突然挂掉,查看产生了崩溃日志,如下: # Set larger code cache with -XX:ReservedCodeCacheSize= # This ...
 - 死磕内存篇 --- JAVA进程和linux内存间的大小关系
		
运行个JAVA 用sleep去hold住 package org.hjb.test; public class TestOnly { public static void main(String[] ...
 - 【小程序分享篇 一 】开发了个JAVA小程序, 用于清除内存卡或者U盘里的垃圾文件非常有用
		
有一种场景, 手机内存卡空间被用光了,但又不知道哪个文件占用了太大,一个个文件夹去找又太麻烦,所以我开发了个小程序把手机所有文件(包括路径下所有层次子文件夹下的文件)进行一个排序,这样你就可以找出哪个 ...
 - Java多线程基础学习(二)
		
9. 线程安全/共享变量——同步 当多个线程用到同一个变量时,在修改值时存在同时修改的可能性,而此时该变量只能被赋值一次.这就会导致出现“线程安全”问题,这个被多个线程共用的变量称之为“共享变量”. ...
 - Java多线程基础学习(一)
		
1. 创建线程 1.1 通过构造函数:public Thread(Runnable target, String name){} 或:public Thread(Runnable target ...
 
随机推荐
- 【BZOJ 3150】新Nim游戏
			
http://www.lydsy.com/JudgeOnline/problem.php?id=3105 并不会QwQ 为什么贪心是正确的. 向小神请教了一个弱智问题(小神好神啊OTZ) 然后就写了一 ...
 - DOS常用命令收集(长期更新)
			
命令列表 命令 说明 ASSOC 显示或修改文件扩展名关联. ATTRIB 显示或更改文件属性. BREAK 设置或清除扩展式 CTRL+C 检查. BCDEDIT 设置启动数据库中的属性以控制启动加 ...
 - Eclipse SVN插件与TortoiseSVN的对应关系及下载链接
			
Eclipse SVN 插件与TortoiseSVN对应关系 Eclipse 3.2/Callisto, 3.3/Europa, 3.4/Ganymede, 3.5/Galileo, 3.6/Heli ...
 - PyQt类库介绍
			
安装完PyQt后我们去看看这个库里面有些什么cd /usr/lib/python3/dist-packages/PyQt5/ && ls都是些.so的动态链接库,这就是为什么我们在安 ...
 - C# for循环及循环嵌套
			
格式(for循环四要素:初始条件.循环条件.循环体.状态改变) for (int i=1<初始条件>;i<=n<循环条件>;i++<状态改变>) { < ...
 - 【CodeForces 699A】Launch of Collider
			
维护最新的R,遇到L时如果R出现过就更新答案. #include <cstdio> #include <algorithm> using namespace std; int ...
 - 二叉查找树 C++实现(含完整代码)
			
一般二叉树的查找是通过遍历整棵二叉树实现,效率较低.二叉查找树是一种特殊的二叉树,可以提高查找的效率.二叉查找树又称为二叉排序树或二叉搜索树. 二叉查找树的定义 二叉排序树(Binary Search ...
 - git 最基本的使用方法
			
1. git init ----初始化git仓库 2.git add . ----把代码添加到仓库 3.git commit -m '注释' ---commit:提交 -m:全部提交 ‘ ...
 - OPENGL若干重要基础概念
			
投影:3D数据“压平”到2D的计算机屏幕上,即将真正的三维物体显示到二维屏幕上,这种3D压平到2D的过程称为投影. 投影类型:正投影,透视投影 正投影:垂直于投影平面的平行投影(不垂直的投影平面的平行 ...
 - Redis有序集合Zset(sorted set)
			
zadd/zrange 127.0.0.1:6379> zadd zset01 60 v1 70 v2 80 v3 90 v4 100 v5(integer) 5127.0.0.1:6379&g ...