我的控制台连连看代码
此程序是为了实现算法并不是为了给人玩的。所以我的数组是定义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(); } }