• Java局域网对战游戏、天气预报项目


    功能

    1.天气预报
    2.局域网对战

    展示

     java学习群669823128
     

    部分源码

    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
  • 相关阅读:
    linux学习笔记---grep
    node.js读取到的文件列表
    node 按行读取文件
    NodeJS遍历文件生产文件列表
    常用linux命令行
    2017/11/13
    Linux下输出 excel文件
    位映射对大数据的排重
    算法中的渐进记号
    KMP算法原理
  • 原文地址:https://www.cnblogs.com/rese-t/p/7988715.html
Copyright © 2020-2023  润新知