C# 拼图魔方小游戏

 更新时间:2020年02月28日 16:27:23   作者:[Stephen-kzx]  
这篇文章主要介绍了C# 拼图魔方小游戏,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧

工作闲暇之余去逛了逛CodeProject,刚好现有项目主要用到就是winform,浏览了下照片,找到上周带着蛋挞打疫苗回家的照片,于是新生一记,如何把这些图片玩起来~

80后应该都有印象,小时候有种玩具,叫做拼图魔方,90后00后的世界这种玩具应该早已灭绝了。一个塑料小板,上面分隔了很多小图框,通过移动这些小图框,最后拼接成完整的图片

话不多说开始吧~ 先上一张原图

代码也很简单,主要就是通过BitMap分隔现有(后面有时间可以优化下,让玩家自动上传图片,应该会更有意思)图片,然后Random随机打乱分割后图片的顺序,通过点击小方格来完成图片的拼图,为了更方便玩家,每个小方格添加了序号,玩家也可以不参考原图,按照小方格上的序号进行拼图

序号功能实现主要是类MyButton集成父类Button实现:

public class MyButton : Button
  {
    private int number; 
    public int Number
    {
      get
      {
        return this.number;
      }
      set
      {
        this.Text = value.ToString();
        this.number = value;
      }
    } 
    public MyButton()
    {
    }
  }

随机分隔

Random r = new Random();
      int[] a = new int[24];
      int i = 0;
      int b;
      bool exist;
      while (i != a.Length)
      {
        exist = false;
        b = (r.Next(24) + 1);
        for (int j = 0; j < a.Length; j++)
          if (a[j] == b) exist = true;
        if (!exist) a[i++] = b;
      }
      for (int j = 0; j < a.Length; j++)
        ButtonArray[j].Number = a[j];
      // set picture pieces as the background image
      int Number;
      int Row, Column;
      for (int k = 0; k < 5; k++)
      {
        for (int j = 0; j < 5; j++)
        {
          if (k == 4)
            if (j == 4) break;
          Number = ButtonArray[k * 5 + j].Number; //Get The Number Of Button
          Row = (Number - 1) / 5;
          Column = (Number - 1) - (Row * 5);
          ButtonArray[k * 5 + j].Image = CurrentBitmapImage.Clone(new Rectangle(new Point(Column * 75, Row * 75), new Size(75, 75)), System.Drawing.Imaging.PixelFormat.DontCare);
        }
      }

点击小方格,通过改变当前点击的小方格X,Y坐标来更新小方格的位置

private void myButton_LocationChanged(object sender, EventArgs e)
    {
      MyButton A = sender as MyButton;
      YouWin = true;
      int ButtonNumber;
      this.NumberOfMoves++;
      if (ButtonArray == null)
      {
        this.FrmMain_Load(sender, e);
      }
      for (int i = 0; i < 5; i++)
      {
        if (YouWin == false)
          break;
        else for (int j = 0; j < 5; j++)
          {
            ButtonNumber = i * 5 + j;
            if (i == 4 && j == 4)
              break;
            else if (GetNumber(ButtonArray[ButtonNumber].Location.X, ButtonArray[ButtonNumber].Location.Y) == ButtonArray[ButtonNumber].Number)
              continue;
            else
            {
              YouWin = false;
              break;
            }
          }
      }
      if (YouWin)
      {

        if (MessageBox.Show("You Win This Game in " + this.NumberOfMoves.ToString() + " Moves\n\rDo You Want To Play Another Game ?", "Congratulation", MessageBoxButtons.YesNo) == DialogResult.Yes)
          this.LoadNewGame();
        else
          this.Close();
      }
    }
