javafx游戏的排行榜

时间:2016-04-20 02:24:45

标签: java javafx-8

Hello stackoverflow社区!我正在学习编程,正在进行一项“寻找猎物”#34;用于移动设备的javafx风格游戏,其中3种类型的鸭子在屏幕上水平移动。每次点击某种类型的鸭子时,这种类型的鸭子会在其名称旁边找到一个点。

我想要做的是在游戏结束后显示一个全球排行榜,这样你就可以看到每个玩过游戏的人中最常点击的鸭子类型。什么是每个人实现这样的事情的首选方式?如果您有任何疑问,请随时问我。谢谢,-H.J。

编辑(太平洋标准时间2016年4月20日下午1:40):因为我的原帖被搁置了因为它被认为含糊不清,所以我写了一个非常基本的示例程序来帮助解释我想要做的事情。在我的菜单场景中,我想检索全球玩过这个游戏的所有人的红色和绿色矩形的总点击次数,当前为globalScoreRedglobalScoreGreen并设置为0,因为这是我需要帮助的部分之一。

在playGame场景中,当您点击GG按钮时,我希望scoreRedscoreGreen提交到排行榜,从菜单屏幕查看时会调整值。

这是一个非常糟糕的游戏,我可以证明这不是我喜欢玩的游戏,但我正在尝试学习如何发送值并检索它们的概念。再次感谢您查看我的帖子并提供帮助,非常感谢您。

package LeaderboardHelp;

import javafx.application.Application;
import javafx.scene.Scene;
import javafx.scene.control.Button;
import javafx.scene.layout.Pane;
import javafx.scene.layout.VBox;
import javafx.scene.paint.Color;
import javafx.scene.shape.Rectangle;
import javafx.scene.text.Text;
import javafx.stage.Stage;

public class LeaderboardHelpMain extends Application {

Stage window;
Scene menu, playGame;

private Rectangle targetRed = new Rectangle(40, 40);
private Rectangle targetGreen = new Rectangle(40, 40);

private int scoreRed = 0;
private int scoreGreen = 0;

private Text redScoreText = new Text("Red: " + scoreRed);
private Text greenScoreText = new Text("Green: " + scoreGreen);

private int globalScoreRed = 0;
private int globalScoreGreen = 0;

private Text globalRedScoreText = new Text("Worldwide Red Clicks: " + globalScoreRed);
private Text globalGreenScoreText = new Text("Worldwide Green Clicks: " + globalScoreGreen);

private boolean playable = false;


public static void main(String[] args) { launch(args); }


@Override
public void start(Stage primaryStage) throws Exception {
    window =  primaryStage;

    Button startButton = new Button("Start!");
    startButton.setOnAction(e -> window.setScene(playGame));

    //menu scene layout
    VBox menuLayout = new VBox(20);
    menuLayout.getChildren().addAll(globalGreenScoreText, globalRedScoreText, startButton);

    menu = new Scene(menuLayout, 600, 600);

    Button ggButton = new Button("GG");
    ggButton.setOnAction(e -> window.setScene(menu));

    targetRed.setFill(Color.RED);
    targetRed.setOnMouseClicked(event -> {
        scoreRed += 1;
        redScoreText.setText("Red: " + scoreRed);
    });

    targetGreen.setFill(Color.GREEN);
    targetGreen.setOnMouseClicked(event -> {
        scoreGreen += 1;
        greenScoreText.setText("Green: " + scoreGreen);
    });

    targetRed.setTranslateX(50);
    targetRed.setTranslateY(50);

    targetGreen.setTranslateX(100);
    targetGreen.setTranslateY(50);

    greenScoreText.setTranslateX(500);
    greenScoreText.setTranslateY(50);

    redScoreText.setTranslateX(500);
    redScoreText.setTranslateY(70);

    ggButton.setTranslateX(250);
    ggButton.setTranslateY(250);
    //game layout
    Pane gameLayout = new Pane();
    gameLayout.getChildren().addAll(targetRed, targetGreen, redScoreText, greenScoreText, ggButton);
    playGame = new Scene(gameLayout, 600, 600);

    window.setScene(menu);
    window.setTitle("Leaderboard Helper");
    window.show();



    }
}

编辑(太平洋标准时间2016年4月20日下午8:45)所以经过更多的阅读后,我遇到了oracles EchoServer的例子,它让我走上了一条轨道(不确定它是对还是错的轨道)。我在考虑让服务器将提交的分数保存在文本文件中。当客户端调用menu场景时,它将连接到服务器并请求分数。服务器将读取文本文件并将分数发送到应用程序客户端。当按下GG按钮时,分数被发送到读取文本文件的服务器,将新闻分数添加到旧分数,然后覆盖分数文本文件。有没有更好的方法呢?我希望这是可扩展的,允许很多用户同时添加他们的分数。

1 个答案:

答案 0 :(得分:2)

  1. 需要网络服务。一个简单的方法,可能是鸭子的类型和点击的次数。

    POST / duck / {type} / {clicks}

  2. 需要使用HTTPS或HMAC保护网络服务,或者两者都更好。

  3. 对于HMAC,密钥需要在代码中隐藏和混淆。安全性总是易于破解,它的努力不值得为任何想成为黑客的小额支付。
  4. 要正确执行HMAC,在创建摘要(即签名)时应使用NONCE。 NONCE应该有一个短暂的到期时间。许多实现使用时间戳作为NONCE,其他实现具有由Web服务提供的NONCE。为简单起见,我会选择前者。如果NONCE超过2或3秒,则拒绝该请求。