资源描述
中 国 地 质 大 学
本科生课程论文封面
课程名称 C语言课程设计
教师姓名
本科生姓名
本科生学号
本科生专业
所在院系
类别:
日期:
课程设计评语
对课程论文的评语:
平时成绩:
课程论文成绩:
总 成 绩:
评阅人签名:
注:1、无评阅人签名成绩无效;
2、必须用钢笔或圆珠笔批阅,用铅笔阅卷无效;
3、如有平时成绩,必须在上面评分表中标出,并计算入总成绩。
目 录
课程设计评语 2
目 录 3
1.课程论文题目 4
2.程序设计思路 4
3.功能模块图 5
4.数据结构设计 5
5.算法设计 5
6.程序代码 8
7.程序运行结果 11
8.编程中遇到的困难及解决方法 13
9.总结心得及良好建议 14
1.课程论文题目
一担挑游戏:
[要求]
简单计算机模拟棋盘对弈。其中棋盘左上角坐标为(1,1),右下脚坐标为(3,3)。游戏规则如下:
(1)计算机移动时,使用相应的函数扫描棋盘矩阵,寻找未占单元,发现空单元后,置为“O”,未发现时,报告平局后退出。
(2)轮到对弈者时,使用相应函数要求对弈者把“X”放在哪里。
(3)谁先三点一线了,则报告谁胜出。
(4)计算机与对弈者没下一步棋都会使相应位置变为“O”和“X”,便于在屏上显示矩阵。
[提示]
棋盘位置用二维数组代表,初始状态每一位置均为“ ”(空)。其分隔线(即棋盘线)可用- -或||来分隔。
2.程序设计思路
(1)由于此一担挑游戏棋盘是3*3的棋盘,所以棋盘的位置可以用二维数组来表示,在输入时需要采用坐标形式输入;
(2)在输入坐标时,因为可能出错,所以需要对坐标是否重复和超界进行判断,计算机移动时系统要不停得扫描棋盘矩阵来寻找未占单元,所以程序提供了显示、浏览、查找、排序等操作;
(3)在对奕者与计算机输入坐标后,应该进行输赢平局的判断;
(4)另外系统还能提供键盘式的选择菜单来实现功能的选择。
3.功能模块图
一担挑游戏
初始化棋盘
判定胜负平
判定当前棋手
输入下棋的坐标
打印当前棋盘
4.数据结构设计
用二维数组构筑了棋盘,用间隔线分割棋盘后,就可以按自己意愿和计算机对弈了,此后每一步计算机都会调用相应的函数扫描棋盘。
Char qi pan[3][3];
Void init_qipan(void);
{int i,j;
for(i=0;i<3;i++)
for(j=0:j<3;j++)
qipan[i][j]=’ ’
}
5.算法设计
(1)主函数
主函数较为简单,只有数据输入,功能处理等函数调用。
流程图设计如下:
开始
构造棋盘,输入数据
输入二维数组(I,j,)
根据数据调用各功能模块的相应函数
结果显示
检查棋盘空挡
结束
(2)各功能模块设计
①棋盘输入
用二维数组构筑了棋盘,用间隔线分割棋盘后,就可以按自己意愿和计算机对弈了,此后每一步计算机都会调用相应的函数扫描棋盘。
Char qi pan[3][3];
Void init_qipan(void);
{int i,j;
for(i=0;i<3;i++)
for(j=0:j<3;j++)
qipan[i][j]=’ ’
②对弈模块
模块是提供用户模拟棋盘按用户自己的思想来下棋,这期间涉及两种情况:用户输入错误或者棋子位置错误。
/*************用户方面对弈************/
void player_move(void)
{
int x,y;
printf("It's your turn,please:");
scanf("%d%*c%d",&x,&y);
x--;y--;
if(qipan[x][y]!=' ')
{
printf("Error, try again.\n");
player_move();
}
else qipan[x][y]='X';
}
/**************计算机方面对弈*********/
void computer_move(void)
{
int i,j;
for(i=0;i<3;i++)
{
for(j=0;j<3;j++)
if(qipan[i][j]==' ')
break;
if(qipan[i][j]==' ')
break;
}
if(i*j==9)
{
printf("pingju\n");
exit(0);
}
else
qipan[i][j]='0';
}
③显现模块
该模块的作用是显示对弈结果。即要求计算机调用相关的函数多次扫描棋盘,谁的棋优先连成一线了,计算机就判定谁胜出。这期间有三种情况:第一,用户是胜者;第二,计算机胜出;第三,二者打成平局。
void disp(void)
{
int t;
for(t=0;t<3;t++)
{
printf("%c|%c|%c",qipan[t][0],qipan[t][1],qipan[t][2]);
if(t!=2)
printf("\n-|-|-\n");
}
printf("\n");
}
char check(void)
{
int i;
for(i=0;i<3;i++)
if(qipan[i][0]==qipan[i][1]&&qipan[i][0]==qipan[i][2])
return qipan[i][0];
for(i=0;i<3;i++)
if(qipan[0][i]==qipan[1][i]&&qipan[0][i]==qipan[2][i])
return qipan[0][i];
for(i=0;i<3;i++)
if(qipan[0][0]==qipan[1][1]&&qipan[0][0]==qipan[2][2])
return qipan[0][0];
for(i=0;i<3;i++)
if(qipan[0][2]==qipan[1][1]&&qipan[1][1]==qipan[2][0])
return qipan[0][2];
return ' ';
}
6.程序代码
#include "stdio.h"
#include "stdlib.h"
void init_qipan();
void player_move();
void computer_move();
void disp();
char check();
int main(void)
{
char done;
done=' ';
init_qipan();
do
{
disp();
player_move();
done=check();
if(done!=' ')
break;
computer_move();
done=check();
}
while(done==' ');
if(done=='X')
printf("恭喜你获胜!\n");
else
printf("真遗憾,你输了!\n");
disp();
getchar();
return 0;
}
char qipan[3][3];
void init_qipan(void)
{
int i,j;
for(i=0;i<3;i++)
for(j=0;j<3;j++)
qipan[i][j]=' ';
}
void player_move(void)
{
int x,y;
printf("It's your turn,please:");
scanf("%d%*c%d",&x,&y);
x--;y--;
if(qipan[x][y]!=' ')
{
printf("Error, please try again.\n");
player_move();
}
else qipan[x][y]='X';
}
void computer_move(void)
{
int i,j;
for(i=0;i<3;i++)
{
for(j=0;j<3;j++)
if(qipan[i][j]==' ')
break;
if(qipan[i][j]==' ')
break;
}
if(i*j==9)
{
printf("pingju\n");
exit(0);
}
else
qipan[i][j]='0';
}
void disp(void)
{
int t;
for(t=0;t<3;t++)
{
printf("%c|%c|%c ",qipan[t][0],qipan[t][1],qipan[t][2]);
if(t!=2)
printf("\n-|-|-\n");
}
printf("\n");
}
char check(void)
{
int i;
for(i=0;i<3;i++)
if(qipan[i][0]==qipan[i][1]&&qipan[i][0]==qipan[i][2])
return qipan[i][0];
for(i=0;i<3;i++)
if(qipan[0][i]==qipan[1][i]&&qipan[0][i]==qipan[2][i])
return qipan[0][i];
for(i=0;i<3;i++)
if(qipan[0][0]==qipan[1][1]&&qipan[0][0]==qipan[2][2])
return qipan[0][0];
for(i=0;i<3;i++)
if(qipan[0][2]==qipan[1][1]&&qipan[1][1]==qipan[2][0])
return qipan[0][2];
return ' ';
}
7.程序运行结果
(1)主函数显示:
(2)移动一个棋子后:
(3)移动两个棋子后:
(4)移动了三个棋子后:
8.编程中遇到的困难及解决方法
这次实习中遇到很多问题,这毕竟第一次做的,难免会遇到过各种各样的问题,同时在设计的过程中发现了自己的不足之处,对一些前面学过的知识理解得不够深刻,掌握得不够牢固,比如说结构体,指针,文件等等。通过这次课程设计之后,我把前面所学过的知识又重新温故了一遍。
编程中遇到很多麻烦,首先是编译中的许多错误,不乏很低级的失误。其次是运行成功后,一些功能没有按要求实现,比如判定输入的坐标是否重复。最后是对程序的简化,再写报告时发现有许多程序段都是可以去掉或者调用其它函数来代替。写结构图时发现有些函数结构混乱,也做了些修改。在做课程设计的过程中,虽然遇到不少很难对付的问题,但和周边同学进行了交流或讨论后,大多数问题都得到解决。
9.总结心得及良好建议
这次实习,我有了不少的收获。一是编程思想有了很大提升:对面向过程的结构化思想有了进一步的认识和理解。初步接触和了解了较大规模程序的写法。二是调试水平的提高:有了这次的锻炼,积累了对一些编译和运行中常见的错误的解决办法的经验和心得。三是初步认识了一些常见算法:如递归,回溯,折半查找。四是思想上有了改变:编程是一项容不得半点马虎的工作,要有严谨的态度,细致的思维,另外还要勤动手,多实践。
这次实习,由于上机时间的不足,这门课让我们普遍感觉到这门课内容太多,来不及消化。但我们经过这个星期的集中上机强化训练,我们初步掌握了编写中小型程序的编写方法,实习老师的精心指点让我们获益匪浅。这让我们的程序设计能力和综合能力上了一个不小的台阶。
我在实习过程中一直坚持了“程序=数据结构+算法”这一思想,但在算法上尤其在操作步骤这方面我还是存在一些不足,在上机调试时,我还是缺乏查找错误的经验。
14
展开阅读全文