Java局域网对战游戏、天气预报项目
功能
1.天气预报
2.局域网对战
展示
部分源码
package game.weather;
import java.util.HashMap;
public class Weather {
/**
* @Fields 今天的天气数据,整体
*/
private JSONObject today;
/**
* @Fields 今天的天气指数 index第一个String是指数中文名,index的Map键值为"ivalue" "detail";
*/
private JSONArray index;
/**
* @Fields 一周的天气,JSONObject:"night" "day";
*/
private JSONArray daily;
private JSONArray hourly;
private JSONObject aqi;
/**
*
* @Title: getSubJSONObject @Description: TODO(这里用一句话描述这个方法的作用) @param
* JSONObject obj ,String key @return JSONObject 返回类型 @throws
*/
public JSONObject getToday(JSONObject obj) {
return today = (JSONObject) obj;
}
public JSONArray getIndex(JSONObject obj){
return index = (JSONArray) obj.get("index");
}
public JSONArray getDaily(JSONObject obj) {
return daily = (JSONArray) obj.get("daily");
}
public JSONArray getHourly(JSONObject obj){
return hourly = (JSONArray) obj.get("hourly");
}
public JSONObject getAqi(JSONObject obj){
return aqi = obj.getJSONObject("aqi");
}
public static JSONObject getSubJSONObject(JSONObject obj, String key) {
Object obj2 = obj.get(key);
if (obj2 instanceof JSONObject) {
return (JSONObject) obj2;
} else {
System.out.println(key + "不是一个JSONObject");
}
return null;
}
public static JSONObject ipToWeather(String ip) {
String host = "http://jisutqybmf.market.alicloudapi.com";
String path = "/weather/query";
String method = "GET";
String appcode = "8c97675e6493491d8153093a1facdc0e";
Map<String, String> headers = new HashMap<String, String>();
headers.put("Authorization", "APPCODE " + appcode);
Map<String, String> querys = new HashMap<String, String>();
// System.out.println(ip);
querys.put("ip", ip);
// Map<String, String> res = new HashMap<>();
try {
HttpResponse response = HttpUtils.doGet(host, path, method, headers, querys);
// 获取response的body
System.out.println("111");
String json = EntityUtils.toString(response.getEntity());
// json = (json == null)? "{}":json;
System.out.println("222");
if (json.equals("")) {
System.out.println("333");
return null;
}
System.out.println(json);
// 解析json
JSONObject obj = JSONObject.fromString(json);
String ret = (String) obj.get("msg");
if (ret.equals("ok")) {
// 获取result里的json数据
String ret2 = obj.getString("result");
JSONObject obj2 = JSONObject.fromString(ret2);
// // 直接提取数据,城市
// String value = obj2.getString("city");
// res.put("city", value);
// // 日期
// value = obj2.getString("date");
// res.put("date", value);
// // 周次
// value = obj2.getString("week");
// res.put("week", value);
// // 天气
// value = obj2.getString("weather");
// res.put("weather", value);
// // 温度
// value = obj2.getString("temp");
// res.put("temp", value);
//
// analysisJson(obj2);
return obj2;
}
} catch (Exception e) {
e.printStackTrace();
}
return null;
}
// 递归解析JSON
private static void analysisJson(JSONObject obj) {
Iterator keys = obj.keys();
while (keys.hasNext()) {
String keyName = keys.next().toString();
Object obj2 = obj.get(keyName);
if (obj2 instanceof JSONObject) {
analysisJson((JSONObject) obj2);
} else if (obj2 instanceof JSONArray) {
for (int i = 0; i < ((JSONArray) obj2).length(); ++i) {
JSONObject obj3 = ((JSONArray) obj2).getJSONObject(i);
System.out.println("[");
analysisJson(obj3);
System.out.println("]");
}
} else {
System.out.println(keyName + ": " + (String) obj2);
}
}
}
public static void main(String[] args) {
Weather.ipToWeather("119.75.217.109");
}
}
package game.ui;
import java.awt.geom.Rectangle2D;
/**
*
* @ClassName: Main
* @Description: 游戏启动界面
* @author: Administrator
* @date: 2017年7月5日 下午6:37:53
*/
public class Main extends Application {
/**
* 滚动信息的总条数
*/
private static final int countLabel = 23;
/**
* 背景的WebView
*/
private WebView w;
/**
* 按下鼠标时的x
*/
private double xOffset;
/**
* 按下鼠标开始拖动窗体时的x
*/
private double startX;
/**
* 按下鼠标开始拖动窗体时的y
*/
private double startY;
/**
* 按下鼠标时的y
*/
private double yOffset;
/**
* 川师一区
*/
private ToggleButton cs1;
/**
* 川师二区
*/
private ToggleButton cs2;
/**
* 屏幕宽度
*/
private static final int width = 1000;
/**
* 屏幕高度
*/
private static final int hight = 655;
/**
* 按钮互斥组
*/
ToggleGroup csGroup = new ToggleGroup();
/**
* Web引擎
*/
WebEngine webEngine;
/**
* 滚动信息的Label存储List
*/
List<Label> rollInfor = new ArrayList<>();
/**
* 加载fxml的root
*/
Parent root;
/**
* 存放滚动和信息的VBox
*/
private VBox rollBox;
/**
* 主舞台
*/
private Stage primaryStage;
/**
* 开始游戏按钮
*/
private Button startG;
/**
* 播放声音的线程
*/
private Thread thradePlay;
/**
* 旋转
*/
private RotateTransition rotateTransition;
/**
* 声音
*/
private String[] soundPath = { "sound//start1.wav", "sound//start2.wav", "sound//start3.wav" };
/**
* 退出游戏
*/
private Button exitButton;
/**
* 健康按钮
*/
private Button healthButton;
/**
* 设置按钮
*/
private Button setButton;
private GridPane mainPane;
private LineChart<Number, Number> lineChart;
XYChart.Series series;
private Axis<Number> xAxis;
private Axis<Number> yAxis;
private WebView bgWeb;
private WebEngine bgEngine;
private GridPane gp;
/*
* (non Javadoc)
*
* @Title: start
*
* @Description: 舞台初始化
*
* @param primaryStage
*
* @see javafx.application.Application#start(javafx.stage.Stage)
*/
@Override
public void start(Stage primaryStage) {
try {
primaryStage.getIcons().add(new Image(new File("img//icon.png").toURL().toString()));
primaryStage.setTitle("血战川师实验楼");
this.primaryStage = primaryStage;
Parent root = FXMLLoader.load(getClass().getResource("/game/ui/main.fxml"));
this.root = root;
Scene scene = new Scene(root);
scene.getStylesheets().add(getClass().getResource("application.css").toExternalForm());
primaryStage.setScene(scene);
// 加载组件
loadModule(root);
// 加载网页
loadHTML("start//index.html",webEngine);
// 加载提示信息
loadRollInfor();
// 窗口关闭
closeWindow();
// 进入游戏点击事件
clickedStartG();
// 播放声音
CSTool.playSound("sound//introduce.wav");
thradePlay = new Thread(new CSTool.PlaySound(soundPath));
thradePlay.start();
// 关闭窗口
clickedExit();
// 健康按钮
clickedHealth();
// 设置按钮
clickedSet();
// 天气旋转
// transWeather();
// 创建图标
createChat();
// 滚动控制
rollLabel();
// Stage设置
prepareStage(primaryStage);
} catch (Exception e) {
e.printStackTrace();
}
}
private void createChat() {
// 定义序列对<x,y>
series = new XYChart.Series();
// 把序列对添加到坐标系
lineChart.getData().add(series);
lineChart.setLayoutY(100);
}
//
// private void transWeather() {
//
// try {
// weaherIV.setImage(new Image(new File("img//head.png").toURL().toString()));
// } catch (MalformedURLException e) {
// // TODO 自动生成的 catch 块
// e.printStackTrace();
// }
//
// weaherIV.setFitWidth(200);
// weaherIV.setFitHeight(200);
// rotateTransition = RotateTransitionBuilder.create().node(weaherIV).duration(Duration.seconds(4))
// .axis(new Point3D(0, 100, 0)).fromAngle(0).toAngle(180).cycleCount(Timeline.INDEFINITE)
// .autoReverse(true).build();
// rotateTransition.play();
// }
/**
*
* @Title: loadModule
* @Description: 从root寻找组件
* @param root
* @return: void
*/
private void loadModule(Parent root) {
gp = (GridPane) root.lookup("#gp");
// 背景webView
bgWeb = (WebView) root.lookup("#bgWeb");
bgEngine = bgWeb.getEngine();
// 加载WebView
w = (WebView) root.lookup("#w");
// 加载WebViewEngine
webEngine = w.getEngine();
// 川师一区
cs1 = (ToggleButton) root.lookup("#cs1");
// 川师二区
cs2 = (ToggleButton) root.lookup("#cs2");
// 互斥按钮组
cs1.setToggleGroup(csGroup);
cs2.setToggleGroup(csGroup);
// 提示消息
rollBox = (VBox) root.lookup("#rollBox");
// 进入游戏
startG = (Button) root.lookup("#startG");
// 退出游戏
exitButton = (Button) root.lookup("#exitButton");
// 健康按钮
healthButton = (Button) root.lookup("#healthButton");
// 设置按钮
setButton = (Button) root.lookup("#setButton");
// 天气View
// weaherIV = (ImageView) root.lookup("#weaherIV");
// 折线图
lineChart = (LineChart<Number, Number>) root.lookup("#lineChart");
// y轴
yAxis = (NumberAxis) root.lookup("#yAxis");
// x轴
xAxis = (NumberAxis) root.lookup("#xAxis");
}
/**
*
* @Title: clickedStartG
* @Description: 点击进入游戏事件
* @return: void
*/
private void clickedStartG() {
// 登录
if (startG != null) {
startG.setOnMouseClicked((MouseEvent event) -> {
// 启动客户端
new TankClient().launchFrame();
// primaryStage.close();
// new TankClient().lauchFrame();
// primaryStage.hide();
if (thradePlay.isAlive()) {
thradePlay.stop();
}
});
}
}
/**
*
* @Title: clickedExit
* @Description: 退出按钮
* @return: void
*/
private void clickedExit() {
// 退出
if (exitButton != null) {
exitButton.setOnMouseClicked((MouseEvent event) -> {
System.exit(0);
});
}
}
/**
*
* @Title: closeWindow
* @Description: 关闭窗口
* @return: void
*/
private void closeWindow() {
primaryStage.setOnCloseRequest(new EventHandler<WindowEvent>() {
@Override
public void handle(WindowEvent event) {
System.exit(0);
}
});
}
/**
*
* @Title: clickedExit
* @Description: 退出按钮
* @return: void
*/
private void clickedHealth() {
// 健康
if (healthButton != null) {
healthButton.setOnMouseClicked((MouseEvent event) -> {
new Health().start(new Stage());
});
}
}
/**
*
* @Title: clickedSet
* @Description: 设置按钮
* @return: void
*/
private void clickedSet() {
// 设置
if (setButton != null) {
setButton.setOnMouseClicked((MouseEvent event) -> {
System.out.println("设置按钮");
loadHTML("bg//index.html",bgEngine);
rotateTransition = RotateTransitionBuilder.create().node(gp).duration(Duration.seconds(4))
.axis(new Point3D(0, 100, 0)).fromAngle(0).toAngle(180).cycleCount(2)
.autoReverse(true).build();
rotateTransition.play();
});
}
}
/**
*
* @Title: rollLabel
* @Description: 滚动信息控制
* @return: void
*/
private void rollLabel() {
Timer timer = new Timer();
timer.scheduleAtFixedRate(new TimerTask() {
int countChat = 1;
int countWeb = 0;
int i = 1;
@Override
public void run() {
while (true) {
Platform.runLater(() -> {
rollBox.getChildren().clear();
if (countWeb == 20) {
countWeb = 1;
series.getData().clear();
countChat = 0;
loadHTML("start//index.html",webEngine);
}
++countWeb;
});
Platform.runLater(() -> {
XYChart.Data xy = new XYChart.Data(i, Math.random() * 1000);
series.getData().add(xy);
});
++countChat;
int j = 1;
while (j <= countLabel) {
if (i >= countLabel) {
i = i % countLabel;
}
Label l = rollInfor.get(i);
Platform.runLater(() -> {
rollBox.getChildren().add(l);
});
++i;
++j;
}
++i; // next作为current
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
// TODO 自动生成的 catch 块
e.printStackTrace();
}
}
}
}, 1000, 5000);
}
/**
*
* @Title: loadRollInfor
* @Description: 滚动信息设置
* @return: void
*/
private void loadRollInfor() {
// 1
rollInfor.add(new Label("欢迎来到血战川师实验楼!"));
// 2
rollInfor.add(new Label("您是第1024位玩家!"));
// 3
rollInfor.add(new Label("玩家枸杞子加入游戏!"));
// 4
rollInfor.add(new Label("玩家孤独求败加入游戏!"));
// 5
rollInfor.add(new Label("玩家晓风寒月加入游戏!"));
// 6
rollInfor.add(new Label("川师第一实验楼失守!"));
// 7
rollInfor.add(new Label("川师第二实验楼受到第一轮进攻!"));
// 8
rollInfor.add(new Label("抵制盗版游戏!"));
// 9
rollInfor.add(new Label("游戏有害健康"));
// 10
rollInfor.add(new Label("每日限制登录4小时!"));
// 11
rollInfor.add(new Label("川师第二实验楼受到第二轮进攻!"));
// 12
rollInfor.add(new Label("玩家枸杞子取得狗头一个!"));
// 13
rollInfor.add(new Label("新枪支黄金战枪上线"));
// 14
rollInfor.add(new Label("活动期间,购买商品价格减半"));
// 15
rollInfor.add(new Label("玩家阡陌上线!"));
// 16
rollInfor.add(new Label("您已登录5小时,请注意合理游戏!"));
// 17
rollInfor.add(new Label("有版本可更新,请下载!"));
// 18
rollInfor.add(new Label("由于苹果商店限制,已取消热更新功能!"));
// 19
rollInfor.add(new Label("川师第一实验楼已被修复!"));
// 20
rollInfor.add(new Label("川师第二实验楼失守!"));
// 21
rollInfor.add(new Label("川师第三实验楼受到第一轮进攻!"));
// 22
rollInfor.add(new Label("您的账号近期出现异地登录,请尽快修改密码!"));
// 23
rollInfor.add(new Label("川师一区开服!"));
for (int i = 0; i < countLabel; ++i) {
rollBox.getChildren().add(rollInfor.get(i));
}
}
/**
*
* @Title: prepareStage
* @Description: 舞台准备
* @param primaryStage
* @return: void
*/
private void prepareStage(Stage primaryStage) {
primaryStage.setResizable(false);
primaryStage.setWidth(width);
primaryStage.setHeight(hight);
primaryStage.show();
}
/**
*
* @Title: loadHTML
* @Description: 加载HTML网页
* @param filePath
* @return: void
*/
private void loadHTML(String filePath,WebEngine webEngine) {
try {
File file = new File(filePath);
if (file.exists()) {
System.out.println("00");
}
webEngine.load(file.toURL().toString());
} catch (MalformedURLException e) {
e.printStackTrace();
}
w.setMinWidth(width);
w.setMinHeight(hight);
}
/**
*
* @Title: snapshot
* @Description: 网页截图
* @param view
* @return: void
*/
public void snapshot(Node view) {
Image image = view.snapshot(null, null);
try {
System.out.println("sdsds");
ImageIO.write(SwingFXUtils.fromFXImage(image, null), "png",
new File("f:\\" + System.currentTimeMillis() + ".png"));
} catch (IOException e) {
e.printStackTrace();
}
}
/**
*
* @Title: noBorderMove
* @Description: 无边框,可移动
* @param primaryStage
* @param root
* @return: void
*/
private void noBorderMove(Stage primaryStage, Parent root) {
primaryStage.initStyle(StageStyle.UNDECORATED);// 设定窗口无边框
// 可拖动
root.setOnMousePressed((MouseEvent event) -> {
event.consume();
xOffset = event.getScreenX();
startX = primaryStage.getX();
startY = primaryStage.getY();
yOffset = event.getScreenY();
// System.out.println(xOffset + ":" + yOffset);
});
// root.setOnMouseDragEntered
root.setOnMouseDragged((MouseEvent event) -> {
// System.out.println(event.getSceneX() + "-" + event.getSceneY());
double xx = event.getScreenX();
double yy = event.getScreenY();
double x = xx - xOffset + startX;
double y = yy - yOffset + startY;
primaryStage.setX(x);
primaryStage.setY(y);
});
}
// 自己实现多线程调用截屏,较麻烦
private class Snap implements Runnable {
public void run() {
while (true) {
try {
Thread.sleep(1000);// 该命令不可直接在Fx用户线程执行,否则会导致前台的渲染线程暂停,页面不会被加载
Platform.runLater(new Runnable() {
@Override
public void run() {
snapshot(w);// 在后台线程中不可以直接操作UI,需要借助runLater
}
});
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
/**
*
* @Title: main
* @Description: 主函数
* @param args
* @return: void
*/
public static void main(String[] args) {
launch(args);
}
}
java学习群669823128
Java局域网对战游戏、天气预报项目的更多相关文章
- 27.Java 飞机游戏小项目
开篇 游戏项目基本功能开发 飞机类设计 炮弹类设计 碰撞检测设计 爆炸效果的实现 其他功能 计时功能 游戏项目基本功能开发 这里将会一步步实现游戏项目的基本功能. 使用 AWT 技术画出游戏主窗口 A ...
- Android快乐贪吃蛇游戏实战项目开发教程-01项目概述与目录
一.项目简介 贪吃蛇是一个很经典的游戏,也很适合用来学习.本教程将和大家一起做一个Android版的贪吃蛇游戏. 我已经将做好的案例上传到了应用宝,无病毒.无广告,大家可以放心下载下来把玩一下.应用宝 ...
- Java写的斗地主游戏源码
源码下载在最后 我们的前年的课设要求做一个斗地主程序,当时正在愁如何做界面,当时刚好在学习C#,于是就用C#完成了这个程序.一方面,当时我C#功底还很差(其实现在也不怎么样),很多地方用了“笨办法”, ...
- Java学习路径及练手项目合集
Java 在编程语言排行榜中一直位列前排,可知 Java 语言的受欢迎程度了. 实验楼上的[Java 学习路径]中将首先完成 Java基础.JDK.JDBC.正则表达式等基础实验,然后进阶到 J2SE ...
- 基于Udp的五子棋对战游戏
引言 本文主要讲述在局域网内,使用c#基于Udp协议编写一个对战的五子棋游戏.主要从Udp的使用.游戏的绘制.对战的逻辑这三个部分来讲解. 开发环境:vs2013,.Net4.0,在文章的末尾提供源代 ...
- 基于Java的开源3D游戏引擎jMonkeyEngine
jMonkeyEngine简介 jMonkeyEngine是一款纯Java语言编写的游戏引擎,继承了Java应用跨平台的特性,而且是开放源代码的,遵循BSD开源协议,BSD开源协议用一句简单的话概括就 ...
- Java实现贪吃蛇游戏(含账号注册登录,排行榜功能)
这是我第一次工程实践的作业,选题很多,但我只对其中的游戏开发感兴趣,可游戏就两三个类型,最终还是选择了贪吃蛇.其实就贪吃蛇本身的代码实现还算是比较简单的,可是实践要求代码行达到一定数量,所以我就额外给 ...
- Java 教程整理:基础、项目全都有
Java 在编程语言排行榜中一直位列前排,可知 Java 语言的受欢迎程度了. 网上有很多 Java 教程,无论是基础入门还是开发小项目的教程都比比皆是,可是系统的很少,对于Java 学习者来说找到系 ...
- ADO.Net(五)——实战:对战游戏
对战游戏 要求: 自建数据表(例如:数据表包含:代号,姓名,性别,血量,攻击力,防御力,命中,闪避,等级等字段) 需要通过程序向数据表添加人员 添加的时候,根据用户输入的名字,自动计算生成相应的血量. ...
随机推荐
- TP框架基础2
---恢复内容开始--- [空操作和空控制器处理] 空操作:就没有指定的操作方法 空控制器:没有指定控制器 http://网址/index.php/Home/User/login http://网址/ ...
- JSP SERVLET 基础知识
jsp(java server page)和servlet是JAVA EE规范的两个基本成员,是JAVA WEB开发的重点也是基础知识.JSP本质上也需要编译成SERVLET运行. JSP比较简单,可 ...
- Java基础_基本语法
Java基本语法 一:关键字 在Java中有特殊含义的单词(50). 二:标志符 类名,函数名,变量名的名字的统称. 命名规则: 可以是字母,数字,下划线,$. 不能以数字开头. 见名之意. 驼峰规则 ...
- function func(){} 与 var func=function(){}的区别
1 var func =function(){} ,即和 var 变量的特性 一样. func 变量名提前,但是不会初始化,直到执行到初始化代码. 2 function func(){} ...
- nor flash的一般操作与分析
是现在市场上两种主要的非易失闪存技术.Intel于1988年首先开发出NOR Flash 技术,彻底改变了原先由EPROM(Electrically Programmable Read-Only-Me ...
- <nginx+PHP>nginx环境下配置支持php7
[root@redhat7 ~]# wget http://am1.php.net/get/php-7.1.2.tar.gz/from/this/mirror [root@redhat7 ~]# ta ...
- Facebook力推导航库:React Navigation使用详解
本文来自Songlcy投稿:文章地址:http://blog.csdn.net/u013718120/article/details/72357698 一.开源库介绍 今年1月份,新开源的react- ...
- Linux系统下使用pwgen生成密码的使用教程
pwgen生成的密码易于记忆且相当安全.从技术上来说,容易记忆的密码不会比随机生成的密码更加安全.但是,在大多数情况下,pwgen生成的密码已经足够安全,除了网银密码等需要高安全等级的情况外.使用易于 ...
- 解决com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException: Specified key was too long; max key length is 767 bytes异常
错误截图: 解决方法: 用root进入mysql终端,执行以下命令: alter database hive character set latin1;
- Windows下使用MinGW在命令行编译运行C++程序
之前学习C语言的时候都是用IDE类似CodeBlocks的工具写完直接编译运行的,今天突然心血来潮,自己下一个编译器,在命令行下,编译运行C++程序,了解一下编译过程. 一.安装编译器 首先你需要下载 ...