javaEE小游戏开发(雪花飘落以及弹球小游戏)

学习目标:

上一周学校一直在实训,所以一直没有更新博客(虽然也没有人看),但作为一个坚持更新半年多的UP主习惯还是要保持住的。


学习内容:

利用javaSE开发了两个小游戏 雪花飘落和弹弹球 由于博主以及学习了javaEE的知识,对程序做了一个简单的迁移,最终目标本来是部署到云端服务器的,但能力有限,老师也都撤了,最后还是失败了,不过起码努力过了。

学习时间:

提示:这里可以添加计划学习的时间
例如:
7.15-7.20
上午9:00-12:00
下午14:00-18:00


学习产出:

雪花飘落(效果图)

在这里插入图片描述
在这里插入图片描述
结果是动态的,奈何博主技术有限不会上传视频和动图。
简单说一下代码
创建窗口类

package game;

import javax.swing.JFrame;

//1.JFDemo找一个父亲 JFrame  提供窗体对象的创建,大小的设置,别的一些属性
public class JFDemo extends JFrame{
	//构造方法1.用于创建对象2.用于初始化对象
	public JFDemo(int num) {
		super();//创建出窗体对象
		//使窗体可视化
		this.setVisible(true);//调用的是父类JFrame里的方法setVisible(true)
		//设置窗体的大小
		this.setSize(600, 500);
		//设置窗体位置居中
		this.setLocationRelativeTo(null);
		//设置关联关闭按钮
		this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		//设置窗体的名称
		this.setTitle("雪花飘落");
		//关闭放大按钮
		this.setResizable(false);
		//创建画布类对象jp
		JPDemo jp=new JPDemo(num);
		//将画布类对象jp放到窗体类对象jf上
		this.add(jp);
	}
}

创建画布类

package ball;

import java.awt.Color;
import java.awt.Graphics;

import javax.swing.JPanel;

public class JPDemo extends JPanel implements Runnable{
	public static int[] arry1;
	public static int[] arry2;
	//用全局变量存储雪花坐标方便调用
	int x;
	int y;
	public JPDemo(int a) {
		//接受雪花数量并随即生成坐标并赋给全局变量
		int [] arr1=new int[a];
		int [] arr2=new int[a];
		for (int i = 1; i <a; i++) {
			int x=(int)(Math.random()*1200+1);
			int y=(int)(Math.random()*800+1);
			arr1[i-1]=x;
			arr2[i-1]=y;
		JPDemo.arry1=arr1;
		JPDemo.arry2=arr2;
		}
	}
	public void paint(Graphics g) {
		//读取坐标并打印出雪花
		super.paint(g);
		this.setBackground(Color.BLACK);
		g.setColor(Color.WHITE);
		for (int i = 1; i<JPDemo.arry1.length; i++) {
			Math.random();
			g.drawString("*", JPDemo.arry1[i-1], JPDemo.arry2[i-1]);
		}
	}

