必威体育Betway必威体育官网
当前位置:首页 > IT技术

Java小游戏——是男人就坚持20秒

时间:2019-10-12 07:13:22来源:IT技术作者:seo实验室小编阅读:82次「手机版」
 

是男人就坚持5秒

java游戏——是男人就坚持20秒

给大家分享一个小游戏,这是一个Swing项目,先用代码画界面板,然后依次添加飞机、子弹、计时器等:

代码如下:

/*
 * 程序的主窗体
 */
public class FrmMain extends JFrame {

	/*
	 * 初始的一些全局变量 1是否存活 2方向 3子弹数量 4飞机
	 */
	// 1是否存活
	public static boolean isRun = true;
	// 2方向
	public static boolean right, left, up, down;
	// 3子弹数量
	public static int num = 30;
	// 4飞机
	private JLabel plane;

	public FrmMain() {
		isRun=true;
		// 设置大小
		setSize(400, 600);
		// 设置居中
		setLocationRelativeTo(null);
		// 设置点关闭时,程序退出
		setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		// 得到内容面板
		final container c = getcontentPane();
		c.setBackground(color.BLACK);
		// 设置标题
		settitle("是男人就坚持20秒");
		// 设置绝对定位
		c.setlayout(null);

		// 添加标签
		final JLabel lblDesc = new JLabel("是男人就坚持20秒");
		lblDesc.setBounds(133, 175, 113, 31);
		lblDesc.setForeground(Color.WHITE);
		c.add(lblDesc);

		// 添加按钮
		final JButton btnStart = new JButton("开始");
		btnStart.setBounds(133, 210, 113, 31);
		c.add(btnStart);

		// 设置可见
		setVisible(true);
		//设置内容面板获取焦点
		c.setFocusable(true);

		/*
		 * 增加键盘事件
		 */
		c.addKeyListener(new KeyAdapter() {
			// 按下,具体实现,即为按钮把对应的方向设置为true
			@Override
			public void keyPressed(KeyEvent e) {
				switch (e.getKeyCode()) {
				case KeyEvent.VK_LEFT:
					left=true;
					break;
				case KeyEvent.VK_RIGHT:
					right=true;	
					break;
				case KeyEvent.VK_UP:
					up=true;
					break;
				case KeyEvent.VK_DOWN:
					down=true;
					break;
				}
			}

			// 释放,把当前方向再设置成false
			@Override
			public void keyReleased(KeyEvent e) {
				switch (e.getKeyCode()) {
				case KeyEvent.VK_LEFT:
					left=false;
					break;
				case KeyEvent.VK_RIGHT:
					right=false;	
					break;
				case KeyEvent.VK_UP:
					up=false;
					break;
				case KeyEvent.VK_DOWN:
					down=false;
					break;
				}
			}
		});
		/*
		 * 增加鼠标点击事件
		 */
		btnStart.addactionlistener(new ActionListener(){
			@Override
			public void actionPerformed(ActionEvent e) {
				//把当前标签和按钮隐藏
				btnStart.setVisible(false);
				lblDesc.setVisible(false);
				//飞机
				plane = new JLabel(new ImageIcon("img/plane.png"));
				plane.setBounds(150, 400, 33, 33);
				c.add(plane);
				//刷新页面
				plane.updateUI();
				//飞机实现 移动
				new MoveThread(plane,c).start();
				
				//计时器
				new TimerThread(c).start();
				
				//子弹
				for(int i=0;i<num;i++){
					new BulletThread(c,plane,FrmMain.this).start();
				}
				
			}
		});

	}

	/*
	 * 程序的入口
	 */
	public static void main(String[] args) {
		// new 就是一个对象
		new FrmMain();
	}
}
/*
 * 飞机移动的线程类
 */
public class MoveThread extends Thread {

	//飞行速度
	private int speed=5;
	//飞机
	private JLabel plane;
	//内容面板
	private Container c;
	
	public MoveThread(JLabel plane, Container c) {
		this.plane=plane;
		this.c=c;
	}
	
