C#WinFrom写的拼图游戏
1.窗口载入时自动生成拼图按钮
const int N = ;//按钮的行、列数
Button[,] buttons = new Button[N, N];//按钮的数组
int step = ;//记录步数 private void Form3_Load(object sender, EventArgs e)
{
//产生所有按钮
GenerateAllButtons();
} private void button1_Click(object sender, EventArgs e)
{
//打乱顺序
this.button1.Text = "重新开始";
Shuffle();
}
void GenerateAllButtons()
{
int x0 = , y0 = , w = , d = ;
for (int r = ; r < N; r++)
{
for (int c = ; c < N; c++)
{
int num = r * N + c;
Button btn = new Button();
btn.Text = (num + ).ToString();
btn.Top = y0 + r * d;
btn.Left = x0 + c * d;
btn.Width = w;
btn.Height = w;
btn.Visible = true;
btn.Tag = num;
//注册事件
btn.Click += new EventHandler(Btn_Click);
buttons[r, c] = btn; //放到数组中
this.Controls.Add(btn); //加到界面上
}
}
buttons[N - , N - ].Visible = false;//最后一个btn不可见面
} private void Btn_Click(object sender, EventArgs e)
{
step++;
Button btn = sender as Button;//当前选中的按钮
Button blank = FindHiddenButton();//空白的按钮
//判断是否与空白块相邻,如果是,则交换
if (IsNeighbor(btn, blank))
{
Swap(btn, blank);
blank.Focus();
}
//判断是否完成了
if (ResultIsOk())
{
string result = "你真棒!"+"\n一共用了"+step.ToString()+"步";
MessageBox.Show(result);
} }
Button FindHiddenButton()
{
for (int r = ; r < N; r++)
{
for (int c = ; c < N; c++)
{
if (!buttons[r, c].Visible)
{
return buttons[r, c];
}
}
}
return null;
}
bool IsNeighbor(Button btnA, Button btnB)
{
int a = (int)btnA.Tag;//获得按钮记录的值
int b = (int)btnB.Tag;
int r1 = a / N;int c1 = a % N;//得到按钮的行号和列号
int r2 = b / N; int c2 = b % N;
if ((r1 == r2 && (c1 - c2 == || c2 - c1 == ))//左右相邻
|| (c1 == c2 && (r1 - r2 == || r2 - r1 == ))//上下相邻
)
{
return true;
}
return false;
}
//检查是否完成
bool ResultIsOk()
{
for (int r = ; r < N; r++)
for (int c = ; c < N; c++)
{
if (buttons[r, c].Text != (r * N + c + ).ToString())
{
return false;
}
}
return true;
}
//打乱顺序
void Shuffle()
{
//多次随机交换两个按钮
Random rnd = new Random();
for (int i = ; i < ; i++)
{
int a = rnd.Next(N);
int b = rnd.Next(N);
int c = rnd.Next(N);
int d = rnd.Next(N);
Swap(buttons[a, b], buttons[c, d]);
}
}
//交换两个按钮
void Swap(Button btna, Button btnb)
{
string t = btna.Text;
btna.Text = btnb.Text;
btnb.Text = t; bool v = btna.Visible;
btna.Visible = btnb.Visible;
btnb.Visible = v;
}
}
C#WinFrom写的拼图游戏的更多相关文章
- JavaScript写一个拼图游戏
拼图游戏的代码400行, 有点多了, 在线DEMO的地址是:打开: 因为使用canvas,所以某些浏览器是不支持的: you know: 为什么要用canvas(⊙o⊙)? 因为图片是一整张jpg或 ...
- 利用Vue.js实现拼图游戏
之前写过一篇<基于Vue.js的表格分页组件>的文章,主要介绍了Vue组件的编写方法,有兴趣的可以访问这里进行阅读:http://www.cnblogs.com/luozhihao/p/5 ...
- JavaScript拼图游戏
今天是2016年最后一天上班了.最近几天都比较休闲,有时间空闲下来写写文档之类的. 2016过得真是快.感觉没做什么就过去了.想到之前想坚持每个月写一写博客都没坚持到.希望2017年可以吧. 无聊之余 ...
- SDL制作拼图游戏
看完教程第三集后,好像自己能用这个来写一个简单的拼图游戏,第一次写出个带界面的游戏,好有成就感. 图片是自己慢慢截左上部分8个脸. #include <stdio.h> #include ...
- atitit.html5 拼图游戏的解决之道.
atitit.html5 拼图游戏的解决之道. 1. 拼图游戏的操作(点击法and 拖动法) 1 1. 支持键盘上.下.左.右键移动: 1 2. 支持点击空白模块中的上下左右箭头移动: 1 3. 支持 ...
- Android拼图游戏
效果如下 游戏的设计 首先我们分析下如何设计这款游戏: 1.我们需要一个容器,可以放这些图片的块块,为了方便,我们准备使用RelativeLayout配合addRule实现 2.每个图片的块块,我们准 ...
- Vue.js实现拼图游戏
Vue.js实现拼图游戏 之前写过一篇<基于Vue.js的表格分页组件>的文章,主要介绍了Vue组件的编写方法,有兴趣的可以访问这里进行阅读:http://www.cnblogs.com/ ...
- 基于unity3d和leap motion的拼图游戏
近期用unity3d引擎做了一个拼图游戏,会分几次写完,以此作为总结. 本文基本查找了网上能查到的全部资料作为參考.也算是大家节省了时间. 眼下仅仅完毕了拼图部分,leap motion手势控制部分会 ...
- 程序设计 之 C#实现《拼图游戏》 (下) 原理篇
前言:在 http://www.cnblogs.com/labixiaohei/p/6698887.html 程序设计 之 C#实现<拼图游戏>(上),上传了各模块代码,而在本文中将详细剖 ...
随机推荐
- Github如何快速添加add文件到暂存区之git add
git add作用是将代码从工作区提交到暂存区 通常会想到:git add [file1] [file2] : 这个方法添加文件比较慢,如果文件比较多怎么办? git add *.扩展名 这条命令 ...
- [USACO18JAN]Cow at Large G(树形DP)
P4186 [USACO18JAN]Cow at Large G(树形DP) Luogu4186 设dp[i]表示i点需要放多少个农民.则有 \(if(near[i]-dep[i]<=dep[i ...
- django 自带的验证功能
django.contrib.auth提供了很多验证方法 authenticate(): 提供了用户认证,在自带的数据库表中验证用户名和密码,需要username和password两个关键字参数 如果 ...
- 如何将一个Maven项目转化成一个Eclipse项目
有时候我们需要将一个Maven项目导入到Eclipse中,直接作为一个普通的eclipse项目来导入是不行的,我们可以通过一个命令来实现:mvn eclipse:eclipse 1. 进入该Maven ...
- Windows 环境下安装MongoDB
mongoDB下载地址 https://www.mongodb.org/ 在mongoDB官网下载windows版本的mongoDB后解压出来(本文以解压到D盘为例) 在解压出来的MongoDB文件夹 ...
- join合并字符串时使用生成器表达式
data=['11','pp','aa'] ','.join(str(d) for d in data)
- Android 中怎么重新启动APP或系统
重新启动应用程序,有两种方法,分别是: 1.通过ActivityManager来重新启动应用程序: ActivityManager manager = (ActivityManager)this.ge ...
- 使用PIE对IE6、7、8进行CSS3兼容介绍和经验总结
下面说说如何对 IE10 以下版本的浏览器进行部分 CSS3 兼容 国外团队开发的兼容插件,去年做项目时才发现,非常强大 主角:PIE.js , PIE.htc 两种方法可以实现 官方网站:h ...
- cout和printf不能混用
1.两者的缓存机制不同:printf无缓冲区,而std::cout有 (其实printf也是有缓冲区的,https://blog.csdn.net/ithzhang/article/details/6 ...
- BaseAdapter,SimpleAdapter,CursorAdapter的用法
简单好用的Adapter---ArrayAdapter ArrayAdapter是BaseAdapter的派生类,在BaseAdapter的基础上,添加了一项重大的功能:可以直接使用泛型构造. 我们先 ...