	public void move() {
		new Thread(){
		//利用多线程实现雪花持续下落
			@Override
			public void run() {
				while (true) {
					//将飘落到下边界的雪花y设为0从上方继续下落
					for(int i=0;i<JPDemo.arry2.length;i++){
						if (arry2[i]>800) {
							arry2[i]=0;
						}
						arry2[i]++;
					}
					//将飘落到右边界的雪花x设为0从左边向右飘落
					for(int i=0;i<JPDemo.arry2.length/2;i++){
						if (arry1[i]>1200) {
							arry1[i]=0;
						}
						arry1[i]++;
					}
					try {
						//设置线程睡眠时间达到合适的视觉效果
						Thread.sleep(10);
					} catch (InterruptedException e) {
						// TODO Auto-generated catch block
						e.printStackTrace();
					}
					repaint();
				}
			}
		}.start();
	}
	@Override
	public void run() {
		// TODO Auto-generated method stub	
	}
}

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="gbk"%>
<%@ page import="ball.*" %>
导入需要的包
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
	<style type="text/css">
		设置背景图片
		body{background:url(5b58376f45c37.jpg)  no-repeat center center;
  			background-size:cover;
   			background-attachment:fixed;
   			background-color:#CCCCCC;}
	</style>

</head>
<embed src="1878018903.mp3" loop="true" hidden="true"></embed>
设置背景音乐

<body>
设置文本输入框
<form action="game.jsp" method=post>
	在这个炎炎夏日,你是否期待一场白雪来浸透炎热的内心?<br>
	请输入雪花数量,沐浴你的雪天<br>
	<input type=text name="num">
	<input type="submit" value="开始下雪">
</form>

</body>
</html>
<%
//获取输入的数字并初始化窗体类容器
try{
	String num=request.getParameter("num");
	int number=Integer.parseInt(num);
	JFDemo jf=new JFDemo(number);
}
catch(NumberFormatException ee){
}
%>

弹球小游戏
在这里插入图片描述
在这里插入图片描述

窗体类(几乎一样)

package ball;

import java.awt.Graphics;
import java.awt.JobAttributes;

import javax.swing.JFrame;
import javax.swing.JLabel;

public class TanQiuJFrame extends JFrame{
	public TanQiuJFrame(){
		this.setVisible(true);
		this.setSize(800, 600);
		this.setLocationRelativeTo(null);
		this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		this.setTitle("弹球小游戏");
		this.setResizable(false);
		TanQiuJPFrame jp=new TanQiuJPFrame();
		this.add(jp);
		jp.move();
	}
}

画布类

package ball;

import java.awt.Color;
import java.awt.Font;
import java.awt.Graphics;
import java.awt.event.MouseEvent;
import java.awt.event.MouseMotionListener;

import javax.swing.JLabel;
import javax.swing.JPanel;



public class TanQiuJPFrame extends JPanel implements MouseMotionListener,Runnable{
	int x=100,y=100;
	//小球初始坐标
	int d=100;
	//小球直径
	int dx=100,dy=500,dd=200,dh=10;
	//挡板初始坐标长以及宽
	int direction=2;
	//初始运动方向(↘)
	int count;
	//初始分数
	boolean flag=false;
	//判断游戏是否结束
	boolean game=false;
	//判读游戏是否通关
	public TanQiuJPFrame() {
		addMouseMotionListener(this);
		//设置鼠标跟随(控制挡板)
		
	}
	
	
	public void paint(Graphics g) {
		super.paint(g);
		this.setBackground(Color.GRAY);
		//背景颜色
		g.setColor(Color.PINK);
		g.fillOval(x, y, d, d);
		//粉色的球
		g.setColor(Color.BLUE);
		g.fillRect(dx, dy, dd, dh);
		//蓝色的挡板
		g.setFont(new Font("分数"+count,Font.BOLD,50));
		//控制分数文字大小
		g.drawString("分数"+count, 100, 50);
		//打印分数
		if (flag) {
			g.drawString("游戏结束", 100, 150);
			//打印游戏结束
		}
		if (game) {
			g.drawString("游戏通关", 100, 150);
			//打印游戏通关
		}
		
		

	}
	public void move() {
		new Thread(){
			@Override
			public void run() {
				// TODO Auto-generated method stub
				super.run();
				while (true) {
					if (d==0) {
					//小球直接缩小到0公关
						game=true;
					}
					if(direction==1){
					//向↙运动
						x--;
						y++;
					}
					if (x<=0) {
					//到达左边界
						if(direction==1){
							direction=2;
						}//由↙变成↘
						if(direction==4){
							direction=3;
						}//由↖变成↗
					}
					if(direction==2){
					//向↘运动
						x++;
						y++;}
					if (y>=500-d) {
					//判断是否到底端
						if (x+d/2>=dx&(x+d/2<=dx+dd)) {
						//判断是否碰到挡板
							d=d-10;
							//小球直径减小
							dd=dd-10;
							//挡板长度减小
							count++;
							//分数增加哦
							if (direction==2) {
								direction=3;
							}//由↘变成↗
							if (direction==1) {
								direction=4;
							}//由↙变成↗
						}else {
							flag=true;
							//游戏结束
							this.stop();
							//杀死进程	
						}
					}
					if(direction==3){
						x++;
						y--;
					}//向↗运动
					if(x+d>=800){
					//到达有边界
						if (direction==3) {
							direction=4;
						}//由↗到↖
						if (direction==2) {
							direction=1;
						}//由↘到↙
					}
					if(direction==4){
						x--;
						y--;
					}//向↗运动
					if(y<=0){
					//到达顶端
						if (direction==4) {
							direction=1;
						}//由↖到↙
						if (direction==3) {
							direction=2;
						}//由↗到↘
					}
						
					try {
					//通过分数控制线程睡眠时间进而控制速度
						if (count<10) {
							Thread.sleep(5-count/2);
						}else {
							Thread.sleep(1);
						}
						
					} catch (InterruptedException e) {
						e.printStackTrace();
					}
					repaint();	
				}
			}
		}.start();
	}
	
	
	@Override
	public void mouseDragged(MouseEvent e) {
		
		// TODO Auto-generated method stub
		
	}
	@Override
	public void mouseMoved(MouseEvent e) {
		dx=e.getX()-dd/2;
		
		
		
	}


	@Override
	public void run() {
		// TODO Auto-generated method stub
		
	}

}

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
 <%@ page import="ball.*" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
</head>
<body>
<embed src="2451457534.mp3" loop="true" hidden="true"></embed>
<%
TanQiuJFrame jp=new TanQiuJFrame();
//初始化窗口类
%>
</body>
</html>

以上就是一周的实训成果。

posted @ 2021-07-21 20:07  lcc-666  阅读(198)  评论(0编辑  收藏  举报