C语言黑白棋实验报告.docx
- 文档编号:9090391
- 上传时间:2023-02-03
- 格式:DOCX
- 页数:14
- 大小:18.13KB
C语言黑白棋实验报告.docx
《C语言黑白棋实验报告.docx》由会员分享,可在线阅读,更多相关《C语言黑白棋实验报告.docx(14页珍藏版)》请在冰豆网上搜索。
C语言黑白棋实验报告
福建工程学院计算机与信息科学系
实验报告
2011–2012学年第1学期任课老师:
聂明星
课程名称
结构化程序设计
班级
信管1002
座号
15号
姓名
林左权
实验题目
黑白棋
实验时间
实验开始日期:
12.22
报告提交日期:
12.22
实验目的、要求
黑白棋,又叫反棋(Reversi)、奥赛罗棋(Othello)、苹果棋或翻转棋。
黑白棋在西方和日本很流行。
游戏通过相互翻转对方的棋子,最后以棋盘上谁的棋子多来判断胜负。
棋子:
黑白棋棋子每颗由黑白两色组成,一面白,一面黑,共64个(包括棋盘中央的4个)。
棋子呈圆饼形。
棋盘:
黑白棋棋盘由64格的正方格组成,游戏进行时棋子要下在格内。
棋盘可分为“角”、“边”以及黑白棋“中腹”。
现今的棋盘多以8x8较为普遍。
棋钟:
正式的比赛中可以使用棋钟对选手的时间进行限制。
非正式的对局中一般不使用棋钟。
黑白棋的棋盘是一个有8*8方格的棋盘。
下棋时将棋下在空格中间,而不是像围棋一样下在交叉点上。
开始时在棋盘正中有两白两黑四个棋子交叉放置,黑棋总是先下子。
下子的方法把自己颜色的棋子放在棋盘的空格上,而当自己放下的棋子在横、竖、斜八个方向内有一个自己的棋子,则被夹在中间的全部翻转会成为自己的棋子。
并且,只有在可以翻转棋子的地方才可以下子。
如果玩家在棋盘上没有地方可以下子,则该玩家对手可以连下。
双方都没有棋子可以下时棋局结束,以棋子数目来计算胜负,棋子多的一方获胜。
在棋盘还没有下满时,如果一方的棋子已经被对方吃光,则棋局也结束。
将对手棋子吃光的一方获胜。
每个“翻转棋”游戏开始时,棋盘上已经交叉放好了四颗棋子。
其中两颗是黑棋,另两颗是白棋。
黑棋总是先走。
当您的棋子在某一直线方向包围了对手的棋子时,就可以翻转这些棋子的颜色,使它们成为您方的颜色。
例如,如果您执黑棋,并且看到在一排白棋的某一端是一颗黑棋,那么当您将一颗黑棋放在这一排的另一端时,所有的白棋都将翻转并变为黑棋!
所有的直线方向均有效:
水平、垂直和斜线方向。
走棋的唯一规则是只能走包围并翻转对手的棋子。
每一回合都必须至少翻转一颗对手的棋子。
按规则不能再走棋时,这一回合弃权。
计算机会自动将控制权交给对方。
得分
“翻转棋”的计分方法非常简单。
游戏过程中随时都显示黑棋数与白棋数。
结束时棋数最多的一方就是赢家。
实验步骤与内容
1、主要设计思想;
(1)画棋盘
(2)画分数板
(3)控制棋子颜色变化
(4)吃掉对手棋子
(5)分数变化
(6)判断输赢
(7)显示胜负信息
2、所有函数的简要说明;
voidVS();/*对战函数*/
voidDrawChessBoard();/*画棋盘函数*/
voidSetPlayColor(intx);/*控制棋子颜色函数*/
voidRestoreBoardShape(intx,inty);/*回复棋盘状态*/
intChessBoardChange(intx,inty,intz);/*吃掉对方棋子*/
voidProcessingScores();/*分数控制*/
voidPrintScore();/*打印分数*/
voidPlayWin();/*显示胜负信息*/
3、所有源代码;
#include
#defineESC0x011b
#defineENTER0x1c0d
#defineUP0x4800
#defineDOWN0x5000
#defineLEFT0x4b00
#defineRIGHT0x4d00
inta[8][8]={0},key,score1,score2;
charPlayOne[3],PlayTwo[3];
voidVS();
voidDrawChessBoard();
voidSetPlayColor(intx);
voidRestoreBoardShape(intx,inty);
intChessBoardChange(intx,inty,intz);
voidProcessingScores();
voidPrintScore();
voidPlayWin();
intmain()
{
intgdrive=VGA,gmode=VGAHI;
initgraph(&gdrive,&gmode,"");
DrawChessBoard();
VS();
getch();
}
voidDrawChessBoard()
{
inti,j;
score1=0;
score2=0;
for(i=100;i<=420;i=i+40)
{
line(100,i,420,i);
line(i,100,i,420);
}
setcolor(BLACK);
setfillstyle(SOLID_FILL,WHITE);
fillellipse(500,200,15,15);
setfillstyle(SOLID_FILL,DARKGRAY);
fillellipse(500,300,15,15);
a[3][3]=1;
a[3][4]=2;
a[4][3]=2;
a[4][4]=1;
setfillstyle(SOLID_FILL,WHITE);
fillellipse(240,240,15,15);
fillellipse(280,280,15,15);
setfillstyle(SOLID_FILL,DARKGRAY);
fillellipse(240,280,15,15);
fillellipse(280,240,15,15);
score1=2;
score2=2;
}
voidVS()
{
intx,y,t=1,i,j,cc=0;
while
(1)
{
x=120;
y=80;
while
(1)
{
PrintScore();
SetPlayColor(t);
fillellipse(x,y,15,15);
key=bioskey(0);
if(key==ESC)
break;
else
if(key==ENTER)
{
if(y!
=80&&a[(x-120)/40][(y-120)/40]!
=1&&a[(x-120)/40][(y-120)/40]!
=2)
{
if(t%2==1)
a[(x-120)/40][(y-120)/40]=1;
else
a[(x-120)/40][(y-120)/40]=2;
if(ChessBoardChange(x,y,t)==0)
{
a[(x-120)/40][(y-120)/40]=0;
cc++;
if(cc>=64-score1-score2)
{
RestoreBoardShape(x,y);
fillellipse(x,y,15,15);
break;
}
else
continue;
}
ProcessingScores();
break;
}
else
continue;
}
elseif(key==LEFT&&x>120)
{
RestoreBoardShape(x,y);
fillellipse(x,y,15,15);
SetPlayColor(t);
x=x-40;
fillellipse(x,y,15,15);
}
elseif(key==RIGHT&&x<400&&y>80)
{
RestoreBoardShape(x,y);
fillellipse(x,y,15,15);
SetPlayColor(t);
x=x+40;
fillellipse(x,y,15,15);
}
elseif(key==DOWN&&y<400)
{
RestoreBoardShape(x,y);
fillellipse(x,y,15,15);
SetPlayColor(t);
y=y+40;
fillellipse(x,y,15,15);
}
elseif(key==UP&&y>120)
{
RestoreBoardShape(x,y);
fillellipse(x,y,15,15);
SetPlayColor(t);
y=y-40;
fillellipse(x,y,15,15);
}
}
if(key==ESC)
break;
if((score1+score2)==64||score1==0||score2==0)
{
PlayWin();
break;
}
t=t%2+1;
cc=0;
}
}
voidPrintScore()
{
setfillstyle(SOLID_FILL,BLACK);
bar(550,100,640,400);
setcolor(RED);
settextstyle(DEFAULT_FONT,HORIZ_DIR,3);
sprintf(PlayOne,"%d",score1);
outtextxy(550,190,PlayOne);
sprintf(PlayTwo,"%d",score2);
outtextxy(550,290,PlayTwo);
setcolor(BLACK);
}
voidSetPlayColor(intx)
{
if(x%2==1)
setfillstyle(SOLID_FILL,WHITE);
else
setfillstyle(SOLID_FILL,DARKGRAY);
}
intChessBoardChange(intx,inty,intz)
{
inti,j,k,kk,ii,jj,yes;
yes=0;
i=(x-120)/40;
j=(y-120)/40;
SetPlayColor(z);
if(i>1)
{
for(k=i-1;k>=0;k--)
if(a[k][j]==a[i][j]||!
a[k][j])
break;
if(a[k][j]!
=0&&k>=0)
{
for(kk=i-1;kk>k&&k>=0;kk--)
{
a[kk][j]=a[i][j];
fillellipse(120+kk*40,120+j*40,15,15);
}
if(kk!
=i-1)
yes=1;
}
}
if(i<6)
{
for(k=i+1;k<8;k++)
if(a[k][j]==a[i][j]||!
a[k][j])
break;
if(a[k][j]!
=0&&k<8)
{
for(kk=i+1;kk { a[kk][j]=a[i][j]; fillellipse(120+kk*40,120+j*40,15,15); } if(kk! =i+1) yes=1; } } if(j>1) { for(k=j-1;k>=0;k--) if(a[i][k]==a[i][j]||! a[i][k]) break; if(a[i][k]! =0&&k>=0) { for(kk=j-1;kk>k&&k>=0;kk--) { a[i][kk]=a[i][j]; fillellipse(120+i*40,120+kk*40,15,15); } if(kk! =j-1) yes=1; } } if(j<6) { for(k=j+1;k<8;k++) if(a[i][k]==a[i][j]||a[i][k]==0) break; if(a[i][k]! =0&&k<8) { for(kk=j+1;kk { a[i][kk]=a[i][j]; fillellipse(120+i*40,120+kk*40,15,15); } if(kk! =j+1) yes=1; } } if(i>1&&j>1) { for(k=i-1,kk=j-1;k>=0&&kk>=0;k--,kk--) if(a[k][kk]==a[i][j]||! a[k][kk]) break; if(a[k][kk]! =0&&k>=0&&kk>=0) { for(ii=i-1,jj=j-1;ii>k&&k>=0;ii--,jj--) { a[ii][jj]=a[i][j]; fillellipse(120+ii*40,120+jj*40,15,15); } if(ii! =i-1) yes=1; } } if(i>1&&j<6) { for(k=i-1,kk=j+1;k>=0&&kk<8;k--,kk++) if(a[k][kk]==a[i][j]||! a[k][kk]) break; if(a[k][kk]&&k>=0&&kk<8) { for(ii=i-1,jj=j+1;ii>k&&k>=0;ii--,jj++) { a[ii][jj]=a[i][j]; fillellipse(120+ii*40,120+jj*40,15,15); } if(ii! =i-1) yes=1; } } if(i<6&&j>1) { for(k=i+1,kk=j-1;k<8&&kk>=0;k++,kk--) if(a[k][kk]==a[i][j]||! a[k][kk]) break; if(a[k][kk]! =0&&k<8&&kk>=0) { for(ii=i+1,jj=j-1;ii { a[ii][jj]=a[i][j]; fillellipse(120+ii*40,120+jj*40,15,15); } if(ii! =i+1) yes=1; } } if(i<6&&j<6) { for(k=i+1,kk=j+1;kk<8&&kk<8;k++,kk++) if(a[k][kk]==a[i][j]||! a[k][kk]) break; if(a[k][kk]! =0&&kk<8&&k<8) { for(ii=i+1,jj=j+1;ii { a[ii][jj]=a[i][j]; fillellipse(120+ii*40,120+jj*40,15,15); } if(ii! =i+1) yes=1; } } returnyes; } voidRestoreBoardShape(intx,inty) { if(y<100) setfillstyle(SOLID_FILL,BLACK); else switch(a[(x-120)/40][(y-120)/40]) { case1: setfillstyle(SOLID_FILL,WHITE);break; case2: setfillstyle(SOLID_FILL,DARKGRAY);break; default: setfillstyle(SOLID_FILL,BLACK); } } voidProcessingScores() { inti,j; score1=0; score2=0; for(i=0;i<8;i++) for(j=0;j<8;j++) if(a[i][j]==1) score1++; elseif(a[i][j]==2) score2++; } voidPlayWin() { settextstyle(DEFAULT_FONT,HORIZ_DIR,3); setcolor(LIGHTRED); if(score2>score1) outtextxy(100,50,"BlackWin! "); else if(score2 outtextxy(100,50,"WhiteWin! "); else outtextxy(60,50,"YouallWin! "); } 试验过程记录 记录试验中遇到的困难及解决方法; 实验结果记录以及与预期结果比较以及分析 记录每次实验结果以及分析情况 总结以及心得体会 指导老师评阅意见 指导老师: 年月日 填写内容时,可把表格扩大。 实验的源程序代码(要有注释)附在表后。
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 语言 白棋 实验 报告