1.课程设计目的及要求
1.1设计目的及问题描述
Windows程序设计课程考核;
1.2设计要求
题目任选可以是小游戏、数据库系统、通信软件等。(不可以是教材的例子,程序需有一定规模)
1、必须用到所学的控件、对话框、菜单、工具栏、消息处理、视图框架、数据库、图形等大部分知识
2、创建的项目名“学号姓名XX”,学号仅取后四位,需严格遵守。
3、若该程序涉及多个窗口则每个窗口对应的类名必须包含学号(取后四位),需严格遵守。
1.3软件、硬件环境
Microsoft Visual C++ 6.0;
2.课程设计步骤
1.构思游戏;
2.使用VC++6.0,新建单文档工程,默认完成;
3.设计界面;
4.添加变量函数,实现游戏内容;
5.调试,改进,完善;
6.书写实验报告
3.课程设计内容
3.1概要设计
3.2主要技术
3.3程序设计结果(界面截图、操作流程)
1.添加资源:
添加两张位图:黑棋(IDB_BITMAP1),白棋(IDB_BITMAP2);
添加菜单栏:
游戏:人对机(ID_COMPUTER)
人对人(ID_PLAYER)
保存(ID_SAVE)
读取(ID_OPEN)
帮助:规则(ID_RELES)
2.在View类中添加成员变量和函数:
变量:
void drawqipan(CDC*pDC);//画棋盘界面
CPoint gamedown();//黑子自行选择棋子位置
bool candown();//有没有子能够下
void gameover();//结束
bool ifdown(CPoint point,bool colorx);//可不可以落子
void panduan(CPoint point,bool colorx);//判断翻转
afx_msg void OnStart();
afx_msg void OnLButtonUp(UINT nFlags, CPoint point
3.构造函数
CMy7137View::CMy7137View()
{
// TODO: add construction code here
hcursorblack=AfxGetApp()->LoadCursor(IDC_CURSOR1)
hcursorwhite=AfxGetApp()->LoadCursor(IDC_CURSOR2)
m_bmwhite.LoadBitmap(IDB_WHITE);
m_bmblack.LoadBitmap(IDB_BLACK);
m_bmJM.LoadBitmap(IDB_JIEMIAN);
ifstart=false;
for(int i=0;i<19;i++)
for(int j=0;j<19;j++)
wzq[i][j]=0;
colorwhite=true;
//默认为人对机
vscomputer=1;
}
4.设置窗口大小
BOOL CMainFrame::PreCreateWindow(CREATESTRUCT& cs)
{
if( !CFrameWnd::PreCreateWindow(cs) )
return FALSE;
// TODO: Modify the Window class or styles here b
// the CREATESTRUCT cs
cs.style=WS_SYSMENU|WS_OVERLAPPED|WS_MINIMIZEBOX;
//设置窗口大小:400*340
cs.cx=450;
cs.cy=530;
return TRUE;
}
5.OnDraw函数
void CMy7137View::OnDraw(CDC* pDC)
{
CMy7137Doc* pDoc = GetDocument();
ASSERT_VALID(pDoc);
// TODO: add draw code for native data here
if(ifstart==true)
{
CBrush mybrush1;
mybrush1.CreateSolidBrush(RGB(222,184,134));
CRect myrect1(0,0,1200,800);
pDC->FillRect(myrect1,&mybrush1);
CBrush mybrush;
mybrush.CreateSolidBrush(RGB(0,0,0));
CRect myrect(217,217,223,223);
pDC->FillRect(myrect,&mybrush);
//画黑框线
CPen mypen1;
mypen1.CreatePen(PS_SOLID,3,RGB(0,0,0));
pDC->SelectObject(&mypen1);
pDC->MoveTo(30,30);
pDC->LineTo(410,30);
pDC->LineTo(410,410);
pDC->LineTo(30,410);
pDC->LineTo(30,30);
CPen mypen;
CPen*myoldPen;
mypen.CreatePen(PS_SOLID,1,RGB(0,0,0));
myoldPen=pDC->SelectObject(&mypen);
for(int i=0;i<19;i++)
{
pDC->MoveTo(40,40+i*20);
pDC->LineTo(400,40+i*20);
pDC->MoveTo(40+i*20,40);
pDC->LineTo(40+i*20,400);
}
CDC Dc;
if(Dc.CreateCompatibleDC(pDC)==FALSE)
AfxMessageBox("Can't create DC");
for(int n=0;n<19;n++)
for(int m=0;m<19;m++)
if(wzq[n][m]==1)
{
Dc.SelectObject(m_bmwhite);
pDC->BitBlt(n*20+32,m*20+32,160,160,&Dc,0,0,SR
}
else if(wzq[n][m]==-1)
{
Dc.SelectObject(m_bmblack);
pDC->BitBlt(n*20+32,m*20+32,160,160,&Dc,0,0,S
}
}
else
{
CDC Dc;
if(Dc.CreateCompatibleDC(pDC)==FALSE)
AfxMessageBox("Can't create DC");
Dc.SelectObject(m_bmJM);
pDC->BitBlt(0,0,800,600,&Dc,0,0,SRCCOPY);
}
}
7.computerdown函数
void CMy7137View::computerdown()
{
//把各种情形赋值为如下
bpointcan4=(-1,-1);
wpointcan4=(-1,-1);
bpointcan3=(-1,-1);
wpointcan3=(-1,-1);
bpointcan2=(-1,-1);
wpointcan2=(-1,-1);
bpointcan1=(-1,-1);
//搜索最好的落棋点
for(int i=0;i<19;i++)
for(int j=0;j<19;j++)
bestputdown(i,j);
//判断放在哪里
//棋多的位置优先
//黑白一样多时黑先
if(bpointcan4.x!=-1)
{
putdown(bpointcan4);
return;
}
else if(wpointcan4.x!=-1)
{
putdown(wpointcan4);
return;
}
else if(bpointcan3.x!=-1)
{
putdown(bpointcan3);
return;
}
else if(wpointcan3.x!=-1)
{
putdown(wpointcan3);
return;
}
else if(bpointcan2.x!=-1)
{
putdown(bpointcan2);
return;
}
else if(wpointcan2.x!=-1)
{
putdown(wpointcan2);
return;
}
else
{
putdown(bpointcan1);
return;
}
}
8.maxnum函数
CPoint CMy7137View::maxnum(int a, int b, int c, in
{
//point.x为方向值
//point.y为最大值
CPoint point;
if(a>=b)
{
point.x=0;
point.y=a;
}
else
{
point.x=1;
point.y=b;
}
if(c>point.y)
{
point.x=2;
point.y=c;
}
if(d>point.y)
{
point.x=3;
point.y=d;
}
return point;
}
9.putdown函数
void CMy7137View::putdown(CPoint point)
{
CDC *pDC=GetDC();
CDC Dc;
if(Dc.CreateCompatibleDC(pDC)==FALSE)
AfxMessageBox("Can't create DC");
Dc.SelectObject(m_bmblack);
pDC->BitBlt(point.x*20+32,point.y*20+32,160,160,
wzq[point.x][point.y]=-1;
//变数组坐标为棋盘坐标
CPoint overpoint;
overpoint.x=point.x*20+30;
overpoint.y=point.y*20+30;
over(overpoint);
colorwhite=true;
}
10.OnSave函数
void CMy7137View::OnSave()
{
// TODO: Add your command handler code here
//设置保存的文件,后缀名wzq
CFileDialog dlg(FALSE,"wzq",NULL,OFN_HIDERE
//如果公共类对话框为确定
if(dlg.DoModal()==IDOK)
//获取文件名
dlg.GetFileName();
//否则,退出
else
return;
//字符串变量
CString str;
int i,j;
CStdioFile file;
//如果有问题,退出
if(file.Open(dlg.GetFileName(),CFile::modeCr
{
AfxMessageBox("save error!");
return;
}
//循环把棋盘数组的值写进文件
for(i=0;i<19;i++)
for(j=0;j<19;j++)
{
if(wzq[i][j]==-1)
file.WriteString("-1\n
if(wzq[i][j]==0)
file.WriteString("0\n"
if(wzq[i][j]==1)
file.WriteString("1\n"
}
//保存当前下棋颜色
if(colorwhite==true)
file.WriteString("1\n");
else
file.WriteString("0\n");
//关闭文件
file.Close();
}
3.4 程序截图
4.课程设计总结
4.1遇到的问题及如何解决