Board logo

標題: 2011 0917 貪食蛇(可吃蘋果版) [打印本頁]

作者: buy    時間: 2011-9-17 11:33     標題: 2011 0917 貪食蛇(可吃蘋果版)

  1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4. using System.Text;
  5. using System.Drawing;

  6. namespace SnakeBase
  7. {
  8.     // 定義方向
  9.     enum Direction
  10.     {
  11.         Up, Down, Left, Right
  12.     }

  13.     //蛇節點
  14.     class NodeSnake
  15.     {
  16.         public int x, y; //目前節點座標
  17.         public int pre_x, pre_y; // 前一秒的座標

  18.         public void SetCurrentXYToPreXY()
  19.         {
  20.             this.pre_x = this.x;
  21.             this.pre_y = this.y;
  22.         }
  23.     }

  24.     //蘋果
  25.     class NodeApple
  26.     {
  27.         public int x, y; //目前節點座標
  28.         public NodeApple()
  29.         {
  30.             x = 30;
  31.             y = 30;
  32.         }
  33.         public void SetXAndY(int x, int y)
  34.         {
  35.             this.x = x;
  36.             this.y = y;
  37.         }
  38.     }

  39.     //貪食蛇
  40.     class Snake
  41.     {
  42.         private int width = 50;
  43.         private int height = 40;
  44.         private int pixelPerBody = 10;

  45.         private NodeApple myApple;

  46.         public Direction myDirection = Direction.Down; //目前移動方向
  47.         List<NodeSnake> myBody = new List<NodeSnake>(); // 目前蛇身

  48.         public Snake()
  49.         {
  50.             myBody.Add(new NodeSnake {
  51.                 x = 0,
  52.                 y =0
  53.             });
  54.             myBody.Add(new NodeSnake
  55.             {
  56.                 x = 1,
  57.                 y = 0
  58.             });
  59.             myBody.Add(new NodeSnake
  60.             {
  61.                 x = 2,
  62.                 y = 0
  63.             });
  64.             myApple = new NodeApple();
  65.         }

  66.         public Snake(int lengthOfBody)
  67.         {
  68.             for (int i = 0; i < lengthOfBody; i++)
  69.             {
  70.                 myBody.Add(new NodeSnake
  71.                 {
  72.                     x = i,
  73.                     y = 0
  74.                 });
  75.             }
  76.             myApple = new NodeApple();
  77.         }

  78.         //自動往前一格
  79.         public void Move()
  80.         {
  81.             var IsEatApple = false;
  82.             var d = this.myDirection;
  83.             int index = 0; //紀錄目前判斷到哪個蛇身
  84.             foreach (var bdy in this.myBody)
  85.             {
  86.                 if (index == 0) // 頭
  87.                 {
  88.                     bdy.SetCurrentXYToPreXY(); //先儲存目前節點的目前位置
  89.                     if (d == Direction.Down)
  90.                     {
  91.                         bdy.y += 1; //往下走
  92.                     }
  93.                     else if (d == Direction.Up)
  94.                     {
  95.                         bdy.y -= 1; //往上走
  96.                     }
  97.                     else if (d == Direction.Left)
  98.                     {
  99.                         bdy.x -= 1; //往左走
  100.                     }
  101.                     else
  102.                     {
  103.                         bdy.x += 1; //往右走
  104.                     }
  105.                     // 有無吃到蘋果
  106.                     if (bdy.x == this.myApple.x && bdy.y == myApple.y)
  107.                     {
  108.                         IsEatApple = true;
  109.                     }
  110.                 }
  111.                 else //身體
  112.                 {
  113.                     bdy.SetCurrentXYToPreXY(); //先儲存目前節點的目前位置
  114.                     bdy.x = myBody[index - 1].pre_x;
  115.                     bdy.y = myBody[index - 1].pre_y;
  116.                 }
  117.                 index++;
  118.             }
  119.             if (IsEatApple) //判斷如果有吃到蘋果
  120.             {
  121.                 var last = this.myBody.Last();
  122.                 this.myBody.Add(new NodeSnake()
  123.                 {
  124.                     x = last.pre_x,
  125.                     y = last.pre_y
  126.                 });
  127.                 NewApplePosition();
  128.             }
  129.         }

  130.         /// <summary>
  131.         ///  重新放蘋果
  132.         /// </summary>
  133.         private void NewApplePosition()
  134.         {
  135.             Random a = new Random();
  136.             bool IsCollection = false;
  137.             int x, y;
  138.             do
  139.             {
  140.                  x = a.Next(1, this.width );
  141.                  y = a.Next(1, this.height );
  142.                 foreach (var bdy in this.myBody)
  143.                 {
  144.                     if (bdy.x == x && bdy.y == y)
  145.                     {
  146.                         IsCollection = true;
  147.                     }
  148.                 }
  149.             } while (IsCollection == true);
  150.             this.myApple.SetXAndY(x,y);
  151.         }


  152.         /// <summary>
  153.         ///  每次移動一格的方法
  154.         /// </summary>
  155.         /// <param name="d">往哪個方向移動</param>
  156.         public void Move(Direction d)
  157.         {
  158.                 int index = 0; //紀錄目前判斷到哪個蛇身
  159.                 foreach (var bdy in this.myBody)
  160.                 {
  161.                     if (index == 0) // 頭
  162.                     {
  163.                         bdy.SetCurrentXYToPreXY(); //先儲存目前節點的目前位置
  164.                         if (d == Direction.Down)
  165.                         {
  166.                             bdy.y += 1; //往下走
  167.                         }
  168.                         else if (d == Direction.Up)
  169.                         {
  170.                             bdy.y -= 1; //往上走
  171.                         }
  172.                         else if (d == Direction.Left)
  173.                         {
  174.                             bdy.x -= 1; //往左走
  175.                         }
  176.                         else
  177.                         {
  178.                             bdy.x += 1; //往右走
  179.                         }               
  180.                     }
  181.                     else //身體
  182.                     {
  183.                         bdy.SetCurrentXYToPreXY(); //先儲存目前節點的目前位置
  184.                         bdy.x = myBody[index - 1].pre_x;
  185.                         bdy.y = myBody[index - 1].pre_y;
  186.                     }
  187.                     index++;
  188.                 }         
  189.         }

  190.         /// <summary>
  191.         ///  把整條蛇畫出來,並且回傳200*200圖片
  192.         /// </summary>
  193.         /// <returns></returns>
  194.         public Bitmap GetBitmapFromSnake()
  195.         {
  196.             Bitmap bmp = new Bitmap(this.width * this.pixelPerBody, this.height * this.pixelPerBody);
  197.             Graphics GDI = Graphics.FromImage(bmp);
  198.             Pen pen = new Pen(Color.White, 1);

  199.             pen.Color = Color.Red; //畫蘋果
  200.             GDI.DrawRectangle(pen, (float)this.myApple.x * this.pixelPerBody, (float)this.myApple.y * this.pixelPerBody,
  201.                 (float)this.pixelPerBody, (float)this.pixelPerBody);

  202.             pen.Color = Color.White; //畫蘋果
  203.             foreach (var node in this.myBody)
  204.             {
  205.                 GDI.DrawRectangle(pen, (float)node.x * this.pixelPerBody, (float)node.y * this.pixelPerBody, (float)this.pixelPerBody, (float)this.pixelPerBody);
  206.             }

  207.             return bmp;
  208.         }
  209.     }
  210. }
