#include "stdio.h"
#include "graphics.h"
#define LEFT 0x4b00
#define RIGHT 0x4d00
#define DOWN 0x5000
#define UP 0x4800
#define W 0x1177
#define S 0x1f73
#define A 0x1e61
#define D 0x2064
#define SPACE 0x3920
#define ESC 0x011b
#define ENTER 0x1c0d
struct type
{
int defend;
int offend;
};//made by linju
struct point
{
int x;
int y;
int flag;
int sum;
};//made by chenjian
typedef struct point POINT;
POINT move(POINT t,int s[16][16]);
POINT computer(POINT t,int s[16][16]);
int init(void);
void outputMap(int a[16][16]);
void draw(int x,int y,int i);
void checkwin(POINT i,int a[16][16]);
int getscore(int i,int j,int s[16][16]);
void cursor(int x,int y,int i);
void main()
{
int gdriver=DETECT,gmode;
POINT player1,player2;
int k[16][16];
int i,j,m;
initgraph(&gdriver,&gmode,"C:\\JMSOFT\\DRV");
player1.x=player2.x=240;
player1.y=player2.y=240;
player1.flag=1;
player2.flag=-1;
for(i=0;i<=15;i++)
for(j=0;j<=15;j++)
k[i][j]=0;
m=init();
if(m==1){
outputMap(k);
while(1)
{
player1=move(player1,k);
outputMap(k);
checkwin(player1,k);
player2=move(player2,k);
outputMap(k);
checkwin(player2,k);
}
}
if(m==2){
outputMap(k);
while(1)
{
player1=move(player1,k);
outputMap(k);
checkwin(player1,k);
player2=computer(player2,k);
outputMap(k);
checkwin(player2,k);
}
}
getch();
closegraph();
}
int init()
{
int i;
int key;
int x=180,y=353;
settextstyle(0, 0, 3);
setbkcolor(YELLOW);
setcolor(CYAN);
outtextxy(80, 120, "Five In A Row");
for(i=0;i<5;i++){
circle(140+i*80,210,12);
}
settextstyle(0,0,1);
setcolor(BLUE);
outtextxy(200, 300, "By linju and chenjian");
settextstyle(0,0,1);
outtextxy(200, 350, "human to human battle");
outtextxy(200, 380, "human to computer battle");
cursor(x,y,2);
setfillstyle(1,YELLOW);
while(1)
{
key=bioskey(0);
if(key==UP||key==DOWN)
{
if(y==353)
{
bar(120,320,200,420);
y+=30;
cursor(x,y,3);
}
else
{
bar(150,350,200,420);
y-=30;
cursor(x,y,2);
}
}
if(key==ENTER){
cleardevice();
if(y==353) return 1;
if(y==383) return 2;
}
}
}
void checkwin(POINT i,int a[16][16])
{
int k[4]={1,1,1,1};
int p;
POINT t1=i;
POINT t2=i;
t1.x-=20;
while(a[(t1.y-100)/20][(t1.x-100)/20]==i.flag)//左
{
k[0]+=1;
t1.x-=20;
}
t2.x+=20;//右
while(a[(t2.y-100)/20][(t2.x-100)/20]==i.flag)
{
k[0]+=1;
t2.x+=20;
}
t1=i;
t2=i;
t1.y-=20;//竖直向上
while(a[(t1.y-100)/20][(t1.x-100)/20]==i.flag)
{
k[1]+=1;
t1.y-=20;
}
t2.y+=20;//竖直向下
while(a[(t2.y-100)/20][(t2.x-100)/20]==i.flag)
{
k[1]+=1;
t2.y+=20;
}
t1=i;
t2=i;
t1.y-=20;//这个/方向
t1.x+=20;
while(a[(t1.y-100)/20][(t1.x-100)/20]==i.flag)
{
k[2]+=1;
t1.y-=20;
t1.x+=20;
}
t2.y+=20;//这个/方向
t2.x-=20;
while(a[(t2.y-100)/20][(t2.x-100)/20]==i.flag)
{
k[2]+=1;
t2.y+=20;
t2.x-=20;
}
t1=i;
t2=i;
t1.y-=20;//这个\方向
t1.x-=20;
while(a[(t1.y-100)/20][(t1.x-100)/20]==i.flag)
{
k[3]+=1;
t1.y-=20;
t1.x-=20;
}
t2.y+=20;//这个/方向
t2.x+=20;
while(a[(t2.y-100)/20][(t2.x-100)/20]==i.flag)
{
k[3]+=1;
t2.y+=20;
t2.x+=20;
}
for(p=0;p<=3;p++)
{
if(k[p]==5)
{
setbkcolor(GREEN);
settextstyle(0,0,3);
outtextxy(100,50,"GAME OVER");
getch();
exit(0);
}
}
}
void outputMap(int a[16][16])
{
int i,j;
int k,l;
char *b="Quit: Please press ESC ";
cleardevice();
setbkcolor(10);
setcolor(CYAN);
for(i=100;i<=14*20+100;i+=20)
for(j=100;j<=14*20+100;j+=20)
{
rectangle(i,j,i+20,j+20);
}
settextstyle(0,0,1);
outtextxy(420,100,b);
rectangle(420,150,600,380);
outtextxy(425, 155, "-----PLAYER1 B-------");
outtextxy(425, 170, "PRESS 'W' 'A' 'S' 'D'");
outtextxy(425, 185, "'SPACE'");
outtextxy(425, 200, "-----PLAYER2 W------- ");
outtextxy(425, 215, "PRESS 'UP' 'DOWN' ");
outtextxy(425, 230, "PRESS 'LEFT' 'RIGHT'");
outtextxy(425, 245, "'ENTER'");
for(i=0;i<=15;i++)
for(j=0;j<=15;j++){
draw(100+j*20,100+i*20,a[i][j]);
}
}
POINT computer(POINT t,int s[16][16])
{
POINT max = t;//save the dot of max socre
POINT a[16][16];//save the empty dot
int i,j;//do the circle
for(i=0;i<16;i++)//get all the score of every empty dot
{
for(j=0;j<16;j++)
{
if(s[i][j]==0)
{
a[i][j].sum = getscore(i,j,s);
a[i][j].x = j;
a[i][j].y = i;
a[i][j].flag =-1;
}
}
}
max.sum = 0;
for(i=0;i<16;i++)//get the dot of max score
{
for(j=0;j<16;j++)
{
if(s[i][j]==0)
{
if(max.sum <= a[i][j].sum)
{
max.sum=a[i][j].sum;
max.x = a[i][j].x;
max.y = a[i][j].y;
max.flag = a[i][j].flag;
}
}
}
}
if(s[max.y][max.x]==0)
s[max.y][max.x]=-1;
max.x=100+max.x*20;
max.y=100+max.y*20;
return max;
}
int getscore(int y,int x,int s[16][16])
{
int i,j;
int scoreDefend[16][16];
int scoreOffend[16][16];
for(i=0;i<16;i++)
{
for(j=0;j<16;j++)
{
scoreDefend[i][j]=0;
scoreOffend[i][j]=0;
}
}
for(i=0;i<16;i++)
{
for(j=0;j<16;j++)
{
//normal-defend
//one black-eight sides
if(s[i][j]==1){
if(j>0&&j<16)
scoreDefend[i][j-1]=scoreDefend[i][j+1]+=13;
if(i>0&&i<16)
scoreDefend[i-1][j]=scoreDefend[i+1][j]+=13;
if(i>0&&i<16&&j>0&&j<16)
scoreDefend[i-1][j-1]=scoreDefend[i+1][j+1]=
scoreDefend[i+1][j-1]=scoreDefend[i-1][j+1]+=10;
}
//two black-eight sides
if(j>0&&j<16)
if(s[i][j]==1&&s[i][j+1]==1)//right
scoreDefend[i][j-1]=scoreDefend[i][j+2]+=38;
if(i>0&&i<16)
if(s[i][j]==1&&s[i+1][j]==1)//down
scoreDefend[i-1][j]=scoreDefend[i+2][j]+=38;
if(i>0&&i<16&&j>0&&j<16)
if(s[i][j]==1&&s[i+1][j+1]==1)//right-down
scoreDefend[i-1][j-1]=scoreDefend[i+2][j+2]+=37;
if(j>0&&j<16)
if(s[i][j]==1&&s[i][j-1]==1)//left
scoreDefend[i][j+1]=scoreDefend[i][j-2]+=38;
if(i>0&&i<16&&j>0&&j<16)
if(s[i][j]==1&&s[i+1][j-1]==1)//left-down
scoreDefend[i-1][j+1]=scoreDefend[i+2][j-2]+=37;
if(i>0&&i<16)
if(s[i][j]==1&&s[i-1][j]==1)//up
scoreDefend[i+1][j]=scoreDefend[i-2][j]=38;
if(i>0&&i<16&&j>0&&j<16)
if(s[i][j]==1&&s[i-1][j-1]==1)//up-left
scoreDefend[i+1][j+1]=scoreDefend[i-2][j-2]+=37;
if(i>0&&i<16&&j>0&&j<16)
if(s[i][j]==1&&s[i-1][j+1]==1)//up-right
scoreDefend[i+1][j-1]=scoreDefend[i-2][j+2]+=37;
//three black-eight sides
if(j>0&&j<16)
if(s[i][j]==1&&s[i][j+1]==1&&s[i][j+2]==1)//right
if(s[i][j-1]==-1||s[i][j+3]==-1)
scoreDefend[i][j-1]=scoreDefend[i][j+3]+=427;
else
scoreDefend[i][j-1]=scoreDefend[i][j+3]+=628;
if(i>0&&i<16)
if(s[i][j]==1&&s[i+1][j]==1&&s[i+2][j]==1)//down
if(s[i-1][j]==-1||s[i+3][j]==-1)
scoreDefend[i-1][j]=scoreDefend[i+3][j]+=427;
else
scoreDefend[i-1][j]=scoreDefend[i+3][j]+=628;
if(i>0&&i<16&&j>0&&j<16)
if(s[i][j]==1&&s[i+1][j+1]==1&&s[i+2][j+2]==1)//right-down
if(s[i-1][j-1]==-1||s[i+3][j+3]==-1)
scoreDefend[i-1][j-1]=scoreDefend[i+3][j+3]+=423;
else
scoreDefend[i-1][j-1]=scoreDefend[i+3][j+3]+=624;
if(j>0&&j<16)
if(s[i][j]==1&&s[i][j-1]==1&&s[i][j-2]==1)//left
if(s[i][j-3]==-1||s[i][j+1]==-1)
scoreDefend[i][j-3]=scoreDefend[i][j+1]+=427;
else
scoreDefend[i][j-3]=scoreDefend[i][j+1]+=628;
if(i>0&&i<16&&j>0&&j<16)
if(s[i][j]==1&&s[i+1][j-1]==1&&s[i+2][j-2]==1)//left-down
if(s[i-1][j+1]==-1||s[i+3][j-3]==-1)
scoreDefend[i-1][j+1]=scoreDefend[i+3][j-3]+=423;
else
scoreDefend[i-