中北大学
程序设计 课程设计说明书
学生姓名: 号: 学 院: 信息与通信工程学院 专 业: 光电信息工程
题 目: 五子棋
指导教师: 职称:
2012 年 01月 06 日
院: 信息与通信工程学院 专 业: 光电信息工程 学 生 姓 名: 学 号: 10051041
课程设计题目: 五子棋 起 迄 日 期:2011年12月 24日~2012年1月6日
课程设计地点: 111420 指 导 教 师:
系 主 任:
下达任务书日期: 2011 年 12 月25 日
课 程 设 计 任 务 书
课 程 设 计 任 务 书
目 录
1、课程设计的背景及意义……………....06
2、设计的基本原理………………………06
3、设计的基本过程………………………08
4、设计的结果……………………………10
5、总结和结论…………………………….11
1. 设计背景及意义
我们的五子棋程序是在Visual C++ 6.0环境下运行的。
Visual C++ 6.0
Microsoft Visual C++(简称Visual C++、MSVC、VC++或VC)微软公司的C++开发工具,具有集成开发环境,可提供编辑C语言,C++以及C++/CLI等编程语言。VC++整合了便利的除错工具,特别是整合了微软视窗程式设计(Windows API)、三维动画DirectX API,Microsoft .NET框架。目前最新的版本是Microsoft Visual C++ 2010。Visual C++ 6.0集成了MFC6.0,于1998发行。发行至今一直被广泛地用于大大小小的项目开发。 五子棋是一种两人对弈的纯策略型棋类游戏,是起源于中国古代的传统黑白棋种之一。我们通过对《C语言》以及对《大学计算机基础》的初步学习后,本学期末进行了课程程序设计,设计课题为“五子棋”。我们小组由6人组成,通过分工与合作并在赵老师的耐心指导下共同完成了此程序设计。
2.设计的基本原理
2.1问题描述
连珠(五子棋)是有两个人在一盘棋上进行对抗的竞技运动。在对局开始时,先由用户选择哪方先开局,先开局一方将一枚棋子落在一点上,然后由另一方在对方棋周围的交叉点上落子,如此轮流落子,直到某一方首先在棋盘的直线、横线
或斜线上形成连续的五子则该方就算获胜。此时,算法结束。
2.2需求分析
(1)输出棋盘界面 (2)要求玩家选择棋子 (3)玩家轮流下棋
(4)判断键盘输入哪个键按规则执行操作 (5)判断谁先落棋 (6)判断赢家 (7)输出结果界面
2.3流程图
Y
3设计的基本过程
char b[40][40];
void show() //输出获胜图像// {
int i=0,j=0; //i为横坐标变量,j为纵坐标变量// for(i=0;i
for(i=0;i10&&i10&&j25&&j=6&&j=7&&j=8&&j=9&&j=10&&j=12&&j
{ if(i==27) {if(j>=14&&j=17&&j
详细说明:
Show函数的目的是输出获胜界面,调用全局变量b[][](目的是为图像分配存储空间),i为横坐标变量,j为纵坐标变量,接下来的两个for是把b[][]初始化为“.”,再接下来的双for是为塑形:限定行间距为10
4设计结果
玩家获胜显示界面截图
5总结与结论
1 课程设计是培养学生综合运用所学知识,发现,提出,分析和解决实际问题,锻炼实践能力的重要环节,是对学生实际工作能力的具体训练和考察过程.回顾起此次课程程序设计,至今我仍感慨颇多,从选题到定稿,从理论到实践,在整整两星期的日子里,学到很多很多的的东西,不仅巩固了以前所学过的知识,而且学到了很多在书本上所没有学到过的知识。通过这次课程设计使我懂得了理论与实际相结合是很重要的,只有理论知识是远远不够的,只有把所学的理论知识与实践相结合起来,才能真正提高自己的实际动手能力和独立思考的能力。在设计的过程中难免会遇到过各种各样的问题,同时在设计的过程中也发现了自己的不足之处,对以前所学过的知识理解得不够深刻,掌握得不够牢固,通过这次课程设计之后,把以前所学过的知识重新温故。 这次课程设计顺利完成了,在设计中遇到了很多编程问题,最后在赵宇老师的辛勤指导下,终于游逆而解。同时,在赵宇老师的身上我学得到很多实用的知识,我表示感谢!同时,对给过我帮助的所有同学和各位指导老师再次表示忠心的感谢!
附录
程序源代码:
#include
#include
char a[65][65];
char b[40][40];
void show() //输出获胜图像//
{
int i=0,j=0; //i为横坐标变量,j为纵坐标变量// for(i=0;i
for(j=0;j
{b[i][j]=46;}
for(i=0;i
for(j=0;j
{
if(i>10&&i
{if(j>10&&j25&&j
b[i][j]='O';}
else
{
if(i==21)
{if(j>=6&&j
b[i][j]='O';}
else
{
if(i==22)
{if(j>=7&&j
b[i][j]='O';}
else
{
if(i==23)
{if(j>=8&&j
b[i][j]='O';}
else
{
if(i==24)
{if(j>=9&&j
b[i][j]='O';}
else
{
if(i==25)
{if(j>=10&&j
b[i][j]='O';}
else
{
if(i==26)
{if(j>=12&&j
b[i][j]='O';}
else
{
if(i==27)
{if(j>=14&&j
b[i][j]='O';}
else
{
if(i==28)
{if(j>=17&&j
b[i][j]='O';}
}
}
}
}
}
}
}
}
}
for(i=0;i
{
for(j=0;j
printf("%c",b[i][j]);
printf("\n");
}
}
void move(int *x,int *y) /*移动棋子的方向*/ //x为上一步棋子横坐标,y为上一步棋子纵坐标//
{
char b[40]; //为记录棋子将要移动的步伐//
int i,z,flag=1; //z为某一步的中间变量,flag为标志变量// gets(b); //输入要移动的步伐//
for(i=0;i
{
z=b[i]; //把b【】的某一步传递给z//
switch(z) //判断移动棋子方向//
{
case 119: *x=*x-1;break; //w键控制棋子上移//
case 97: *y=*y-1;break; //a键控制棋子左移//
case 115: *x=*x+1;break; //s键控制棋子下移//
case 100: *y=*y+1;break; //d键控制棋子右移//
case 111: flag=0;break; //o键确定落子//
}
if(flag==0) break; //判断某步是否移动完成//
}
}
int playing() /*开始下棋*/
{
int flag=1,i=0,x=0,y=0,k,l,n=0,m=1; //flag为记录哪方下棋的标志变量,x,y为a[][]的横纵坐标,m,n分别记录o方,@方的积累步数// int *p1=&x,*p2=&y;
int judge (int x,int y); //本函数所用子函数的声明// void move(int *p1,int *p2);
void showcheckerboard(int x,int y);
printf("O方先输入首子坐标:");
scanf("%d %d",&x,&y); //输入首坐标//
a[x][y]='O'; //首坐标的棋盘位置画棋子// showcheckerboard(m,n); //输出更新后的棋盘// for(i=0;i
{
if(flag==1)
flag=0;
else
flag=1;
for(k=0;k
{
if(flag==1)
{ printf("O方下棋\n");m++;}
else
{ printf("@方下棋\n");n++;}
move(p1,p2);
if(x>=1&&x=1&&y
{
if(a[x][y]==46) break;
else
{if(flag==1) m--; else n--;
printf("此处有子,请继续移子");
continue;
}
}
else {if(flag==1) m--; else n--;printf("此处过界,请继续移子");}
}
if(flag==1) //在a[][]的特定位置更新字符// a[x][y]='O';
else
a[x][y]='@';
showcheckerboard(m,n); //更新棋盘//
l=judge(x,y); //记录谁赢变量//
if(l==1) return flag;
}
}
void showcheckerboard(int x,int y) /*画出棋盘*/ //x,y分别为o方下棋步数,@方下棋步数//
{
int i,j,w=0; //i,j为横纵坐标变量//
printf("============================================================
====================================================\n");
printf(" 0方累计下棋步数:%d @方累计下棋步数:%d\n",x,y);
printf("================================================================================================================\n");
for(i=0;i
printf("%2d",i);
printf("\n");
for(i=1;i
{
for(j=0;j
{
if(j==0)
{
w+=1;
printf("%2d",w);
}
else
{
printf("%2c",a[i][j]);
}
}
printf("\n");
}
}
int judge(int x,int y) /*判断各方向五子是否连成一线*/ //x,y分别为横纵坐标//
{
int i,b,c,d,e,z=1; //z为标志变量,记录每个方向连棋个数// for(i=1;i
{
if(a[x][y+i]==a[x][y])
{
z+=1;
if(z==5)
{return(1);break;}
}
else break;
}
for(i=1;i
{
if(a[x][y-i]==a[x][y])
{
z+=1;
if(z==5)
{return(1);break;}
}
else break;
}
e=z;z=1;
for(i=1;i
{
if(a[x+i][y]==a[x][y])
{
z+=1;
if(z==5)
{return(1);break;}
}
else break;
}
for(i=1;i
{
if(a[x-i][y]==a[x][y])
{
z+=1;
if(z==5)
{return(1);break;}
}
else break;
}
b=z;z=1;
for(i=1;i
{
if(a[x-i][y+i]==a[x][y])
{
z+=1;
if(z==5)
{return(1);break;}
}
else break;
}
for(i=1;i
{
if(a[x+i][y-i]==a[x][y])
{
z+=1;
if(z==5)
{return(1);break;}
}
else break;
}
c=z;z=1;
for(i=1;i
{
if(a[x-i][y-i]==a[x][y])
{
z+=1;
if(z==5)
{return(1);break;}
}
else break;
}
for(i=1;i
{
if(a[x+i][y+i]==a[x][y])
{
z+=1;
if(z==5)
{return(1);break;}
}
else break;
}
d=z;
if(e!=5&&b!=5&&c!=5&&d!=5) //判断某个方向五子连棋//
{
return(0);
}
}
void main()
{
int x,y,flag,m=0,n=0,p=0; //flag为哪方下棋的判断变量,m,n为分别记录双方的步数//
printf("================================================================================================================\n");
printf("w为上移动,a为左移动,s为下移动,d为右移动,o确定落棋子\n"); printf("=================================================================================================================\n");
printf("玩家1选择棋子:选0方输入1,选@方输入2\n"); scanf("%d",&p);
for(x=1;x
for(y=1;y
a[x][y]=46;
showcheckerboard(m,n); //输出棋盘//
flag=playing(); //下棋//
show(); //输出获胜图形//
if(flag==1) //判断哪方获胜//
printf("O方获胜");
else
printf("@方获胜");
}
中北大学
程序设计 课程设计说明书
学生姓名: 号: 学 院: 信息与通信工程学院 专 业: 光电信息工程
题 目: 五子棋
指导教师: 职称:
2012 年 01月 06 日
院: 信息与通信工程学院 专 业: 光电信息工程 学 生 姓 名: 学 号: 10051041
课程设计题目: 五子棋 起 迄 日 期:2011年12月 24日~2012年1月6日
课程设计地点: 111420 指 导 教 师:
系 主 任:
下达任务书日期: 2011 年 12 月25 日
课 程 设 计 任 务 书
课 程 设 计 任 务 书
目 录
1、课程设计的背景及意义……………....06
2、设计的基本原理………………………06
3、设计的基本过程………………………08
4、设计的结果……………………………10
5、总结和结论…………………………….11
1. 设计背景及意义
我们的五子棋程序是在Visual C++ 6.0环境下运行的。
Visual C++ 6.0
Microsoft Visual C++(简称Visual C++、MSVC、VC++或VC)微软公司的C++开发工具,具有集成开发环境,可提供编辑C语言,C++以及C++/CLI等编程语言。VC++整合了便利的除错工具,特别是整合了微软视窗程式设计(Windows API)、三维动画DirectX API,Microsoft .NET框架。目前最新的版本是Microsoft Visual C++ 2010。Visual C++ 6.0集成了MFC6.0,于1998发行。发行至今一直被广泛地用于大大小小的项目开发。 五子棋是一种两人对弈的纯策略型棋类游戏,是起源于中国古代的传统黑白棋种之一。我们通过对《C语言》以及对《大学计算机基础》的初步学习后,本学期末进行了课程程序设计,设计课题为“五子棋”。我们小组由6人组成,通过分工与合作并在赵老师的耐心指导下共同完成了此程序设计。
2.设计的基本原理
2.1问题描述
连珠(五子棋)是有两个人在一盘棋上进行对抗的竞技运动。在对局开始时,先由用户选择哪方先开局,先开局一方将一枚棋子落在一点上,然后由另一方在对方棋周围的交叉点上落子,如此轮流落子,直到某一方首先在棋盘的直线、横线
或斜线上形成连续的五子则该方就算获胜。此时,算法结束。
2.2需求分析
(1)输出棋盘界面 (2)要求玩家选择棋子 (3)玩家轮流下棋
(4)判断键盘输入哪个键按规则执行操作 (5)判断谁先落棋 (6)判断赢家 (7)输出结果界面
2.3流程图
Y
3设计的基本过程
char b[40][40];
void show() //输出获胜图像// {
int i=0,j=0; //i为横坐标变量,j为纵坐标变量// for(i=0;i
for(i=0;i10&&i10&&j25&&j=6&&j=7&&j=8&&j=9&&j=10&&j=12&&j
{ if(i==27) {if(j>=14&&j=17&&j
详细说明:
Show函数的目的是输出获胜界面,调用全局变量b[][](目的是为图像分配存储空间),i为横坐标变量,j为纵坐标变量,接下来的两个for是把b[][]初始化为“.”,再接下来的双for是为塑形:限定行间距为10
4设计结果
玩家获胜显示界面截图
5总结与结论
1 课程设计是培养学生综合运用所学知识,发现,提出,分析和解决实际问题,锻炼实践能力的重要环节,是对学生实际工作能力的具体训练和考察过程.回顾起此次课程程序设计,至今我仍感慨颇多,从选题到定稿,从理论到实践,在整整两星期的日子里,学到很多很多的的东西,不仅巩固了以前所学过的知识,而且学到了很多在书本上所没有学到过的知识。通过这次课程设计使我懂得了理论与实际相结合是很重要的,只有理论知识是远远不够的,只有把所学的理论知识与实践相结合起来,才能真正提高自己的实际动手能力和独立思考的能力。在设计的过程中难免会遇到过各种各样的问题,同时在设计的过程中也发现了自己的不足之处,对以前所学过的知识理解得不够深刻,掌握得不够牢固,通过这次课程设计之后,把以前所学过的知识重新温故。 这次课程设计顺利完成了,在设计中遇到了很多编程问题,最后在赵宇老师的辛勤指导下,终于游逆而解。同时,在赵宇老师的身上我学得到很多实用的知识,我表示感谢!同时,对给过我帮助的所有同学和各位指导老师再次表示忠心的感谢!
附录
程序源代码:
#include
#include
char a[65][65];
char b[40][40];
void show() //输出获胜图像//
{
int i=0,j=0; //i为横坐标变量,j为纵坐标变量// for(i=0;i
for(j=0;j
{b[i][j]=46;}
for(i=0;i
for(j=0;j
{
if(i>10&&i
{if(j>10&&j25&&j
b[i][j]='O';}
else
{
if(i==21)
{if(j>=6&&j
b[i][j]='O';}
else
{
if(i==22)
{if(j>=7&&j
b[i][j]='O';}
else
{
if(i==23)
{if(j>=8&&j
b[i][j]='O';}
else
{
if(i==24)
{if(j>=9&&j
b[i][j]='O';}
else
{
if(i==25)
{if(j>=10&&j
b[i][j]='O';}
else
{
if(i==26)
{if(j>=12&&j
b[i][j]='O';}
else
{
if(i==27)
{if(j>=14&&j
b[i][j]='O';}
else
{
if(i==28)
{if(j>=17&&j
b[i][j]='O';}
}
}
}
}
}
}
}
}
}
for(i=0;i
{
for(j=0;j
printf("%c",b[i][j]);
printf("\n");
}
}
void move(int *x,int *y) /*移动棋子的方向*/ //x为上一步棋子横坐标,y为上一步棋子纵坐标//
{
char b[40]; //为记录棋子将要移动的步伐//
int i,z,flag=1; //z为某一步的中间变量,flag为标志变量// gets(b); //输入要移动的步伐//
for(i=0;i
{
z=b[i]; //把b【】的某一步传递给z//
switch(z) //判断移动棋子方向//
{
case 119: *x=*x-1;break; //w键控制棋子上移//
case 97: *y=*y-1;break; //a键控制棋子左移//
case 115: *x=*x+1;break; //s键控制棋子下移//
case 100: *y=*y+1;break; //d键控制棋子右移//
case 111: flag=0;break; //o键确定落子//
}
if(flag==0) break; //判断某步是否移动完成//
}
}
int playing() /*开始下棋*/
{
int flag=1,i=0,x=0,y=0,k,l,n=0,m=1; //flag为记录哪方下棋的标志变量,x,y为a[][]的横纵坐标,m,n分别记录o方,@方的积累步数// int *p1=&x,*p2=&y;
int judge (int x,int y); //本函数所用子函数的声明// void move(int *p1,int *p2);
void showcheckerboard(int x,int y);
printf("O方先输入首子坐标:");
scanf("%d %d",&x,&y); //输入首坐标//
a[x][y]='O'; //首坐标的棋盘位置画棋子// showcheckerboard(m,n); //输出更新后的棋盘// for(i=0;i
{
if(flag==1)
flag=0;
else
flag=1;
for(k=0;k
{
if(flag==1)
{ printf("O方下棋\n");m++;}
else
{ printf("@方下棋\n");n++;}
move(p1,p2);
if(x>=1&&x=1&&y
{
if(a[x][y]==46) break;
else
{if(flag==1) m--; else n--;
printf("此处有子,请继续移子");
continue;
}
}
else {if(flag==1) m--; else n--;printf("此处过界,请继续移子");}
}
if(flag==1) //在a[][]的特定位置更新字符// a[x][y]='O';
else
a[x][y]='@';
showcheckerboard(m,n); //更新棋盘//
l=judge(x,y); //记录谁赢变量//
if(l==1) return flag;
}
}
void showcheckerboard(int x,int y) /*画出棋盘*/ //x,y分别为o方下棋步数,@方下棋步数//
{
int i,j,w=0; //i,j为横纵坐标变量//
printf("============================================================
====================================================\n");
printf(" 0方累计下棋步数:%d @方累计下棋步数:%d\n",x,y);
printf("================================================================================================================\n");
for(i=0;i
printf("%2d",i);
printf("\n");
for(i=1;i
{
for(j=0;j
{
if(j==0)
{
w+=1;
printf("%2d",w);
}
else
{
printf("%2c",a[i][j]);
}
}
printf("\n");
}
}
int judge(int x,int y) /*判断各方向五子是否连成一线*/ //x,y分别为横纵坐标//
{
int i,b,c,d,e,z=1; //z为标志变量,记录每个方向连棋个数// for(i=1;i
{
if(a[x][y+i]==a[x][y])
{
z+=1;
if(z==5)
{return(1);break;}
}
else break;
}
for(i=1;i
{
if(a[x][y-i]==a[x][y])
{
z+=1;
if(z==5)
{return(1);break;}
}
else break;
}
e=z;z=1;
for(i=1;i
{
if(a[x+i][y]==a[x][y])
{
z+=1;
if(z==5)
{return(1);break;}
}
else break;
}
for(i=1;i
{
if(a[x-i][y]==a[x][y])
{
z+=1;
if(z==5)
{return(1);break;}
}
else break;
}
b=z;z=1;
for(i=1;i
{
if(a[x-i][y+i]==a[x][y])
{
z+=1;
if(z==5)
{return(1);break;}
}
else break;
}
for(i=1;i
{
if(a[x+i][y-i]==a[x][y])
{
z+=1;
if(z==5)
{return(1);break;}
}
else break;
}
c=z;z=1;
for(i=1;i
{
if(a[x-i][y-i]==a[x][y])
{
z+=1;
if(z==5)
{return(1);break;}
}
else break;
}
for(i=1;i
{
if(a[x+i][y+i]==a[x][y])
{
z+=1;
if(z==5)
{return(1);break;}
}
else break;
}
d=z;
if(e!=5&&b!=5&&c!=5&&d!=5) //判断某个方向五子连棋//
{
return(0);
}
}
void main()
{
int x,y,flag,m=0,n=0,p=0; //flag为哪方下棋的判断变量,m,n为分别记录双方的步数//
printf("================================================================================================================\n");
printf("w为上移动,a为左移动,s为下移动,d为右移动,o确定落棋子\n"); printf("=================================================================================================================\n");
printf("玩家1选择棋子:选0方输入1,选@方输入2\n"); scanf("%d",&p);
for(x=1;x
for(y=1;y
a[x][y]=46;
showcheckerboard(m,n); //输出棋盘//
flag=playing(); //下棋//
show(); //输出获胜图形//
if(flag==1) //判断哪方获胜//
printf("O方获胜");
else
printf("@方获胜");
}