複製代碼

作者: buy    時間: 2011-9-17 11:36

  1. using System;
  2. using System.Collections.Generic;
  3. using System.ComponentModel;
  4. using System.Data;
  5. using System.Drawing;
  6. using System.Linq;
  7. using System.Text;
  8. using System.Windows.Forms;

  9. namespace SnakeBase
  10. {
  11.     public partial class Form1 : Form
  12.     {
  13.         public Form1()
  14.         {
  15.             InitializeComponent();
  16.         }

  17.         Snake snake1 = new Snake();
  18.         private void Form1_Load(object sender, EventArgs e)
  19.         {
  20.             foreach (var control in this.Controls)
  21.             {
  22.                 if( control.ToString().Contains("Button") )
  23.                 {
  24.                     var tmp = (System.Windows.Forms.Button)control;
  25.                     tmp.PreviewKeyDown += ArrowButton_PreviewKeyDown;
  26.                 }
  27.             }
  28.             pictureBox1.Image =  snake1.GetBitmapFromSnake();
  29.         }

  30.         private void btnRight_Click(object sender, EventArgs e)
  31.         {
  32.             SnakeMoveRight();
  33.         }

  34.         private void SnakeMoveRight()
  35.         {
  36.             snake1.myDirection = Direction.Right;
  37.         }

  38.         private void btnDown_Click(object sender, EventArgs e)
  39.         {
  40.             snake1.myDirection = Direction.Down;
  41.         }

  42.         private void btnLeft_Click(object sender, EventArgs e)
  43.         {
  44.             snake1.myDirection = Direction.Left;
  45.         }

  46.         private void btnUp_Click(object sender, EventArgs e)
  47.         {
  48.             snake1.myDirection = Direction.Up;
  49.         }

  50.         private void btnStart_Click(object sender, EventArgs e)
  51.         {
  52.             snake1 = new Snake(3);
  53.             pictureBox1.Image = snake1.GetBitmapFromSnake();
  54.             timer_Move.Enabled = true;
  55.             timer_Refresh.Enabled = true;
  56.         }

  57.         private void timer_Move_Tick(object sender, EventArgs e)
  58.         {
  59.             snake1.Move();
  60.         }

  61.         private void timer_Refresh_Tick(object sender, EventArgs e)
  62.         {
  63.             pictureBox1.Image = snake1.GetBitmapFromSnake();
  64.         }

  65.         private void btn_SppedUp_Click(object sender, EventArgs e)
  66.         {
  67.             if (timer_Move.Interval >= 200)
  68.             {
  69.                 timer_Move.Interval = timer_Move.Interval - 100;
  70.             }
  71.         }

  72.         private void Form1_KeyPress(object sender, KeyPressEventArgs e)
  73.         {

  74.         }

  75.         private void Form1_KeyDown(object sender, KeyEventArgs e)
  76.         {
  77.             if (e.KeyCode == Keys.Right)
  78.             {
  79.                 SnakeMoveRight();
  80.             }
  81.         }

  82.         private void btnStart_KeyDown(object sender, KeyEventArgs e)
  83.         {
  84.             if (e.KeyCode == Keys.Right)
  85.             {
  86.                 SnakeMoveRight();
  87.             }
  88.         }


  89.         private void ArrowButton_PreviewKeyDown(object sender, PreviewKeyDownEventArgs e)
  90.         {
  91.             if (e.KeyCode == Keys.Right)
  92.             {
  93.                 SnakeMoveRight();
  94.             }
  95.         }






  96.     }
  97. }
複製代碼

作者: p17johnny    時間: 2011-9-20 21:24

自嘲:  哈哈  我以後用不了電腦了,  我爸把資源回收桶用不見  結果說是我?   弄壞掉之後就算了~   
笑,  以後不用上課了(回家寫不了)
作者: buy    時間: 2011-9-24 10:27

[attach]515[/attach]




歡迎光臨 種子論壇 | 高雄市資訊培育協會學員討論區 (http://seed.istak.org.tw/) Powered by Discuz! 7.2