五子棋

原创 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);
 }
}

初学mfc,根据网上资料写的五子棋

五子棋
  • u011120824
  • u011120824
  • 2014年04月19日 20:38
  • 1644

五子棋AI设计

五子棋AI设计——从门外到门内不得不说的事儿1 分类: 人工智能 AI 五子棋 Naive2012-06-08 09:48 278人阅读 评论(0) 收藏 举报 mfc测试 ...
  • pi9nc
  • pi9nc
  • 2013年09月01日 22:15
  • 27954

博弈算法实现简单五子棋

博弈算法实现的简单五子棋,使用极大极小搜索,alpha-beta剪枝,java图形界面。...
  • FANGPINLEI
  • FANGPINLEI
  • 2015年12月21日 16:46
  • 3118

Java-Swing五子棋源码

五子棋源码package org.nick;import java.awt.Color; import java.awt.Font; import java.awt.Graphics; import ...
  • wu6660563
  • wu6660563
  • 2016年07月04日 22:24
  • 2086

【五子棋AI循序渐进】发布一个完整的有一定棋力的版本(含源码)

本博文来自于:http://www.cnblogs.com/zcsor/archive/2012/12/25/2832820.html       经过这半年左右的学习和探索,现在对五子棋A...
  • cjianwyr
  • cjianwyr
  • 2017年02月07日 16:32
  • 1481

五子棋代码详细注解

网上有很多五子棋的代码,对于新手来说,看别人的代码实在有些费劲,因为很多地方的注释都不全,此文章重点不在代码上而是在代码的分析上,现在直接上代码及其注解。          五子棋中需要用到的知识点有...
  • cuicanxingchen123456
  • cuicanxingchen123456
  • 2015年10月21日 12:12
  • 2009

MFC设计局域网对战五子棋游戏(一)设计

一直想做游戏,不过鉴于D3D和OPENGL有点复杂,所以就选择了比较简单的GDI+和GDI混合模式,这样就解决了GDI绘图质量不高和GDI+不支持双缓冲的问题。 开发环境采用Visual Studi...
  • jokers_i
  • jokers_i
  • 2012年04月08日 22:43
  • 5243

android开发五子棋人人对战

转载请注明出处:http://blog.csdn.net/sw950729/article/details/51942858 本文出自:马云飞的博客 当初学编程的,都想做一个游戏,俄罗斯方块?贪吃...
  • sw950729
  • sw950729
  • 2016年07月18日 16:06
  • 3455

分享基于Flash AS 3.0制作五子棋的故事

【首先,很感谢每一位看这份博客的侠客。本人编程小白,刚刚上路,希望各路高手可以多多提宝贵意见。】 1,作品: 基于Flash AS3.0 语言的简单五子棋制作 2,流程: 要熟悉flash cs6的工...
  • ljw_Josie
  • ljw_Josie
  • 2015年10月20日 15:18
  • 1400

7*7的五子棋,博弈树的构造与节点数

五子棋博弈树的构造过程。
  • cnlht
  • cnlht
  • 2014年02月14日 16:40
  • 2593
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:五子棋
举报原因:
原因补充:

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