我正在用C#创建Conway的生活游戏,除了刷新面板以显示下一代之外,一切都很好。我可以在面板上绘制细胞的网格线,使用simWindow_Paint
和simWindow_MouseClick
放置和摧毁"生命",但目前我无法更新它。
private void updateGame(){
int living = 0;
int dead = 0;
for(int i = 1; i < gameHeight; i++)
for (int j = 1; j < gameWidth; j++){
//set cell location and size
Rectangle cell = new Rectangle();
cell.Height = cell.Width = 9;
int X = j - 1;
int Y = i - 1;
cell.X = Convert.ToInt32(X * 10 + 1);
cell.Y = Convert.ToInt32(Y * 10 + 1);
using (Graphics g = this.simWindow.CreateGraphics()){
if (gameArray[i, j] == true){
Brush brush = new SolidBrush(Color.Red);
g.FillRectangle(brush, cell);
++living;
} else {
Brush brush = new SolidBrush(Color.White);
g.FillRectangle(brush, cell);
++dead;
}
}
}
}
我不确定我试图在C#中做的事情是否可行,我已经在Pascal中做过了,但我不确定C#是否以同样的方式工作。。。
很难说您向我们展示了什么,但我怀疑问题可能出在您的simWindow_Paint方法中。这(大概)是对面板的绘制事件的响应,我怀疑您正在做的是覆盖(或过度绘制)您在updateGame()方法中正在进行的所有绘制。
所有的绘图都应该在你的油漆处理程序中完成。所以绘制处理程序应该知道游戏的状态并相应地绘制它。updateGame()方法应该只更新游戏的状态,然后使面板无效(强制重新绘制)。
我建议您查看以下关于WinForms中自定义绘画的文档:http://msdn.microsoft.com/en-us/library/kxys6ytf.aspx