五子棋

原创 2006年06月03日 20:02:00

/************************************
名 称:五子棋
作 者: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);
 }
}

相关文章推荐

利用VC制作单机版五子棋游戏

1, 制作用户登录框 比如有两个用户,张三和李四 定义两个全局变量 CString nameblack;//保存黑子玩家的名字 CString namewhite;//保存白子...

关于做人工智能—五子棋的总结

前言:     略... 正文:     首先,对于每一盘棋都有很多种下法,当黑方落下第一颗棋子的时候,白方有254种下法,白方在这254种下法中选择其一后,黑方又有253中下法。如此,将所有的下法都...
  • ji_yun
  • ji_yun
  • 2015年05月28日 15:38
  • 1552

Java-Swing五子棋源码

五子棋源码package org.nick;import java.awt.Color; import java.awt.Font; import java.awt.Graphics; import ...

Android实现五子棋游戏(一) 游戏基本逻辑

Android实现简单五子棋游戏。

JAVA第一个小项目——五子棋的制作(第一篇)

大家都应该知道五子棋吧

java程序--控制台五子棋

控制台五子棋,具体思路见代码注释。 代码如下: package test; import java.io.IOException; import java.util.Scanner; ...
  • acm_lkl
  • acm_lkl
  • 2014年12月02日 19:04
  • 1563

小萝莉五子棋(高能绕行)

问题及代码: /* *copyright (t) 2016,烟台大学计算机学院 *All rights reserved. *文件名称:test.cpp *作者:张晴晴 *完成日期:2016年6月3...

五子棋基础算法及胜利判定算法(无AI)

这篇文章只是简单的绘制了一个棋盘,通过输入坐标(格式举例:3,4)来下棋,然后就是胜利判定算法。我最刚开始的算法会出现数组越界问题,也就是说当棋子下在棋盘最靠边的一圈时就会出现数组越界异常,后来大改了...
  • diaotai
  • diaotai
  • 2016年09月15日 22:15
  • 4544

Java实现一个简单的两人五子棋游戏(四) 落子动作的实现

1)选择棋子 目标 2)画棋子 ✔️ 3)判断胜负 4)交换行棋方   前面,我们已经画好的棋盘和棋子,接下来,我们要通过鼠标点击屏幕获取落子位置并...

一种基于机器学习的五子棋实现

远望研发部 周晨威,蔡斌松 概述 早些年,IBM研发的深蓝机器人战胜了当时的国际象棋冠军,引发了人们对人工智能的关注, 去年,谷歌的alphaGo战胜了李世石九段,又引发了一场人工智能和机器学习的热...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:五子棋
举报原因:
原因补充:

(最多只允许输入30个字)