五子棋小游戏.docx
- 文档编号:8581401
- 上传时间:2023-01-31
- 格式:DOCX
- 页数:14
- 大小:18.77KB
五子棋小游戏.docx
《五子棋小游戏.docx》由会员分享,可在线阅读,更多相关《五子棋小游戏.docx(14页珍藏版)》请在冰豆网上搜索。
五子棋小游戏
#include
#include
#include
#include
#defineROW20
#defineCOL20
#defineSIZE20
#defineHIDE0
#defineSHOW1
#defineSET2
#defineTRUE1
#defineFALSE0
#defineLU5
#defineRD6
#defineLD7
#defineRU8
#defineLEFT0x4b00/*光标左键值*/
#defineRIGHT0x4d00/*光标右键值*/
#defineDOWN0x5000/*光标下键值*/
#defineUP0x4800/*光标上键值*/
#defineESC0x011b/*按键ESC的值*/
#defineENTER0x1c0d/*按键ENTER的值*/
#defineF20x3c00/*按键F2的值*/
intMinX,MinY,MaxX,MaxY;/*定义棋盘横纵坐标变量*/
intCurRow,CurCol,CurX,CurY;/*定义行列坐标变量*/
intCurFocus,Radius;/*定义棋手标志变量,棋子半径变量*/
intMap[ROW][COL];/*定义棋盘数组,主要用于去记录棋子的位置*/
intPlayInfo();/*说明游戏规则*/
voidInitData();/*初始化数据*/
voidDrawChessboard();/*画棋盘函数*/
voidShowChess();/*显示棋子*/
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();
return;
}
}
intPlayInfo()/*在TEXT窗口上说明游戏规则*/
{
charanswer;
gotoxy(10,2);/*在TEXT窗口上,根据设定的横纵坐标上打出游戏规则*/
printf("PlayRules:
");
gotoxy(10,6);
printf("1:
PressLeft,Right,Up,DownKeytomovePiece!
");
gotoxy(10,10);
printf("2:
PressEnterKeytoplacethePiece!
");
gotoxy(10,14);
printf("3:
Don'tpressthePieceutsideofthechessboard!
");
gotoxy(10,18);
printf("Doyouaccepttheabovetheplayingrules?
[y/n]:
");
while
(1)
{
answer=getch();
if(answer=='Y'||answer=='y')
return1;
elseif(answer=='N'||answer=='n')
{
clrscr();
gotoxy(10,10);
printf("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);/*画垂直线*/
setcolor(11);/*设置文本颜色*/
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的旗子颜色*/
}
else
color=7;/*如果都不是棋手棋子的颜色的话,通过把棋子设置为背景颜色隐藏*/
if(flag==SET)
{
Map[CurRow][CurCol]=color;/*置位数组值为当前颜色,即记录棋子的在棋盘的位置*/
CheckWin(CurRow,CurCol);/*判断输赢;每下完一个棋子,就进行判断有多少棋子相连*/
}
else
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);/*提示对手下棋*/
ShowChess(SHOW);/*显示对手棋子颜色*/
}
break;
caseF2:
/*按F2,重新开始一局游戏*/
InitData();/*重新初始化数据*/
for(i=0;i for(j=0;j Map[i][j]=0; DrawChessboard();/*重新画棋盘*/ ShowChess(SHOW);/*在初始位置显示棋子*/ SetChess(CurFocus);/*显示下棋一方的颜色提示信息*/ caseDOWN: /*按方向键移动棋子*/ caseUP: caseLEFT: caseRIGHT: MoveChess(key);/*按照键盘输入移动棋子*/ break; } } } voidMoveChess(intdirection)/*移动棋子*/ { ShowChess(HIDE);/*隐藏棋子*/ if(Map[CurRow][CurCol]) Refresh();/*此位置有棋子时更新,即重新画出一个棋子*/ switch(direction) { caseLEFT: CurCol--;/*数组横向减一*/ CurX-=SIZE;/*横坐标减一格*/ if(CurCol<0)/*若移出棋盘从相反方向进入*/ { CurCol+=COL; CurX+=COL*SIZE; } break; caseRIGHT: CurCol++;/*数组横向加一*/ CurX+=SIZE;/*横坐标加一格*/ if(CurCol==COL)/*若移出棋盘从相反方向进入*/ { CurCol-=COL; CurX-=COL*SIZE; } break; caseDOWN: CurRow++;/*数组纵向加一*/ CurY+=SIZE;/*纵坐标加一格*/ if(CurRow==ROW)/*若移出棋盘从相反方向进入*/ { CurRow-=ROW; CurY-=ROW*SIZE; } break; caseUP: CurRow--;/*数组纵向减一*/ CurY-=SIZE;/*纵坐标减一格*/ if(CurRow<0)/*若移出棋盘从相反方向进入*/ { CurRow+=ROW; CurY+=ROW*SIZE; } break; } ShowChess(SHOW);/*在要下棋的棋手下显示棋子*/ } voidRefresh()/*更新画面*/ { intcolor=Map[CurRow][CurCol]; setcolor(color); circle(CurX,CurY,Radius); setfillstyle(SOLID_FILL,color); floodfill(CurX,CurY,color); } 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;/*五子相连则胜*/ if(! winner) { count=GetNum(row,col,UP,color)+GetNum(row,col,DOWN,color)-1;/*统计竖直方向相连棋子数目*/ if(count>=5) winner=CurFocus;/*五子相连则胜*/ } if(! winner) { count=GetNum(row,col,LU,color)+GetNum(row,col,RD,color)-1;/*统计左对角线方向相连棋子数目*/ if(count>=5) winner=CurFocus;/*五子相连则胜*/ } if(! winner) { count=GetNum(row,col,LD,color)+GetNum(row,col,RU,color)-1;/*统计右对角线方向相连棋子数目*/ if(count>=5) winner=CurFocus;/*五子相连则胜*/ } 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");/*将Player1复制到MsgWin*/ else strcpy(MsgWin,"Player2");/*将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) { caseLEFT: /*向左判断*/ for(i=col;i>=0;i--)/*向左统计棋子个数,计算相连棋子数目*/ { if(Map[row][i]==value) chessNum++; else break; } result=chessNum; break; caseRIGHT: /*向右判断*/ for(i=col;i { if(Map[row][i]==value) chessNum++; else break; } result=chessNum; break; caseDOWN: /*向下判断*/ for(i=row;i { if(Map[i][col]==value) chessNum++; else break; } result=chessNum; break; caseUP: /*向上判断*/ for(i=row;i>=0;i--)/*向上统计棋子个数,计算相连棋子数目*/ { if(Map[i][col]==value) chessNum++; else break; } result=chessNum; break; caseLU: /*向左上方进行判断*/ for(i=row,j=col;i>=0&&j>=0;i--,j--)/*向左上方统计棋子个数,计算相连棋子数目*/ { if(Map[i][j]==value) chessNum++; else break; } result=chessNum; break; caseRD: /*向右下方进行判断*/ for(i=row,j=col;i { if(Map[i][j]==value) chessNum++; else break; } result=chessNum; break; caseRU: /*向右上方进行判断*/ for(i=row,j=col;i>=0&&j { if(Map[i][j]==value) chessNum++; else break; } result=chessNum; break; caseLD: /*向左下方进行判断*/ for(i=row,j=col;i { if(Map[i][j]==value) chessNum++; else break; } result=chessNum; break; } returnresult; }
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 五子棋 小游戏