五子棋程序设计说明书

中北大学

程序设计 课程设计说明书

学生姓名: 号: 学 院: 信息与通信工程学院 专 业: 光电信息工程

题 目: 五子棋

指导教师: 职称:

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("@方获胜");

}


相关文章

  • AI五子棋程序设计
  • 课程名称: 项目名称:专业班级:计算机科学与技术 学生姓名:指导教师: 人工智能 人工智能之五子棋程序设计 学号: 冯婧 谢红薇 2014年12月7日 大数据的关键技术 一.大数据环境下的数据处理需求 大数据环境下数据来源非常丰富且数据类型 ...查看


  • 五子棋开题报告
  • 一.选题的依据及意义 五子棋是一种两人对弈的纯策略型棋类游戏,是起源于中国古代的传统黑白棋种之一.发展于日本,流行于欧美.容易上手,老少皆宜,而且趣味横生,引人入胜:五子棋不仅能增强思维能力,提高智力,而且富含哲理,有助于修身养性.五子棋既 ...查看


  • 第四届智力运动会策划终
  • 第四届智力运动会 策 划 书 主办:中国石油大学(华东)校团委 承办:中国石油大学社团联合会 2011年11月18日 在两个校区刚合并的大形势下,为了使同学们尽快融入到学校"和谐团结,积极奋进"的氛围中,丰富和活跃校园文 ...查看


  • 五子棋比赛规则
  • 五子棋比赛规则 1) 黑先.白后,从天元开始相互顺序落子. 2) 白棋第一手应在天元为界自己一侧布子,之后双方可任意行子. 3) 最先在棋盘横向.竖向.斜向形成连续的相同色五个棋子的一方为胜. 4) 黑棋禁手判负.白棋无禁手.黑棋禁手包括& ...查看


  • 五子棋比赛策划书
  • 本文由ZJIEJIEJ 贡献 doc文档可能在WAP 端浏览体验不佳.建议您优先选择TXT ,或下载源文件到本机查看. 昊天假日酒店五子棋比赛策划书 为丰富员工业余文化生活,进一步渗透企业文化,增强企业凝聚力和向心 力, 为员工营造更加和谐 ...查看


  • 五子棋的设计与开发开题报告
  • 学校代码: 学 号: HENAN INSTITUTE OF ENGINEERING 毕业设计(论文) 题 目 五子棋游戏的 _______学生姓名 专业班级 学 号 系 (部) 计算机科学与工程系 指导教师(职称) 完成时间 2011 年 ...查看


  • 五子棋是起源于中国古代的传统黑白棋种之一03
  • 五子棋是起源于中国古代的传统黑白棋种之一.现代五子棋日文称之为 " 连珠 " ,英译为 "Renju" ,英文称之为 "Gobang" 或 "FIR"(Five ...查看


  • 信息的智能化加工案例
  • 信息的智能化加工 一.教学内容分析 信息的智能化加工作为信息加工的一种类型,是本章内容重要组成部分.信息的智能化主要特点是让计算机更加自主地加工,减少人的参与,进一步提高信息加工的效率和人性化程度. 本节内容对应课程内容标准:通过部分智能信 ...查看


  • 五子棋程序禁手规则
  • 五子棋程序禁手规则 行棋顺序 黑先(Start).白后,从天元(h8)开始相互顺序落子. 判断胜负 最先在棋盘横向.竖向.斜向形成连续的相同色五个棋子的一方为胜. 黑棋禁手判负(Lose),白棋无禁手.黑棋禁手包括"三.三&quo ...查看


热门内容