📄 wuziqi.txt
字号:
/* ****************************************************************************************************** */
/* 程序:我伟大的五子棋 */
/* 程序员:向雪林XxX */
/* 时间:2008/5/12 */
/* ****************************************************************************************************** */
#include <stdio.h>
#include <graphics.h>
#include <bios.h>
#define ROW 20
#define COL 20
#define SIZE 20
#define HIDE 0
#define SHOW 1
#define SET 2
#define TRUE 1
#define FALSE 0
#define LU 5
#define RD 6
#define LD 7
#define RU 8
#define LEFT 0x4b00
#define RIGHT 0x4d00
#define DOWN 0x5000
#define UP 0x4800
#define ESE 0x011b
#define ENTER 0x1c0d
#define F2 0x3c00
int MinX,MinY,MaxX,MaxY;
int CurRow,CurCol,CurX,CurY;
int CurFocus,Radius;
int Map[ROW][COL];
void InitGraph();
void InitData();
void DrawChessboard();
void ShowChess();
void GamePlay();
void SetChess(int focus);
void MoveChess(int dir);
void Refresh();
void CheckWin(int row,int col);
main()
{
InitGraph();
InitData();
DrawChessboard();
GamePlay();
closegraph();
}
void InitGraph()
{
int gdriver=DETECT;
int gmode,errorcode;
initgraph(&gdriver,&gmode,"");
errorcode=graphresult();
if(errorcode!=grOk)
{
printf("Graghics error: %s\n",grapherrormsg(errorcode));
printf("Press any key to halt:");
getch();
exit(1);
}
}
void InitData()
{
int x,y;
x=getmaxx();
y=getmaxy();
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;
}
void DrawChessboard()
{
int i,j,x,y;
setbkcolor(3);
setfillstyle(SOLID_FILL,3);
bar(0,0,getmaxx(),MinY);
setfillstyle(SOLID_FILL,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,0);
settextjustify(1,1);
outtextxy(MinX-MinX/2,MinY+10,"LYJ");
outtextxy(MaxX+MinX/2,MinY+10,"XxX");
outtextxy(getmaxx()/2,MaxY+MinY/2,"Esc:Exit Enter:Set F2:Start");
}
void ShowChess(int flag)
{
int color,r=Radius;
if(flag==SET||flag==SHOW)
{
if(CurFocus==1)
color==1;
else color=15;
}
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);
}
void SetChess(int focus)
{
int color1,color2;
static x1,y1,x2,y2;
if(!x1)
{
x1=MinX-MinX/2;
x2=MaxX+MinX/2;
y1=y2=MinY+40;
}
if(focus==1)
{
color1=1;
color2=3;
}
else
{
color1=3;
color2=15;
}
setfillstyle(SOLID_FILL,color1);
setcolor(color1);
circle(x1,y1,Radius+2);
floodfill(x1,y1,color1);
setfillstyle(SOLID_FILL,color2);
setcolor(color2);
circle(x2,y2,color2);
CurFocus=focus;
}
void GamePlay()
{
int key,Exit=FALSE;
int i,j;
ShowChess(SHOW);
SetChess(CurFocus);
while(!Exit)
{
key=bioskey(0);
switch(key)
{
case ESE:
Exit=TRUE;
break;
case ENTER:
if(!Map[CurRow][CurCol])
{
ShowChess(SET);
SetChess(CurFocus%2+1);
ShowChess(SHOW);
}
break;
case F2:
InitData();
for(i=0;i<ROW;i++)
for(j=0;j<COL;j++)
Map[i][j]=0;
DrawChessboard();
ShowChess(SHOW);
SetChess(CurFocus);
case DOWN:
case UP:
case LEFT:
case RIGHT:
MoveChess(key);
break;
}
}
}
void MoveChess(int dir)
{
ShowChess(HIDE);
if(Map[CurRow][CurCol])
Refresh();
switch (dir)
{
case LEFT:
CurCol--;
CurX-=SIZE;
if(CurCol<0)
{
CurCol+=COL;
CurX+=COL*SIZE;
}
break;
case RIGHT:
CurCol++;
CurX+=SIZE;
if(CurCol==COL)
{
CurCol-=COL;
CurX-=COL*SIZE;
}
break;
case DOWN:
CurRow++;
CurY+=SIZE;
if(CurRow==ROW)
{
CurRow-=ROW;
CurY-=ROW*SIZE;
}
break;
case UP:
CurRow--;
CurY-=SIZE;
if(CurRow<0)
{
CurRow+=ROW;
CurY+=ROW*SIZE;
}
break;
}
ShowChess(SHOW);
}
void Refresh()
{
int color=Map[CurRow][CurCol];
setcolor(color);
circle(CurX,CurY,Radius);
setfillstyle(SOLID_FILL,color);
floodfill(CurX,CurY,color);
}
void CheckWin(int row,int col)
{
int count,color=Map[row][col];
int winner=0,x,y;
char MsgWin[50];
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);
settextstyle(0,0,2);
if(CurFocus==1)
strcpy(MsgWin,"LYJ");
else
strcpy(MsgWin,"XxX");
strcat(MsgWin," Win ");
outtextxy(x,y,MsgWin);
settextstyle(0,0,0);
getch();
exit(0);
}
}
int GetNum(int row,int col,int dir,int value)
{
int result=0;
int i,j;
switch(dir)
{
case LEFT:
for(i=col-1;i>=0;i--)
if(Map[row][i]!=value) break;
result=col-1-i;
break;
case RIGHT:
for(i=col+1;i<COL;i++)
if(Map[row][i]!=value) break;
result=i-1-col;
break;
case DOWN:
for(i=row+1;i<ROW;i++)
if(Map[i][COL]!=value) break;
result=i-1-row;
break;
case UP:
for(i=row-1;row>0;i--)
if(Map[i][COL]!=value) break;
result=row-1-i;
break;
case LU:
for(i=row-1,j=col-1;i>=0&&j>=0;i--,j--)
if(Map[i][j]!=value) break;
result=i-1-row;
break;
case RD:
for(i=row+1,j=col+1;i<ROW&&j<COL;i++,j++)
if(Map[i][j]!=value) break;
result=i-1-row;
break;
case RU:
for(i=row-1,j=col+1;i>=0&&j<COL;i--,j++)
if(Map[i][j]!=value) break;
result =row-1-i;
break;
case LD:
for(i=row+1,j=col-1;i<ROW&&j>=0;i++,j--)
if(Map[i][j]!=value) break;
result=i-1-row;
break;
}
return result;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -