天天看点

连连看c语言代码,连连看C语言代码.doc

#include void initialize();                                         //初始化

void near1(int a,int b,int a1,int b1);          //算法

void print_chess();                                   //打印棋盘

int exit_chess();                                        //判断是否结束

//全局变量

char chessman[10][10];                         //编译系统初始化每个元素为0

void main()

{

int row,line;                             //row是行号,line是列号

int row2,line2;                         //row是行号,line是列号

printf("\t\t\t按任意键开始\n");

fflush(stdin);

getch();

initialize();                //初始化棋盘内容

do

{

print_chess();

printf("输入第一个:");

fflush(stdin);

scanf("%d.%d",&line,&row);

printf("输入第二个:");

fflush(stdin);

scanf("%d.%d",&line2,&row2);

if(chessman[line][row]!=chessman[line2][row2])

{

printf("两数不相同!\n");                        //两数不同

}

else if(line==line2&&row==row2)

{

printf("错误输入!!!\n");                  //输入相同的坐标,提示用户错误

}

else if(line<=line2)

{

near1(line,row,line2,row2);                //使用函数处理,第一个点一定在第二个点上方

}

else

{

near1(line2,row2,line,row);                //使用函数处理

}

system("pause");

}while(exit_chess());

system("pause");

printf("\n\n\n\t\t恭喜您,您胜利了!\n");

printf("\n\t\t制作人:蒋睿立\n");

printf("\n\t博客:http:\\maidini.blog.163.com");

}

void initialize()                     //初始化棋盘

{

int i,j;                          //用于循环计数

int a[8]={0};                //记录哪些字符出现次数不是偶数

srand(time(NULL));

for(i=1;i<8;i++)                //这里只随机前8行,留最后一行不打印

for(j=1;j<9;j++)

{

chessman[i][j]=rand()%8+65;         //棋盘内容为大写字母A到H

if(chessman[i][j]==65) a[0]++;        //记录A的个数

if(chessman[i][j]==66) a[1]++;        //记录B的个数

if(chessman[i][j]==67) a[2]++;        //记录C的个数

if(chessman[i][j]==68) a[3]++;        //记录D的个数

if(chessman[i][j]==69) a[4]++;        //记录E的个数

if(chessman[i][j]==70) a[5]++;        //记录F的个数

if(chessman[i][j]==71) a[6]++;        //记录G的个数

if(chessman[i][j]==72) a[7]++;        //记录H的个数

}

for(i=0;i<8;i++)

{

if(a[i]%2!=0)        //如果字符的个数是奇数就还需要打印一个

chessman[8][i+1]=i+65;

else                    //如果前面7行随机的A到H字符恰好是偶数,最后一行全是I字符

chessman[8][i+1]=73;

}

}

void print_chess()                //打印棋盘内容

{

int i,j;

system("cls");

printf("\t       1   2   3   4   5   6   7   8   \n");

for(i=0;i<10;i++)

{

printf("\t\n\t");

for(j=0;j<10;j++)

{

printf("%4c",chessman[i][j]);

if(j==9&&i!=0&&i!=9)

printf("\t%d",i);

}

}

printf("\n\n\n\n");

}

int exit_chess()                //判断是否满足退出

{

int i,j;

for(i=0;i<10;i++)

{

for(j=0;j<10;j++)

if(chessman[i][j]!=0)

return 1;        //只要有1个棋子不为0,就返回1

}

return 0;

}

void near1(int a,int b,int a1,int b1)

{

int arow[2];

int aline[2];

int brow[2];

int bline[2];

int start=0,end=0;                //临时两个点

int i,j,n;                                //用于循环

for(i=0;i<2;i++)        //初始化数组

{

arow[i]=a;

brow[i]=a1;

aline[i]=b;

bline[i]=b1;

}

(a,b) a行中有哪些列

for(i=a+1;i<10;i++)

{

if(chessman[i][b]==0)

arow[1]=i;                                //arow[1]是A点a行向下向量

else

break;

}

for(i=a-1;i>=0;i--)

{

if(chessman[i][b]==0)                //arow[0]是A点a行向上向量

arow[0]=i;

else

break;

}

(a1,b1) a1行中有哪些列

for(i=a1+1;i<10;i++)

{

if(chessman[i][b1]==0)                //brow[1]是B点a1行向下向量

brow[1]=i;

else

break;

}

for(i=a1-1;i>=0;i--)

{

if(chessman[i][b1]==0)                //brow[0]是B点a1行向上向量

{brow[0]=i;}

else

{break;}

}

//(a,b) b列中有哪些行

for(i=b+1;i<10;i++)

{

if(chessman[a][i]==0)                //aline[1]是A点b列向右向量

{aline[1]=i;}

else

{break;}

}

for(i=b-1;i>=0;i--)

{

if(chessman[a][i]==0)                //aline[0]是A点b列向左向量

{aline[0]=i;}

else

{break;}

}

//(a1,b1) b1列中有哪些行

for(i=b1+1;i<10;i++)

{

if(chessman[a1][i]==0)                //bline[1]是B点b1列向右向量

{bline[1]=i;}

else

{break;}

}

for(i=b1-1;i>=0;i--)

{

if(chessman[a1][i]==0)                //bline[0]是B点b1列向左向量

{bline[0]=i;}

else

{break;}

}

//关键算法///

if(brow[0]>=arow[0])                //向上方向向量 有共同的列向量

start=brow[0];                        //取大的

else

start=arow[0];

if(brow[1]<=arow[1])                //向下方向向量 有共同的列向量

end=brow[1];                        //取小的

else

end=arow[1];

for(;start<=end;start++)                //列向量上共同点start到end

{

if(b0))                //因为b与b1大小不能确定,所有有2个if

chessman[a][b]=chessman[a1][b1]=0;

if((n==b1-b)&&(n>0))

chessman[a][b]=chessman[a1][b1]=0;

}

if(aline[0]>=bline[0])                //向左的向量 有共同的行向量

start=aline[0];                        //取大的

else

start=bline[0];

if(aline[1]0)        //a1始终大于a

{

chessman[a][b]=chessman[a1][b1]=0;

break;

}

}

if(a==a1)                //同行

{

if((aline[1]>=b1)||(aline[0]<=b1))

chessman[a][b]=chessman[a1][b1]=0;

}

if(b==b1)               //同列

{

if(arow[1]>=a1)

chessman[a][b]=chessman[a1][b1]=0;

}

}