2014-10-08 49 views
1

我正在为2个玩家编写一个简单的游戏,他们必须在彼此之后轮流 - 选择一些物体从棋盘上移除(移除实际上是将一个ImageView设置为不可见),然后一个玩家按下“End turn”最终将转身传递给另一名球员。如何在游戏中转向AI?

该板是GridLayoutImageView S,所有ImageView■找onClickListener(),以及他们在比赛一开始所有可见。玩家点击几个ImageView(在这些时刻,他们的ID被放置在一个数组中),然后点击“结束转弯”,分析他的移动阵列,将相应的ImageView设置为不可见,之后转弯被传递给另一个玩家(阵列被清理并且当前玩家的号码改变)。

板上的所有物体都附有onClickListeners()。点击后,他们的ID被放置在一个数组中,并且一个变量包含当前玩家的号码。在“End turn”按钮上连接的onClickListener()上的方法被切换为onClick()方法,它只是清除ID的数组并更新当前播放器的编号。

它适用于2人玩的情况(在同一设备上)。但是如果一个人玩电脑,AI会计算并采用相同的onClick()方法。由于用户界面仅在处理onClick()后才更新,因此(ImageView被设置为不可见等),AI的移动不会在屏幕上绘制,并且播放器看起来好像在移动之后(点击对象),板子随着计算机的移动(删除对象)所做的更改立即重新绘制。

所以,我需要以不同的方式通过轮到AI,而不是在“End turn”按钮的onClick(),以便能够绘制AI的选择并隐藏选定的视图 - 在玩家可以进行下一步之前。 但如何做到这一点,在哪里?为“结束转弯”按钮

onClick()方法:

public void onClick(View v) { 
    hideSelectedImageViews(); 
    if (currentGame.isWinningState()) { 
     //you won 
    } else { 
     changePlayer(); 
     if (playWithAI) { 
      calculateAImove(currentGame); 
      showSelectedImageViewsByAI(); //doesn't work even with .invalidate() 
      hideSelectedImageViews(); 
      if (currentGame.isWinningState()) { 
        //AI won 
      } 
      changePlayer(); 
     } 
    } 
} 

showSelectedImageViewsByAI(),特定图像资源被设定为ImageView S,使得它们看起来不一样(“选择”)。

+0

发布您的代码/流程/图表/绘图会很有帮助。 – 2014-10-08 21:21:32

+0

请发布您的代码。尝试 。invalidate()“board” – 2014-10-08 21:38:21

回答

0

您可以创建一个新的Thread它将运行AI的移动,当AI进行选择时,您可以让线程延迟几秒(以便显示它们的选择),然后移除它们。你的代码有问题,一旦AI进行选择,它的瞬间(即使你没有invalidate()两次)

如果你不熟悉这里的线程是一个例子删除:

//I assume your code was inside an Activity 
public class mainActivity extends Activity implements Runnable 
{ 
    Thread aiThread; 

    /*...*/ 

    public void onClick(View v) 
    { 
     hideSelectedImageViews(); 
     if (currentGame.isWinningState()) { /*you won*/ } 
     else 
     { 
      changePlayer(); 
      if (playWithAI) 
      { 
       aiThread = new Thread(this); 
       aiThread.start(); 
      } 
     } 
    } 

    public void run() 
    { 
     calculateAImove(currentGame); 
     showSelectedImageViewsByAI(); 
     Thread.sleep(1000); //This will make thread wait for 1 second before removing selected (note the number is in milliseconds) 
     hideSelectedImageViews(); 
     if (currentGame.isWinningState()) { /*AI won*/ } 
     changePlayer(); 
    } 
} 

请注意,当使用线程来影响用户界面时,您不应该直接影响视图,您应该改为拨打view.post(),如果您不熟悉Threadsview.post()方法,我建议您在线搜索它们。

+0

您的想法对我来说非常有用,我将它实现为AsyncTask:在执行之前,它将按钮“End turn”设置为不可见,执行计算并在UI线程中发布进度,设置必要的ImageViews“选定“的延迟。在onPostExecute()方法中,ImageViews隐藏在UI线程中并且玩家被更改。这让我不用手动编写线程的任何操作。谢谢你的回答! – Vera 2014-10-09 10:25:54

+0

@维拉我很高兴能帮上忙! :) – TomTsagk 2014-10-09 12:22:09