好得很程序员自学网

<tfoot draggable='sEl'></tfoot>

C#拼图游戏编写代码

本文设计了c#拼图游戏程序,供大家参考,具体内容如下

功能描述:

  1.用户自定义上传图片

  2.游戏难度选择:简单(3*3)、一般(5*5)、困难(9*9)三个级别

  3.纪录完成步数

模块:

  1.拼图类

  2.配置类

  3.游戏菜单窗口

  4.游戏运行窗口

 代码文件vs2013版本:

下载链接: 

--------------------------------------------------我叫分割线---------------------------------------------------------------

1.拼图类

方法:

  1.构造函数:传图片并分割成一个一个小图片

  2.交换方法

  3.大图中截取小单元方法

  4.移动单元的方法

  5.打乱单元顺序方法

?

using system;

using system.collections.generic;

using system.drawing;

using system.linq;

using system.text;

using system.threading.tasks;

using system.windows.forms;

 

namespace 拼图

{

  public class puzzle

  {

  public enum diff //游戏难度

  {

  simple, //简单

  ordinary, //普通

  difficulty //困难

  }

  private struct node //拼图单元格结构体

  {

  public image img;

  public int num;

  }

  private image _img; //拼图图片

  public int width; //拼图边长

  private diff _gamedif; //游戏难度

  private node[,] node; //单元格数组

  public int n; //单元格数组行列数

 

  /// <summary>

  /// 构造函数

  /// </summary>

  /// <param name="img">拼图大图</param>

  /// <param name="gamedif">游戏难度,该类下结构体diff</param>

  public puzzle(image img, int width, diff gamedif)

  {

  this ._gamedif = gamedif;

  this ._img = img;

  this .width = width;

  switch ( this ._gamedif)

  {

  case diff.simple:     //简单则单元格数组保存为3*3的二维数组

   this .n = 3;

   node= new node[3,3];

   break ;

  case diff.ordinary:   //一般则为5*5

   this .n = 5;

   node = new node[5, 5];

   break ;

  case diff.difficulty:   //困难则为9*9

   this .n = 9;

   node = new node[9, 9];

   break ;

  }

 

  //分割图片形成各单元保存在数组中

  int count = 0;

  for ( int x = 0; x < this .n; x++)

  {

  for ( int y = 0; y < this .n; y++)

  {

 

   node[x, y].img = captureimage( this ._img, this .width / this .n, this .width / this .n, x * ( this .width / this .n), y * ( this .width / this .n));

   node[x, y].num = count;

   count++;

  }

  }

 

  for ( int x = 0; x < this .n; x++)

  {

  for ( int y = 0; y < this .n; y++)

  {

 

   graphics newgra = graphics.fromimage(node[x, y].img);

   newgra.drawline( new pen(color.white), new point(0, 0), new point(0, this .width / this .n));

   newgra.drawline( new pen(color.white), new point(0, 0), new point( this .width / this .n, 0));

   newgra.drawline( new pen(color.white), new point( this .width / this .n, this .width / this .n), new point( this .width / this .n, 0));

   newgra.drawline( new pen(color.white), new point( this .width / this .n, this .width / this .n), new point(0, this .width / this .n));

  }

  }

  //(最后一项为空单独处理)

  node[n - 1, n - 1].img = image.fromfile( "image\\end.png" );

  graphics newgra2 = graphics.fromimage(node[n - 1, n - 1].img);

  newgra2.drawline( new pen(color.red), new point(1, 1), new point(1, this .width / this .n - 1));

  newgra2.drawline( new pen(color.red), new point(1, 1), new point( this .width / this .n - 1, 1));

  newgra2.drawline( new pen(color.red), new point( this .width / this .n - 1, this .width / this .n - 1), new point( this .width / this .n - 1, 1));

  newgra2.drawline( new pen(color.red), new point( this .width / this .n - 1, this .width / this .n - 1), new point( 1, this .width / this .n - 1));

  //打乱拼图

  this .upset();

 

  }

 

 

  /// <summary>

  /// 由图片fromimage中截图并返回

  /// </summary>

  /// <param name="fromimage">原图片</param>

  /// <param name="width">宽</param>

  /// <param name="height">高</param>

  /// <param name="spacex">起始x坐标</param>

  /// <param name="spacey">起始y坐标</param>

