#include<graphics.h>
#include<windows.h>
#include<iostream>
#define MAX 20
using namespace std;
bool flag=true;
int temp=1; // 为了实现黑白棋子的交替,使用全局变量
void qizi(int array2[][MAX],int array3[][MAX],int array1[][MAX]);
void huaqizi1(int array2[][MAX],int array3[][MAX],int array1[][MAX],mouse_msg msg);
void huaqizi2(int array2[][MAX],int array3[][MAX],int array1[][MAX],mouse_msg msg);
void huaqizi3(int array2[][MAX],int array3[][MAX],int array1[][MAX],mouse_msg msg);
void huaqizi4(int array2[][MAX],int array3[][MAX],int array1[][MAX],mouse_msg msg);
void PanDuanBaiZi1(int array2[][MAX],int a,int b);
void PanDuanBaiZi2(int array2[][MAX],int a,int b);
void PanDuanBaiZi3(int array2[][MAX],int a,int b);
void PanDuanBaiZi4(int array2[][MAX],int a,int b);
void PanDuanHeiZi1(int array3[][MAX],int a,int b);
void PanDuanHeiZi2(int array3[][MAX],int a,int b);
void PanDuanHeiZi3(int array3[][MAX],int a,int b);
void PanDuanHeiZi4(int array3[][MAX],int a,int b);
int main(void)
{
//储存白子,只要交叉点的坐标下了白子,就将该坐标置为2
int array2[MAX][MAX]={0};
//储存黑子,只要交叉点的坐标下了黑子,就将该坐标置为3
int array3[MAX][MAX]={0};
//储存棋子,只要该坐标下了棋子,就置为1,则该点不能被重新下棋子
int array1[MAX][MAX]={0};
int k;
//接下来的几个循环是将棋盘外面的区域置为1,表明不可被下棋子
for(k=0;k<MAX;k++)
{
array1[0][k]=1;
}
int q;
for(q=0;q<MAX;q++)
{
array1[q][0]=1;
}
int w;
for(w=0;w<MAX;w++)
{
array1[15][w]=1;
}
int h,m;
for(m=15;m<MAX;m++)
{
for(h=0;h<15;h++)
{
array1[h][m]=1;
}
}
initgraph(800,600);
setcolor(GREEN);
//画棋盘,横有十四条线,纵有十四条线
int i;
for(i=40;i<=560;i=i+40)
{
line(i,40,i,560);
}
int j;
for(j=40;j<=560;j=j+40)
{
line(40,j,560,j);
}
//接下来是对棋子的操作
qizi(array2,array3,array1);
getch();
closegraph();
return 0;
}
void qizi(int array2[][MAX],int array3[][MAX],int array1[][MAX])
{
//鼠标函数实现
mouse_msg msg={0};
for(; is_run()&&temp==1; delay_fps(60))
{
while(mousemsg())
{
msg=getmouse();
}
//接下来四个区域,要实现当鼠标点击时,离该点最近的交叉点画圆,
//确保每个棋子都落在交叉点上
//以下四个函数是对该思路的算法实现
if(msg.x%40<=18&&msg.y%40<=18)
{
huaqizi1(array2,array3,array1,msg);
}
else if(msg.x%40<18&&msg.y%40>18)
{
huaqizi2(array2,array3,array1,msg);
}
else if(msg.x%40>18&&msg.y%40<18)
{
huaqizi3(array2,array3,array1,msg);
}
else if(msg.x%40>18&&msg.y%40>18)
{
huaqizi4(array2,array3,array1,msg);
}
}
}
void huaqizi1(int array2[][MAX],int array3[][MAX],int array1[][MAX],mouse_msg msg)
{
if(array1[(int)msg.y/40][(int)msg.x/40]==0)
{
if(msg.is_left()&&msg.is_down())
{
if(flag==true)
{
int a,b;
a=(int)msg.y/40;
b=(int)msg.x/40;
setcolor(WHITE);
setfillcolor(WHITE);
fillellipse((int)msg.x/40*40,(int)msg.y/40*40,18,18);
flag=false;//此处的目的是为了使黑白棋子交替
Sleep(300);
//每下一颗棋子,就将坐标置为1
array1[(int)msg.y/40][(int)msg.x/40]=1;
//每下一颗白棋子棋子,就将坐标置为2
array2[(int)msg.y/40][(int)msg.x/40]=2;
//接下来就是判断白子是否胜利
PanDuanBaiZi1(array2,a,b);
PanDuanBaiZi2(array2,a,b);
PanDuanBaiZi3(array2,a,b);
PanDuanBaiZi4(array2,a,b);
}else if(flag==false)
{
int a,b;
a=(int)msg.y/40;
b=(int)msg.x/40;
setcolor(WHITE);
setfillcolor(BLACK);
fillellipse((int)msg.x/40*40,(int)msg.y/40*40,18,18);
flag=true;
Sleep(300);
array1[(int)msg.y/40][(int)msg.x/40]=1;
//每下一颗黑棋子,就将坐标置为3
array3[(int)msg.y/40][(int)msg.x/40]=3;
//接下来就是判断黑子是否胜利
PanDuanHeiZi1(array3,a,b);
PanDuanHeiZi2(array3,a,b);
PanDuanHeiZi3(array3,a,b);
PanDuanHeiZi4(array3,a,b);
}
}
}
}
void huaqizi2(int array2[][MAX],int array3[][MAX],int array1[][MAX],mouse_msg msg)
{
if(array1[(int)msg.y/40+1][(int)msg.x/40]==0)
{
if(msg.is_left()&&msg.is_down())
{
int a=(int)msg.y/40+1;
int b=(int)msg.x/40;
if(flag==true)
{
setcolor(WHITE);
setfillcolor(WHITE);
fillellipse((int)msg.x/40*40,((int)msg.y/40+1)*40,18,18);
flag=false;
Sleep(300);
array1[(int)msg.y/40+1][(int)msg.x/40]=1;
array2[(int)msg.y/40+1][(int)msg.x/40]=2;
PanDuanBaiZi1(array2,a,b);
PanDuanBaiZi2(array2,a,b);
PanDuanBaiZi3(array2,a,b);
PanDuanBaiZi4(array2,a,b);
}
else if(flag==false)
{
setcolor(WHITE);
setfillcolor(BLACK);
fillellipse((int)msg.x/40*40,((int)msg.y/40+1)*40,18,18);
flag=true;
Sleep(300);
array1[(int)msg.y/40+1][(int)msg.x/40]=1;
array3[(int)msg.y/40+1][(int)msg.x/40]=3;
PanDuanHeiZi1(array3,a,b);
PanDuanHeiZi2(array3,a,b);
PanDuanHeiZi3(array3,a,b);
PanDuanHeiZi4(array3,a,b);
}
}
}
}
void huaqizi3(int array2[][MAX],int array3[][MAX],int array1[][MAX],mouse_msg msg)
{
if(array1[(int)msg.y/40][(int)msg.x/40+1]==0)
{
if(msg.is_left()&&msg.is_down())
{
int a,b;
a=(int)msg.y/40;
b=(int)msg.x/40+1;
if(flag==true)
{
setcolor(WHITE);
setfillcolor(WHITE);
fillellipse(((int)msg.x/40+1)*40,(int)msg.y/40*40,18,18);
flag=false;
Sleep(300);
array1[(int)msg.y/40][(int)msg.x/40+1]=1;
array2[(int)msg.y/40][(int)msg.x/40+1]=2;
PanDuanBaiZi1(array2,a,b);
PanDuanBaiZi2(array2,a,b);
PanDuanBaiZi3(array2,a,b);
PanDuanBaiZi4(array2,a,b);
}
else if(flag==false)
{
setcolor(WHITE);
setfillcolor(BLACK);
fillellipse(((int)msg.x/40+1)*40,(int)msg.y/40*40,18,18);
flag=true;
Sleep(300);
array1[(int)msg.y/40][(int)msg.x/40+1]=1;
array3[(int)msg.y/40][(int)msg.x/40+1]=3;
PanDuanHeiZi1(array3,a,b);
PanDuanHeiZi2(array3,a,b);
PanDuanHeiZi3(array3,a,b);
PanDuanHeiZi4(array3,a,b);
}
}
}
}
void huaqizi4(int array2[][MAX],int array3[][MAX],int array1[][MAX],mouse_msg msg)
{
if(array1[(int)msg.y/40+1][(int)msg.x/40+1]==0)
{
if(msg.is_left()&&msg.is_down())
{
int a,b;
a=(int)msg.y/40+1;
b=(int)msg.x/40+1;
if(flag==true)
{
setcolor(WHITE);
setfillcolor(WHITE);
fillellipse(((int)msg.x/40+1)*40,((int)msg.y/40+1)*40,18,18);
Sleep(300);
flag=false;
array1[(int)msg.y/40+1][(int)msg.x/40+1]=1;
array2[(int)msg.y/40+1][(int)msg.x/40+1]=2;
PanDuanBaiZi1(array2,a,b);
PanDuanBaiZi2(array2,a,b);
PanDuanBaiZi3(array2,a,b);
PanDuanBaiZi4(array2,a,b);
}
else if(flag==false)
{
setcolor(WHITE);
setfillcolor(BLACK);
fillellipse(((int)msg.x/40+1)*40,((int)msg.y/40+1)*40,18,18);
Sleep(300);
flag=true;
array1[(int)msg.y/40+1][(int)msg.x/40+1]=1;
array3[(int)msg.y/40+1][(int)msg.x/40+1]=3;
PanDuanHeiZi1(array3,a,b);
PanDuanHeiZi2(array3,a,b);
PanDuanHeiZi3(array3,a,b);
PanDuanHeiZi4(array3,a,b);
}
}
}
}
//接下来是判断棋子胜负的算法实现
/*
举个例子,当白子下落后,就往左循环判断不间断最远的白子的位置并记录,
接下来就从那里往右循环看白子是否是连续的五个,
这样的算法要四个,分别是从左到右,从上到下,斜上方到斜下方,斜下方到斜上方
若是,则白子赢,跳出循环,使棋盘不能被下棋子,并在界面显示白子胜利
判断黑子胜负的过程也是这样的。
*/
void PanDuanBaiZi1(int array2[][MAX],int a,int b)
{
int c;
for(;array2[a][b]==2;b--)
{
;
}
c=b+1;
int count1=0;
for(;array2[a][c]==2;c++)
{
count1++;
}
if(count1==5)
{
setcolor(RED);
setfont(20,12,"宋体");
outtextxy(650,100,"白子胜利!");
temp=0;
}
}
void PanDuanBaiZi2(int array2[][MAX],int a,int b)
{
int c;
for(;array2[a][b]==2;a--)
{
;
}
c=a+1;
int count1=0;
for(;array2[c][b]==2;c++)
{
count1++;
}
if(count1==5)
{
setcolor(RED);
setfont(20,12,"宋体");
outtextxy(650,100,"白子胜利!");
temp=0;
}
}
void PanDuanBaiZi3(int array2[][MAX],int a,int b)
{
int c,d;
for(;array2[a][b]==2;a--,b--)
{
;
}
c=a+1;
d=b+1;
int count1=0;
for(;array2[c][d]==2;c++,d++)
{
count1++;
}
if(count1==5)
{
setcolor(RED);
setfont(20,12,"宋体");
outtextxy(650,100,"白子胜利!");
temp=0;
}
}
void PanDuanBaiZi4(int array2[][MAX],int a,int b)
{
int c,d;
for(;array2[a][b]==2;a--,b++)
{
;
}
c=a+1;
d=b-1;
int count1=0;
for(;array2[c][d]==2;c++,d--)
{
count1++;
}
if(count1==5)
{
setcolor(RED);
setfont(20,12,"宋体");
outtextxy(650,100,"白子胜利!");
temp=0;
}
}
void PanDuanHeiZi1(int array3[][MAX],int a,int b)
{
int c;
for(;array3[a][b]==3;b--)
{
;
}
c=b+1;
int count1=0;
for(;array3[a][c]==3;c++)
{
count1++;
}
if(count1==5)
{
setcolor(RED);
setfont(20,12,"宋体");
outtextxy(650,200,"黑子胜利!");
temp=0;
}
}
void PanDuanHeiZi2(int array3[][MAX],int a,int b)
{
int c;
for(;array3[a][b]==3;a--)
{
;
}
c=a+1;
int count1=0;
for(;array3[c][b]==3;c++)
{
count1++;
}
if(count1==5)
{
setcolor(RED);
setfont(20,12,"宋体");
outtextxy(650,200,"黑子胜利!");
temp=0;
}
}
void PanDuanHeiZi3(int array3[][MAX],int a,int b)
{
int c,d;
for(;array3[a][b]==3;a--,b--)
{
;
}
c=a+1;
d=b+1;
int count1=0;
for(;array3[c][d]==3;c++,d++)
{
count1++;
}
if(count1==5)
{
setcolor(RED);
setfont(20,12,"宋体");
outtextxy(650,200,"黑子胜利!");
temp=0;
}
}
void PanDuanHeiZi4(int array3[][MAX],int a,int b)
{
int c,d;
for(;array3[a][b]==3;a--,b++)
{
;
}
c=a+1;
d=b-1;
int count1=0;
for(;array3[c][d]==3;c++,d--)
{
count1++;
}
if(count1==5)
{
setcolor(RED);
setfont(20,12,"宋体");
outtextxy(650,200,"黑子胜利!");
temp=0;
}
}
//以上代码要运行的话必须要安装ege图形库
总结:
这次小案例我觉得做的还行,用到了ege图形库,接触到了以前没有接触到的东西,学到了很多。
可是也有不足的地方:那就是没有一个“开始游戏”的动态gif画面。
还有就是没有“人机对战”的选项,因为我不会人机算法,如果我以后会的话,我会加上去。
总的来说,这次要感谢老师出这样一个题目,不然我还是浑浑噩噩的浪下去,不可能被动及主动的接收这样的知识。