private void myButton_LocationChanged(object sender, EventArgs e)
    {
      MyButton A = sender as MyButton;
      YouWin = true;
      int ButtonNumber;
      this.NumberOfMoves++;
      if (ButtonArray == null)
      {
        this.FrmMain_Load(sender, e);
      }
      for (int i = 0; i < 5; i++)
      {
        if (YouWin == false)
          break;
        else for (int j = 0; j < 5; j++)
          {
            ButtonNumber = i * 5 + j;
            if (i == 4 && j == 4)
              break;
            else if (GetNumber(ButtonArray[ButtonNumber].Location.X, ButtonArray[ButtonNumber].Location.Y) == ButtonArray[ButtonNumber].Number)
              continue;
            else
            {
              YouWin = false;
              break;
            }
          }
      }
      if (YouWin)
      {

        if (MessageBox.Show("You Win This Game in " + this.NumberOfMoves.ToString() + " Moves\n\rDo You Want To Play Another Game ?", "Congratulation", MessageBoxButtons.YesNo) == DialogResult.Yes)
          this.LoadNewGame();
        else
          this.Close();
      }
    }

具体效果如下:

代码有很多已知的可以优化的地方,后面有闲暇时间会处理,如果大家有更好的建议,不妨在下方评论区告知,在此感谢~

点击下载源码

到此这篇关于C# 拼图魔方小游戏的文章就介绍到这了,更多相关C# 拼图魔方内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • C#使用PPT组件的CreateVideo方法实现视频生成

    C#使用PPT组件的CreateVideo方法实现视频生成

    这篇文章主要为大家详细介绍了C#如何使用PPT组件的CreateVideo方法实现视频生成,文中的示例代码讲解详细,有需要的小伙伴可以跟随小编一起学习一下
    2023-10-10
  • C# 多线程更新界面的错误的解决方法

    C# 多线程更新界面的错误的解决方法

    这篇文章主要介绍了C# 多线程更新界面的错误方法,由于一个线程的程序,如果调用一个功能是阻塞的,那么就会影响到界面的更新,导致使用人员操作不便。所以往往会引入双线程的工作的方式,主线程负责更新界面和调度,而次线程负责做一些阻塞的工作,便有了下面春雨里方法
    2021-10-10
  • WPF Trigger改变属性无效问题排查示例详解

    WPF Trigger改变属性无效问题排查示例详解

    这篇文章主要为大家介绍了WPF Trigger改变属性无效问题排查示例详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-10-10
  • WPF制作带小箭头的按钮完整代码

    WPF制作带小箭头的按钮完整代码

    WPF(Windows Presentation Foundation)是微软推出的基于Windows 的用户界面框架。下面通过本文给大家介绍WPF制作带小箭头的按钮完整代码,需要的朋友参考下吧
    2017-12-12
  • C#多线程系列之任务基础(一)

    C#多线程系列之任务基础(一)

    本文详细讲解了C#多线程的任务基础,文中通过示例代码介绍的非常详细。对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2022-02-02
  • VS2019下安装和破解 DevExpress 19.2 插件的详细教程

    VS2019下安装和破解 DevExpress 19.2 插件的详细教程

    这篇文章主要介绍了VS2019 安装并破解 DevExpress 19.2 插件的详细教程,本文通过图文并茂的形式给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2022-03-03
  • C#并查集(union-find)算法详解

    C#并查集(union-find)算法详解

    本文详细讲解了C#并查集(union-find)算法,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2022-04-04
  • C#连接MySQL的两个简单代码示例

    C#连接MySQL的两个简单代码示例

    这篇文章主要介绍了C#连接MySQL的简单代码示例,需要的朋友可以参考下
    2017-06-06
  • c#基础之数组与接口使用示例(遍历数组 二维数组)

    c#基础之数组与接口使用示例(遍历数组 二维数组)

    本文主要介绍了c#基础知识中的数组与接口使用方法,结合示例,大家一看就明白
    2014-01-01
  • 用Linq从一个集合选取几列得到一个新的集合(可改列名)

    用Linq从一个集合选取几列得到一个新的集合(可改列名)

    这篇文章主要介绍了用Linq从一个集合选取几列得到一个新的集合(可改列名),文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2019-12-12

最新评论