没有合适的资源?快使用搜索试试~ 我知道了~
为想要用C++做产品的一个实例,通过此次练习,可以让你走进C++的编写门槛。
资源推荐
资源详情
资源评论
这里是一个成品,用 DrakGDK+VS2008 做的,中途还使用到了 PhotoShop 来处理美工,
AI 难度等级上还有些欠缺。
115 网盘地址 http://u.115.com/file/f0af6293d5
纳米盘地址 http://d.namipan.com/d/0064e1aa5a39eb5cc0a4a03136c321a0ad994a51058d7a02
如果要做图形界面,我目前选择的是 DarkGDK 平台,结合 VC2008 或者 VS2008 可以支持
C++编程。
DarkGDDK 平台插件可以到这里来找
http://www.thegamecreators.com/?m=view_product&id=2128
具体配置方法访问教材译者的博客
http://transbot.blog.163.com/blog/static/54213961200992302529265/
如果不想搞图形界面,也可以用命令行实现棋盘的输出,和操作的输入,由于二维矩阵
的输出和坐标的输入是十分基础的操作,这里就不做详细说明了,我主要是讨论一些关于
五子棋算法的问题。
首先第一步,我们要构建五子棋算法的内核。只要核心算法搞定了,剩下的只是去调用
各种函数罢了。五子棋,是在棋盘上操作的一种简单游戏,棋盘可以描述为一个二维矩阵
只需要参考一个坐标上的数值就能知道这里放没放子,放的是黑子还是白子。本来想用向
量来表示这个矩阵,但是还是觉得二维数组的角标来给棋盘坐标精确定位要顺手些。
我定义了一个这样的类
class 5PointsChess
{
char box[16][16];//棋盘的规格是 15*15,但是我想忽略掉角标 0
char Winner;//Winner 代表取得胜利的阵营
public:
void ClearBox(){……}//遍历棋盘,并将所有棋子清除
char Winner(){return Winner;}//得知游戏进展的函数
void Player(){……}//定义玩家的操作及其所带来的影响
void KnowWhoWin(){……}//遍历棋盘,探寻是否有胜利条件被触发,修改 Winner 的值,
并给连成一线的五颗棋子打上特殊标记。
void AI(){……}//定义 AI 函数,这里最复杂,要教会电脑下五子棋,而且还要具有尽可能
高的水平。
};
以上并不是所有的函数和变量,而是最基本的函数和变量,可以构建成粗犷的框架,扩展
的功能都在此基础之上小修小补就行了。
这里简要介绍一下我编写五子棋 AI 时的思想。五子棋,自然是要将五颗子在横向纵向或者
是斜线上无间隔地连成一线,而且在此之前还要阻止对方完成同类操作才能获胜。那么自
然首先要有 1,1 进 2,2 进 3,3 进 4,4 进 5 是最基本的算法。那么我们可以按照棋局结构的
杀伤力来分出等级。按最简单的 AI 来看,第一杀伤力的棋局是有空隙能生成 5 的 4,然后
是有空隙能生成 4 的 3,以此类推。在遍历棋局后,按照杀伤由强到弱判断。同等级的操
作,优先攻击,但是防御要优先于下一个等级的进攻。当没有任何可用棋局的时候,就随
机选择一个空位下子。
这样写出来的 AI 只能算是基本上会下,但会被人菜的很惨,所以还有必要进一步加强,这
就要加入其他一些介于基本棋局杀伤力等级之间的结构,例如三三禁手和四四禁手,还可
以写一些辅助函数,让 AI 在游戏初期为后来的进攻路线做一些准备,详细的就不需要一一
介绍了。
然后来说一下用 DarkGDK 制作图形界面的问题,最基础的多媒体界面是基于对图像和声
音的简单调用,这样的操作对 DarkGDK 来说是相当容易的。
"DarkGDK.h"是必须要引用的头文件,程序入口不再是 main 函数,而是 void DarkGDK(){}
要做简单的图形界面,建议还是要有一定的 PhotoShop 基础,这样至少能比较容易地做出
自己想要的界面素材,能自己设计素材的形态,在调用库函数的时候自然会轻松很多。
关于图像的调用,在 DarkGDK 里面可以用 dbLodeImage()来加载图像,用 dbPasteImage()来
显示图像,绝提的说是:
dbLodeImage("图像文件名称.图像格式",图像编号);
用 dbPasteImage(图像编号,x,y,图层);//x 和 y 为所显示图像左上角在窗口的坐标,图层有 0 和
1,分别为底层和表层,这里需要提醒的是,窗口的像素坐标,左上角为(0,0), x 从上
到下递增,y 从左到右递增。如果在同一图层,新显示图像释放在先前显示图像的前面。
之前最好有如下语句:
dbSyncOn();//关闭自动刷新
dbSyncRate(60);//限定刷新频率为 60Hz
在完成了对要显示的图像的操作之后,要记住用 dbSync();来刷新窗口(因为自动刷新已经
关闭)
必要的时候还可以用 dbCLS();来清除窗口里所有的图像。
DarkGDK 里提供了使特定颜色像素点变得透明的函数,但是我不建议用这些函数,因为
DarkGDK 可以支持 PNG 图像的半透明和透明效果,这些特效拿 PhotoShop 来编辑显然会
更好。
关于声音的调用,和图像类似,如果要重复利用的话,最好也是先载入后播放。需要注意
的是,对 DarkGDK 来说,声音和音乐是两种文件,WAV 格式被认为是声音,MP3 则被认
为是音乐。
dbLoadMusic("文件名称.mp3",音乐编号);//载入音乐文件
dbLoadSound("文件名称.wav",声音编号);//载入声音文件
dbPlaySound(声音编号);//一次性播放声音文件
dbPlayMusic(音乐编号);//一次性播放音乐文件
dbLoopMusic(音乐编号);//循环播放音乐,继续执行其他语句
dbLoopSound(声音编号);//循环播放声音,继续执行其他语句
dbSetMusicVolume(音乐编号,数值);//将特定音乐的音量调到数值%
dbSetSoundVolume(声音编号,数值);//将特定声音的音量调到数值%
接下来简单提一下鼠标的调用
需要一个 while 循环
while(LoopGDK())
{
if(dbMouseClick()==1)
{
x=dbMouseX();//得到当前鼠标指针的横坐标
y=dbMouseY();//得到当前鼠标指针的纵坐标
//这里可以定义点下鼠标后瞬间要干的事情·
while(dbMouseClick()==1)//当返回值为 1 代表左键被点下,2 代表右键被点下
{
/*nothing*//这个循环里什么也不做,但是必须有
}
//这里定义鼠标松开后,也就是一次完整的鼠标点击以后的操作
}
}
这些基本的图像、声音、鼠标操作掌握了以后,基本的图形界面就已经有了技术上的保障
重要的是与核心算法相结合,把数学化的思想用图形表现出来,这样能够跟好的完成人与
计算机之间的交互。鼠标点击绝对比坐标输入要轻松多了。
那么下面是我的源代码,因为是初学,所以现在才发现有许多地方的语句其实可以简
化,而且这是在命令行版本上修改填补而来的,所以代码上也许有混乱的地方,甚至可能
有无用的残留代码,程序需要调用的资源在前面提供的网盘地址里面可以找到。
源代码:
#include "DarkGDK.h"
#include <ctime>
#include<stdio.h>
#include <stdlib.h>
#include<windows.h>
#define white 'w'
#define black 'b'
#define computer 'c'
#define whiteWin 'a'
#define blackWin 'd'
#define empty 'e'
#define fire 'f'
#define NobodyWin -1
#define NeverWin 0
#define WhiteWin 1
#define BlackWin 2
char mainmap(int x,int y)//在主菜单判断鼠标位置
{
if(x>465&&x<614&&y>40&&y<89) return 'S';
if(x>465&&x<614&&y>115&&y<164) return 'D';
if(x>465&&x<614&&y>190&&y<239) return 'A';
if(x>465&&x<614&&y>315&&y<364) return 'H';
if(x>465&&x<614&&y>390&&y<439) return 'Q';
}
char gamemap(int x,int y)//在游戏菜单判断鼠标位置
{
if(x>465&&x<614&&y>165&&y<214) return 'R';
if(x>465&&x<614&&y>240&&y<289) return 'C';
if(x>465&&x<614&&y>315&&y<364) return 'G';
if(x>465&&x<614&&y>390&&y<439) return 'Q';
if(x>500&&x<620&&y>400&&y<440) return 'q';
}
char Smap(int x,int y)//在游戏菜单判断鼠标位置
{
if(x>465&&x<614&&y>165&&y<214) return 'R';
if(x>465&&x<614&&y>390&&y<439) return 'Q';
if(x>20&&x<169&&y>165&&y<314) return white;
if(x>270&&x<419&&y>165&&y<314) return black;
}
int Xis(int x)//按照鼠标点击确定下棋横坐标
{
if(x>32&&x<=57) return 1;
else if(x>57&&x<=82) return 2;
else if(x>82&&x<=107) return 3;
else if(x>107&&x<=132) return 4;
else if(x>132&&x<=157) return 5;
else if(x>157&&x<=182) return 6;
else if(x>182&&x<=207) return 7;
else if(x>207&&x<=232) return 8;
else if(x>232&&x<=257) return 9;
else if(x>257&&x<=282) return 10;
else if(x>282&&x<=307) return 11;
else if(x>307&&x<=332) return 12;
else if(x>332&&x<=357) return 13;
else if(x>357&&x<=382) return 14;
else if(x>382&&x<=407) return 15;
else return 0;
}
int Yis(int y)//按照鼠标点击确定下棋纵坐标
{
if(y>402&&y<=427) return 1;
剩余56页未读,继续阅读
资源评论
qweabc123abc
- 粉丝: 0
- 资源: 1
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功