/****************include******************/
#include<graphics.h>
#include<stdio.h>
#include<conio.h>
#include<stdlib.h>
#include<bios.h>
#include<dos.h>
/**********************define********************/
#define ESC 27
#define F1 59
#define F2 60
#define F3 61
#define F4 62
#define F5 63
#define F6 64
#define ENTER 13
#define SPACE 32
#define UP 72
#define DOWN 80
#define LEFT 75
#define RIGHT 77
/************************函数*************************/
int ch=0;
void initgra(void);
void qipan(void);
void qizi(void);
void guangbiao(int x,int y);
void yidong(void);
void luozi(int x,int y);
void shengfu(int x,int y);
void cunpan(void);
void dakai(void);
int p,Qipu[225][2];
/***********************主函数**********************/
main()
{
initgra();
qipan();
qizi();
yidong();
closegraph();
}
/********************************棋盘***********************************/
void qipan(void)
{
int a,b;
initgra();
p=0;
setbkcolor(3);
setcolor(8);
setfillstyle(SOLID_FILL,2);
bar3d(15,15,465,465,3,8);
bar3d(15,15,465,465,2,8);
bar3d(15,15,465,465,1,8);
setcolor(6);
for(a=30;a<=450;a+=30)
line(a,30,a,450);
for(b=30;b<=450;b+=30)
line(30,b,450,b);
}
/*******************************棋子***********************************/
void qizi(void)
{
setcolor(0);
setfillstyle(SOLID_FILL,8);
fillellipse(500,50,15,15);
arc(500,50,0,40,10);
setfillstyle(SOLID_FILL,15);
fillellipse(500,430,15,15);
arc(500,430,0,40,10);
setfillstyle(SOLID_FILL,8);
fillellipse(240,240,4,4);
fillellipse(120,120,4,4);
fillellipse(120,360,4,4);
fillellipse(360,360,4,4);
fillellipse(360,120,4,4);
settextstyle(0,0,1);
setcolor(4);
outtextxy(490,320,"press F1:savegame");
outtextxy(490,350,"press F2:loadgame");
}
/********************************光标***********************************/
void guangbiao(int x,int y)
{
int i;
setcolor(12);
for(i=x-2;i<=x+2;i++)
{
line(i,y-2,i,y+2);
}
return;
}
/******************************移动********************************/
void yidong(void)
{
int x=240,y=240;
for(;ch!=27;)
{
setwritemode(XOR_PUT);
guangbiao(x,y);
ch=getch();
guangbiao(x,y);
setwritemode(COPY_PUT);
if(ch==27)return;
switch(ch){
case UP: y=y-30;
if(y==0)y=450;
break;
case DOWN: y=y+30;
if(y==480)y=30;
break;
case RIGHT: x=x+30;
if(x==480)x=30;
break;
case LEFT: x=x-30;
if(x==0)x=450;
break;
case ENTER: luozi(x,y);
shengfu(x,y);
break;
case F1: cunpan();
break;
case F2: dakai();
break;
}
}
}
/*********************************落子*********************************/
void luozi(int x,int y)
{
setcolor(2);
if(getpixel(x+5,y+5)==2)
{
if(p%2==0){
setfillstyle(1,8);
fillellipse(x,y,15,15);
arc(x,y,0,40,10);
Qipu[p][0]=x;Qipu[p][1]=y;
p++;
}
else {
setfillstyle(1,15);
fillellipse(x,y,15,15);
arc(x,y,0,40,10);
Qipu[p][0]=x;Qipu[p][1]=y;
p++;
}
}
else
{
setwritemode(XOR_PUT);
guangbiao(x,y);
}
return;
}
/***********************************胜负******************************/
void shengfu(int x,int y)
{
char chs;
int i,j,k=0,t=getpixel(x+5,y+5),q=1;
while(q)
{
for(i=x;i>=30&&k!=6;i=i+30)
{
if(getpixel(i+5,y+5)==t) k++;
else break;
}
for(i=x;i<=450&&k!=6;i=i-30)
{
if(getpixel(i+5,y+5)==t) k++;
else break;
}
if(k==6)
{q=0;break;}
for(j=y,k=0;j>=30&&k!=6;j=j+30)
{
if(getpixel(x+5,j+5)==t) k++;
else break;
}
for(j=x;j<=450&&k!=6;j=j-30)
{
if(getpixel(x+5,j+5)==t) k++;
else break;
}
if(k==6)
{q=0;break;}
for(i=x,j=y,k=0;i>=30&&j>=30&&k!=6;i=i+30,j=j+30)
{
if(getpixel(i+5,j+5)==t) k++;
else break;
}
for(i=x,j=y;i<=450&&j<=450&&k!=6;i=i-30,j=j-30)
{
if(getpixel(i+5,j+5)==t) k++;
else break;
}
if(k==6)
{q=0;break;}
for(i=x,j=y,k=0;i>=30&&j<=450&&k!=6;i=i+30,j=j-30)
{
if(getpixel(i+5,j+5)==t) k++;
else break;
}
for(i=x,j=y;i<=450&&j>=30&&k!=6;i=i-30,j=j+30)
{
if(getpixel(i+5,j+5)==t) k++;
else break;
}
q=0;
}
while(k==6)
{
settextstyle(0,0,2);
setcolor(12);
if(t==8)
outtextxy(100,50,"The winner is black!");
else
outtextxy(100,50,"The winner is white!");
chs=getch();
if(chs==F1) ch=59;
else ch=27;
break;
}
}
/*************************************存盘*********************************/
void cunpan(void)
{
int i;
FILE *ptr;
char blcsy[20];
outtextxy(50,50,"please input the name:");
scanf("%s",blcsy);
if((ptr=fopen(blcsy,"wb"))==NULL) return;
else
{
fseek(ptr,SEEK_SET,0);
for(i=0;i<p;i++)
{
putw(Qipu[i][0],ptr);
putw(Qipu[i][1],ptr);
}
}
outtextxy(50,80,"save ok");
fclose(ptr);
return;
}
/**********************************打开*****************************/
void dakai(void)
{
int i=0,x,y;
char ch;
FILE *fs;
char blcsy[20];
outtextxy(50,50,"please input the name:");
scanf("%s",blcsy);
if((fs=fopen(blcsy,"rb"))==NULL) return;
else
{
fseek(fs,SEEK_SET,0);
for(;feof(fs)==0;)
{
ch=getch();
if(ch==ESC) break;
else
{
x=getw(fs); y=getw(fs);
if(i%2==0)
{
setfillstyle(1,8);
fillellipse(x,y,15,15);
i++;
}
else
{
setfillstyle(1,15);
fillellipse(x,y,15,15);
i++;
}
}
}
}
return;
}
/***********************************初始化函数***********************************/
void initgra(void)
{
int gd=VGA,ge=VGAHI;
initgraph(&gd,&ge,"");
cleardevice();
return;
}
/******************************************/