4

我目前正在为 iPhone 构建一个国际象棋游戏。棋盘上的棋子由一系列 UIImageView 表示,每个 UIImageView 代表棋盘的正方形,并引用正确的图像以显示该正方形。选择了一个正方形并进行了移动,函数 -(void)updateBoard; 在 ViewController 中调用:

-(void)updateBoard{

NSLog(@"updating board");

[square1 setImage:[UIImage imageNamed:[game imageForSquare:1]]];
[square2 setImage:[UIImage imageNamed:[game imageForSquare:2]]];
[square3 setImage:[UIImage imageNamed:[game imageForSquare:3]]];
[square4 setImage:[UIImage imageNamed:[game imageForSquare:4]]];
[square5 setImage:[UIImage imageNamed:[game imageForSquare:5]]];
[square6 setImage:[UIImage imageNamed:[game imageForSquare:6]]];
[square7 setImage:[UIImage imageNamed:[game imageForSquare:7]]];
[square8 setImage:[UIImage imageNamed:[game imageForSquare:8]]];
[square9 setImage:[UIImage imageNamed:[game imageForSquare:9]]];
[square10 setImage:[UIImage imageNamed:[game imageForSquare:10]]];
[square11 setImage:[UIImage imageNamed:[game imageForSquare:11]]];
[square12 setImage:[UIImage imageNamed:[game imageForSquare:12]]];
[square13 setImage:[UIImage imageNamed:[game imageForSquare:13]]];
[square14 setImage:[UIImage imageNamed:[game imageForSquare:14]]];
[square15 setImage:[UIImage imageNamed:[game imageForSquare:15]]];
[square16 setImage:[UIImage imageNamed:[game imageForSquare:16]]];
[square17 setImage:[UIImage imageNamed:[game imageForSquare:17]]];
[square18 setImage:[UIImage imageNamed:[game imageForSquare:18]]];
[square19 setImage:[UIImage imageNamed:[game imageForSquare:19]]];
[square20 setImage:[UIImage imageNamed:[game imageForSquare:20]]];
[square21 setImage:[UIImage imageNamed:[game imageForSquare:21]]];
[square22 setImage:[UIImage imageNamed:[game imageForSquare:22]]];
[square23 setImage:[UIImage imageNamed:[game imageForSquare:23]]];
[square24 setImage:[UIImage imageNamed:[game imageForSquare:24]]];
[square25 setImage:[UIImage imageNamed:[game imageForSquare:25]]];
[square26 setImage:[UIImage imageNamed:[game imageForSquare:26]]];
[square27 setImage:[UIImage imageNamed:[game imageForSquare:27]]];
[square28 setImage:[UIImage imageNamed:[game imageForSquare:28]]];
[square29 setImage:[UIImage imageNamed:[game imageForSquare:29]]];
[square30 setImage:[UIImage imageNamed:[game imageForSquare:30]]];
[square31 setImage:[UIImage imageNamed:[game imageForSquare:31]]];
[square32 setImage:[UIImage imageNamed:[game imageForSquare:32]]];
[square33 setImage:[UIImage imageNamed:[game imageForSquare:33]]];
[square34 setImage:[UIImage imageNamed:[game imageForSquare:34]]];
[square35 setImage:[UIImage imageNamed:[game imageForSquare:35]]];
[square36 setImage:[UIImage imageNamed:[game imageForSquare:36]]];
[square37 setImage:[UIImage imageNamed:[game imageForSquare:37]]];
[square38 setImage:[UIImage imageNamed:[game imageForSquare:38]]];
[square39 setImage:[UIImage imageNamed:[game imageForSquare:39]]];
[square40 setImage:[UIImage imageNamed:[game imageForSquare:40]]];
[square41 setImage:[UIImage imageNamed:[game imageForSquare:41]]];
[square42 setImage:[UIImage imageNamed:[game imageForSquare:42]]];
[square43 setImage:[UIImage imageNamed:[game imageForSquare:43]]];
[square44 setImage:[UIImage imageNamed:[game imageForSquare:44]]];
[square45 setImage:[UIImage imageNamed:[game imageForSquare:45]]];
[square46 setImage:[UIImage imageNamed:[game imageForSquare:46]]];
[square47 setImage:[UIImage imageNamed:[game imageForSquare:47]]];
[square48 setImage:[UIImage imageNamed:[game imageForSquare:48]]];
[square49 setImage:[UIImage imageNamed:[game imageForSquare:49]]];
[square50 setImage:[UIImage imageNamed:[game imageForSquare:50]]];
[square51 setImage:[UIImage imageNamed:[game imageForSquare:51]]];
[square52 setImage:[UIImage imageNamed:[game imageForSquare:52]]];
[square53 setImage:[UIImage imageNamed:[game imageForSquare:53]]];
[square54 setImage:[UIImage imageNamed:[game imageForSquare:54]]];
[square55 setImage:[UIImage imageNamed:[game imageForSquare:55]]];
[square56 setImage:[UIImage imageNamed:[game imageForSquare:56]]];
[square57 setImage:[UIImage imageNamed:[game imageForSquare:57]]];
[square58 setImage:[UIImage imageNamed:[game imageForSquare:58]]];
[square59 setImage:[UIImage imageNamed:[game imageForSquare:59]]];
[square60 setImage:[UIImage imageNamed:[game imageForSquare:60]]];
[square61 setImage:[UIImage imageNamed:[game imageForSquare:61]]];
[square62 setImage:[UIImage imageNamed:[game imageForSquare:62]]];
[square63 setImage:[UIImage imageNamed:[game imageForSquare:63]]];
[square64 setImage:[UIImage imageNamed:[game imageForSquare:64]]];


NSLog(@"-------------------BOARD READOUT-----------------------:");

for (int i = 1; i <=64; i++) {
    NSLog(@"Square %i: %@", i, [game imageForSquare:i]);
}

}

'square1'、'square2' 等是 UIImageViews,[game imageForSquare:] 方法返回需要显示的相应图像的 NSString*。

当与两个人类玩家一起玩时,棋盘会完美更新,之后程序等待下一个玩家的输入,我已经运行了很多游戏而没有任何问题。

我也有一个电脑玩家使用算法来选择它的移动,我目前正在尝试设置一个由两个电脑玩家相互对抗的游戏。(我还没有尝试过人类与电脑的游戏)。

问题是,当调用 updateBoard 方法时,没有任何图像被更新,尽管底部的 NSLog 读数告诉我一切正常,我实际上可以看到两个玩家通过控制台玩游戏。

我认为这与以下事实有关,即在调用 updateBoard 后我立即将控制权传递给下一个计算机播放器,并且以某种方式阻止了 UIImageViews 正确更新。我做了一个测试,注释掉调用下一个玩家的代码行(这意味着只有一次移动,然后执行停止)并且棋盘确实更新正确。

对不起,很长的问题,提前感谢您的任何建议!

4

1 回答 1

15

只有当程序控制返回到主运行循环时,用户界面才会更新。您应该在后台线程中进行计算,然后调用

dispatch_async(dispatch_get_main_queue(), ^{
   [self updateBoard];
});

当您想要更新显示时,从后台线程。这样你就不会在计算时阻塞 UI。

于 2012-08-25T14:06:10.407 回答