  /// <returns></returns>

  public image captureimage(image fromimage, int width, int height, int spacex, int spacey)

  {

  int x = 0;

  int y = 0;

  int sx = fromimage.width - width;

  int sy = fromimage.height - height;

  if (sx > 0)

  {

  x = sx > spacex ? spacex : sx;

  }

  else

  {

  width = fromimage.width;

  }

  if (sy > 0)

  {

  y = sy > spacey ? spacey : sy;

  }

  else

  {

  height = fromimage.height;

  }

 

  //创建新图位图

  bitmap bitmap = new bitmap(width, height);

  //创建作图区域

  graphics graphic = graphics.fromimage(bitmap);

  //截取原图相应区域写入作图区

  graphic.drawimage(fromimage, 0, 0, new rectangle(x, y, width, height), graphicsunit.pixel);

  //从作图区生成新图

  image saveimage = image.fromhbitmap(bitmap.gethbitmap());

  return saveimage;

  }

  /// <summary>

  /// 移动坐标(x,y)拼图单元

  /// </summary>

  /// <param name="x">拼图单元x坐标</param>

  /// <param name="y">拼图单元y坐标</param>

  public bool move( int x, int y)

  {

  //messagebox.show(" " + node[2, 2].num);

  if (x + 1 != n && node[x + 1, y].num == n * n - 1)

  {

  swap( new point(x + 1, y), new point(x, y));

  return true ;

  }

  if (y + 1 != n && node[x, y + 1].num == n * n - 1)

  {

  swap( new point(x, y + 1), new point(x, y));

  return true ;

  }

  if (x - 1 != -1 && node[x - 1, y].num == n * n - 1)

  {

  swap( new point(x - 1, y), new point(x, y));

  return true ;

  }

  if (y - 1 != -1 && node[x, y - 1].num == n * n - 1)

  {

  swap( new point(x, y - 1), new point(x, y));

  return true ;

  }

  return false ;

 

  }

  //交换两个单元格

  private void swap(point a, point b)

  {

  node temp = new node();

  temp = this .node[a.x, a.y];

  this .node[a.x, a.y] = this .node[b.x, b.y];

  this .node[b.x, b.y] = temp;

  }

  public bool judge()

  {

  int count=0;

  for ( int x = 0; x < this .n; x++)

  {

  for ( int y = 0; y < this .n; y++)

  {

   if ( this .node[x, y].num != count)

   return false ;

   count++;

  }

  }

  return true ;

  }

  public image display()

  {

  bitmap bitmap = new bitmap( this .width, this .width);

  //创建作图区域

  graphics newgra = graphics.fromimage(bitmap);

  for ( int x = 0; x < this .n; x++)

  for ( int y = 0; y < this .n; y++)

   newgra.drawimage(node[x, y].img, new point(x * this .width / this .n, y * this .width / this .n));

  return bitmap;

  }

  /// <summary>

  /// 打乱拼图

  /// </summary>

  public void upset()

  {

  int sum = 100000;

  if ( this ._gamedif == diff.simple) sum = 10000;

  //if (this._gamedif == diff.ordinary) sum = 100000;

  random ran = new random();

  for ( int i = 0, x = n - 1, y = n - 1; i < sum; i++)

  {

  long tick = datetime.now.ticks;

  ran = new random(( int )(tick & 0xffffffffl) | ( int )(tick >> 32)|ran.next());

  switch (ran.next(0, 4))

  {

   case 0:

   if (x + 1 != n)

   {

   move(x + 1, y);

   x = x + 1;

   }

  

   break ;

   case 1:

   if (y + 1 != n)

   {

   move(x, y + 1);

   y = y + 1;

   }

   break ;

   case 2:

   if (x - 1 != -1)

   {

   move(x - 1, y);

   x = x - 1;

   }

   break ;

   case 3:

   if (y - 1 != -1)

   {

   move(x, y - 1);

   y = y - 1;

   }

   break ;

  }

 

  }

  }

 

 

 

  }

}

2、配置类:

?

using system;

using system.collections.generic;

using system.drawing;

using system.linq;

using system.text;

using system.threading.tasks;

 

namespace 拼图

{

  public static class gamepage

  {

  public static puzzle.diff dif; //游戏难度

  public static image img; //拼图图案

  }

}

