【发布时间】:2021-09-03 15:30:30
【问题描述】:
我正在开展一个项目,该项目涉及使用 JDBC 模板创建 Spring Boot REST 应用程序以访问我自己创建的数据库 (MySQL)。我正在使用 Postman 验证端点并通过 postman 使用 JSON 输入数据。我目前的任务是创建一个猜谜游戏,它会生成一个随机的 4 位数字,这很容易。我的问题是这个; “根据 ID 返回一个特定的游戏。确保正在进行的游戏不显示他们的答案” 我创建了一个满足要求的“启动器”方法,但仅限于最基本的级别。一旦对象的字段值更改为“隐藏”,我就无法对对象进行操作,因为它不再是 4 位数字。我想隐藏答案,同时仍然能够以功能方式对随机生成的数字进行操作。这是我返回的基本方法:
@Override
public Game gameById(int id) {
Game game = gameDao.getGameById(id);
if (game.getFinished() == false) { // "Hides" the answer
game.setGameAnswer("Hidden");
}
return game;
}
这是在我的应用程序中使用上述代码的方法:
@PostMapping("/guess")
public ResponseEntity<Game> play( int id, String guess) {
Game game = service.gameById(id); // Get method
if (game == null) {
return new ResponseEntity(null, HttpStatus.NOT_FOUND);
}
Round round = new Round();
round.setGuess(guess);
service.guess(round, game);
return ResponseEntity.ok(game);
}
有什么想法吗?
编辑:
游戏对象:
public class Game {
int gameId;
String gameAnswer;
Boolean finished;
List<Round> Rounds = new ArrayList<>();
我还将包括我将所述字段存储到的数据库游戏表:
CREATE TABLE game(
id INT NOT NULL PRIMARY KEY AUTO_INCREMENT,
gameAnswer CHAR(4) NOT NULL,
finished BOOLEAN DEFAULT false
);
为了澄清我的问题,在 postman 中运行游戏时,游戏对象及其字段都会显示以及游戏答案。只要游戏状态显示为“假”,我的目标就是隐藏这个答案。一旦数字被正确猜出,游戏的状态将自动设置为 true。
以下是 postman 的 JSON 输出示例:
{
"gameId": 1,
"gameAnswer": "2651",
"finished": false,
"rounds": [
{
"roundId": 1,
"guess": "1234",
"timeOfGuess": "2021-06-18 09:28:29",
"exactMatch": 0,
"partialMatch": 0,
"gameId": 1
}
]
}
虽然“已完成”设置为 false,但我希望游戏答案显示为“隐藏”,但仍有数值存在以进行操作。
猜测方法:
@Override
public void guess(Round round, Game game) {
// Takes the games generated answer and the user's guess and breaks them down into character array's
round.setGameId(game.getGameId());
char[] gameAnswer = characterBreakDown(game.getGameAnswer());
char[] roundGuess = characterBreakDown(round.getGuess());
// used for comparing the array elements one by one
int min = 0;
int max = 1;
int exact = 0;
boolean run = true;
while (run) {
for (int i = 0; i <= 3; i++) {
if (Arrays.equals(roundGuess, gameAnswer)) {
round.setExactMatch(4);
game.setFinished(true);
gameDao.updateGameById(game);
run = false;
} else if (Arrays.equals(roundGuess, min, max, gameAnswer, min, max)) {
exact++;
round.setExactMatch(exact);
min++;
max++;
if (i == 3 && round.getExactMatch() >= 2) {
round.setPartialMatch(round.getExactMatch());
run = false;
} else if (i == 3) {
run = false;
}
} else if (!Arrays.equals(roundGuess, min, max, gameAnswer, min, max)) {
min++;
max++;
if (i == 3 && round.getExactMatch() >= 2) {
round.setPartialMatch(round.getExactMatch());
run = false;
} else if (i == 3) {
run = false;
}
}
}
}
game.getRounds().add(round);
roundDao.createRound(round);
}
【问题讨论】:
-
您能给我们看一下 Game 对象的 sn-p 吗?
-
让我澄清一下,您有一个使用 JDBC 和 MySQL 存储的 4 位数猜谜游戏。查看您拥有
game.getFinished()的事实,这意味着您可以运行多个“游戏会话”本身。您的目标是使用其数据库 ID 或任何内在链接的游戏检索任何游戏,但是当游戏未完成时,您希望玩家继续吗? (另一种说法don't display answer) -
我建议重新表述您的问题并添加一些支持代码 sn-ps 和示例。我理解这个想法,但对我来说似乎有点不清楚你想要实现什么。例如。展示一些你想要什么功能的例子,无论是视觉的还是基于代码的,它可以帮助其他人更多地了解你的问题。
-
感谢您的回复,亚历克斯。我仍在研究“提出好的问题”部分。我的目标是隐藏游戏对象的“答案”字段的输出,只要将完成的布尔值设置为 false。 @Alex我已经添加了更多说明,如果不是不便,请告诉我是否还有其他需要澄清的地方。再次感谢你!也回答你的第二个问题;一旦游戏完成,唯一改变的是完成的布尔值设置为 true,如果从数据库中检索游戏,则答案存在而不是隐藏。
-
我不明白你的说法,“我想隐藏答案,同时仍然能够以功能方式对随机生成的数字进行操作”。如果您想对您的 api 客户端隐藏答案,那么您已经在做正确的事情(尽管我可能会将“gameAnswer”设置为 null 或空字符串)。 “仍然能够以功能方式对随机生成的数字进行操作”是什么意思?您不会在数据库中更改它,是吗?
标签: java json spring-boot spring-mvc jdbctemplate