1

我正在尝试使用 Android 的 1v1 战斗创建一个基于回合的游戏。我的基本游戏循环会检查两名战士是否已经死亡,如果没有,则检查下一个要走的人。如果轮到玩家,那么它应该等待点击攻击按钮。如果轮到计算机,那么它将执行随机攻击。我无法让程序等待用户输入。我尝试在这里设置按钮侦听器,但没有这样做。[编辑] 确定哪个字符是基于恢复整数。每次攻击都有一个恢复值(50-100),该值会添加到角色的恢复中。nextMove() 方法检查哪个更接近 0 并减去两个字符的差值。这使得游戏需要更多的策略,因为你不需要

我该怎么做才能让游戏在那个时候暂停

这是代码

public void battle(){
    boolean playerGo;
    while(!checkDead()){
        playerGo=nextMove();  //returns true if its the players turn to go
        if(playerGo){
            //The game should wait here for the user input

            moveButton1.setOnClickListener(this);

        }
        else{
            randomMove();  //game automatically goes
        }
    }

}
4

2 回答 2

3

当您的应用程序启动时,所有东西都在一个线程上运行,包括事件处理程序。在您完成设置并调用battle() 之后,该线程就坐在那里一圈又一圈地循环。它在循环中忙得不可开交,以至于它没有注意到有一个点击事件等待处理!

有几个选项:

  1. 重构你的代码。看起来基本结构是玩家移动,然后游戏移动。您可以完全删除此循环,而是randomMove()在每次处理玩家移动后调用。OnClickListener在for中处理玩家的移动moveButton1。这样,一切都发生在事件上。总体而言,这会更简单,并且可能是正确的做法。
  2. 对代码进行尽可能小的更改以使其正常工作。这可能意味着将 while 循环的内容拉入 a Runnable,您可以通过调用Handler.post. 第一行调用checkDead,如果为真则返回。最后一行重新安排了Runnable. 中间是while循环的主体。这样做的效果是你的循环体运行,然后事件处理程序得到一个回合,然后你的循环体运行,然后事件处理程序运行。这可能是个坏主意。
  3. 在另一个线程中运行battle()。这可能是个坏主意。

Why are 2. and 3. bad ideas? On a mobile device, battery life is precious, and running a check to see if you need to do something over and over again will keep the CPU busy chewing up battery life. Much better to sit there idle until you need to do something - this is what option 1 achieves.

So if 2. and 3. are bad ideas, why mention them? Welllllll, 2. I mention because it's the closest thing I've got to an answer to the question you actually asked. I mention 3. because there's a sense in which your current code is a fairly clear embodiment of the game logic. You could rework it so it runs in a separate thread, and instead of nextMove() returning true, nextMove() waits until the player makes a move (this would involve semaphores or mutexes or promises). But this would be an explicitly multi-threaded program, and as such would be difficult to write correctly. I recommend you don't attempt it at this stage in your programming career - the most likely outcome is a program that stops and waits forever, or that corrupts its data structures, in a way that is exceedingly difficult to diagnose.

于 2012-08-09T17:02:29.513 回答
1

Button.SetOnClickListener() 函数将被触发,只有当用户点击按钮时。因此,它不会等待\阻塞,直到用户输入。这是 Android 设计的,您不能让阻塞窗口等待用户输入。而是更改您的设计以显示提示“现在它的用户移动”。

  1. 用户首先通过单击按钮移动。
  2. SetOnclickListener() 将被调用。在其中包含用户操作代码。
  3. 在 SetOnclickListener() 的末尾有计算机操作代码。

使用此循环,您可以链接用户移动和计算机移动。

于 2012-08-09T16:56:43.957 回答