	/*
	 * 飞机运算的线程实现
	 * @see java.lang.Thread#run()
	 */
	@Override
	public void run() {
		while(FrmMain.isRun){
			if(FrmMain.left){
				//设置左飞机
				plane.setIcon(new ImageIcon("img/planeLeft.png"));
				//如果是超过左边边缘,x轴则设置为零
				if(plane.getX()-speed<0){
					plane.setLocation(0, plane.getY());
				}else{
					plane.setLocation(plane.getX()-speed, plane.getY());
				}
			}else if(FrmMain.right){
				//设置成右飞机	
				plane.setIcon(new ImageIcon("img/planeRight.png"));
				//如果x轴+飞宽+移动大小超过内容面板,则设置最靠右(内容面板-飞机宽的x轴大小)
				if(plane.getX()+plane.getWidth()+speed>c.getWidth()){
					plane.setLocation(c.getWidth()-plane.getWidth(), plane.getY());
				}
				else{
					plane.setLocation(plane.getX()+speed, plane.getY());
				}
			}else if(FrmMain.up){
				//正飞机
				plane.setIcon(new ImageIcon("img/plane.png"));
				//如果飞最上面,超过边界后,作的处理
				if(plane.getY()-speed<0){
					plane.setLocation(plane.getX(), 0);
				}
				else{
					plane.setLocation(plane.getX(), plane.getY()-speed);
				}
			}else if(FrmMain.down){
				//正飞机
				plane.setIcon(new ImageIcon("img/plane.png"));
				//如果飞最下面,超过边界后,作的处理
				if(plane.getY()+speed+plane.getHeight()>c.getHeight()){
					plane.setLocation(plane.getX(), c.getHeight()-plane.getHeight());
				}else{
					plane.setLocation(plane.getX(), plane.getY()+speed);
				}
			}
			//在线程时,间隔50毫秒执行一回
			try {
				sleep(50);
			} catch (InterruptedException e) {
				e.printstacktrace();
			}
		}
		
	}
}
/*
 * 子弹线程
 */
public class BulletThread extends Thread {

	// 内容面板
	private Container c;
	// 飞机
	private JLabel plane;

	// 子弹
	private JLabel lblBullet;
	// x轴速度
	private int xSpeed;
	// y轴速度
	private int ySpeed;
	
	private FrmMain frmMain;
	public BulletThread(Container c, JLabel plane, FrmMain frmMain) {
		this.c = c;
		this.plane = plane;
		this.frmMain=frmMain;

		// 随机类
		Random random = new Random();
		// 创建 子弹
		lblBullet = new JLabel(new ImageIcon("img/bullet.png"));
		lblBullet.setLocation(random.nextint(c.getWidth()), random.nextInt(c.getHeight()/2));
		// 随机x轴速度
		xSpeed = random.nextInt(5) + 1;
		// 随机y轴速度
		ySpeed = random.nextInt(5) + 1;
		c.add(lblBullet);
	}

	// 张程实现
	@Override
	public void run() {
		while (FrmMain.isRun) {

			//子弹超过上下左右边缘的处理
			if (lblBullet.getX() < 0 || lblBullet.getX() > c.getWidth()) {
				xSpeed = -xSpeed;
			}
			if (lblBullet.getY() < 0 || lblBullet.getY() > c.getHeight()) {
				ySpeed=-ySpeed;
			}
			lblBullet.setBounds(lblBullet.getX()+xSpeed, lblBullet.getY()+ySpeed, 12, 12);
			//判断子弹与飞机的交集
			if(lblBullet.getBounds().intersects(plane.getBounds())){
				//结束 
				FrmMain.isRun=false;
				//爆炸
				int x = plane.getX()-plane.getWidth();
				int y=  plane.getY()-plane.getHeight();
				//启动爆炸线程
				new ExplosionThread(x,y,c,plane,frmMain).start();
			}
			
			try {
				sleep(40);
			} catch (InterruptedException e) {
				e.printStackTrace();
			}
		}
	}
}
/*
 * 计时线程
 */
public class TimerThread extends Thread {

