貪吃蛇大作戰單人版完整代碼以及詳細解釋


貪吃蛇總結:

1. 創建WPF應用程序

 

2. 添加Canvas標簽。Name=back;

 

3. 添加loaded事件

 

4. 在loaded事件中創建蛇(設置蛇的位置,大小,顏色)

  this.Left = 0;

            this.Top = 0;

            this.Width  = 800;

            this.Height = 600;

            for (int i = 0; i < 5; i++)

            {

                bd = new Border();

                bd.Width = bd.Height = 10;

                bd.CornerRadius = new CornerRadius(5);

                if (i == 0)

                    bd.Background = Brushes.Red;

                else

                    bd.Background = Brushes.Black;

                Canvas.SetTop(bd,200+i*bd.Height);

                Canvas.SetLeft(bd,200);

                back.Children.Add(bd);

                snake.Add(bd);

 

5. 添加一個timer,(問題:添加timer和winform程序中不一樣

Winform 程序中直接添加。

WPF應用程序中不能直接添加,需要引入命名空間:

Using System.Thearing

DispatcherTimer tm1 = new DispatcherTimer();

            tm1.Interval =TimeSpan.FromMilliseconds(200);

            tm1.Tick += Tm1_Tick;

            tm1.Start();

            this.KeyDown += MainWindow_KeyDown;

6. 添加鍵盤事件,讀取鍵盤敲下的字符

 if (e.Key==Key.Up&&str!="d" )

            {

                str = "up";

            }

            if (e.Key==Key.Down&&str!="up")

            {

                str = "d";

[csharp]  view plain  copy
 
 print?
  1.   

 

            {

                str = "l";

            }

            if (e.Key == Key.Right&&str!="l")

            {

                str = "r";

            }

 

7.在timer事件中實現蛇的移動(問題:在實現向左移動時出現錯誤

解決:添加一個集合,來存儲蛇的位置信息,與此同時添加一個border儲存位置信息border)

 

        //創建蛇的位置集合

        List<Border> snakeback =new List<Border>();

 //創建蛇的位置border

                Border bdback = new Border();

                bdback.Height = bdback.Width = 10;

                Canvas.SetTop(bdback, 200 + i * bd.Height);

                Canvas.SetLeft(bdback, 200);

                snakeback.Add(bdback);

if (str == "up")

            {

                Canvas.SetTop(snake[0],Canvas.GetTop(snake[0]) - snake[0].Height);

                run();

            }

            if (str=="d")

            {

                Canvas.SetTop(snake[0],Canvas.GetTop(snake[0])+ snake[0].Height);

                run();

            }

            if (str == "l")

            {

                Canvas.SetLeft(snake[0],Canvas.GetLeft(snake[0]) - snake[0].Height);

                run();

            }

            if (str == "r")

            {

                Canvas.SetLeft(snake[0],Canvas.GetLeft(snake[0]) + snake[0].Height);

                run();

            }

 

private void run()

        {

            for (int i = 1; i < snake.Count; i++)

            {

                Canvas.SetTop(snake[i],Canvas.GetTop(snakeback[i - 1]));

                Canvas.SetLeft(snake[i],Canvas.GetLeft(snakeback[i - 1]));

            }

            for (int i = 0; i < snake.Count; i++)

            {

                Canvas.SetTop(snakeback[i],Canvas.GetTop(snake[i]));

                Canvas.SetLeft(snakeback[i],Canvas.GetLeft(snake[i]));

            }

        }

 

8. 判斷與食物相撞時,食物改變位置

 if (Canvas.GetTop(snake[0])==Canvas.GetTop(food)&&Canvas.GetLeft(snake[0])==Canvas.GetLeft(food))

            {

                Canvas.SetTop(food, ra.Next(60) * 10);

                Canvas.SetLeft(food, ra.Next(80) * 10);

}

9. 在與食物相撞時添加一節蛇尾

10. 添加一個border來作為蛇尾,添加到snake集合中

11. 添加一個border存儲所增加的蛇尾的位置信息

if (Canvas.GetTop(snake[0])==Canvas.GetTop(food)&&Canvas.GetLeft(snake[0])==Canvas.GetLeft(food))

            {

                Canvas.SetTop(food, ra.Next(60) * 10);

                Canvas.SetLeft(food, ra.Next(80) * 10);

                //定義一個增加的蛇尾的border

                Border bdfood = new Border();

                bdfood.Height = bdfood.Width = 10;

                bdfood.CornerRadius = new CornerRadius(5);

                bdfood.Background = Brushes.Azure;

                Canvas.SetTop(bdfood,Canvas.GetTop(snake[snake.Count-1]));

                Canvas.SetLeft(bdfood,Canvas.GetLeft(snake[snake.Count - 1]));

                back.Children.Add(bdfood);

                snake.Add(bdfood);

 

                //定義一個border存儲增加的的集合

                Border br = new Border();

                br.Height = br.Width = 10;

                Canvas.SetTop(br, Canvas.GetTop(snakeback[snakeback.Count - 1]));

                Canvas.SetLeft(br, Canvas.GetLeft(snakeback[snakeback.Count - 1]));

                snakeback.Add(br);

            }

 

12.判斷蛇與面板四周相撞或者蛇撞到自己,游戲結束。

 for (int i = 1; i < snake.Count; i++)

            {

                if (Canvas.GetTop(snake[0]) ==Canvas.GetTop(snake[i]) && Canvas.GetLeft(snake[0]) == Canvas.GetLeft(snake[i]))

                {

                    tm1.Stop();

                    MessageBox.Show("GAME  OVER!");

                }

            }

            if (Canvas.GetTop(snake[0]) == 0 ||Canvas.GetTop(snake[0]) == 560 || Canvas.GetLeft(snake[0]) == 0 || Canvas.GetLeft(snake[0]) == 790)

            {

                tm1.Stop();

                MessageBox.Show("GAME  OVER!");

            }

完整版代碼:

 

[csharp]  view plain  copy
 
 print?
  1. using System;  
  2. using System.Collections.Generic;  
  3. using System.Windows;  
  4. using System.Windows.Controls;  
  5. using System.Windows.Input;  
  6. using System.Windows.Media;  
  7. using System.Windows.Threading;  
  8.   
  9. namespace 貪吃蛇1._0  
  10. {  
  11.     /// <summary>  
  12.     /// MainWindow.xaml 的交互邏輯  
  13.     /// </summary>  
  14.     public partial class MainWindow : Window  
  15.     {  
  16.         public MainWindow()  
  17.         {  
  18.             InitializeComponent();  
  19.             this.Background = Brushes.Pink;  
  20.         }  
  21.         string str = "";  
  22.         Border bd;  
  23.         DispatcherTimer tm1;  
  24.         Border food;  
  25.         List<Border> snake = new List<Border>();  
  26.         //創建蛇的位置集合  
  27.         List<Border> snakeback = new List<Border>();  
  28.         List<Border> foodback = new List<Border>();  
  29.         Random ra = new Random();  
  30.         private void Window_Loaded(object sender, RoutedEventArgs e)  
  31.         {  
  32.             this.Left = 0;  
  33.             this.Top = 0;  
  34.             this.Width = 800;  
  35.             this.Height = 600;  
  36.             for (int i = 0; i < 5; i++)  
  37.             {  
  38.                 bd = new Border();  
  39.                 bd.Width = bd.Height = 10;  
  40.                 bd.CornerRadius = new CornerRadius(5);  
  41.                 if (i == 0)  
  42.                     bd.Background = Brushes.Red;  
  43.                 else  
  44.                     bd.Background = Brushes.Black;  
  45.                 Canvas.SetTop(bd, 200 + i * bd.Height);  
  46.                 Canvas.SetLeft(bd, 200);  
  47.                 back.Children.Add(bd);  
  48.                 snake.Add(bd);  
  49.   
  50.                 //創建蛇的位置border  
  51.                 Border bdback = new Border();  
  52.                 bdback.Height = bdback.Width = 10;  
  53.                 Canvas.SetTop(bdback, 200 + i * bd.Height);  
  54.                 Canvas.SetLeft(bdback, 200);  
  55.                 snakeback.Add(bdback);  
  56.             }  
  57.   
  58.             tm1 = new DispatcherTimer();  
  59.             tm1.Interval = TimeSpan.FromMilliseconds(200);  
  60.             tm1.Tick += Tm1_Tick;  
  61.             tm1.Start();  
  62.             this.KeyDown += MainWindow_KeyDown;  
  63.             for (int i = 0; i < 30; i++)  
  64.             {  
  65.                 //創建食物  
  66.                 food = new Border();  
  67.                 food.Height = food.Width = 10;  
  68.                 food.CornerRadius = new CornerRadius(5);  
  69.                 Canvas.SetTop(food, ra.Next(60) * 10);  
  70.                 Canvas.SetLeft(food, ra.Next(80) * 10);  
  71.                 food.Background = Brushes.Orange;  
  72.                 back.Children.Add(food);  
  73.                 foodback.Add(food);  
  74.             }  
  75.         }  
  76.   
  77.         private void MainWindow_KeyDown(object sender, KeyEventArgs e)  
  78.         {  
  79.             if (e.Key == Key.Up && str != "d")  
  80.             {  
  81.                 str = "up";  
  82.             }  
  83.             if (e.Key == Key.Down && str != "up")  
  84.             {  
  85.                 str = "d";  
  86.             }  
  87.             if (e.Key == Key.Left && str != "r")  
  88.             {  
  89.                 str = "l";  
  90.             }  
  91.             if (e.Key == Key.Right && str != "l")  
  92.             {  
  93.                 str = "r";  
  94.             }  
  95.         }  
  96.   
  97.         private void Tm1_Tick(object sender, EventArgs e)  
  98.         {  
  99.             if (str == "up")  
  100.             {  
  101.                 Canvas.SetTop(snake[0], Canvas.GetTop(snake[0]) - snake[0].Height);  
  102.                 run();  
  103.             }  
  104.             if (str == "d")  
  105.             {  
  106.                 Canvas.SetTop(snake[0], Canvas.GetTop(snake[0]) + snake[0].Height);  
  107.                 run();  
  108.             }  
  109.             if (str == "l")  
  110.             {  
  111.                 Canvas.SetLeft(snake[0], Canvas.GetLeft(snake[0]) - snake[0].Height);  
  112.                 run();  
  113.             }  
  114.             if (str == "r")  
  115.             {  
  116.                 Canvas.SetLeft(snake[0], Canvas.GetLeft(snake[0]) + snake[0].Height);  
  117.                 run();  
  118.             }  
  119.             for (int i = 0; i < 30; i++)  
  120.             {  
  121.                 if (Canvas.GetTop(snake[0]) == Canvas.GetTop(foodback[i]) && Canvas.GetLeft(snake[0]) == Canvas.GetLeft(foodback[i]))  
  122.                 {  
  123.                     Canvas.SetTop(foodback[i], ra.Next(60) * 10);  
  124.                     Canvas.SetLeft(foodback[i], ra.Next(80) * 10);  
  125.                     //定義一個增加的蛇尾的border  
  126.                     Border bdfood = new Border();  
  127.                     bdfood.Height = bdfood.Width = 10;  
  128.                     bdfood.CornerRadius = new CornerRadius(5);  
  129.                     bdfood.Background = Brushes.Black;  
  130.                     Canvas.SetTop(bdfood, Canvas.GetTop(snake[snake.Count - 1]));  
  131.                     Canvas.SetLeft(bdfood, Canvas.GetLeft(snake[snake.Count - 1]));  
  132.                     back.Children.Add(bdfood);  
  133.                     snake.Add(bdfood);  
  134.   
  135.                     //定義一個border存儲增加的的集合  
  136.                     Border br = new Border();  
  137.                     br.Height = br.Width = 10;  
  138.                     Canvas.SetTop(br, Canvas.GetTop(snakeback[snakeback.Count - 1]));  
  139.                     Canvas.SetLeft(br, Canvas.GetLeft(snakeback[snakeback.Count - 1]));  
  140.                     snakeback.Add(br);  
  141.                 }  
  142.             }  
  143.             for (int i = 1; i < snake.Count; i++)  
  144.             {  
  145.                 if (Canvas.GetTop(snake[0]) == Canvas.GetTop(snake[i]) && Canvas.GetLeft(snake[0]) == Canvas.GetLeft(snake[i]))  
  146.                 {  
  147.                     tm1.Stop();  
  148.                     MessageBox.Show("GAME  OVER!");  
  149.                 }  
  150.             }  
  151.             if (Canvas.GetTop(snake[0]) == 0 || Canvas.GetTop(snake[0]) == 560 || Canvas.GetLeft(snake[0]) == 0 || Canvas.GetLeft(snake[0]) == 790)  
  152.             {  
  153.                 tm1.Stop();  
  154.                 MessageBox.Show("GAME  OVER!");  
  155.             }  
  156.         }  
  157.   
  158.         private void run()  
  159.         {  
  160.             for (int i = 1; i < snake.Count; i++)  
  161.             {  
  162.                 Canvas.SetTop(snake[i], Canvas.GetTop(snakeback[i - 1]));  
  163.                 Canvas.SetLeft(snake[i], Canvas.GetLeft(snakeback[i - 1]));  
  164.             }  
  165.             for (int i = 0; i < snake.Count; i++)  
  166.             {  
  167.                 Canvas.SetTop(snakeback[i], Canvas.GetTop(snake[i]));  
  168.                 Canvas.SetLeft(snakeback[i], Canvas.GetLeft(snake[i]));  
  169.             }  
  170.         }  
  171.     }  
  172. }  


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM