黑白棋课程设计方案.docx

上传人:b****4 文档编号:11727760 上传时间:2023-03-31 格式:DOCX 页数:19 大小:38.14KB
下载 相关 举报
黑白棋课程设计方案.docx_第1页
第1页 / 共19页
黑白棋课程设计方案.docx_第2页
第2页 / 共19页
黑白棋课程设计方案.docx_第3页
第3页 / 共19页
黑白棋课程设计方案.docx_第4页
第4页 / 共19页
黑白棋课程设计方案.docx_第5页
第5页 / 共19页
点击查看更多>>
下载资源
资源描述

黑白棋课程设计方案.docx

《黑白棋课程设计方案.docx》由会员分享,可在线阅读,更多相关《黑白棋课程设计方案.docx(19页珍藏版)》请在冰豆网上搜索。

黑白棋课程设计方案.docx

黑白棋课程设计方案

攀枝花学院课程设计

题目:

黑白棋游戏

院(系):

数学与计算机学院

年级专业:

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;row

for(col=0;col

board[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_moves

display(board);

comp_score=user_score=0;

for(row=0;row

for(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;col

printf("%c",col_label+col);

printf("\n");

for(row=0;row

{

printf("+");

for(col=0;col

printf("---+");

printf("\n%2d|",row+1);

for(col=0;col

printf("%c|",board[row][col]);

printf("\n");

}

printf("+");

for(col=0;col

printf("---+");

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;row

for(col=0;col

moves[row][col]=0;

for(row=0;row

for(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;row

for(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;row

for(col=0;col

{

if(!

moves[row][col])

continue;

for(i=0;i

for(j=0;j

new_board[i][j]=board[i][j];

make_move(new_board,row,col,player);

new_score=get_score(new_board,player);

if(score

score=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;row

for(col=0;col

{

if(moves[row][col]==0)

continue;

for(i=0;i

for(j=0;j

temp_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);

}

结束语

通过本次黑白棋程序设计,我觉得对自己有很大的提高,程序员的工作可以说很不简单,忙起来还真的有得让你忙个不完的。

得益的是这让我克服了平时爱偷懒的毛病,这在我以后的学习和工作中的心理定位和调节有很大的帮助。

从敲代码到运行成功,我感受到编程是一项非常繁琐周密的活动,它不仅需要一个人周密思考问题的能力,处理问题的能力,而且还需要有足够的耐心和严谨的作风,不得有半点马虎。

代码里,一丁点小错误就会致使整个程序没有办法运行而让我头疼。

但经过不

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 工作范文 > 其它

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1