	//内容面板 
	private Container  c;
	public TimerThread(Container c) {
		this.c=c;
	}
	
	//线程实现 
	@Override
	public void run() {
		//1添加JLabel 00:
		JLabel lblTime = new JLabel("00:00");
		lblTime.setBounds(350, 0, 50, 20);
		lblTime.setForeground(Color.YELLOW);
		c.add(lblTime);
		lblTime.updateUI();
		//2获取当前时间
		long start = system.currenttimemillis();
		//3刷新
		decimalformat df = new DecimalFormat("00");
		while(FrmMain.isRun){
			long x = System.currentTimeMillis()-start;
			int second= (int)(x/1000);
			int mSecond=(int)(x%1000/10); 
			lblTime.setText(df.format(second)+":"+df.format(mSecond));
			
			//休眠50毫秒
			try {
				Thread.sleep(50);
			} catch (InterruptedException e) {
				e.printStackTrace();
			}
		}
	}
}
/*
 * 爆炸线程
 */
public class ExplosionThread extends Thread {
	private int x;
	private int y;
	private Container c;
	private JLabel plane;

	//最先的窗体
	private FrmMain frmMain;
	public ExplosionThread(int x, int y, Container c, JLabel plane, FrmMain frmMain) {
		this.x=x;
		this.y=y;
		this.c=c;
		this.plane=plane;
		this.frmMain=frmMain;
	}
	
	//线程实现
	@Override
	public void run() {
		//爆炸的起始图片
		JLabel lblExplosion =new JLabel(new ImageIcon("img/explosion2-1.png"));
		lblExplosion.setBounds(x, y, 128, 128);
		c.add(lblExplosion);
		plane.setVisible(false);
		//爆炸的动画图片
		for(int i=1;i<72;i++){
			lblExplosion.setIcon(new ImageIcon("img/explosion2-"+i+".png"));
			try {
				sleep(50);
			} catch (InterruptedException e) {
				e.printStackTrace();
			}
		}
		//提示消息
		JLabel lblEnd = new JLabel("Game Over");
		lblEnd.setForeground(Color.RED);
		lblEnd.setBounds(160, 200, 100, 50);
		c.add(lblEnd);
		//再来一局
		JButton btnAgain = new JButton("再来一局");
		btnAgain.setBounds(150, 250, 100, 50);
		c.add(btnAgain);
		
		lblEnd.updateUI();
		btnAgain.updateUI();
		
		//再来一局的事件
		btnAgain.addActionListener(new ActionListener() {
			
			@Override
			public void actionPerformed(ActionEvent e) {
				new FrmMain();
				frmMain.setVisible(false);
			}
		});
		
	}

}

以上就是这个小游戏的所有代码实现部分,总共不到400行代码,快写一个试试吧。

相关阅读

金融科技提升服务效率 龙驹财行坚持智能化升级

现在,越来越多的投资开始涌向金融行业,金融科技俨然成为目前全球最热门话题,金融科技迅猛发展,使得金融行业发生了巨大变化。金融是本

你是如何坚持读完《算法导论》这本书的?

你是如何坚持读完《算法导论》这本书的? 《算法导论》不够猛,答者顺便补充 “你是如何坚持读完《计算机编程的艺术》这本书的?”

JAVA贪吃蛇小游戏源代码系列

源代码加图片加背景音乐链接:https://pan.baidu.com/s/1Ll_vVsBC-lYNpLrSRAz5ew提取码:h2ds复制这段内容后打开百度网盘手机App,操作

C语言编写小游戏:Tic Tac Toe(三子棋)

三子棋:在3*3的棋盘中,谁先用自己的棋走出一条直线(横着三个/竖着三个/对角线三个),谁就算赢!下面我们就来一起编写一下这个小游戏吧!!!首

蚂蚁森林不只是小游戏:由浅入深,四个层面解构其产品逻辑

观察了蚂蚁森林有一阵子,说说我的看法。过去毕竟总戴着有色眼镜看支付宝,所以这个产品刚出来时,没有体验的欲望。过了一阵子,身边大家

分享到:

栏目导航

推荐阅读

热门阅读