| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 430 人关注过本帖
标题:我的控制台连连看代码
只看楼主 加入收藏
小鱼儿c
Rank: 9Rank: 9Rank: 9
等 级:贵宾
威 望:14
帖 子:852
专家分:1317
注 册:2011-4-1
结帖率:95.74%
收藏
已结贴  问题点数:20 回复次数:3 
我的控制台连连看代码
此程序是为了实现算法并不是为了给人玩的。所以我的数组是定义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();
    }
}

 
搜索更多相关主题的帖子: color 控制台 
2011-07-06 00:15
yangfanconan
Rank: 7Rank: 7Rank: 7
等 级:贵宾
威 望:10
帖 子:397
专家分:541
注 册:2009-9-22
收藏
得分:10 
不错,加油。
2011-07-06 08:47
laoyang103
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
来 自:内蒙古包头
等 级:贵宾
威 望:19
帖 子:3082
专家分:11056
注 册:2010-5-22
收藏
得分:10 
其实就是广度搜索,然后找到小于等于两个拐点的路径

                                         
===========深入<----------------->浅出============
2011-07-06 09:11
小鱼儿c
Rank: 9Rank: 9Rank: 9
等 级:贵宾
威 望:14
帖 子:852
专家分:1317
注 册:2011-4-1
收藏
得分:0 
回复 3楼 laoyang103
呵呵,只有听说过。但没有真正学过

用心做一件事情就这么简单
2011-07-07 00:06
快速回复:我的控制台连连看代码
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.032635 second(s), 7 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved