本文设计了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");