五子棋

/************************************
名 称:五子棋
作 者:freewind
版 本:v1.0
时 间:2006-08
Email:freewind22@163.com
*************************************/

#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 ESC 0x011b   /*  ESC键值 */
#define ENTER 0x1c0d /* 回车键值 */
#define F2 0x3c00    /*    F2值  */
int P1Color,P2Color,BackGround,MapBgColor,LineColor,TextColor;
int MinX,MinY,MaxX,MaxY;
int CurRow,CurCol,CurX,CurY;
int CurFocus, Radius;
int Map[ROW][COL];
char P1Name[20],P2Name[20];
void Init_Graph();
void Init_Data();
void Init_Color();
void DrawMap();
void ShowQi();
void Begin();
void SetFoucs(int focus);
void Move(int dir);
void CheckWin(int row,int col);
void main(){
 Init_Graph();
 Init_Data();
 Init_Color();
 DrawMap();
 Begin();
 closegraph();
}
void Init_Graph(){
 int gdriver=DETECT,gmode,errorcode;
 initgraph(&gdriver, &gmode, "G://turboc2"); /* TC 目录 */
 errorcode = graphresult();
 if (errorcode != grOk){ /* an error occurred */
  printf("Graphics error: %s/n", grapherrormsg(errorcode));
  printf("Press any key to halt:");
  getch();
  exit(1); /*terminate with an error code */
    }
}
void Init_Color(){
 P1Color=15;
 P2Color=1;
 BackGround=3;
 MapBgColor=7;
 LineColor=11;
 TextColor=11;
 strcpy(P1Name,"Player 1");
 strcpy(P2Name,"Player 2");
}
void Init_Data(){
 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;  /* white 1 black 2*/
}
void DrawMap(){
 int i,j,x,y;
 setbkcolor(BackGround);
 setfillstyle(SOLID_FILL,BackGround);
 bar(0,0,getmaxx(),MinY);
 setfillstyle(SOLID_FILL,MapBgColor);
 setcolor(LineColor);
 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(TextColor);
 settextstyle(0,0,0);
 settextjustify(1,1);
 outtextxy(MinX-MinX/2,MinY+10,P1Name);
 outtextxy(MaxX+MinX/2,MinY+10,P2Name);
 outtextxy(getmaxx()/2,MaxY+MinY/2,"Esc:Exit   Enter:Set   F2:Start ");
}
void ShowQi(int flag){
 int color, r=Radius; 
 if (flag==SET || flag==SHOW){
  if(CurFocus==1)
   color=P1Color;
  else
   color=P2Color;
 }else
  color=MapBgColor;

 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 SetFocus(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=P1Color,color2=BackGround;
 else
  color1=BackGround,color2=P2Color;
 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;
 
}
void Begin(){
 int key,Exit=FALSE;
 int i,j;
 ShowQi(SHOW);
 SetFocus(CurFocus);
 while(!Exit) {
  key=bioskey(0);
  switch(key) {
  case ESC:
   Exit=TRUE;
   break;
  case ENTER:
   if(!Map[CurRow][CurCol]){
    ShowQi(SET);
    SetFocus(CurFocus%2+1);
    ShowQi(SHOW);
   }
   break;
  case F2:
   Init_Data();
   for(i=0;i<ROW;i++)
    for(j=0;j<COL;j++)
     Map[i][j]=0;
   DrawMap();
   ShowQi(SHOW);
   SetFocus(CurFocus);
  case DOWN:case UP:case LEFT:case RIGHT:
   Move(key);
   break;
  }
 }
}
void Refresh(){
 int color=Map[CurRow][CurCol];
 setcolor(color);
 circle(CurX,CurY,Radius);
 setfillstyle(SOLID_FILL,color);
 floodfill(CurX,CurY,color);
}
void Move(int dir){
 ShowQi(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;
 }
 ShowQi(SHOW);
}
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;i>=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=row-1-i;
  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;
}
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,P1Name);
  else
   strcpy(MsgWin,P2Name);
  strcat(MsgWin," Win");
  outtextxy(x,y,MsgWin);
  settextstyle(0,0,0);
 }
}

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值