- ubuntu12.04环境下使用kvm ioctl接口实现最简单的虚拟机
- Ubuntu 通过无线网络安装Ubuntu Server启动系统后连接无线网络的方法
- 在Ubuntu上搭建网桥的方法
- ubuntu 虚拟机上网方式及相关配置详解
CFSDN坚持开源创造价值,我们致力于搭建一个资源共享平台,让每一个IT人在这里找到属于你的精彩世界.
这篇CFSDN的博客文章MFC实现连连看游戏之消子算法由作者收集整理,如果你对这篇文章有兴趣,记得点赞哟.
本文实例为大家分享了MFC实现连连看游戏消子算法的具体代码,供大家参考,具体内容如下 。
两个位置的图片能否消除,有三种情况:
1.一条直线连接,这种也是最简单的一种消除方法 。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
|
bool
LinkInLine(CPoint p1, CPoint p2)
{
conner1.x = conner1.y = -1;
// 记录拐点位置
conner2.x = conner2.y = -1;
BOOL
b =
true
;
if
(p1.y == p2.y)
// 两个点再同一行
{
int
min_x = min(p1.x, p2.x);
int
max_x = max(p1.x, p2.x);
for
(
int
i = min_x+1; i < max_x; i++)
{
if
(game->map[i][p1.y] != 0)
{
b =
false
;
}
}
}
else
if
(p1.x == p2.x)
// 在同一列
{
int
min_y = min(p1.y, p2.y);
int
max_y = max(p1.y, p2.y);
for
(
int
i = min_y + 1; i < max_y; i++)
{
if
(game->map[p1.x][i] != 0)
{
b =
false
;
}
}
}
else
// 不在同一直线
{
b =
false
;
}
return
b;
}
|
2.两条直线消除,即经过一个拐点.
两个顶点经过两条直线连接有两种情况,即两个拐点分两种情况.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
|
bool
OneCornerLink(CPoint p1, CPoint p2)
{
conner1.x = conner1.y = -1;
conner2.x = conner2.y = -1;
int
min_x = min(p1.x, p2.x);
int
max_x = max(p1.x, p2.x);
int
min_y = min(p1.y, p2.y);
int
max_y = max(p1.y, p2.y);
// 拐点1
int
x1 = p1.x;
int
y1 = p2.y;
//拐点2
int
x2 = p2.x;
int
y2 = p1.y;
BOOL
b =
true
;
if
(game->map[x1][y1] != 0 && game->map[x2][y2] != 0)
{
b =
false
;
}
else
{
if
(game->map[x1][y1] == 0)
// 拐点1位置无图片
{
for
(
int
i = min_x + 1; i < max_x; i++)
{
if
(game->map[i][y1] != 0)
{
b =
false
;
break
;
}
}
for
(
int
i = min_y + 1; i < max_y; i++)
{
if
(game->map[x1][i] != 0)
{
b =
false
;
break
;
}
}
if
(b)
{
conner1.x = x1;
conner1.y = y1;
return
b;
}
}
if
(game->map[x2][y2] == 0)
// 拐点2位置无图片
{
b =
true
;
for
(
int
i = min_x + 1; i < max_x; i++)
{
if
(game->map[i][y2] != 0)
{
b =
false
;
break
;
}
}
for
(
int
i = min_y + 1; i < max_y; i++)
{
if
(game->map[x2][i] != 0)
{
b =
false
;
break
;
}
}
if
(b)
{
conner1.x = x2;
conner1.y = y2;
return
b;
}
}
}
return
b;
}
|
3.三条直线消除,即经过两个拐点.
这是可以通过横向扫描和纵向扫描,扫描的时候可以得到连个拐点,判断两个顶点经过这两个拐点后是否能消除 。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
|
bool
TwoCornerLink(CPoint p1, CPoint p2)
{
conner1.x = conner1.y = -1;
conner2.x = conner2.y = -1;
int
min_x = min(p1.x, p2.x);
int
max_x = max(p1.x, p2.x);
int
min_y = min(p1.y, p2.y);
int
max_y = max(p1.y, p2.y);
bool
b;
for
(
int
i = 0; i < MAX_Y; i++)
// 扫描行
{
b =
true
;
if
(game->map[p1.x][i] == 0 && game->map[p2.x][i] == 0)
// 两个拐点位置无图片
{
for
(
int
j = min_x + 1; j < max_x; j++)
// 判断连个拐点之间是否可以连接
{
if
(game->map[j][i] != 0)
{
b =
false
;
break
;
}
}
if
(b)
{
int
temp_max = max(p1.y, i);
int
temp_min = min(p1.y, i);
for
(
int
j = temp_min + 1; j < temp_max; j++)
// 判断p1和它所对应的拐点之间是否可以连接
{
if
(game->map[p1.x][j] != 0)
{
b =
false
;
break
;
}
}
}
if
(b)
{
int
temp_max = max(p2.y, i);
int
temp_min = min(p2.y, i);
for
(
int
j = temp_min + 1; j < temp_max; j++)
// 判断p2和它所对应的拐点之间是否可以连接
{
for
(
int
j = temp_min + 1; j < temp_max; j++)
{
if
(game->map[p2.x][j] != 0)
{
b =
false
;
break
;
}
}
}
}
if
(b)
// 如果存在路线,返回true
{
conner1.x = p1.x;
conner1.y = i;
conner2.x = p2.x;
conner2.y = i;
return
b;
}
}
}
// 扫描行结束
for
(
int
i = 0; i < MAX_X; i++)
// 扫描列
{
b =
true
;
if
(game->map[i][p1.y] == 0 && game->map[i][p2.y] == 0)
// 连个拐点位置无图片
{
for
(
int
j = min_y + 1; j < max_y; j++)
// 两个拐点之间是否可以连接
{
if
(game->map[i][j] != 0)
{
b =
false
;
break
;
}
}
if
(b)
{
int
temp_max = max(i, p1.x);
int
temp_min = min(i, p1.x);
for
(
int
j = temp_min + 1; j < temp_max; j++)
// 判断p1和它所对应的拐点之间是否可以连接
{
if
(game->map[j][p1.y] != 0)
{
b =
false
;
break
;
}
}
}
if
(b)
{
int
temp_max = max(p2.x, i);
int
temp_min = min(p2.x, i);
for
(
int
j = temp_min + 1; j < temp_max; j++)
{
if
(game->map[j][p2.y] != 0)
{
b =
false
;
break
;
}
}
}
if
(b)
// 如果存在路线,返回true
{
conner1.y = p1.y;
conner1.x = i;
conner2.y = p2.y;
conner2.x = i;
return
b;
}
}
}
// 扫描列结束
return
b;
}
|
完整源码已上传至我的GitHub 。
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持我.
原文链接:https://blog.csdn.net/StriverLi/article/details/73958608 。
最后此篇关于MFC实现连连看游戏之消子算法的文章就讲到这里了,如果你想了解更多关于MFC实现连连看游戏之消子算法的内容请搜索CFSDN的文章或继续浏览相关文章,希望大家以后支持我的博客! 。
我有一个 MFC 项目,它链接到第三方 dll。在程序退出时,IDE 会报告“检测到内存泄漏!”并倾倒泄漏物。 这些泄漏来自第三方 dll。我很确定这些是错误的报道。 (Google 的快速检查表明
首先我想要的是:能够显示具有多列的网格,每个单元格都有一个自定义渲染回调。因此,您可以使用这样的控件在游戏中显示您的库存,或者类似于 Google Chrome 中的行为,它会显示您访问的热门页面的网
在新的 MFC 功能(功能包)中,菜单出现在三个地方: 在菜单栏中 (CMFCMenuBar) 在弹出菜单中 (CMFCPopupMenu) 在 CMFCButton 的“下拉菜单”版本中 我想在所有
在我的 MFC 项目中,我想动态生成标签。例如:我必须为它们生成 4 个编辑控件和相应的标签——比如“Label1”“Label2”...... CStatic *label[MAX_THREAD];
我有第一个对话框,上面有一个简单的按钮,单击该按钮时,使用 CDialog::Create(IDD,this) 创建了第二个对话框。我希望在销毁第二个对话框但不向第二个对话框添加任何代码时通知父级,即
我们的代码库中的添加到剪贴板代码非常低级 - 分配全局内存等等。对于简单的情况,我只想将一些纯文本放在剪贴板上,是否有任何例程可以包装所有这些内容? 一个例子是 CRichEditCtrl 具有 Co
我对 mfc 中事件和消息之间的区别有点困惑。 他们是一样的吗? 最佳答案 由于您专门询问 MFC,我假设您指的是可以在 MFC 类的属性窗口中定义的事件处理程序和消息处理程序。 在“事件”下,您可以
如何以编程方式检测我的 MFC 应用程序当前是否正在显示模式对话框或属性表?目前我正在使用以下内容,但我觉得该代码也会触发无模式对话框。 bool HasModalDialog(const CWnd*
我有两个按钮: 单选按钮:“十六进制” 按钮:“A” 我想在用户选中“十六进制”按钮时启用“A”(“A”在创建时的状态为“禁用”),我该怎么做?谢谢大家。 最佳答案 您需要使用 CButton 's
通常情况下,窗口的厚度为 4 个像素,可以通过 GetSystemMetrics 方法获取。我可以更改它的值,例如 2 个像素吗? 非常感谢! 最佳答案 简单的回答:不。不适用于特定窗口。 复杂的答案
我需要打开一个从同一个类实例化的对话框两次。当我尝试这个时 CdelmeDlg dlg; dlg.DoModal(); dlg.DoModal(); 第二个调用只打开对话框一瞬间,然后关闭。我敢打赌消
如何通过代码在 mfc 中减少标题栏的窗口? 最佳答案 用: ModifyStyle (WS_CAPTION, 0); // to hide ModifyStyle (0, WS_CAPTION);
我使用 AfxMessageBox 关键字显示消息框。基本的东西。 但是,由于路径的长度,它显示如下: 有什么方法可以阻止它以这种方式自动换行吗? 抱歉,如果这是一个愚蠢的问题。但如果我只有一个句子,
所以,我有一个 MFC 程序的插件。我正在使用鼠标事件 Hook (来自 SetWindowsHookEx)来捕获点击。主机应用程序可以打开任意数量的(可能重叠的)子窗口,但我只想拦截特定子窗口中的点
我正在尝试将图像添加到现有按钮..我在一定程度上做到了这一点,问题是我可以添加一个所有者绘制的图像,但无法添加我想要的确切图像..示例见下文代码 CButton* pBtn= (CButton*)Ge
我想在对话框的标题栏上放置一些控件。一种可能的解决方案是,我只是从对话框中删除标题栏并绘制自己的标题栏。 但是如果我自己画标题栏,标题栏的外观不会根据窗口的主题而改变。而且我也不得不忍受接近、最小化和
我已经使用 MinGW 开发了 WinAPI 应用程序,没有问题。现在,我可以用 MFC 做同样的事情吗? 最佳答案 你不能。 MFC 代表 Microsoft Foundation Classes,
(我正在使用VS ++ 2005) 我在对话框上放置了编辑框控件(ID为ID_edit_box),并为其关联了两个变量(使用处理程序向导):控件(c_editbox)和值(v_editbox)变量。我
我有一个自定义 MFC 对话框 CMyDialog,使用资源编辑器添加了一个类型为 CMyControl 的自定义控件 - 该对话框有一个控件的成员变量并且有 DDX设置。 该控件正在接收绘制消息,并
直到现在,我从未真正需要我正在开发的大型 MFC(如果重要,则为单文档界面)应用程序的 Winapp ExitInstance()。但现在我这样做了,主要是为了清理内存分配、卸载一些 DLL 等。好吧
我是一名优秀的程序员,十分优秀!