游戏菜单:

通过菜单,上传图片至配置类img,并选择难度上传至配置类dif,然后拼图对象构造时读取配置类

?

using system;

using system.collections.generic;

using system测试数据ponentmodel;

using system.data;

using system.drawing;

using system.linq;

using system.text;

using system.threading.tasks;

using system.windows.forms;

 

namespace 拼图

{

  public partial class menu : form

  {

  public menu()

  {

  initializecomponent();

  gamepage.img =image.fromfile( @"image\\拼图.jpg" );

  control.checkforillegalcrossthreadcalls = false ;

  }

 

  private void button1_click( object sender, eventargs e)

  {

  gamepage.dif = puzzle.diff.simple;

  this .hide();

  form1 ff = new form1();

  ff.closefather+= new 拼图.form1.childclose( this .closethis);

  ff.show();

 

  }

 

  private void button2_click( object sender, eventargs e)

  {

  gamepage.dif = puzzle.diff.ordinary;

  this .hide();

  form1 ff = new form1();

  ff.closefather += new 拼图.form1.childclose( this .closethis);

  ff.show();

 

  }

 

  private void button3_click( object sender, eventargs e)

  {

  gamepage.dif = puzzle.diff.difficulty;

  this .hide();

  form1 ff = new form1();

  ff.closefather += new 拼图.form1.childclose( this .closethis);

  ff.show();

 

  }

 

  public void closethis()

  {

  this .show();

  }

 

 

  private void button4_click( object sender, eventargs e)

  {

  openfiledialog ofd = new openfiledialog();

  ofd.showdialog();

  gamepage.img = image.fromfile(ofd.filename).getthumbnailimage(600,600, new image.getthumbnailimageabort( delegate { return false ; }), intptr.zero);

 

  }

  private void menu_load( object sender, eventargs e)

  {

  }

 

  }

}

游戏运行窗口:

1.注册鼠标点击事件来获得输入消息

2.显示功能

3.picturebox1用来展示游戏拼图情况

4.picturebox2展示完整拼图的缩略图(当鼠标移至picturebox2时,发送消息,使picturebox1显示完整拼图)

5.numlabel来显示移动步数(通过变量num的累加来计算)

?

using system;

using system.collections.generic;

using system测试数据ponentmodel;

using system.data;

using system.drawing;

using system.linq;

using system.text;

using system.threading;

using system.threading.tasks;

using system.windows.forms;

 

namespace 拼图

{

  public partial class form1 : form

  {

  public form1()

  {

  initializecomponent();

  }

  private puzzle puzzle;

  private int num=0;

  private image img;

  private void form1_load( object sender, eventargs e)

  {

  img = gamepage.img;

  picturebox2.image = img.getthumbnailimage(120,120, new image.getthumbnailimageabort( delegate { return false ; }), intptr.zero);

  puzzle = new puzzle(img, 600, gamepage.dif);

  picturebox1.image =puzzle.display();

  }

 

  private void picturebox1_mouseclick( object sender, mouseeventargs e)

  {

  if (puzzle.move(e.x / (puzzle.width / puzzle.n), e.y / (puzzle.width / puzzle.n)))

  {

  num++;

  picturebox1.image = puzzle.display();

  if (puzzle.judge())

  {

   if (messagebox.show( "恭喜过关" , "是否重新玩一把" , messageboxbuttons.okcancel) == dialogresult.ok)

   {

   num = 0;

   puzzle.upset();

   picturebox1.image = puzzle.display();

  

   }

   else

   {

   num = 0;

   closefather();

   this .close();

   }

 

  }

 

  }

  numlabel.text = num.tostring();

  }

 

  private void picturebox2_mouseenter( object sender, eventargs e)

  {

  picturebox1.image = img;

  }

 

  private void picturebox2_mouseleave( object sender, eventargs e)

  {

  picturebox1.image = puzzle.display();

  }

 

 

  private void form1_formclosed( object sender, formclosedeventargs e)

  {

  closefather();

  }

  public delegate void childclose();

  public event childclose closefather;

 

  }

}

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持服务器之家。

原文链接:http://HdhCmsTestcnblogs测试数据/labixiaohei/archive/2017/04/12/6698887.html

dy("nrwz");

查看更多关于C#拼图游戏编写代码的详细内容...

  阅读:44次