• 工作闲暇之余去逛了逛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[];
int i = ;
int b;
bool exist;
while (i != a.Length)
{
exist = false;
b = (r.Next() + );
for (int j = ; j < a.Length; j++)
if (a[j] == b) exist = true;
if (!exist) a[i++] = b;
}
for (int j = ; j < a.Length; j++)
ButtonArray[j].Number = a[j];
// set picture pieces as the background image
int Number;
int Row, Column;
for (int k = ; k < ; k++)
{
for (int j = ; j < ; j++)
{
if (k == )
if (j == ) break;
Number = ButtonArray[k * + j].Number; //Get The Number Of Button
Row = (Number - ) / ;
Column = (Number - ) - (Row * );
ButtonArray[k * + j].Image = CurrentBitmapImage.Clone(new Rectangle(new Point(Column * , Row * ), new Size(, )), 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 = ; i < ; i++)
{
if (YouWin == false)
break;
else for (int j = ; j < ; j++)
{
ButtonNumber = i * + j;
if (i == && j == )
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 = ; i < ; i++)
{
if (YouWin == false)
break;
else for (int j = ; j < ; j++)
{
ButtonNumber = i * + j;
if (i == && j == )
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();
}
}

  具体效果如下:

  

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

  【点击下载源码

  【打个小广告】最近申请了个微信公众号,主要用于个人随笔记录,工作/生活中项目中用到的技术或娱乐的小游戏,俗话说得好好记性不如烂键盘!后续娱乐的小游戏源码也会分享到公众号中(部分会同步到博客园)。

  又有俗话说了, 您的支持就是我写作的动力,公众号点个关注什么的也是举手之劳,还请您高抬贵手~

最新文章

  1. git 一般的使用操作
  2. beta版本贡献率
  3. vm安装ubuntu桥接模式无法联网
  4. 在keil中使用Astyle格式化你的代码的方法
  5. 2015北大夏令营day1 B:An Idea of Mr. A
  6. dict.get(&#39;key&#39;)和dict[&#39;key&#39;]的区别
  7. [网络分析]WEBQQ3.0协议分析---good good study
  8. 【我所認知的BIOS】—&amp;gt;ADU.exe
  9. hdoj 1013
  10. 在标记的HREF属性中javascript:alert(this.innerHTML)会怎么样?
  11. 一个IC软件工程师的2017年终工作总结
  12. 终于放弃Windows下丑陋的cmd
  13. Codechef August Challenge 2018 : Coordinate Compression
  14. Linux/Unix系统QA
  15. SpringBoot 全配置(推荐收藏)
  16. jsp请求转发与重定向区别小结
  17. HTTPS协议加密原理解析
  18. Array of Doubled Pairs LT954
  19. 1.Tomcat配置.md
  20. opencv 线,椭圆 圆

热门文章

  1. BigInteger的权限设计
  2. 【强化学习RL】model-free的prediction和control —— MC,TD(λ),SARSA,Q-learning等
  3. [bzoj3930] [洛谷P3172] [CQOI2015] 选数
  4. Collections中的常用方法
  5. 关于SOA架构设计的案例分析
  6. for in 和 for i 十月 javascript 第一弹 记录
  7. Linux上部署web服务器并发布web项目-转
  8. [转]在C#中调用C语言函数(静态调用Native DLL,Windows &amp; Microsoft.Net平台)
  9. Java 使用 UnixSocket 调用 Docker API
  10. 远程桌面软件RDCMan汉化版