From: Gansito F. <gan...@gm...> - 2007-07-03 16:46:26
|
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> <html> <head> <meta content="text/html;charset=ISO-8859-1" http-equiv="Content-Type"> </head> <body bgcolor="#ffffff" text="#000000"> Hi all,<br> <br> I just noticed, the Kings Table JUnit test DummyDisplay doesn't implement setGameOver().<br> <br> Thanks,<br> Gansito<br> <br> Lane Schwartz wrote, On 7/3/2007 11:31 AM: <blockquote cite="mid:683...@ma..." type="cite"> <pre wrap="">Awesome. That's exactly what I need. I've committed my changes to King's Table - the code is now able to properly handle the end of the game. I do see one new problem. If you play a networked game of King's Table, and the game ends (one player wins), and then the client does Leave Game, the server pops up a message that says something like "Connection lost to:clientname game is over. Game saved to:connection_lost_on....svg". I'm not sure where the relevant code is, but it seems that the code should check to see if the stopGameSequence condition is true. If it is, that means the game really is over, and there's no need to automatically save the game and pop up a message to the server when the client leaves. Lane On 7/2/07, Sean Bridges <a class="moz-txt-link-rfc2396E" href="mailto:sbr...@ya..."><sbr...@ya...></a> wrote: </pre> <blockquote type="cite"> <pre wrap="">It is a good suggestion, the only problem is we dont want startGame(...) to return until the game is stopped through a call to stopGame(). I added a new method to IDelegateBridge called stopGameSequence(). When a delegate calls this method, no further delegates will start, but the game wont end (and startGame will not return). Your EndTurnDelegate should call this method. You will still need to have a ui mechanism to release latches when the game ends, since the server can end the game while the client is thinking about his move. Whenever a frame is opened, or an IDisplay waits on a latch, you must make sure it is released if IDisplay.shutdown() is called. Sean --- Lane Schwartz <a class="moz-txt-link-rfc2396E" href="mailto:dow...@gm..."><dow...@gm...></a> wrote: </pre> <blockquote type="cite"> <pre wrap="">I think I'm already do something fairly similar to what you outline. I am already able to successfully block user input. The problem is that I need to prevent delegates from executing after the game has ended. If I understand correctly, what you are suggesting would work only if all of the relevant delegates are associated with a player. If EndTurnDelegate is associated with a player, then that player's start method will get called after the EndTurnDelegate.start() returns. Right now EndTurnDelegate is not associated with a player, because logically there is no connection between that delegate and any player. But, if that's the only way to do it, I will try that. I'm wondering if a cleaner way to do this would be to add a new member variable to GameData. The member variable would be boolean m_gameOver, and would initially be set to false. We would then add a new Change class called GameOverChange, which would be capable of setting GameData's m_gameOver to true. Any delegate which recognizes a game over condition could create a GameOverChange and apply it using IDelegateBridge.addChange(). In ServerGame.startGame(), we would change the following code: while (!m_isGameOver) runStep(false); to this: while (!m_isGameOver && !m_data.isGameOver()) runStep(false); where GameData.isGameOver() is a getter method for the m_gameOver member variable. This would have the effect that once a delegate applies a GameOverChange, no more delegates would be called. What do you think? Lane On 7/1/07, Sean Bridges <a class="moz-txt-link-rfc2396E" href="mailto:sbr...@ya..."><sbr...@ya...></a> wrote: </pre> <blockquote type="cite"> <pre wrap="">The way that TripleA solves this is that the </pre> </blockquote> <pre wrap="">uiContext </pre> <blockquote type="cite"> <pre wrap="">holds a list of latches and frames to close, </pre> </blockquote> <pre wrap="">release </pre> <blockquote type="cite"> <pre wrap="">when the game is over. When a player needs to wait for user input, the </pre> </blockquote> <pre wrap="">player </pre> <blockquote type="cite"> <pre wrap="">creates a new latch, registers that latch with the uiContext, and waits for the latch to countdown. </pre> </blockquote> <pre wrap="">The </pre> <blockquote type="cite"> <pre wrap="">latch will countdown when the player moves, or </pre> </blockquote> <pre wrap="">when </pre> <blockquote type="cite"> <pre wrap="">IDisplay's shutDown() method is called (TripleaFrame.stopGame() will call uiContext.shutDown()). You want to do the same thing. Create an object </pre> </blockquote> <pre wrap="">that </pre> <blockquote type="cite"> <pre wrap="">holds the shutdown actions to perform, and on IDisplay.shutDown(), perform those actions. In the case where the player recognizes the game </pre> </blockquote> <pre wrap="">is </pre> <blockquote type="cite"> <pre wrap="">over, and wants to wait for ever, create a new </pre> </blockquote> <pre wrap="">latch, </pre> <blockquote type="cite"> <pre wrap="">register it with the ui context, and then wait on </pre> </blockquote> <pre wrap="">it. </pre> <blockquote type="cite"> <pre wrap="">The latch will only be released when the IDisplay.shutDown() method is called. This is all quite hacky, and there should be a </pre> </blockquote> <pre wrap="">cleaner </pre> <blockquote type="cite"> <pre wrap="">better documented way of handling it. IGame does have an isGameOver() method that can be used to test if a game is over. Game over in this sense does not mean someone has one, but that the </pre> </blockquote> <pre wrap="">game </pre> <blockquote type="cite"> <pre wrap="">is being shutdown. Sean --- Lane Schwartz <a class="moz-txt-link-rfc2396E" href="mailto:dow...@gm..."><dow...@gm...></a> wrote: </pre> <blockquote type="cite"> <pre wrap="">When I originally wrote the King's Table code, I tried to base it on the similar TripleA code. Every instance of KingsTableDisplay stores exactly one KingsTableFrame reference. When KingsTableDisplay.shutDown() is called, it calls </pre> </blockquote> </blockquote> <pre wrap="">the </pre> <blockquote type="cite"> <blockquote type="cite"> <pre wrap="">stopGame() method for its KingsTableFrame. The KingsTableFrame stopGame() method closes and disposes of the KingsTableFrame. The problem stems from the fact that King's </pre> </blockquote> </blockquote> <pre wrap="">Table </pre> <blockquote type="cite"> <blockquote type="cite"> <pre wrap="">has a true game over. My understanding based on earlier posts is that when a TripleA game ends, it doesn't really end. That is, the </pre> </blockquote> </blockquote> <pre wrap="">game </pre> <blockquote type="cite"> <blockquote type="cite"> <pre wrap="">continues, and steps keep on advancing. That behavior wouldn't make sense in King's </pre> </blockquote> </blockquote> <pre wrap="">Table. </pre> <blockquote type="cite"> <blockquote type="cite"> <pre wrap="">In order to prevent that from happening, in an earlier thread it was recommended to me to make the IKingsPlayer start method never return </pre> </blockquote> </blockquote> <pre wrap="">if </pre> <blockquote type="cite"> <blockquote type="cite"> <pre wrap="">the game is over. I tried that, and it sort of works, in that </pre> </blockquote> </blockquote> <pre wrap="">players </pre> <blockquote type="cite"> <blockquote type="cite"> <pre wrap="">can't play any more. However, the delegates keep getting called in </pre> </blockquote> </blockquote> <pre wrap="">rapid </pre> <blockquote type="cite"> <blockquote type="cite"> <pre wrap="">succession, and the KingsTableFrame user interface gets </pre> </blockquote> </blockquote> <pre wrap="">continuously </pre> <blockquote type="cite"> <blockquote type="cite"> <pre wrap="">updated with "Black's Turn" followed by "White's Turn" </pre> </blockquote> </blockquote> <pre wrap="">followed </pre> <blockquote type="cite"> <blockquote type="cite"> <pre wrap="">by "Black's Turn" and so on. The only way I could find to prevent this </pre> </blockquote> </blockquote> <pre wrap="">behavior </pre> <blockquote type="cite"> <blockquote type="cite"> <pre wrap="">was to make EndTurnDelegate's start method never return if </pre> </blockquote> </blockquote> <pre wrap="">the </pre> <blockquote type="cite"> <blockquote type="cite"> <pre wrap="">game is over. So, I put a while(true){} loop at the end of the EndTurnDelegate start method. Doing that fixed the above problem </pre> </blockquote> </blockquote> <pre wrap="">because </pre> <blockquote type="cite"> <blockquote type="cite"> <pre wrap="">the succeeding delegates are never called. But, this approach led to my next problem. If </pre> </blockquote> </blockquote> <pre wrap="">the </pre> <blockquote type="cite"> <blockquote type="cite"> <pre wrap="">game has ended, and the EndTurnDelegate start method doesn't return, then leaving the game appears to not be handled gracefully. It seems </pre> </blockquote> </blockquote> <pre wrap="">that </pre> <blockquote type="cite"> <blockquote type="cite"> <pre wrap="">since the current delegate is stuck in an (intentional) infinite </pre> </blockquote> </blockquote> <pre wrap="">loop, </pre> <blockquote type="cite"> <blockquote type="cite"> <pre wrap="">when a player tries to Leave Game and then </pre> </blockquote> </blockquote> <pre wrap="">ServerGame.stopGame() </pre> <blockquote type="cite"> <blockquote type="cite"> <pre wrap="">gets called, System.exit() is called from </pre> </blockquote> </blockquote> <pre wrap="">ServerGame.stopGame(). </pre> <blockquote type="cite"> <blockquote type="cite"> <pre wrap="">This is bad because the program quits instead of displaying </pre> </blockquote> </blockquote> <pre wrap="">the </pre> <blockquote type="cite"> <blockquote type="cite"> <pre wrap="">MainFrame. So, that brings us to the current state of the </pre> </blockquote> </blockquote> <pre wrap="">code. </pre> <blockquote type="cite"> <blockquote type="cite"> <pre wrap="">I tried passing around CountDownLatch objects to see if that </pre> </blockquote> </blockquote> <pre wrap="">could </pre> <blockquote type="cite"> <blockquote type="cite"> <pre wrap="">solve the problem. Obviously it didn't. I don't know how to solve the problem. Maybe you could help me with ideas. Here's what I want to happen: </pre> </blockquote> </blockquote> </blockquote> <pre wrap="">=== message truncated === ____________________________________________________________________________________ Need Mail bonding? Go to the Yahoo! Mail Q&A for great tips from Yahoo! Answers users. <a class="moz-txt-link-freetext" href="http://answers.yahoo.com/dir/?link=list&sid=396546091">http://answers.yahoo.com/dir/?link=list&sid=396546091</a> </pre> </blockquote> <pre wrap=""><!----> </pre> </blockquote> </body> </html> |