黑白棋课程设计方案.docx
《黑白棋课程设计方案.docx》由会员分享,可在线阅读,更多相关《黑白棋课程设计方案.docx(19页珍藏版)》请在冰豆网上搜索。
黑白棋课程设计方案
攀枝花学院课程设计
题目:
黑白棋游戏
院(系):
数学与计算机学院
年级专业:
2014级软件工程
姓名:
田坤林
学号:
201410804095
指导教师:
陈斌
二〇一五年一月十日
攀枝花学院教务处制
攀枝花学院本科学生课程设计任务书
题 目
黑白棋游戏程序设计
1、课程设计的目的
通过完成一个完整项目,经历策划、设计、开发、测试、验收各阶段,达到:
(1)巩固和实践计算机图形学课程中的理论和算法;
(2)培养项目策划、架构设计、软件开发和科研设计的能力;
(3)培养认真学习、积极探索的工作态度和良好的合作精神。
2、课程设计的内容和要求(包括原始数据、技术要求、工作要求等)
开发工具:
TC或VisualC++
开发人数:
1人
实现内容:
设计开发一个黑白棋游戏程序
功能要求:
(1)尽量使用图形用户界面方式实现(不作硬性要求)
(2)可以实现人机对战,自动判断胜负
(3)界面美观
3、主要参考文献
[1]钦科技.VisualC++游戏设计[M].北京:
科海电子出版社,2003.1.
[2]何健辉.游戏软件设计与开发大揭秘[M].北京:
人民邮电出版社.2000.
[3]坂本千寻.VisualC++专业游戏程序设计[M].北京:
中国铁道出版社,2004.
[4]肖永亮等.计算机游戏程序设计[M].北京:
电子工业出版社,2005.
等。
4、课程设计工作进度计划
1、设计动员,布置任务,选题(1天)
2、查阅资料,分析、讨论与设计(1天)
3、编写程序,进行调试(4天)
4、完成模块联调,进行测试(2天)
5、成果验收,完成设计报告(2天)
指导教师(签字)
日期
年月日
教研室意见:
年月日
学生(签字):
接受任务时间:
2015年1月6日
注:
任务书由指导教师填写。
课程设计(论文)指导教师成绩评定表
题目名称
评分项目
分值
得分
评价内涵
工作
表现
20%
01
学习态度
6
遵守各项纪律,工作刻苦努力,具有良好的科学工作态度。
02
科学实践、调研
7
通过实验、试验、查阅文献、深入生产实践等渠道获取与课程设计有关的材料。
03
课题工作量
7
按期圆满完成规定的任务,工作量饱满。
能力
水平
35%
04
综合运用知识的能力
10
能运用所学知识和技能去发现与解决实际问题,能正确处理实验数据,能对课题进行理论分析,得出有价值的结论。
05
应用文献的能力
5
能独立查阅相关文献和从事其他调研;能提出并较好地论述课题的实施方案;有收集、加工各种信息及获取新知识的能力。
06
设计(实验)能力,方案的设计能力
5
能正确设计实验方案,独立进行装置安装、调试、操作等实验工作,数据正确、可靠;研究思路清晰、完整。
07
计算及计算机应用能力
5
具有较强的数据运算与处理能力;能运用计算机进行资料搜集、加工、处理和辅助设计等。
08
对计算或实验结果的分析能力(综合分析能力、技术经济分析能力)
10
具有较强的数据收集、分析、处理、综合的能力。
成果
质量
45%
09
插图(或图纸)质量、篇幅、设计(论文)规范化程度
5
符合本专业相关规范或规定要求;规范化符合本文件第五条要求。
10
设计说明书(论文)质量
30
综述简练完整,有见解;立论正确,论述充分,结论严谨合理;实验正确,分析处理科学。
11
创新
10
对前人工作有改进或突破,或有独特见解。
成绩
指导教师评语
指导教师签名:
年 月 日
摘要
黑白棋,又叫反棋(Reversi)、奥赛罗棋(Othello)、苹果棋或翻转棋。
黑白棋在西方和日本很流行。
游戏通过相互翻转对方的棋子,最后以棋盘上谁的棋子多来判断胜负。
棋子:
黑白棋棋子每颗由黑白两色组成,一面白,一面黑,共64个(包括棋盘中央的4个)。
棋子呈圆饼形。
棋盘:
黑白棋棋盘由64格的正方格组成,游戏进行时棋子要下在格内。
棋盘可分为“角”、“边”以及黑白棋“中腹”。
现今的棋盘多以8x8较为普遍。
棋钟:
正式的比赛中可以使用棋钟对选手的时间进行限制。
非正式的对局中一般不使用棋钟。
黑白棋的棋盘是一个有8*8方格的棋盘。
下棋时将棋下在空格中间,而不是像围棋一样下在交叉点上。
开始时在棋盘正中有两白两黑四个棋子交叉放置,黑棋总是先下子。
下子的方法把自己颜色的棋子放在棋盘的空格上,而当自己放下的棋子在横、竖、斜八个方向内有一个自己的棋子,则被夹在中间的全部翻转会成为自己的棋子。
并且,只有在可以翻转棋子的地方才可以下子。
如果玩家在棋盘上没有地方可以下子,则该玩家对手可以连下。
双方都没有棋子可以下时棋局结束,以棋子数目来计算胜负,棋子多的一方获胜。
在棋盘还没有下满时,如果一方的棋子已经被对方吃光,则棋局也结束。
将对手棋子吃光的一方获胜。
每个“翻转棋”游戏开始时,棋盘上已经交叉放好了四颗棋子。
其中两颗是黑棋,另两颗是白棋。
黑棋总是先走。
当您的棋子在某一直线方向包围了对手的棋子时,就可以翻转这些棋子的颜色,使它们成为您方的颜色。
例如,如果您执黑棋,并且看到在一排白棋的某一端是一颗黑棋,那么当您将一颗黑棋放在这一排的另一端时,所有的白棋都将翻转并变为黑棋!
所有的直线方向均有效:
水平、垂直和斜线方向。
走棋的唯一规则是只能走包围并翻转对手的棋子。
每一回合都必须至少翻转一颗对手的棋子。
按规则不能再走棋时,这一回合弃权。
计算机会自动将控制权交给对方。
关键词黑白棋反棋(Reversi)奥赛罗棋(Othello)苹果棋翻转棋
1需求分析
1.1需求概述
(1)收集资料,全面分析课题,分解问题,形成中体编程思路;
(2)深入分析各个小问题,编写个部分程序模块;
(3)对于设计中用到的关键函数,要联系实际问题进行具体介绍;
(4)上机调试,确保程序能正确运行;
(5)设计完成后提交课程设计报告;
1.2需求环境
本课程设计需要的设备为硬件要求和软件配置要求具体要求如下:
①硬件要求:
一台计算机。
②软件配置:
WINDOWS、C/VC++6.0。
1.3功能描述
编写一个《黑白棋游戏》的C程序,包括以下功能:
初始状态:
在一个8*8的棋盘中央交叉排放黑白棋子各两枚,白棋先走。
(1)每个棋手下棋时,摆子的位置必须是以自己的棋子能包围住对方一个或多个棋子,被包围住的对方棋子将成为自己的棋子。
包围的方向可以是上下左右以及斜线8个方向,只要能连成一线即可。
(2)当轮到某一个棋手下子,但是他没有可以包围对方棋子的位置时,他必须停步,让对方走棋,直到他可以走为止。
(3)当棋盘上一方的棋子为0或者下满64格,游戏结束,棋子少者输。
2概要设计
2.1程序设计思路
(1)首先设计程序进入界面。
(2)在说明玩家和电脑各自的棋子。
(3)详细说明黑白棋的规则。
并指引玩家开始游戏。
(4)初始棋盘。
(5)设计黑白棋程序的主体。
2.2程序流程图
2
3详细设计
3.1程序源代码
3.1.1代码功能
#include
#include//定义了一批C语言字符分类函数//
#defineSIZE8//定义SIZE的值为8//
voiddisplay(charboard[][SIZE]);//显示,输出函数//
intvalid_moves(charboard[][SIZE],intmoves[][SIZE],charplayer);//该函数将前一数组各项复制到后一数组当中。
主要用于黑白棋的人工智能。
//
voidmake_move(charboard[][SIZE],introw,intcol,charplayer);//该函数用于玩家的下棋位置行列的输入//
voidcomputer_move(charboard[][SIZE],intmoves[][SIZE],charplayer);
intget_score(charboard[][SIZE],charplayer);//计算比赛结果//
intbest_move(charboard[][SIZE],intmoves[][SIZE],charplayer);
3.1.2所有源代码
#include
#include
#defineSIZE8
voiddisplay(charboard[][SIZE]);
intvalid_moves(charboard[][SIZE],intmoves[][SIZE],charplayer);
voidmake_move(charboard[][SIZE],introw,intcol,charplayer);
voidcomputer_move(charboard[][SIZE],intmoves[][SIZE],charplayer);
intget_score(charboard[][SIZE],charplayer);
intbest_move(charboard[][SIZE],intmoves[][SIZE],charplayer);
intmain()
{
charboard[SIZE][SIZE]={0};
intmoves[SIZE][SIZE]={0};
introw=0;
intcol=0;
intno_of_games=0;
intno_of_moves=0;
intinvalid_moves=0;
intcomp_score=0;
intuser_score=0;
chary=0;
charx=0;
charagain=0;
intplayer=0;
printf("\n黑白棋--奥赛罗棋--madeby田坤林\n\n");
printf("欢迎来到黑白棋的世界!
棋子有些奇怪哦,牢记住自己的棋子样子吧!
\n");
printf("你的棋子是这样子的哦-(o)\n电脑则是这这这样子的-(*).\n");
printf("想在哪个方格落棋的话,请先输入方格的行数,\n"
"然后再输入方格的列数哦!
\n");
printf("\n祝你好运哦,按回车键就开始咯。
\n");
scanf("%c",&again);
do
{
player=++no_of_games%2;
no_of_moves=4;
for(row=0;rowfor(col=0;colboard[row][col]='';
board[SIZE/2-1][SIZE/2-1]=board[SIZE/2][SIZE/2]='o';
board[SIZE/2-1][SIZE/2]=board[SIZE/2][SIZE/2-1]='*';
do
{
display(board);
if(player++%2)
{
if(valid_moves(board,moves,'o'))
{
for(;;)
{
fflush(stdin);
printf("Pleaseenteryourmove(行列):
");
scanf("%d%c",&x,&y);
y=tolower(y)-'a';
x--;
if(x>=0&&y>=0&&x{
make_move(board,x,y,'o');
no_of_moves++;
break;
}
else
printf("莫法这样子下的哦,换个地方试试。
\n");
}
}
else
if(++invalid_moves<2)
{
fflush(stdin);
printf("\n哦啊,我竟走投无路了,哎,你来吧!
");
scanf("%c",&again);
}
else
printf("\n(*^__^*),我们都没法落子了,GameOver!
看看谁的棋子多谁就赢啦......\n");
}
else
{
if(valid_moves(board,moves,'*'))
{
invalid_moves=0;
computer_move(board,moves,'*');
no_of_moves++;
}
else
{
if(++invalid_moves<2)
printf("\n哦啊,我竟走投无路了,哎,你来吧!
\n");
else
printf("\n(*^__^*),我们都没法落子了,GameOver!
看看谁的棋子多谁就赢啦......\n");
}
}
}while(no_of_movesdisplay(board);
comp_score=user_score=0;
for(row=0;rowfor(col=0;col{
comp_score+=board[row][col]=='*';
user_score+=board[row][col]=='o';
}
printf("Thefinalscoreis:
\n");
printf("Computer%d\nUser%d\n\n",comp_score,user_score);
fflush(stdin);
printf("你想再来一发么?
(y/n):
");
scanf("%c",&again);
}while(tolower(again)=='y');
printf("\n嘻嘻,下次再见咯!
\n");
}
voiddisplay(charboard[][SIZE])
{
introw=0;
intcol=0;
charcol_label='a';
printf("\n");
for(col=0;colprintf("%c",col_label+col);
printf("\n");
for(row=0;row{
printf("+");
for(col=0;colprintf("---+");
printf("\n%2d|",row+1);
for(col=0;colprintf("%c|",board[row][col]);
printf("\n");
}
printf("+");
for(col=0;colprintf("---+");
printf("\n");
}
intvalid_moves(charboard[][SIZE],intmoves[][SIZE],charplayer)
{
introwdelta=0;
intcoldelta=0;
introw=0;
intcol=0;
intx=0;
inty=0;
intno_of_moves=0;
charopponent=(player=='o')?
'*':
'o';
for(row=0;rowfor(col=0;colmoves[row][col]=0;
for(row=0;rowfor(col=0;col{
if(board[row][col]!
='')
continue;
for(rowdelta=-1;rowdelta<=1;rowdelta++)
for(coldelta=-1;coldelta<=1;coldelta++)
{
if(row+rowdelta<0||row+rowdelta>=SIZE||
col+coldelta<0||col+coldelta>=SIZE||
(rowdelta==0&&coldelta==0))
continue;
if(board[row+rowdelta][col+coldelta]==opponent)
{
x=row+rowdelta;
y=col+coldelta;
for(;;)
{
x+=rowdelta;
y+=coldelta;
if(x<0||x>=SIZE||y<0||y>=SIZE)
break;
if(board[x][y]=='')
break;
if(board[x][y]==player)
{
moves[row][col]=1;
no_of_moves++;
break;
}
}
}
}
}
returnno_of_moves;
}
voidmake_move(charboard[][SIZE],introw,intcol,charplayer)
{
introwdelta=0;
intcoldelta=0;
intx=0;
inty=0;
charopponent=(player=='o')?
'*':
'o';
board[row][col]=player;
for(rowdelta=-1;rowdelta<=1;rowdelta++)
for(coldelta=-1;coldelta<=1;coldelta++)
{
if(row+rowdelta<0||row+rowdelta>=SIZE||
col+coldelta<0||col+coldelta>=SIZE||
(rowdelta==0&&coldelta==0))
continue;
if(board[row+rowdelta][col+coldelta]==opponent)
{
x=row+rowdelta;
y=col+coldelta;
for(;;)
{
x+=rowdelta;
y+=coldelta;
if(x<0||x>=SIZE||y<0||y>=SIZE)
break;
if(board[x][y]=='')
break;
if(board[x][y]==player)
{
while(board[x-=rowdelta][y-=coldelta]==opponent)
board[x][y]=player;
break;
}
}
}
}
}
intget_score(charboard[][SIZE],charplayer)
{
intscore=0;
introw=0;
intcol=0;
charopponent=player=='o'?
'*':
'o';
for(row=0;rowfor(col=0;col{
score-=board[row][col]==opponent;
score+=board[row][col]==player;
}
returnscore;
}
intbest_move(charboard[][SIZE],intmoves[][SIZE],charplayer)
{
introw=0;
intcol=0;
inti=0;
intj=0;
charopponent=player=='o'?
'*':
'o';
charnew_board[SIZE][SIZE]={0};
intscore=0;
intnew_score=0;
for(row=0;rowfor(col=0;col{
if(!
moves[row][col])
continue;
for(i=0;ifor(j=0;jnew_board[i][j]=board[i][j];
make_move(new_board,row,col,player);
new_score=get_score(new_board,player);
if(scorescore=new_score;
}
returnscore;
}
voidcomputer_move(charboard[][SIZE],intmoves[][SIZE],charplayer)
{
introw=0;
intcol=0;
intbest_row=0;
intbest_col=0;
inti=0;
intj=0;
intnew_score=0;
intscore=100;
chartemp_board[SIZE][SIZE];
inttemp_moves[SIZE][SIZE];
charopponent=player=='o'?
'*':
'o';
for(row=0;rowfor(col=0;col{
if(moves[row][col]==0)
continue;
for(i=0;ifor(j=0;jtemp_board[i][j]=board[i][j];
make_move(temp_board,row,col,player);
valid_moves(temp_board,temp_moves,opponent);
new_score=best_move(temp_board,temp_moves,opponent);
if(new_score{
score=new_score;
best_row=row;
best_col=col;
}
}
make_move(board,best_row,best_col,player);
}
结束语
通过本次黑白棋程序设计,我觉得对自己有很大的提高,程序员的工作可以说很不简单,忙起来还真的有得让你忙个不完的。
得益的是这让我克服了平时爱偷懒的毛病,这在我以后的学习和工作中的心理定位和调节有很大的帮助。
从敲代码到运行成功,我感受到编程是一项非常繁琐周密的活动,它不仅需要一个人周密思考问题的能力,处理问题的能力,而且还需要有足够的耐心和严谨的作风,不得有半点马虎。
代码里,一丁点小错误就会致使整个程序没有办法运行而让我头疼。
但经过不