五子棋小游戏Word下载.docx
- 文档编号:21717621
- 上传时间:2023-01-31
- 格式:DOCX
- 页数:14
- 大小:18.77KB
五子棋小游戏Word下载.docx
《五子棋小游戏Word下载.docx》由会员分享,可在线阅读,更多相关《五子棋小游戏Word下载.docx(14页珍藏版)》请在冰豆网上搜索。
/*显示棋子*/
voidGamePlay();
voidSetChess(intfocus);
/*设定棋子*/
voidMoveChess(intdir);
/*移动棋子*/
voidRefresh();
/*更新画面*/
voidCheckWin(introw,intcol);
/*判断输赢*/
voidmain()
{
intnumber;
intgd=DETECT,gm=0;
/*设置图形驱动器和图形模式,其分辨率是640*480,和gd=VGA,gm=VGAHI是同样效果*/
registerbgidriver(EGAVGA_driver);
/*注册BGI驱动后可以不需要.BGI文件的支持运行*/
clrscr();
/*清屏函数*/
number=PlayInfo();
if(number==1)
{
initgraph(&
gd,&
gm,"
"
);
/*从TEXT窗口进入界面*/
InitData();
DrawChessboard();
GamePlay();
closegraph();
/*关闭图形界面*/
return;
}
else/*如果输入的是N或n的话,就跳出TEXT窗口*/
getch();
}
intPlayInfo()/*在TEXT窗口上说明游戏规则*/
charanswer;
gotoxy(10,2);
/*在TEXT窗口上,根据设定的横纵坐标上打出游戏规则*/
printf("
PlayRules:
gotoxy(10,6);
1:
PressLeft,Right,Up,DownKeytomovePiece!
gotoxy(10,10);
2:
PressEnterKeytoplacethePiece!
gotoxy(10,14);
3:
Don'
tpressthePieceutsideofthechessboard!
gotoxy(10,18);
Doyouaccepttheabovetheplayingrules?
[y/n]:
while
(1)
answer=getch();
if(answer=='
Y'
||answer=='
y'
)
return1;
elseif(answer=='
N'
n'
Becauseofdisagreementwiththerules,soyoucan'
tplaythegame!
return0;
voidInitData()/*初始化数据*/
intx,y;
x=getmaxx();
/*获得x轴的最大值*/
y=getmaxy();
/*获得y轴的最大值*/
MinX=(x-COL*SIZE)/2;
/*棋盘边框横坐标最小值*/
MaxX=MinX+COL*SIZE;
/*棋盘边框横坐标最大值*/
MinY=(y-ROW*SIZE)/2;
/*棋盘边框纵坐标最小值*/
MaxY=MinY+ROW*SIZE;
/*棋盘边框纵坐标最大值*/
CurRow=ROW/2,CurCol=COL/2;
/*给行列坐标变量赋直*/
CurX=MinX+CurCol*SIZE+SIZE/2;
/*棋子最初所在位置的横坐标*/
CurY=MinY+CurRow*SIZE+SIZE/2;
/*棋子最初所在位置的纵坐标*/
Radius=SIZE/2-3;
/*棋子半径*/
CurFocus=1;
/*黑1白2*/
voidDrawChessboard()/*画棋盘函数*/
inti,j,x,y;
setbkcolor(3);
/*设置背景颜色,3为青色*/
setfillstyle(SOLID_FILL,3);
/*背景颜色填充模式*/
bar(0,0,getmaxx(),MinY);
/*画一个矩形,并用淡灰色填充,用于覆盖checkwin的结果,相当于清屏的效果*/
setfillstyle(SOLID_FILL,7);
/*设置填充颜色,7为淡灰色*/
setcolor(11);
/*设置矩形边框的颜色*/
bar(MinX,MinY,MaxX,MaxY);
x=MinX,y=MinY;
for(i=0;
i<
=ROW;
i++,y+=SIZE)
line(MinX,y,MaxX,y);
/*画水平线*/
for(j=0;
j<
=COL;
j++,x+=SIZE)
line(x,MinY,x,MaxY);
/*画垂直线*/
/*设置文本颜色*/
settextstyle(0,0,1);
/*设置文本类型*/
settextjustify(1,1);
outtextxy(MinX-MinX/2,MinY+10,"
Player1"
/*显示文本*/
outtextxy(MaxX+MinX/2,MinY+10,"
Player2"
outtextxy(getmaxx()/2,MaxY+MinY/2,"
Esc:
ExitEnter:
SetF2:
Start"
voidShowChess(intflag)/*在棋盘上各棋手显示各棋手的棋子*/
intcolor,r=Radius;
if(flag==SET||flag==SHOW)/*画棋子*/
if(CurFocus==1)
color=1;
/*棋手1的棋子颜色*/
else
color=15;
/*棋手2的旗子颜色*/
color=7;
/*如果都不是棋手棋子的颜色的话,通过把棋子设置为背景颜色隐藏*/
if(flag==SET)
Map[CurRow][CurCol]=color;
/*置位数组值为当前颜色,即记录棋子的在棋盘的位置*/
CheckWin(CurRow,CurCol);
/*判断输赢;
每下完一个棋子,就进行判断有多少棋子相连*/
r-=2;
/*显示棋子时棋子半径值*/
setcolor(color);
/*当前棋子的边缘颜色*/
circle(CurX,CurY,r);
/*画棋子*/
setfillstyle(SOLID_FILL,color);
/*填充棋子*/
floodfill(CurX,CurY,color);
/*根据设定的颜色填满整个封闭图形*/
/*以下是用于:
在棋手名字下面显示当前下棋的棋手的棋子颜色*/
voidSetChess(intfocus)
intcolor1,color2;
staticx1,y1,x2,y2;
x1=MinX-MinX/2;
/*设定两棋手下面显示棋子所在的坐标*/
x2=MaxX+MinX/2;
y1=y2=MinY+40;
/*,以下是:
根据棋手标志设定棋子颜色*/
if(focus==1)/*棋子标志值为1时显示棋手1的颜色*/
color1=1;
/*当显示棋手1的时候,通过设置棋手2的棋子颜色与背景颜色(本程序中背景颜色值是3)相同,来隐藏棋手2的棋子*/
color2=3;
else/*否则显示棋手2的颜色*/
color1=3;
color2=15;
/*当显示棋手2的时候,通过设置棋手1的棋子颜色与背景颜色相同,来隐藏棋手1的棋子*/
setfillstyle(SOLID_FILL,color1);
/*填充棋盘左侧棋子颜色*/
setcolor(color1);
circle(x1,y1,Radius+2);
/*显示的棋子半径比正常的棋子半径大*/
floodfill(x1,y1,color1);
/*用规定的颜色填满整个封闭图形*/
setfillstyle(SOLID_FILL,color2);
/*填充棋盘右侧棋子颜色*/
setcolor(color2);
circle(x2,y2,Radius+2);
/*显示的棋子半径比棋盘上棋子半径大*/
floodfill(x2,y2,color2);
CurFocus=focus;
/*CurFocus是变化的参量*/
voidGamePlay()
intkey,Exit=FALSE;
/*起初FALSE的值为0*/
inti,j;
ShowChess(SHOW);
/*初始化棋手要下的棋子的位置*/
SetChess(CurFocus);
/*显示正在下棋的棋手的棋子颜色*/
while(!
Exit)/*循环扫描键盘输入*/
key=bioskey(0);
/*bioskey功能是直接使用BIOS服务的键盘接口,bioskey(0)返回下一个在键盘键入的值*/
switch(key)/*判断键盘输入*/
caseESC:
Exit=TRUE;
break;
caseENTER:
/*若此位置没有棋子则在此位置落子*/
/*并判断胜负,胜则显示胜者信息,否则提示该对手下棋*/
if(!
Map[CurRow][CurCol])
ShowChess(SET);
/*在此处落子*/
SetChess(CurFocus%2+1);
/*提示对手下棋*/
/*显示对手棋子颜色*/
caseF2:
/*按F2,重新开始一局游戏*/
/*重新初始化数据*/
ROW;
i++)/*清空棋盘*/
COL;
j++)
Map[i][j]=0;
/*重新画棋盘*/
/*在初始位置显示棋子*/
/*显示下棋一方的颜色提示信息*/
caseDOWN:
/*按方向键移动棋子*/
caseUP:
caseLEFT:
caseRIGHT:
MoveChess(key);
/*按照键盘输入移动棋子*/
voidMoveChess(intdirection)/*移动棋子*/
ShowChess(HIDE);
/*隐藏棋子*/
if(Map[CurRow][CurCol])
Refresh();
/*此位置有棋子时更新,即重新画出一个棋子*/
switch(direction)
CurCol--;
/*数组横向减一*/
CurX-=SIZE;
/*横坐标减一格*/
if(CurCol<
0)/*若移出棋盘从相反方向进入*/
CurCol+=COL;
CurX+=COL*SIZE;
CurCol++;
/*数组横向加一*/
CurX+=SIZE;
/*横坐标加一格*/
if(CurCol==COL)/*若移出棋盘从相反方向进入*/
CurCol-=COL;
CurX-=COL*SIZE;
CurRow++;
/*数组纵向加一*/
CurY+=SIZE;
/*纵坐标加一格*/
if(CurRow==ROW)/*若移出棋盘从相反方向进入*/
CurRow-=ROW;
CurY-=ROW*SIZE;
CurRow--;
/*数组纵向减一*/
CurY-=SIZE;
/*纵坐标减一格*/
if(CurRow<
CurRow+=ROW;
CurY+=ROW*SIZE;
/*在要下棋的棋手下显示棋子*/
voidRefresh()/*更新画面*/
intcolor=Map[CurRow][CurCol];
circle(CurX,CurY,Radius);
voidCheckWin(introw,intcol)/*判断是否有五子相连,即判断输赢*/
intcount,color=Map[row][col];
intwinner=0,x,y;
charMsgWin[50];
/*MsgWin[50]是用于存放CheckWin结果*/
count=GetNum(row,col,LEFT,color)+GetNum(row,col,RIGHT,color)-1;
/*统计水平方向相连的棋子数目*/
if(count>
=5)
winner=CurFocus;
/*五子相连则胜*/
winner)
count=GetNum(row,col,UP,color)+GetNum(row,col,DOWN,color)-1;
/*统计竖直方向相连棋子数目*/
count=GetNum(row,col,LU,color)+GetNum(row,col,RD,color)-1;
/*统计左对角线方向相连棋子数目*/
count=GetNum(row,col,LD,color)+GetNum(row,col,RU,color)-1;
/*统计右对角线方向相连棋子数目*/
if(winner)/*若当前棋手获胜,则输出相关信息*/
x=getmaxx()/2;
/*在棋盘上面输出文本信息*/
y=MinY-MinY/2;
setcolor(12);
/*设置文本颜色为12,即淡红色*/
settextstyle(0,0,3);
/*settextstyle(intfont,intdirection,intcharsize)charsize为字符大小
font值为0,表示8*8点阵字;
direction值为0,表示从左到右,charsize值为1表示
24*24点阵*/
if(CurFocus==1)/*判断哪方获胜并输出其名称*/
strcpy(MsgWin,"
/*将Player1复制到MsgWin*/
/*将Player2复制到MsgWin*/
strcat(MsgWin,"
Win"
/*显示文本win,strcat作用是将Win连接到MsgWin*/
outtextxy(x,y,MsgWin);
/*以下是:
从8个方向判断相连棋子数目,返回数目值*/
intGetNum(introw,intcol,intdir,intvalue)
intresult=0;
inti,j,chessNum=0;
switch(dir)
/*向左判断*/
for(i=col;
i>
=0;
i--)/*向左统计棋子个数,计算相连棋子数目*/
if(Map[row][i]==value)
chessNum++;
result=chessNum;
/*向右判断*/
i++)/*向右统计棋子个数,计算相连棋子数目*/
/*向下判断*/
for(i=row;
i++)/*向下方统计棋子个数,计算相连棋子数目*/
if(Map[i][col]==value)
/*向上判断*/
i--)/*向上统计棋子个数,计算相连棋子数目*/
if(Map[i][col]==value)
caseLU:
/*向左上方进行判断*/
for(i=row,j=col;
=0&
&
j>
i--,j--)/*向左上方统计棋子个数,计算相连棋子数目*/
if(Map[i][j]==value)
caseRD:
/*向右下方进行判断*/
ROW&
i++,j++)/*向右下方统计棋子个数,计算相连棋子数目*/
caseRU:
/*向右上方进行判断*/
i--,j++)/*向右上方统计棋子个数,计算相连棋子数目*/
if(Map[i][j]==value)
chessNum++;
caseLD:
/*向左下方进行判断*/
ROW&
i++,j--)/*向左下方统计棋子个数,计算相连棋子数目*/
returnresult;
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 五子棋 小游戏