《windows程序设计》
课程设计报告
学院(系): 计算机科学与技术系
班 级: 计专2班
学生姓名: 梁剑 学号 0907045233
指导教师:
时间:从 2010 年1 月18 日到2010 年1 月22 日
摘要
1. 能够利用所学的基本知识, 设计一个简单的五子棋序,具有以下功能:①数据结构的设计;五子棋棋盘的绘制。②人机下棋时,计算机下棋算法的设计。③人机下棋时,判断任一方获胜的算法的设计。
关键字: MFC编程,Windows程序
目录
项目一: 五子棋
1 设计目的与要求..... 1
1.1 设计目的.... 1
1.2 设计内容.... 1
1.3 设计要求.... 1
2 设计环境或器材、原理与说明..... 3
2.1 设计环境与器材.... 3
2.2 原理与说明.... 3
3 设计过程及程序代码..... 6
3.1 服务器端设计.... 6
3.1.1 界面设计.... 6
3.1.2 人下棋设计.... 8
3.1.3 电脑下棋设计.... 8
3.1.4 搜索最优下棋点.... 9
4 设计结果与分析..... 21
4.1 设计结果.... 21
4.2 设计分析.... 22
5 设计体会与建议..... 23
参考文献..... 24
五子棋
1 设计目的与要求
1.1 设计目的
1、进一步掌握利用Visual C++进行程序设计的能力;
2、进一步理解和运用面向对象程序设计的思想和方法;
3、初步掌握开发一个小型实用系统的基本方法;
4、学会调试一个较长程序的基本方法;
5、理解Windows程序的运行过程;
1.2设计内容
能够利用所学的基本知识, 设计一个简单的学生信息管理应用程序,具有以下功能:①数据结构的设计;五子棋棋盘的绘制。②人机下棋时,计算机下棋算法的设计。③人机下棋时,判断任一方获胜的算法的设计。
1.3 设计要求
整个程序使用winsocket 函数做网络数据收发,基于UDP协议。可以直接使用Windows API编程(SDK编程),也可以使用MFC编程。本课程设计中我们使用的是MFC编程。其具体的设计要求如下所述:
2 设计环境或器材、原理与说明
2.1 设计环境与器材
因为选择使用MFC编程Windows环境与Microsoft Visual C++ 6.0 编译环境;
2.2 原理与说明
首先利用mfc建立单文档窗口,在窗口上画19*19的表格,把每个表格点的信息存在二维数组wzq[19][19]中。白棋为1,黑棋为-1,这样当要测是否结束时只要查看4个方向的绝对值是否等于5,就可以判定输赢了
如图:
3.1设计过程及程序代码
3.11界面设计:
图3-2 五子棋界面设计
打开应用程序时游戏会自动开始。
显示表格代码:
CMyDoc* pDoc = GetDocument();
ASSERT_VALID(pDoc);
// TODO: add draw code for native data here
CBrush mybrush1;
mybrush1.CreateSolidBrush(RGB(192,192,192));
CRect myrect1(0,0,1200,800);
pDC->FillRect(myrect1,&mybrush1);
//画棋盘框线
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,SRCCOPY);
}
else if(wzq[n][m]==-1)
{
//显示黑棋
Dc.SelectObject(m_bmblack); pDC->BitBlt(n*20+32,m*20+32,160,160,&Dc,0,0,SRCCOPY);
}
3.1.2 人下棋设计
涉及到OnLButtonDown(UINT nFlags, CPoint point)和OnLButtonUp(UINT nFlags, CPoint point)两个函数了。要用哪一个或用两个?用Down函数时是在鼠标按下时放下棋子,可是,要是我们按下后意识到按错了怎么办;那就改用Up函数,表示当鼠标键松开时放下棋子。
这样子当鼠标点下并放开时界面上会显示相应的棋子。并调用over函数判断输赢。
代码如下:
void CMy3_1View::OnLButtonUp(UINT nFlags, CPoint point)
{
// TODO: Add your message handler code here and/or call default
CDC *pDC=GetDC();
CDC Dc;
if(Dc.CreateCompatibleDC(pDC)==FALSE)
AfxMessageBox("Can't create DC");
//是否在棋盘内
if(point.x>30&&point.x<410&&point.y>30&&point.y<410)
{
int px=(point.x-30)/20;
int py=(point.y-30)/20;
//是否已经有棋子
if(colorwhite&&wzq[px][py]==0)
{
Dc.SelectObject(m_bmwhite);
pDC->BitBlt(px*20+32,py*20+32,160,160,&Dc,0,0,SRCCOPY);
//表示存在白棋
wzq[px][py]=1;
//检查是否结束
over(point);
//换黑棋下
colorwhite=false;
}
else if(wzq[px][py]==0)
{
Dc.SelectObject(m_bmblack);
pDC->BitBlt(px*20+32,py*20+32,160,160,&Dc,0,0,SRCCOPY);
wzq[px][py]=-1;
over(point);
colorwhite=true;
}
}
CView::OnLButtonUp(nFlags, point);
}
3.1.3 电脑下棋:
计算机要下棋?就要定位。即搜索棋盘,找出一个最佳点,放下黑棋。实现的方法是:全盘搜索,并把搜索到的位置,保存在变量。由于有多种情况,我们定义变量如下:
CPoint bpointcan4, //这个位置空,它旁边有四个黑棋
wpointcan4, //这个位置空,它旁边有四个白棋
bpointcan3, //这个位置空,它的旁边有三个黑棋
wpointcan3, //这个位置空,它的旁边有三个白棋
bpointcan2, //这个位置空,它的旁边有两个黑棋
wpointcan2, //这个位置空,它的旁边有两个白棋
bpointcan1; //不是以上情况,这个位置空
3.1.4搜索最优下棋点
并在搜索之前都赋值为(-1,-1),然后,进行搜索,并把相应的值保存在相应变量里面,而如果前面已经对变量赋值,我们依然赋值,用新值代替旧值。注意:我们只保存最后一个值,这样的一个好处是,避免了每次都从左上角开始,并且它的随机性比随机函数还随机。
全盘搜索完之后,由于上面的变量中至少有一个已经被赋值,即不是(-1,-1),我们可以采用多数优先的方法,让已经有多个同色棋子的位置先下棋。其原理是,如果已经有四个黑棋,计算机再下一个黑棋就赢了;否则,如果人已经有四个白棋,那么计算机就必须放下一个黑棋,阻止白棋下一步赢;如果已经有三个黑棋,再下一个黑棋,变成四个;否则,如果已经有三个白棋,下一个黑棋,破坏它;两个棋子的同理;否则,在刚才白棋下的地方,顺便找一个位置,下棋。computerdown()函数如下:
//轮到计算机下棋
void CMy3_1View::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);
//判断放在哪里
//棋多的位置优先
//黑白一样多时黑先
//不是-1就表示已经被赋值!
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;
}
}
上面又有两个新函数,分别定义为空函数,如下:
//搜索最佳位置
void bestputdown(int i,int j);
//放下黑棋
void putdown(CPoint point);
现在,我们就必须对上面两个空函数进行定义了。
在指定位置下棋:
由于putdown(CPoint point)函数的原理非常简单,我们先说明如下:
//黑棋下
void CMy3_1View::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,&Dc,0,0,SRCCOPY);
wzq[point.x][point.y]=-1;
//由于原来我们检查是否结束时用的是鼠标点下的坐标,而现在
//putdown(CPoint point)函数用的是数组棋盘的坐标,所以必须转换
CPoint overpoint;
overpoint.x=point.x*20+30;
overpoint.y=point.y*20+30;
over(overpoint);
colorwhite=true;
}
搜索最佳落棋点:
现在就剩下void bestputdown(int i,int j)函数没有定义了(虽然前面的变量函数已经说明了,当时我们这里是用程序扩展的思路进行的,故如此说明)。它的实现原理是:在四个方向上,各自计算那个方向上棋子的状态,我们的思路是利用原来定义的白棋为1,黑棋为-1,的思想,让同个方向上的五个棋子的值相加,取绝对值并赋值给为这个方向定义的局部变量num[i]。
为什么要用五个棋子的值相加呢?因为,如果几个棋子是同色的,无论黑白,它的绝对值必然大,而对于几个棋子中有黑棋和白棋的,其值必然相加而抵消变小。所以我们可以利用这种方法来寻找旁边有多个同色棋子的空位置(前面已经具体说明)。
在每一个棋盘位置,计算以它为起点的四个方向(横、竖、撇、捺),再比较这四个方向中哪个值最大,然后在这个方向上寻找落棋点。
//检查四个方向,各算出五个棋子的和并赋值
void CMy3_1View::bestputdown(int i,int j)
{
//四个方向的值
int num[4];
int a,k;
/////////////////////////////// num[0] -->
a=0;
if(i<15)
for(k=0;k<5;k++)
a=a+wzq[i+k][j];
num[0]=abs(a);
////////////////////////////// num[1] "|"
a=0;
if(j<15)
for(k=0;k<5;k++)
a=a+wzq[i][j+k];
num[1]=abs(a);
/////////////////////////////// num[2] "\"
a=0;
if(i<15&&j<15)
for(k=0;k<5;k++)
a=a+wzq[i+k][j+k];
num[2]=abs(a);
////////////////////////////// num[3] "/"
a=0;
if((i>4)&&(j<15))
for(k=0;k<5;k++)
a=a+wzq[i-k][j+k];
num[3]=abs(a);
//比较哪个方向同色棋最多
//由于我们搜索落棋点时用到最大值和方向,我们可以定义一个Cpoint类变量,//让它返回两个值。可以说,这也是一种巧妙的想法,因为这样你就不用去写//内联函数了
CPoint numbig;
//numbig.x表示方向
//numbig.y表示最大值
numbig=maxnum(num[0],num[1],num[2],num[3]);
//在得到最大值和方向上寻找落棋点
switch(numbig.y)
{
case 4:
searchcandown4(i,j,numbig.x);break;
case 3:
searchcandown3(i,j,numbig.x);break;
case 2:
searchcandown2(i,j,numbig.x);break;
default:
searchcandown1(i,j,numbig.x);
}
}
同样的方法,我们必须为上面还没有定义的函数添加空函数。
//其中i、j表示搜索起点,n表示方向
void searchcandown1(int i,int j,int n);
void searchcandown2(int i,int j,int n);
void searchcandown3(int i,int j,int n);
void searchcandown4(int i,int j,int n);
CPoint maxnum(int a,int b,int c,int d);
最大值函数的实现:
现在先介绍CPoint maxnum(int a,int b,int c,int d)函数,它只是四个整数的比较:
CPoint CMy3_1View::maxnum(int a, int b, int c, int d)
{
//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;
}
而另外的四个函数,有其相似性,分别介绍如下:
void searchcandown4(int i,int j,int n)函数:
如果最大值是四,它必然有一个空位置;我们可以这样计算,如果第一个是空,那我们把它赋值给相应变量;否则,先找那个空位置,然后判断第一个棋子的颜色,并赋相应的值。
//由于相似,下面代码只解释第一个方向
//有四个同色棋
void CMy3_1View::searchcandown4(int i, int j, int n)
{
int k;
///////////////////////////// num[0] "--"
if(n==0)
for(k=0;k<5;k++)
//如果第一个是空
if(wzq[i][j]==0)
{
//如果下面有白棋
if(wzq[i+1][j]==1)
{
//下面位置可以下棋,已经有四个白棋
wpointcan4.x=i;
wpointcan4.y=j;
break;
}
else
{
//下面位置可以下棋,已经有四个黑棋
bpointcan4.x=i;
bpointcan4.y=j;
break;
}
}
//如果找到下棋位置,一定能找到!
else if(wzq[i+k][j]==0)
{
//如果第一个是白棋
if(wzq[j][j]==1)
{
wpointcan4.x=i+k;
wpointcan4.y=j;
break;
}
//否则第一个是黑棋
else
{
bpointcan4.x=i+k;
bpointcan4.y=j;
break;
}
}
//////////////////////////// num[1] "|"
if(n==1)
for(k=0;k<5;k++)
{
if(wzq[i][j]==0)
if(wzq[i][j+1]==1)
{
wpointcan4.x=i;
wpointcan4.y=j;
break;
}
else
{
bpointcan4.x=i;
bpointcan4.y=j;
break;
}
else if(wzq[i][j+k]==0)
{
if(wzq[i][j]==1)
{
wpointcan4.x=i;
wpointcan4.y=j+k;
break;
}
else
{
bpointcan4.x=i;
bpointcan4.y=j+k;
break;
}
}
}
/////////////////////////////// num[2] "\"
if(n==2)
for(k=0;k<5;k++)
{
if(wzq[i][j]==0)
if(wzq[i+1][j+1]==1)
{
wpointcan4.x=i;
wpointcan4.y=j;
break;
}
else
{
bpointcan4.x=i;
bpointcan4.y=j;
break;
}
else if(wzq[i+k][j+k]==0)
{
if(wzq[i][j]==1)
{
wpointcan4.x=i+k;
wpointcan4.y=j+k;
break;
}
else
{
bpointcan4.x=i+k;
bpointcan4.y=j+k;
break;
}
}
}
////////////////////////////// num[3] "/"
if(n==3)
for(k=0;k<5;k++)
{
if(wzq[i][j]==0)
if(wzq[i-1][j+1]==1)
{
wpointcan4.x=i;
wpointcan4.y=j;
break;
}
else
{
bpointcan4.x=i;
bpointcan4.y=j;
break;
}
else if(wzq[i-k][j+k]==0)
{
if(wzq[i][j]==1)
{
wpointcan4.x=i-k;
wpointcan4.y=j+k;
break;
}
else
{
bpointcan4.x=i-k;
bpointcan4.y=j+k;
break;
}
}
}
}
void searchcandown3(int i,int j,int n)函数:
如果最大值是三,它有两种情况,一种是三个同色和两个空;一种是四个同色和一个异色。前一种必定能找到一个空位置,赋值;后一种必定找不到空位置,不赋值。所以我们的想法很简单,先找到空位置,证明有三个同色,这对于玩五子棋来说三个同色是很重要的,再判断是哪种颜色,赋相应的值。
//最多有三个同色
void CMy3_1View::searchcandown3(int i, int j, int n)
{
int k=0;
///////////////////////////// num[0] "--"
if(n==0)
for(k=0;k<5;k++)
//找到位置
if(wzq[i+k][j]==0)
{
//下一个是白棋
if(wzq[i+k+1][j]==1)
{
//下面位置可以下棋,已经有三个白棋
wpointcan3.x=i+k;
wpointcan3.y=j;
}
//下一个是黑棋
else if(wzq[i+k+1][j]==-1)
{
bpointcan3.x=i+k;
bpointcan3.y=j;
}
}
//////////////////////////// num[1] "|"
if(n==1)
for(k=0;k<5;k++)
if(wzq[i][j+k]==0)
{
if(wzq[i][j+k-1]==1)
{
wpointcan3.x=i;
wpointcan3.y=j+k;
}
else if(wzq[i][j+k+1]==-1)
{
bpointcan3.x=i;
bpointcan3.y=j+k;
}
}
/////////////////////////////// num[2] "\"
if(n==2)
for(k=0;k<5;k++)
if(wzq[i+k][j+k]==0)
{
if(wzq[i+k+1][j+k+1]==1)
{
wpointcan3.x=i+k;
wpointcan3.y=j+k;
}
else if(wzq[i+k+1][j+k+1]==-1)
{
bpointcan3.x=i+k;
bpointcan3.y=j+k;
}
}
////////////////////////////// num[3] "/"
if(n==3)
for(k=0;k<5;k++)
if(wzq[i-k][j+k]==0)
{
if(wzq[i-k-1][j+k+1]==1)
{
wpointcan3.x=i-k;
wpointcan3.y=j+k;
}
else if(wzq[i-k-1][j+k+1]==-1)
{
bpointcan3.x=i-k;
bpointcan3.y=j+k;
}
}
}
void searchcandown2(int i,int j,int n)函数:
如果最大值是二,也有两种情况:一种是有两个同色和三个空位置;一种是有三个同色和一个异色和一个空位置,并且只算三个同色不连在一起的情况(因为如果有三个连续的情况,重全盘搜索的角度看,必然会被另外的情况所代替)。
分两种算法:一种是有一个空位置,一种是有三个空位置。前者先找到空位置,再判断它下面两个是否同色,同色则赋值给相应变量,异色则不赋值,因为意义不大;后者只要找到一个空位置就行了。
//最多有两个同色
void CMy3_1View::searchcandown2(int i, int j, int n)
{
int k=0,m=0,a=0,b=0;
///////////////////////////// num[0] "--"
if(n==0)
{
//判断有多少个空位置
for(k=0;k<5;k++)
if(wzq[i+k][j]==0)
m+=1;
//如果只有一个空位置
if(m==1)
for(a=0;a<5;a++)
//找到空位置
if(wzq[i+a][j]==0)
{
//下面两个棋子值的和
b=wzq[i+a+1][j]+wzq[i+a+2][j];
//都是黑棋
if(b==-2)
{
//下面位置可以下棋,旁边有两个黑棋
bpointcan2.x=i+a;
bpointcan2.y=j;
}
//都是白棋
if(b==2)
{
wpointcan2.x=i+a;
wpointcan2.y=j;
}
}
//如果有三个空位置,说明另外两个同色
if(m==3)
{
for(a=0;a<5;a++)
//如果两个是黑棋
if(wzq[i+a][j]==-1)
{
for(b=0;b<5;b++)
//如果找到空位置
if(wzq[i+b][j]==0)
{
//下面位置可以下棋,旁边有两个黑棋
bpointcan2.x=i+b;
bpointcan2.y=j; break;
}
}
else
//如果两个是白棋
if(wzq[i+a][j]==1)
{
for(b=0;b<5;b++)
if(wzq[i+b][j]==0)
{
wpointcan2.x=i+b;
wpointcan2.y=j; break;
}
}
}
}
//////////////////////////// num[1] "|"
m=0;
if(n==1)
{
for(k=0;k<5;k++)
if(wzq[i][j+k]==0)
m++;
if(m==1)
for(a=0;a<5;a++)
if(wzq[i][j+a]==0)
{
b=wzq[i][j+a+1]+wzq[i][j+a+2];
if(b==-2)
{
bpointcan2.x=i;
bpointcan2.y=j+a;
}
if(b==2)
{
wpointcan2.x=i;
wpointcan2.y=j+a;
}
}
if(m==3)
{
for(a=0;a<5;a++)
if(wzq[i][j+a]==-1)
{
for(b=0;b<5;b++)
if(wzq[i][j+b]==0)
{
bpointcan2.x=i;
bpointcan2.y=j+b; break;
}
}
else
if(wzq[i][j+a]==1)
{
for(b=0;b<5;b++)
if(wzq[i][j+b]==0)
{
wpointcan2.x=i;
wpointcan2.y=j+b; break;
}
}
}
}
/////////////////////////////// num[2] "\"
m=0;
if(n==2)
{
for(k=0;k<5;k++)
if(wzq[i+k][j+k]==0)
m++;
if(m==1)
for(a=0;a<5;a++)
if(wzq[i+a][j+a]==0)
{
b=wzq[i+a+1][j+a+1]+wzq[i+a+2][j+a+2];
if(b==-2)
{
bpointcan2.x=i+a;
bpointcan2.y=j+a;
}
if(b==2)
{
wpointcan2.x=i+a;
wpointcan2.y=j+a;
}
}
if(m==3)
{
for(a=0;a<5;a++)
if(wzq[i+a][j+a]==-1)
{
for(b=0;b<5;b++)
if(wzq[i+b][j+b]==0)
{
bpointcan2.x=i+b;
bpointcan2.y=j+b; break;
}
}
else
if(wzq[i+a][j+a]==1)
{
for(b=0;b<5;b++)
if(wzq[i+b][j+b]==0)
{
wpointcan2.x=i+b;
wpointcan2.y=j+b; break;
}
}
}
}
////////////////////////////// num[3] "/"
m=0;
if(n==3)
{
for(k=0;k<5;k++)
if(wzq[i-k][j+k]==0)
m++;
if(m==1)
for(a=0;a<5;a++)
if(wzq[i-a][j+a]==0)
{
b=wzq[i-a-1][j+a+1]+wzq[i-a-2][j+a+2];
if(b==-2)
{
bpointcan2.x=i-a;
bpointcan2.y=j+a;
}
if(b==2)
{
wpointcan2.x=i-a;
wpointcan2.y=j+a;
}
}
if(m==3)
{
for(a=0;a<5;a++)
if(wzq[i-a][j+a]==-1)
{
for(b=0;b<5;b++)
if(wzq[i-b][j+b]==0)
{
bpointcan2.x=i-b;
bpointcan2.y=j+b; break;
}
}
else
if(wzq[i-a][j+a]==1)
{
for(b=0;b<5;b++)
if(wzq[i-b][j+b]==0)
{
wpointcan2.x=i-b;
wpointcan2.y=j+b; break;
}
}
}
}
}
void searchcandown1(int i,int j,int n)函数:
最后的一个函数是searchcandown1(int i, int j, int n),这是为了预防用的,如果以上情况不发生怎么办,总该下棋吧!而这个函数就是为了它而生的。这里就说明了为什么我们要添加vspoint的原因了,它保存了上次白棋下棋的位置,而我们在没有办法的情况下,也只能采取这一步,在白棋旁边随便找个位置算了。
//如果五个位置的和是一
void CMy3_1View::searchcandown1(int i, int j, int n)
{
//计算刚才白棋落棋点
int ii=(vspoint.x-30)/20;
int jj=(vspoint.y-30)/20;
int a;
for(a=0;a<5;a++)
//如果不到边界
if(ii+a<19)
{
//向右,如果有空位置
if(wzq[ii+a][jj]==0)
{
//在这个位置下黑棋
bpointcan1.x=ii+a;
bpointcan1.y=jj;
return;
}
}
//到了边界
else
//向左,如果有空位置
if(wzq[ii-1][jj]==0)
{
bpointcan1.x=ii-a;
bpointcan1.y=jj;
return;
}
}
4 设计结果与分析
4.1 设计结果
4.2 设计分析
因为该程序是博弈类棋类游戏,其中涉及到了人工智能和搜索最优算法,这对于我现在的水平还不足于设计出足够强大的算法。所以在借鉴和学习的基础上,利用现成的算法加于改进。
5 设计体会与建议
通过本次基Windows程序设计,我受益匪浅,并对Windows程序设计这一门课程与相关一些技术有了更深一步的认识。在实验中,我们可以把这学期所学的理论知识和实践联系起来,在所要设计的程序中渐渐融会贯通。虽然我们对这些知识还运用得还不是很熟练,但是相信在现在和今后的学习中会得到更加深刻的掌握。本课程设计是设计一个程序,实现 人机和人人之间下棋。通过设计我们进一步掌握利用Visual C++进行程序设计的能力;进一步理解和运用面向对象程序设计的思想和方法;初步掌握开发一个小型实用系统的基本方法;学会调试一个较长程序的基本方法;理解Windows程序的运行过程;掌握windows编程方法。
总的来说通过本次实验,我学习到了许多东西,增强了一定的实践能力。课程设计过程中我们一边设计一边探索,发现理论和实践要充分地结合,是需要扎实的基本功的,这就表明学好基础知识是理论付诸实践的前提。希望在以后我们能充分利用实习的机会充实自己,并希望有更多的这样的实践机会。
参考文献:
[1].Charles Petzold 著,Windows程序设计.北京博彦科技发展有限公司译.北京.北京大学出版社,1998
[2].杨祥金,杨丹等.Windows程序设计教程.北京:清华大学出版社,2007
[3].Charles Prterzold.Programming Windows by Charles Prterzold.Microsoft Press,1998
[4].何立起著,陆东晖,杜坚贞改编.Borland C++ Windows程序设计.北京:人民邮电出版社,1994
[5].Vc+++游戏编程 作者:王鹏生 2001.12