我正在为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
设置了特定的图像资源,以便它们看起来不同(“选中”)。
答案 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}}方法我建议在线搜索它们。