我的控制台连连看代码
此程序是为了实现算法并不是为了给人玩的。所以我的数组是定义tu[5][5]25个是个奇数所以我也没有写判断输赢的函数。全部都是自己写的,自己开始想用递归实现发现,自己实现不了。
无意间看到别人水平范围的扫描我就觉的可以,我就按这个思路写了。
代码如下:但我也不知道这个程序不知道有没有BUG。自己也没有太多测试。
程序代码:/* Note:Your choice is C IDE */
#include "stdio.h"
#include "string.h"
#include "conio.h"
#include "math.h"
int tu[5][5]={{1,1,1,0,5},
{2,0,1,1,0},
{0,0,3,0,0},
{4,0,1,0,2},
{0,0,3,0,2}};
int x,y,x1,y1;
int ox,oy;
int dir=0,dir1;
int px,py;
int num=0;
int left=0,right=0,up=0,down=0;
int tx=0,ty=0;
int width=5,hight=5;
void Init()
{int dx,dy;
clrscr();
for(dy=0;dy<5;dy++)
for(dx=0;dx<5;dx++)
{gotoxy(dx*3+30,dy*2+1);
printf("%d",tu[dy][dx]);
}
}
void PlayGame()
{
gotoxy(1,10);
printf("Iput your number:");
scanf("%d%d",&x,&y);
printf("Iput your contact number:");
scanf("%d%d",&x1,&y1);
ox=x;
oy=y;
if(tu[y][x]==tu[y1][x1])
{if(x-x1>0)
right=1;
else
{if(x!=x1&&y-y1==0)
ty=1;
else
left=1;
}
if(y-y1>0)
down=1;
else
{if(x==x1&&y!=y1)
tx=1;
else
up=1;
}
if(tu[y][x]==tu[y1][x1])
{special();
search();
}
}}
void clear()
{tu[y][x]=0;
tu[y1][x1]=0;
}
int search()
{int n;
int start,dx,dy;
int flag=0;
int start1;
n=x;
while(n-1>0&&tu[y][n-1]==0)//这里得到的是水平的起始位置.
{n--;
}
if(n!=x)
start=n;
else
start=x;
//////////////实现了水平范围的扫描/////////////////
///////水平范围扫描写的比较啰嗦,因为在special的开始没有包括一些处理,
////就这这里处理,所以就多写了一些垃圾代码。
for(;(start<5&&tu[y][start]==0)||start==x;start++)
{
if(y-y1>0)
{if(start==x&&x==x1)
{for(dy=y;dy>y1+1;dy--)
{
if(tu[dy-1][start]!=0)
{
flag=1;
break;
}
if(!flag)
{
clear();
return 1;
}}
}
flag=0;
for(dy=y;dy>y1;dy--)
if(tu[dy-1][start]!=0)
{flag=1;
break;
}
if(!flag)//这里得到水平的位置。
if(start-x1>0)
{flag=0;
for(n=start;n>x1;n--)
if(tu[y1][n]!=0)
flag=1;}
else
{flag=0;
for(n=start;n<x1;n++)
if(tu[y1][n]!=0)
flag=1;
if(!flag)
{clear();
return 1;
}
}
}
if(y-y1<0)//当x在下面时候的情况
{flag=0;
if(start==x&&x==x1)
{for(dy=y;dy<y1-1;dy++)
if(tu[dy+1][start]!=0)
{flag=1;
break;
}
if(!flag)
{
clear();
return 1;
}
}
flag=0;
for(dy=y;dy<y1;dy++)
if(tu[dy+1][start]!=0)
{flag=1;
break;
}
if(!flag)
if(start-x1>0)
{for(n=start;n<x1;n--)
if(tu[y1][n]!=0)
{flag=1;
break;
}
if(!flag)
{
clear();
return 1;
}
}
else
{flag=0;
for(n=start;n>x1;n++)
{if(tu[y1][n]!=0)
flag=1;
break;}
if(!flag)
{clear();
return 1;
}
}
}
}
///////////////////////竖直范围的扫描///////////////////////////////
flag=0;
n=y;
while(n-1>0&&tu[n-1][x]==0)
{n--;
}
if(n!=y)
start=n;
else
start=y;//这里写的费代码,只是为了好看
n=y1;
while(n-1>0&&tu[n-1][x]==0)
{n--;
}
if(n!=y1)
start1=n;
else
start1=y1;
for(;(start<5&&tu[start][x]==0)||start==y;start++)
{if(start1>start)
start=start1;
if(x-x1>0)
{for(n=start-1;n>x1;n--)
if(tu[start][n]!=0)
{flag=1;
break;
}
if(!flag)
{clear();
return 1;
}
}
else
{{for(n=start+1;n<x1;n++)
if(tu[start][n]!=0)
{flag=1;
break;
}
if(!flag)
{clear();
return 1;
}
}
}
return 0;
}
}
////处理同在一行或一列或在同一方向是开口的 1 0 1 0
//1 0 1 0
int special() // 1 2 1 2//这个2个2的处理
{int n; //四个方向的处理
int flag1=1,flag2=1;
if(tx)
{if((x==0)||(x==4)||abs(y-y1)==1)
{
clear();
return 1;
}
if(down)
{for(n=y;n>y1+1;n--)
if(tu[n][x]!=0)
{flag1=0;
break;
}
if(flag1==1)
{
clear();
return 1;
}
}
else
{for(n=y;n<y1-1;n++)
if(tu[n][x]!=0)
{flag1=0;
break;
}
if(flag1==1)
{
clear();
return 1;
}
}
}
flag1=1;
flag2=1;
if(ty)
{if((y==0)||y==4||abs(x-x1)==1)
{
clear();
return 1;
}
if(right)
{for(n=x;n>x1+1;n--)
if(tu[n][x]!=0)
{flag1=0;
break;
}
if(flag1==1)
{clear();
return 1;
}
}
else
{for(n=x;n<x1-1;n++)
if(tu[n][x]!=0)
{flag1=0;
break;
}
if(flag1==1)
{clear();
return 1;
}
}
}
flag1=1;
flag2=1;
if((n=y+1)<5)
for(;n<5;n++)
if(tu[n][x]>0)
flag1=0;
if((n=y1+1)<5)
for(;n<5;n++)
if(tu[n][x1]>0)
flag2=0;
if(flag1*flag2==1)
{
clear();
return 1;
}
flag1=1;
flag2=1;
if((n=y-1)>=0)
for(;n>=0;n--)
if(tu[n][x]>0)
flag1=0;
if((n=y1-1)>=0)
for(;n>=0;n--)
if(tu[n][x1]>0)
flag2=0;
if(flag1*flag2==1)
{
clear();
return 1;
}
return 1;
}
void main()
{Init();
while(1)
{Init();
PlayGame();
}
}








