小开心一波,项目到今天,所有的基本功能已经全部完成了,包括基本的对战,输赢算法的判断,重新开始游戏,最重要的悔棋功能也完成了,虽然优化做的不是很好,但是已经实现了基本功能,后续可以适当的再进行界面的优化,以及算法的完善,功能的增加等,那么今天接着昨天的地方继续来讲。
1.悔棋功能:
其实这个功能是比较简单的,而且算法也人尽皆知,在控制台比较容易实现,但是现在图形库的一块画布上进行操作还是相对有点难度的,要用到众多的库函数实现图形的框选以及覆盖,抠图面积大小的精确化。
实操思想:利用栈将我们点击点的坐标保存下来,这里我们需要用一个算法将坐标进行处理一下,如下:
m = GetMouseMsg();//获取一个鼠标消息
for (int i = 1; i < 20; i++)
{
for (int j = 1; j < 20; j++)
{
if (abs(m.x - i * 25) < 12 && abs(m.y - j * 25) < 12)
{
x = i * 25;
y = j * 25;
a = i;
b = j;
}
}
}
这样,我们的x和y的值正好是横线所交叉的哪个点的坐标,接下来我们将a,b,x,y进行入栈操作
当用户选择悔棋的时候我们则先利用getimage抠出未落子前的图像,再来利用
putimage
将图片贴到栈顶的x,y所指向的坐标,实现悔棋功能,具体代码如下:
//当鼠标点击悔棋点的坐标的时候,开始执行悔棋功能
if (m.x >= 520 && m.x <= 570 && m.y >= 190 && m.y <= 230)
{
//栈顶元素不能直接使用,因为此时它保存的是悔棋点的坐标,我们需要先把他弹出
A.pop(), B.pop(), X.pop(), Y.pop();
//将悔棋点的二维数字具体点赋值为零,实现下次落子
board[A.top()][B.top()] = 0;
putimage(X.top() - 13, Y.top() - 13, 25, 25, &back, 19, 16);
//对用户进行提示
MessageBox(NULL, "您以悔棋成功,请继续", "提示", MB_OK);
//悔棋成功后将该点坐标也弹出栈。
A.pop(), B.pop(), X.pop(), Y.pop();
flag--;
goto NEW;
}
来测试一下啊:
这里大家可以很明显的看到悔棋提示和覆盖点的位置(我的ps技术不太过关)
就这样,一个简单的五子棋小游戏便开发完成了,不过还得进行后期界面优化设计,这就得看个人的想象力了。
版权声明:本文为ds88888888原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。