我正在编写一个没有幽灵的简单pacman游戏。所以只有象征作为玩家,一些墙壁和物品。
现在我想选择是否自己用箭头键来玩游戏,或者自动解决。
用户玩游戏的表格已完成。
现在我应该创建一个新表单(具有Paint
事件和Load
事件的相同代码)并仅更改必须更改的内容,或者我应该通过switch case决定将所有代码放在一起一个表格?
我通过PreviewKeyDown事件捕获dircetion并将其保存到字符串变量“direction”。然后启动计时器以减慢播放器的一般移动速度。
private void Game_Form_PreviewKeyDown(object sender, PreviewKeyDownEventArgs e)
{
//Unterscheide nach Richtung und kontrolliere ob in dieser Richtung Wand ist
switch (e.KeyCode)
{
case Keys.Up:
if (maze[pos_player_index.Item1, pos_player_index.Item2 - 1] == '#')
{
break;
}
else
{
key = "up";
}
break;
.
.
.
}
//Starte Timer Bewegungsgeschwindigkeit t_move
t_move.Start();
}
然后在OnTickEvent中我决定如何处理玩家的符号并检查是否有墙。然后我为玩家调用Refresh。 迷宫本身只在全局绘画事件中,因此只绘制一次。
void t_move_Tick(对象发送者,EventArgs e) { // Unterscheiden der Richtung durch Hilfsvariable(范例KommentiereneinerMöglichkeit) 开关(键) {
case "up":
//Setzen des neuen Index
pos_player_index = new Tuple<int, int>(pos_player_index.Item1, pos_player_index.Item2 - 1);
//Überschreiben des Zeichens im Labyrinth durch Leerzeichen -> aufgesammelt
maze[pos_player_index.Item1, pos_player_index.Item2] = ' ';
//Neuzeichnen der Spielfigur
p_player.Refresh();
break;
因此,图形和控制的代码严格不同。
答案 0 :(得分:0)
正如其他人所提到的,复制代码是一个坏主意 - 突然间你必须实现所有更改两次。
有很多方法可以分离程序中的功能。
目前,最简单的方式是让您当前的表单成为执行“共享”功能的abstract class PacmanForm
,并拥有class UserPacmanForm : PacmanForm
和class RobotPacmanForm : PacmanForm
。
然而我认为winforms设计师不太喜欢抽象类。如果您希望能够在尝试之前使用设计器,创建项目的备份。
另一种方法是将公共代码移动到单独的PacmanGame
类,例如,具有以下方法:
Form.Load
事件处理程序Render(Graphics g)
方法Move(Direction d)
方法然后,您可以创建两个使用PacmanGame
实例的单独表单。
PS。在我的回答中我没有关注性能,因为性能在这里不是问题。瓶颈很可能是绘制游戏的代码。