如何在游戏中转向AI?

时间:2014-10-08 21:05:03

标签: android android-imageview multiplayer

我正在为2名玩家编写一个简单的游戏,他们必须互相转弯 - 选择一些要从棋盘上删除的对象(删除实际上是设置ImageView不可见),然后玩家按下“结束转弯”结束时转向另一名球员。

董事会是GridLayout ImageView,所有ImageView都有onClickListener(),并且在游戏开始时都可见。玩家点击几个ImageView(在这些时刻他们的ID被放置在一个数组中),然后点击“结束转弯”,分析他的移动数组,相应的ImageView s设置为不可见,之后转弯应该传递给另一个玩家(阵列被清理,当前玩家的号码也会改变)。

棋盘上的所有物体都附有onClickListeners()个。单击时,它们的ID放在一个数组中,变量包含当前播放器的编号。转弯在onClick()上以onClickListener()方式切换,附加到“结束转弯”按钮,它只是清理ID数组并更新当前玩家的号码。

它适用于2个人玩(在同一设备上)的情况。但是如果一个人玩电脑,AI会计算并使用相同的onClick()方法移动。由于用户界面仅在处理onClick()后更新,(ImageView s设置为不可见,等等),因此AI的移动不会在屏幕上绘制,并且玩家在移动后会看到(点击对象),电路板立即重新绘制,计算机移动所做的更改(删除了对象)。

所以,我需要以不同的方式将转向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设置了特定的图像资源,以便它们看起来不同(“选中”)。

1 个答案:

答案 0 :(得分:0)

你可以创建一个新的Thread来运行AI的动作,当AI做出选择时你可以让线程延迟几秒钟(这样可以显示它们的选择)然后删除他们。你的代码有这个问题,一旦AI做出选择,它就会被立即删除(即使你曾invalidate()两次)

如果你不熟悉Threads,这里有一个例子:

//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()或{{Threads,则应改为呼叫view.post()。 1}}方法我建议在线搜索它们。