2015-09-16 38 views
1

我在計算如何使計算機的槳移動時遇到問題。我使用鼠標設置了播放器的槳。這是我必須使用鼠標移動槳。我如何讓電腦的撥片在球運行的地方移動(有可能電腦會丟失)?乾杯!C#AI for Paddle

Form.Cs

private void Form1_MouseMove(object sender, MouseEventArgs e) 
    { 
     controller.MoveLeftPaddle(e.Location.Y); 
    } 

Controller.Cs

public void MoveLeftPaddle(int newPlayerPosition) 
    { 
     paddlePlayer.MovePlayerPaddle(newPlayerPosition); 
    } 

Paddle.CS

public void MovePlayerPaddle(int newYPosition) 
    { 
     position.Y = newYPosition; 
    } 

現在,我有這樣的代碼,我試圖讓計算機的槳舉動。

Paddle.CS

public void MoveComputerPaddle(int newY2Position) 
    { 
     position.Y = newY2Position; 
    } 

Controller.Cs

public void MoveRightPaddle(int newComputerPosition) 
    { 
     if (ball.Position.Y >= paddleComputer.Position.Y) 
     { 
      newComputerPosition += BALLSPEED; 
     } 
     else if (ball.Position.Y <= paddleComputer.Position.Y) 
     { 
      newComputerPosition -= ball.Velocity.Y; 
     } 
    } 

    public void Run() 
    { 
     MoveRightPaddle(paddleComputer.Position.Y);  
    } //im not really sure about this part. this is the only way that I didnt get squiggly line. 

然後我在Controller.cs的方法,以使球移動,彈跳和借鑑。我也使用它來繪製方法Run()內的槳。代碼上面

+0

這是一個有點不清楚你在問什麼;你在問如何實現計算機的槳的運動,或者計算機對手的行爲是什麼_策略。 – Codor

+0

試試'gameloop' – kevintjuh93

+0

爲什麼你發佈MovePlayerPaddle兩次? MoveLeftPaddle的代碼在哪裏? – Hayden

回答

1

理想情況下,您的計算機和播放器的槳將是相同的,你將有一個單獨的控制器 - PlayerController將採取用戶輸入並基於此調用MovePaddle,計算機控制器將檢查球位置來決定如何調用MovePaddle。

您可以使ComputerController存儲之前X幀的位置,只需選擇它用於其決策的數據的年齡就可以調整難度。

+1

我也會建議嘗試移動球,但覆蓋一維[佩林噪音](https://en.wikipedia.org/wiki/Perlin_noise)(或類似的東西),使運動更「自然」。 – Codor

+0

在分析移動的位置時,是指覆蓋球位置的噪音?如果是這樣,這是一個很好的小觸摸 –

+0

要麼或者將噪聲添加到槳的「完美」位置,結果應該是相似的。 – Codor

0

由於500 - 內部服務器錯誤已在註釋部分指出的那樣,你只能改變參數的值傳遞(在這種情況下,newComputerPosition),不paddleComputer.Position.Y

我不認爲你需要任何參數,在所有的MoveRightPaddle像這樣:

public void MoveRightPaddle() 
{ 
    if (ball.Position.Y >= paddleComputer.Position.Y) 
    { 
     paddleComputer.Position.Y += BALLSPEED; // I don't know why this uses a different value from the else statement 
    } 
    else 
    { 
     paddleComputer.Position.Y -= ball.Velocity.Y; 
    } 
} 

public void Run() 
{ 
    MoveRightPaddle();  
} 

不過,我感應有一個代碼味道的地方,如果你在呼喚這些變量直接,因此我會建議尋找解決這個問題的方法。

如何做出正確的槳更好地在移動

目前,你的右槳將繼續跟着球無論球是否向它的標題與否,或者如果槳將出界或不。

如果您知道球的x direction,您可以快速確定右槳是否需要移動。

例如:

if (ball_x_direction > 0) // because for the ball to go right, the direction needs to be positive 
{ 
    // move paddle here: 
} 

爲了檢查是否槳是要去關閉屏幕(僅顯示了屏幕的頂部(即MoveRightPaddle第二個條件)):

if (paddleComputer.Position.Y - ball.Velocity.Y < 0) 
    paddleComputer.Position.Y = 0; 
} else { 
    paddleComputer.Position.Y -= ball.Velocity.Y; 
}