初學者編寫 C# WinForms 貪吃蛇遊戲,編譯無誤但執行後蛇不會移動。核心程式碼包含 Form2 主視窗、Snake 蛇類別與 Bean 食物類別,使用 Timer 控制遊戲循環,在 pictureBox1_Paint 事件中繪製畫面。
PictureBox 的 Paint 事件不會自動持續觸發。遊戲邏輯雖在 timer1_Tick 中更新座標,但畫面未重繪,導致蛇看似靜止。
在 timer1_Tick 事件處理函式中加入 pictureBox1.Refresh(),強制觸發重繪:
private void timer1_Tick(object sender, EventArgs e)
{
if (play)
{
pictureBox1.Refresh(); // 新增這行
snack1.Addsnack();
}
if (snack1.HeadPoint == food.Origin)
{
pictureBox1.Refresh(); // 吃食物時也要重繪
foodDraw = false;
snack1.Addsnack();
}
if (snack1.Diedif())
{
pictureBox1.Refresh(); // 結束前重繪最後一幀
timer1.Enabled = false;
play = false;
MessageBox.Show("Game Over!");
}
}
Refresh() 會立即使控制項失效並重繪,配合 Timer.Interval = 500 可形成約 2 FPS 的遊戲循環。button1_KeyUp 捕獲 WASD 鍵,透過 snack1.Direction 改變移動方向,邏輯正確。Diedif() 檢查蛇頭是否撞牆或撞到自己,邊界設定為 400x300 像素,與畫格大小 10px 對應。套用此修正後,貪吃蛇即可正常移動、進食與判定結束。