当前位置 主页 > 网站技术 > 代码类 >

    C#实现飞行棋(Winform)

    栏目:代码类 时间:2020-02-06 12:08

    本文实例为大家分享了C#实现飞行棋的具体代码,供大家参考,具体内容如下

    基于Winform框架写的
    不足之处请大佬指教

    using System;
    using System.Drawing;
    using System.Windows.Forms;
    
    namespace 飞行棋
    {
     public partial class Form1 : Form
     {
      public Form1()
      {
       InitializeComponent();
      }
      //创建一个数组装游戏地板
      int[] mapList = new int[390];
      //创建装图片的数组
      PictureBox[] mappic = new PictureBox[390];
      //创建路的数组
      int[] road = new int[100];
      //创建地图 
      Panel map = new Panel();
      int size = 30;
      //创建骰子
      PictureBox dice = new PictureBox();
      //初始位置的停放区域红色的
      Panel plan1 = new Panel();
      //初始位置的停放区域绿色的
      Panel plan2 = new Panel();
      private void Form1_Load(object sender, EventArgs e)
      {
       this.Size = new Size(1200, 600);
       this.FormBorderStyle = FormBorderStyle.FixedSingle;
       this.Location = new Point(250, 100);
       this.BackColor = Color.Wheat;
       map.Size = new Size(30*size, 13*size);
       map.BorderStyle = BorderStyle.FixedSingle;
       map.Location = new Point(40,160);
       this.Controls.Add(map);
       //显示图片的方法
       Init();
    
       
       plan1.Size = new Size(100, 100);
       plan1.Location = new Point(map.Left, map.Top - 120);
       plan1.BackgroundImage = Image.FromFile("../../img/circle.png");
       plan1.BackgroundImageLayout = ImageLayout.Stretch;
       this.Controls.Add(plan1);
       
       plan2.Size = new Size(100, 100);
       plan2.Location = new Point(map.Left+120 ,map.Top - 120);
       plan2.BackgroundImage = Image.FromFile("../../img/circle.png");
       plan2.BackgroundImageLayout = ImageLayout.Stretch;
       this.Controls.Add(plan2);
    
       PictureBox redPlayer = new PictureBox();
       redPlayer.Size = new Size(80, 80);
       redPlayer.Image = Image.FromFile("../../img/red.png");
       redPlayer.Location = new Point(10, 10);
       redPlayer.SizeMode = PictureBoxSizeMode.StretchImage;
       plan1.Controls.Add(redPlayer);
    
       PictureBox greenPlayer = new PictureBox();
       greenPlayer.Size = new Size(80, 80);
       greenPlayer.Image = Image.FromFile("../../img/green.png");
       greenPlayer.Location = new Point(10, 10);
       greenPlayer.SizeMode = PictureBoxSizeMode.StretchImage;
       plan2.Controls.Add(greenPlayer);
    
       //创建对话框
       tall.Size = new Size(200, 500);
       tall.Location = new Point(map.Right + 20, 50);
       tall.ReadOnly = true;
       this.Controls.Add(tall);
       //玩家一:
       name.Size = new Size(100, 30);
       name.Location = new Point(45,10);
       this.Controls.Add(name);
       //玩家二:
       names.Size = new Size(100, 30);
       names.Location = new Point(160,10 );
       this.Controls.Add(names);
       btn.Location = new Point(300,10);
       btn.Text = "开始游戏";
       btn.Size = new Size(100, 30);
       btn.BackColor = Color.Pink;
       btn.Click += Btn_Click;
       this.Controls.Add(btn);
    
       //骰子
       dice.Size = new Size(80, 80);
       dice.Image = Image.FromFile("../../img/roll.png");
       dice.Location = new Point(map.Right-160,map.Top-120);
       dice.SizeMode = PictureBoxSizeMode.StretchImage;
       this.Controls.Add(dice);
       dice.MouseClick += Dice_MouseClick;
       
       
      }
    
      private void Btn_Click(object sender, EventArgs e)
      {
    
       //创建初始的弹框
       Tall(string.Format("请两人投掷骰子,{0}先手,点大的先走",name.Text));
       
       playName[0] = name.Text;
       playName[1] = names.Text;
       tall.Focus();
      }
    
      TextBox name = new TextBox();
      TextBox names = new TextBox();
      Button btn = new Button();
      
      //创键记录的对话框
      RichTextBox tall = new RichTextBox();
      //创建随机
      Random r = new Random();
      // 轮流投掷骰子 0代表红方 1代表绿方
      bool[] playStart = new bool[2] { true, false };
      //记录双方当前的位置
      int[] playPosition = new int[2] { -1, -1 };
      int[] playStand = new int[2] { -1, -1 };
      // 记录骰子的点数
      int[] shaizi = new int[2];
      string[] playName = new string[2];
      //数组存储点数
      int[] num = new int[2] ;
      //1.轮流投掷筛子决定谁先出门
      private void Dice_MouseClick(object sender, MouseEventArgs e)
      {
       PlayDice();
       PlayGame();
    
    
      }
      private void PlayDice()
      {
       //红方投掷 红方为true 投掷完之后变为false 绿方投掷
       if (playStart[0])
       {
        shaizi[0] = r.Next(1,7);
        Tall(String.Format("{1}投掷出{0}点", shaizi[0],playName[0]));
        playStart[0] = !playStart[0];
    
       }
       else
       {
        playStart[0] = !playStart[0];
       }
       //绿方投掷 绿方为false 绿方投掷完之后变为true .轮到红方投掷
       if (playStart[1])
       {
        shaizi[1] = r.Next(1, 7);
        Tall(String.Format("{1}投掷出{0}点", shaizi[1],playName[1]));
        playStart[1] = !playStart[1];
    
       }
       else
       {
        playStart[1] = !playStart[1];
       }
      }
      //决定游戏谁先手
      private void OutDoor()
      {
       //红方为true 绿方为false的时候一回合完了 一回合完之后对应的骰子数都不为0
       if (playStart[0]&&!playStart[1]&&(shaizi[0]!=0||shaizi[1]!=0))
       {
        if (shaizi[0] == shaizi[1])
        {
         Tall("双方点数相同,请重新投掷");
        }
        else
        {
         //第二回合
         st = false;
         if (shaizi[0] > shaizi[1])
         {
          Tall(String.Format("{0}点数较大,先行一步,{0}投掷",name.Text));
          playStart[0] = true;
          playStart[1] = false;
    
         }
         if (shaizi[0] < shaizi[1])
         {
          Tall(String.Format("{0}点数较大,先行一步,{0}投掷", names.Text));
          playStart[0] = false;
          playStart[1] = true;
         }
        }
       }
    
      }
    
    
      bool st = true;
      //控制游戏谁先走
      private void PlayGame()
      {
       //判断游戏刚开始时候比点数先行
       if (st == true)
       {
        OutDoor();
        //都为false的时候绿方投掷
        if (!playStart[0]&&playStart[1])
        {
         Tall(string.Format("请{0}投掷",names.Text));
        }//都为true的时候红方投掷
        else if(playStart[0]&&!playStart[1])
        {
         Tall(string.Format("请{0}投掷!",name.Text));
        }
       }
       else
       {
        if (playStart[0] && !playStart[1])//如果绿方大, 绿方为true
        {
         PlayReturn(1);
        }//红方
        else if (!playStart[0] && playStart[1])
        {
         PlayReturn(0);
        } 
       }
    
      }
      /// <summary>
      /// 双方轮流游戏
      /// </summary>
      /// 传入参数index0为红方 1为绿方
      bool[] re = new bool[2] { false, false };
      private void PlayReturn(int index)
      {
       //都没出门
       if (playPosition[index] == -1)
       {
    
        switch (shaizi[index])
        {
         case 2:
         case 4:
          Tall(String.Format("{0}可以起步", playName[index]));
          playPosition[index] = 0;
          playStand[index] = 0;
          //如果两个位置相等
          if (playPosition[1] == playPosition[0])
          {
           mappic[road[playPosition[index]]].Image = imageList1.Images[2];
          }
          else
          {
           mappic[road[playPosition[index]]].Image = imageList1.Images[index];
          }
          break;
         case 6:
          playStart[index] = true;
          playStart[1 - index] = false;
          Tall(String.Format("{0}可以起步", playName[index]));
          playPosition[index] = 0;
          playStand[index] = 0;
          if (playPosition[1] == playPosition[0])
          {
           mappic[road[playPosition[index]]].Image = imageList1.Images[2];
          }
          else
          {
           mappic[road[playPosition[index]]].Image = imageList1.Images[index];
          }
          Tall(String.Format("请{0}投掷骰子", playName[index]));
          break;
         default:
          Tall(String.Format("很遗憾,{0}投掷出{1}点无法起步,轮到{2}投掷", playName[index], shaizi[index], playName[1 - index]));
          break;
        }
        if (playPosition[0] != -1)
        {
         plan1.Controls.Clear();
        }
        if (playPosition[1] != -1)
        {
         plan2.Controls.Clear();
        }
       }
       else
       {
        //改变位置之前记录好之前的位置
        playStand[index] = playPosition[index];
        playPosition[index] += shaizi[index];
        if (playPosition[index] >= 99)
        {
         MessageBox.Show(playName[index] + "获胜");
         playPosition[index] = 99;
         //改变图片
         Change(index);
         return;
        }
        Tall(string.Format("{0}移动了{1}步", playName[index], shaizi[index]));
        //改变图片
        Change(index);
    
        //判断移动完成之后的位置是如何
        if (playPosition[index] == playPosition[1 - index])
        {
         playPosition[1 - index] = 0;
         playStand[1 - index] = playPosition[1 - index];
         Tall(String.Format("厉害!{0}精准的将{1}踩回原点,{0}当前的位置是{2},{1}当前的位置是{3},", playName[index], playName[1 - index], playPosition[index], playPosition[1 - index]));
         mappic[road[playPosition[index]]].Image = imageList1.Images[index];
         mappic[road[playPosition[1 - index]]].Image = imageList1.Images[1 - index];
         Tall(string.Format("{0}开始投掷", playName[1 - index]));
        }
    
        switch (mapList[road[playPosition[index]]])
        {
         case 1:
          Tall(string.Format("{0}安全到达!当前位置是{1}", playName[index], playPosition[index]));
          Tall(String.Format("{0}开始投掷!", playName[1-index]));
          break;
         case 2:
          Tall(string.Format("很不幸,{0}踩中了香蕉皮,后退6步,当前位置是{1}", playName[index], playPosition[index]));
          playStand[index] = playPosition[index];
          playPosition[index] -= 6;
          Change(index);
          /*Tall(string.Format("{0}当前位置是{1}", playName[index], playPosition[index]));*/
          Tall(string.Format("{0}开始投掷", playName[1 - index]));
          break;
         case 3:
          Tall(String.Format("恭喜!{0}踩中时空隧道,前进6步!当前位置是{1}", playName[index], playPosition[index]));
          playStand[index] = playPosition[index];
          playPosition[index] += 6;
          Change(index);
          /*Tall(string.Format("{0}当前位置是{1}", playName[index], playPosition[index]));*/
          Tall(string.Format("{0}开始投掷", playName[1 - index]));
          break;
         case 4:
          Tall(string.Format("好可惜,{0}踩中了陷阱,暂停一回合", playName[index]));
          re[index] = true;
          re[1 - index] =false;
          break;
         case 5:
          Tall(string.Format("真好,{0}踩中幸运星,在玩一回合!当前位置是{1}", playName[index], playPosition[index]));
          playStart[index] = true;
          playStart[1 - index] = false;
          Tall(string.Format("{0}继续投掷!", playName[index]));
          break;
         case 6:
          Tall(string.Format("真好!{0}踩中秘籍,请选择措施!当前位置是{1}", playName[index], playPosition[index]));
          DialogResult result = MessageBox.Show("是否与对方更换位置!", "移魂大法", MessageBoxButtons.YesNo);
          if (result == DialogResult.Yes)
          {
           int temp = playPosition[index];
           playPosition[index] = playPosition[1 - index];
           playPosition[1 - index] = temp;
           playStand[index] = playPosition[index];
           playStand[1 - index] = playPosition[1 - index];
           mappic[road[playPosition[index]]].Image = imageList1.Images[index];
           mappic[road[playPosition[1 - index]]].Image = imageList1.Images[1 - index];
    
          }
          Tall(string.Format("{0}当前位置是{1},{2}的位置是{3}", playName[index], playPosition[index], playName[1 - index], playPosition[1 - index]));
          Tall(string.Format("{0}开始投掷。", playName[1 - index]));
          break;
         case 7:
          Tall(string.Format("幸运!{0}获得手枪,可选择击退对方3步!当前位置是{1}", playName[index], playPosition[index]));
          DialogResult res = MessageBox.Show("是否选择击退对方三步!", "手枪!", MessageBoxButtons.YesNo);
          if (res == DialogResult.Yes)
          {
           playStand[1 - index] = playPosition[1 - index];
           playPosition[1 - index] -= 3;
           mappic[road[playPosition[1 - index]]].Image = imageList1.Images[1 - index];
           Change(1 - index);
          }
          /* Tall(string.Format("{0}被击退对方3步!当前位置是{1}", playName[1 - index], playPosition[1 - index]));*/
          Tall(string.Format("{0}开始投掷。", playName[1 - index]));
          break;
         default:
          break;
        }
        if (re[index] && !re[1 - index])
        {
         playStart[index] = true;
         playStart[1 - index] = false;
         re[index] = false;
         re[1 - index] = false;
        }
    
       }
      }
    
      private void Change( int index)
      {
       //如果移动完之后再同一个位置
       if (playPosition[1] == playPosition[0])
       {
        mappic[road[playPosition[index]]].Image = imageList1.Images[2];
       }
       else
       {//移动完成之后显示对应玩家的图片
        mappic[road[playPosition[index]]].Image = imageList1.Images[index];
       }
       //原本位置图片的显示,如果两人在同一个位置站着,并且都在路上自己离开之后,留下对方的图片在原地在起点的时候
       if (playStand[0]==playStand[1]&&playStand[0]!=-1&&playStand[1]!=-1&&playPosition[1-index]==0)
       {
        mappic[road[playStand[index]]].Image = imageList1.Images[1 - index];
        mappic[road[playPosition[index]]].Image = imageList1.Images[ index];
       }
       else //如果两人不再同一位置判断之前的脚下是什么
       {
        switch (mapList[road[playStand[index]]])
        {
         //整个地图的图片
         case 0:
          mappic[road[playStand[index]]].Image = Image.FromFile("../../img/water.gif");
          break;
         //游戏区域的路
         case 1:
          mappic[road[playStand[index]]].Image = Image.FromFile("../../img/grass.png");
          break;
         case 2:
          mappic[road[playStand[index]]].Image = Image.FromFile("../../img/sk.jpg");
          break;
         case 3:
          mappic[road[playStand[index]]].Image = Image.FromFile("../../img/xj.jpg");
          break;
         case 4:
          mappic[road[playStand[index]]].Image = Image.FromFile("../../img/xianjing.jpg");
          break;
         case 5:
          mappic[road[playStand[index]]].Image = Image.FromFile("../../img/xx.jpg");
          break;
         case 6:
          mappic[road[playStand[index]]].Image = Image.FromFile("../../img/jh.jpg");
          break;
         case 7:
          mappic[road[playStand[index]]].Image = Image.FromFile("../../img/sq.jpg");
          break;
         case 10:
          mappic[road[playStand[index]]].Image = Image.FromFile("../../img/start.png");
          break;
         case 11:
          mappic[road[playStand[index]]].Image = Image.FromFile("../../img/end.bmp");
          break;
        
        }
       }
      }
    
      void Tall(string str)
      {
       MessageBox.Show(str);
       tall.AppendText(str+"\r\n");
      }
    
      //创建一个显示所有图片的方法
      void Init()
      {
       //先调用地图的
       CreateMap();
       //在调用道具的 先有地图再有道具
       CreateGear();
       for (int i = 0; i < mapList.Length; i++)
       {
        //创建图片每循环一次创建一个
        PictureBox pic = new PictureBox();
        //图片的大小等于30
        pic.Size = new Size(size, size);
        //判断mapList索引对应的东西
        switch (mapList[i])
        {
         //整个地图的图片
         case 0:
         pic.Image = Image.FromFile("../../img/water.gif");
         break;
         //游戏区域的路
         case 1:
         pic.Image = Image.FromFile("../../img/grass.png");
         break;
         case 2:
         pic.Image = Image.FromFile("../../img/sk.jpg");
         break;
         case 3:
         pic.Image = Image.FromFile("../../img/xj.jpg");
         break;
         case 4:
         pic.Image = Image.FromFile("../../img/xianjing.jpg");
         break;
         case 5:
         pic.Image = Image.FromFile("../../img/xx.jpg");
         break;
         case 6:
         pic.Image = Image.FromFile("../../img/jh.jpg");
         break;
         case 7:
         pic.Image = Image.FromFile("../../img/sq.jpg");
         break;
         case 10:
         pic.Image = Image.FromFile("../../img/start.png");
         break;
         case 11:
         pic.Image = Image.FromFile("../../img/end.bmp");
         break;
    
        }
        //拉伸图片
        pic.SizeMode = PictureBoxSizeMode.StretchImage;
        mappic[i] = pic;
        //算出图片的坐标
        pic.Left = i % 30 * size;
        pic.Top = i / 30 * size;
        map.Controls.Add(pic);
       }
      }
      //给整个地图添加图片
      void CreateMap()
      {
       //调用铺路的方法
       CreateRoad();
       for (int i = 0; i < road.Length; i++)
       {
        mapList[road[i]] = 1;
       }
       //起始图片的索引位置
       mapList[0] = 10;
       //结束图片对应的索引位置
       mapList[mapList.Length - 1] = 11;
      } 
      //算出路怎么铺
      void CreateRoad()
      {
       //111111
       //  1
       //111111
       //1
       //111111
       //第一行铺的路30个
       for (int i = 0; i < 30; i++)
       {
        road[i] = i;
       }
       //第2个列的路
       for (int i = 30; i <= 35; i++)
       {
        road[i] = road[i - 1] + 30;
       }
       //第三个路
       for (int i = 36; i <65; i++)
       {
        road[i] = road[i - 1] - 1;
       }
       //第4列的路
       for (int i = 65; i <=70; i++)
       {
        road[i] = road[i - 1] + 30;
       }
       //第五行的数
       for (int i =71; i <100; i++)
       {
        road[i] = road[i - 1] + 1;
       }
      }
    
      //定义道具的数组
      int[] back = { 7, 27, 42, 62, 73, 96 };
      int[] forword = { 10, 25, 33, 65, 80, 88 };
      int[] stop = { 3, 20, 35, 50, 60, 70, 90 };
      int[] star = { 5, 28, 45, 71, 85 };
      int[] change = { 4, 55, 75, 98 };
      int[] gun = { 11, 32, 66, 83 };
      //定义一个道具放置位置的方法
      void CreateGear()
      {
       for (int i = 0; i < back.Length; i++)
       {
        //将地图对应的路然后将索引换成对应的道具
        mapList[road[back[i]]] = 2;
       }
       for (int i = 0; i < forword.Length; i++)
       {
        mapList[road[forword[i]]] = 3;
       }
       for (int i = 0; i < stop.Length; i++)
       {
        mapList[road[stop[i]]] = 4;
       }
       for (int i = 0; i <star.Length; i++)
       {
        mapList[road[star[i]]] = 5;
       }
       for (int i = 0; i < change.Length; i++)
       {
        mapList[road[change[i]]] = 6;
       }
       for (int i = 0; i < gun.Length; i++)
       {
        mapList[road[gun[i]]] = 7;
       }
      }
     }
    }