C#拼图游戏编写代码
程序员文章站
2023-08-15 20:19:12
本文设计了c#拼图游戏程序,供大家参考,具体内容如下
功能描述:
1.用户自定义上传图片
2.游戏难度选择:简单(3*3)、一般(5*5)、困难(...
本文设计了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.componentmodel; 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.componentmodel; 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; } }
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。
上一篇: 使用C#正则表达式获取必应每日图片地址
下一篇: 肺癌平时应该注意些什么 肺癌的注意事项