MFC设计五子棋完全代码Word文件下载.docx
- 文档编号:19385618
- 上传时间:2023-01-05
- 格式:DOCX
- 页数:18
- 大小:301.98KB
MFC设计五子棋完全代码Word文件下载.docx
《MFC设计五子棋完全代码Word文件下载.docx》由会员分享,可在线阅读,更多相关《MFC设计五子棋完全代码Word文件下载.docx(18页珍藏版)》请在冰豆网上搜索。
设计过程中常常会出现函数已经构造,却未加定义的情况。
做本游戏时,查看了大量资料。
在棋盘的画法上有所纠结。
是直接将棋盘背景图直接加入还是调用函数进行棋盘绘制都是要考虑的。
经过多次尝试,不断进行函数的调试和界面图标的设计。
最终完成此次实验。
虽然多次返工,虽然有一天从早上做到第二天凌晨5点,但最终的成功,使这些都变成浮云。
不断尝试,永不放弃,最终一定成功。
4.自己收获与不足
此次实验初期,本计划完成一个比较优秀的作品,但最终多种原因没有达到预期理想的界面。
首先谈谈收获,个人认为此次MFC课程设计更适合简单游戏的设计。
五子棋的界面简单,相对规则也不多。
设计过程中,最大的收获要算程序的扩充,函数的调试。
其实MFC已给出框架,所要做的便是填充内容。
懂得了以位图的形式表示棋子,以cusor替换当前鼠标。
还有鼠标热点的设置。
在BOOLCMainFrame下构造函数以坐标的形式以改变棋盘大小。
同时构造出一系列画棋盘,判断鼠标,判断输赢等函数。
为函数添加数据成员并使其一一实现。
对相应菜单进行属性更改并进行消息映射,建立响应函数。
整个过程都得到了了解及应用。
同时,不足也很多,本游戏调用函数进行了棋盘绘制,使得界面过于简单。
由于时间,能力等问题,未能加入人工智能实现人机对战。
而且对于老师所给出的对话框的设计及应用也未能加入。
棋子的位图都是自己绘制,并不十分美观。
如果有充足的时间,我想这些一定会得到完善。
5.重要程序清单
构造函数
//两个鼠标
HCURSORhcursorwhite;
HCURSORhcursorblack;
//棋盘数组
intwzq[19][19];
//colorwhiteTRUE时白棋下,否则黑棋下
boolcolorwhite;
//棋子位图
CBitmapm_bmblack;
CBitmapm_bmwhite;
//保存文件
voidSave();
//检查是否结束
voidover(CPointpoint);
//鼠标操作
afx_msgvoidOnLButtonUp(UINTnFlags,CPointpoint);
//鼠标图形更换
afx_msgBOOLOnSetCursor(CWnd*pWnd,UINTnHitTest,UINTmessage);
//菜单的开始
afx_msgvoidOnStart();
//菜单的保存
afx_msgvoidOnSave();
//菜单的打开
afx_msgvoidOnOpen();
窗口设计
BOOLCMainFrame:
:
PreCreateWindow(CREATESTRUCT&
cs)
{
if(!
CFrameWnd:
PreCreateWindow(cs))
returnFALSE;
//TODO:
ModifytheWindowclassorstylesherebymodifying
//theCREATESTRUCTcs
cs.dwExStyle=cs.dwExStyle|WS_EX_TOPMOST;
//
cs.style=WS_SYSMENU|WS_OVERLAPPED|WS_MINIMIZEBOX;
//;
//设置窗口大小:
400*340
cs.cx=450;
cs.cy=500;
returnTRUE;
棋盘与棋子的绘制
voidCMy3_1View:
OnDraw(CDC*pDC)
CMy3_1Doc*pDoc=GetDocument();
ASSERT_VALID(pDoc);
adddrawcodefornativedatahere
//画背景
CBrushmybrush1;
mybrush1.CreateSolidBrush(RGB(192,192,192));
CRectmyrect1(0,0,1200,800);
pDC->
FillRect(myrect1,&
mybrush1);
//画棋盘框线
CPenmypen;
CPen*myoldPen;
mypen.CreatePen(PS_SOLID,1,RGB(0,0,0));
myoldPen=pDC->
SelectObject(&
mypen);
for(inti=0;
i<
19;
i++)
{
MoveTo(40,40+i*20);
LineTo(400,40+i*20);
MoveTo(40+i*20,40);
LineTo(40+i*20,400);
}
//重画时显示存在的棋子
CDCDc;
if(Dc.CreateCompatibleDC(pDC)==FALSE)
AfxMessageBox("
Can'
tcreateDC"
);
for(intn=0;
n<
n++)
for(intm=0;
m<
m++)
if(wzq[n][m]==1)
{
//显示白棋
Dc.SelectObject(m_bmwhite);
pDC->
BitBlt(n*20+32,m*20+32,160,160,&
Dc,0,0,SRCCOPY);
}
elseif(wzq[n][m]==-1)
{
//显示黑棋
Dc.SelectObject(m_bmblack);
}
}
设置鼠标:
BOOLCMy3_1View:
OnSetCursor(CWnd*pWnd,UINTnHitTest,UINTmessage)
Addyourmessagehandlercodehereand/orcalldefault
if(nHitTest==HTCLIENT)
{
//白棋下,显示白棋鼠标
if(colorwhite)
{
//调用主框架里面的状态栏
CMainFrame*pFrm=(CMainFrame*)AfxGetApp()->
m_pMainWnd;
CStatusBar*pStatus=&
pFrm->
m_wndStatusBar;
if(pStatus)
pStatus->
GetStatusBarCtrl().SetIcon(0,AfxGetApp()->
LoadIcon(IDI_WHITE));
SetPaneText(0,"
白棋下"
SetCursor(hcursorwhite);
}
//显示黑棋鼠标
else
SetCursor(hcursorblack);
//显示图像
LoadIcon(IDI_BLACK));
//显示文字
黑棋下"
return1;
returnCView:
OnSetCursor(pWnd,nHitTest,message);
判断输赢
over(CPointpoint)
//获取鼠标指向数组位置,即中心位置
intx=(point.x-30)/20;
inty=(point.y-30)/20;
//计算开始判断的坐标xx,yy
intxx,yy;
if(x<
4)
xx=0;
else
xx=x-4;
if(y<
yy=0;
yy=y-4;
inti,j,a;
//横向判断
for(i=xx;
15;
{
a=0;
for(j=i;
j<
i+5;
j++)
a=a+wzq[j][y];
//五个都是白棋
if(a==5)
AfxMessageBox("
白棋胜!
"
//重新开始
OnStart();
return;
//五个都是黑棋
if(a==-5)
黑棋胜!
//竖向判断
for(i=yy;
a=a+wzq[x][j];
//向右下角
//判断起点位置
y)
if(xx==0)
yy=y-x;
if(yy==0)
xx=x-y;
//参数over=1时退出循环
intover=0;
do
for(i=0;
5;
if((xx+i)<
19||(yy+i)<
19)
a=a+wzq[xx+i][yy+i];
//到了边界
else
over=1;
xx+=1;
yy+=1;
}while(over==0);
//向左下角
if(y>
(18-x))
if(x>
13)
yy=y-(18-x);
xx=18;
yy=y-4;
xx=x+4;
if(y<
5)
xx=x+y;
yy=0;
over=0;
if((xx-i)>
=0||(yy+i)<
{
a=a+wzq[xx-i][yy+i];
xx-=1;
文件保存
OnSave()
Addyourcommandhandlercodehere
//设置保存的文件,后缀名wzq
CFileDialogdlg(FALSE,"
wzq"
NULL,OFN_HIDEREADONLY|OFN_OVERWRITEPROMPT,"
(*.WZQ)|*.wzq|AllFiles|*.*||"
this);
//如果公共类对话框为确定
if(dlg.DoModal()==IDOK)
//获取文件名
dlg.GetFileName();
//否则,退出
return;
//字符串变量
CStringstr;
inti,j;
CStdioFilefile;
//如果有问题,退出
if(file.Open(dlg.GetFileName(),CFile:
modeCreate|CFile:
modeWrite|CFile:
typeText)==0)
saveerror!
//循环把棋盘数组的值写进文件
for(i=0;
for(j=0;
if(wzq[i][j]==-1)
file.WriteString("
-1\n"
if(wzq[i][j]==0)
0\n"
if(wzq[i][j]==1)
1\n"
//保存当前下棋颜色
if(colorwhite==true)
file.WriteString("
//关闭文件
file.Close();
读取文件:
读文件就是把我们以前保存的文件打开,读取当前打开文件的内容,并给数组赋值使和文件内容相同,然后可以继续进行游戏。
//与保存文件相反
OnOpen()
CFileDialogdlg(TRUE,"
inti,j,m;
CStdioFilefile;
modeRead)==0)
CArchivear(&
file,CArchive:
load);
ar.ReadString(str);
sscanf(str,"
%d"
&
m);
if(m==-1)
wzq[i][j]=-1;
if(m==0)
wzq[i][j]=0;
if(m==1)
wzq[i][j]=1;
ar.ReadString(str);
sscanf(str,"
if(m==1)
colorwhite=true;
colorwhite=false;
file.Close();
ar.Close();
Invalidate(false);
6.窗口截图
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- MFC 设计 五子棋 完全 代码