C#实现飞行棋(Winform)

作者:搁°浅 时间:2023-08-07 07:08:55 

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

C#实现飞行棋(Winform)

基于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;
  }
 }
}
}

来源:https://blog.csdn.net/JGD313/article/details/103453184

标签:C#,飞行棋
0
投稿

猜你喜欢

  • 利用Flutter制作经典贪吃蛇游戏

    2023-07-21 07:04:13
  • java实现对Hadoop的操作

    2021-10-05 16:30:37
  • MyBatis控制台显示SQL语句的方法实现

    2021-10-18 04:10:00
  • java中的SpringBoot框架

    2022-02-10 16:50:05
  • Gradle的使用教程详解

    2022-08-12 05:02:11
  • IntelliJ IDEA 2019.1.1 for MAC 下载和注册码激活教程图解

    2023-07-23 08:01:50
  • Flutter进阶之实现动画效果(九)

    2023-04-11 12:20:06
  • C++函数指针详解

    2021-10-07 15:49:44
  • Java基于二叉查找树实现排序功能示例

    2022-09-04 21:50:52
  • C语言中传值与传指针的介绍与区别

    2023-08-01 15:26:51
  • Android开发之menu菜单

    2023-04-13 04:10:45
  • SpringCloud断路器Hystrix原理及用法解析

    2022-03-20 16:47:41
  • Java原子操作CAS原理解析

    2021-10-20 01:07:05
  • flutter实现底部导航栏切换

    2023-05-30 14:43:40
  • jsp如何获取Session中的值

    2023-07-01 05:59:28
  • Android中使用定时器的三种方法

    2022-06-04 00:16:20
  • C语言中fchdir()函数和rewinddir()函数的使用详解

    2022-02-08 20:08:08
  • Mybatis-Plus 全局配置无效的解决方案

    2022-06-29 12:46:02
  • Java类库BeanUtils组件使用方法及实例详解

    2022-09-28 00:37:49
  • Android WebView实现全屏播放视频

    2023-04-12 17:12:39
  • asp之家 软件编程 m.aspxhome.com