连连看简单终端版(2)
在(1)的基础上添加了可以设置方块数量的功能
ui.h头文件
#ifndef UI_H
#define UI_H
/************************************************
*函数名:display
*说明:显示方块到屏幕
*参数:int** allBlocks,要显示的方块的二维数组的维数
*返回值:无
************************************************/
void display(int **allBlocks,int N);
/************************************************
* h函数名:setGrade
* 说明:设置游戏等级(设置方块的数量)
* 参数:无
* 返回值:返回设置的方块的行数(列数)的个数
************************************************/
int setGrade();
#endif
ui.c头文件
#include <stdio.h>
#include "ui.h"
void display(int **allBlocks,int N)
{
int i=0;
for(;i<N;i++)
{
int j=0;
for(;j<N;j++)
{
if(i==0||j==0||i==(N-1)||j==(N-1))
{
printf(" * ");
}
else if(allBlocks[i][j]==0)
{
printf(" ");
}
else
{
printf("%3d",allBlocks[i][j]);
}
}
printf("/n");
}
return;
}
int setGrade()
{
int n;
printf("请输入您设置方块的行数(4-14之间):/n");
scanf("%d",&n);
return n+2;
}
linksee.h头文件
#ifndef LINKSEE_H
#define LINKSEE_H
/*************************************************
*函数名:initBlocks
*说明:初始化每个方块,并且使方块顺序打乱
*参数:int allBlocks[]要保存方块的二维数组
*返回值:无
*************************************************/
void initBlocks(int** allBlocks,int N);
/***********************************************
*函数名:checkConnect
*说明:判断两个方块是否可以消除
*参数:int x1,第一个方块的横坐标
int y1,第一个方块的纵坐标
int x2,第二个方块的横坐标
int y2,第二个方块的纵坐标
*返回值:bool型,若能消除则返回1,否则返回0
***********************************************/
int checkConnect(int **allBlocks,int x1,int y1,int x2,int y2,int N);
/************************************************
*函数名:connect1
*说明:判断能否在一条直线上连接两个方块
*参数:int allBlocks[][N]保存方块的数组
int x1,int y1第一个方块的坐标
int x2,int y2第二个方块的坐标
*返回值:若能连接返回1,否则返回0
************************************************/
int connect1(int **allBlocks,int x1,int y1,int x2,int y2,int N);
/************************************************
*函数名:connect2
*说明:判断能否在只转一个湾的情况下连接两个方块
*参数:int allBlocks[][N]保存方块的数组
int x1,int y1第一个方块的坐标
int x2,int y2第二个方块的坐标
*返回值:若能连接返回1,否则返回0
************************************************/
int connect2(int **allBlocks,int x1,int y1,int x2,int y2,int N);
/************************************************
*函数名:connect3
*说明:判断能否在转两个湾的情况下连接两个方块
*参数:int allBlocks[][N]保存方块的数组
int x1,int y1第一个方块的坐标
int x2,int y2第二个方块的坐标
*返回值:若能连接返回1,否则返回0
************************************************/
int connect3(int **allBlocks,int x1,int y1,int x2,int y2,int N);
/************************************************
*函数名:isGameOver
*说明:判断玩家是否完成游戏
*参数:int allBlocks[][N]保存方块的数组
*返回值:若完成游戏(即数组的值全为0)返回1,否则返回0
************************************************/
int isGameOver(int **allBlocks,int N);
/************************************************
*函数名:playgame
*说明:玩游戏的过程
*参数:int allBlocks[][N]保存方块的数组
*返回值:无
************************************************/
void playgame(int **allBlocks,int N);
#endif
linksee.c源文件
#include <stdio.h>
#include "linksee.h"
#include <stdlib.h>
#include "ui.h"
#include <time.h>
void initBlocks(int **allBlocks,int N)
{
int i=1;
int k=1;
for(;i<N-1;i++)
{
int j=1;
for(;j<N-1;j+=2)
{
allBlocks[i][j]=k;
allBlocks[i][j+1]=k;
k++;
}
}
srand((unsigned)time(NULL));
i=0;
for(;i<(N-2)*(N-2);i++)
{
int indexX1=rand()%(N-2)+1;
int indexY1=rand()%(N-2)+1;
int indexX2=rand()%(N-2)+1;
int indexY2=rand()%(N-2)+1;
int temp=allBlocks[indexX1][indexY1];
allBlocks[indexX1][indexY1]=allBlocks[indexX2][indexY2];
allBlocks[indexX2][indexY2]=temp;
}
return ;
}
int connect1(int **allBlocks,int x1,int y1,int x2,int y2,int N)
{
int sum=0;
if(x1==x2&&y1!=y2)
{
if(y2>y1)
{
int temp=y1;
y1=y2;
y2=temp;
}
int i=y2+1;
for(;i<=y1-1;i++)
{
sum+=allBlocks[x1][i];
}
if(sum==0)
{
return 1;
}
}
else if(y1==y2&&x1!=x2)
{
if(x2>x1)
{
int temp=x1;
x1=x2;
x2=temp;
}
int i=x2+1;
for(;i<=x1-1;i++)
{
sum+=allBlocks[i][y1];
}
if(sum==0)
{
return 1;
}
}
return 0;
}
int connect2(int** allBlocks,int x1,int y1,int x2,int y2,int N)
{
if((allBlocks[x1][y2]==0)&&connect1(allBlocks,x1,y1,x1,y2,N)&&connect1(allBlocks,x1,y2,x2,y2,N))
{
return 1;
}
else if((allBlocks[x2][y1]==0)&&connect1(allBlocks,x1,y1,x2,y1,N)&&connect1(allBlocks,x2,y1,x2,y2,N))
{
return 1;
}
return 0;
}
int connect3(int** allBlocks,int x1,int y1,int x2,int y2,int N)
{
int i=0;
for(;i<N;i++)
{
int j=0;
for(;j<N;j++)
{
if((allBlocks[i][j]==0)&&connect1(allBlocks,x2,y2,i,j,N)&&connect2(allBlocks,x1,y1,i,j,N))
{
return 1;
}
}
}
return 0;
}
int checkConnect(int** allBlocks,int x1,int y1,int x2,int y2,int N)
{
if(allBlocks[x1][y1]!=allBlocks[x2][y2])
{
return 0;
}
else if(connect1(allBlocks,x1,y1,x2,y2,N))
{
return 1;
}
else if(connect2(allBlocks,x1,y1,x2,y2,N))
{
return 1;
}
else if(connect3(allBlocks,x1,y1,x2,y2,N))
{
return 1;
}
return 0;
}
int isGameOver(int** allBlocks,int N)
{
int i=0;
for(;i<N;i++)
{
int j=0;
for(;j<N;j++)
{
if(allBlocks[i][j])
{
return 0;
}
}
}
return 1;
}
void playgame(int** allBlocks,int N)
{
int x1;
int y1;
int x2;
int y2;
do
{
printf("请输入你要连接的两个方块坐标(Ctrl+c退出游戏):/n");
scanf("%d%d%d%d",&x1,&y1,&x2,&y2);
if(checkConnect(allBlocks,x1,y1,x2,y2,N))
{
allBlocks[x1][y1]=0;
allBlocks[x2][y2]=0;
display(allBlocks,N);
}
else
{
printf("此两方块不能连接!/n");
}
}
while(!isGameOver(allBlocks,N));
printf("恭喜你完成了游戏!/n");
return ;
}
main函数
#include <stdio.h>
#include <stdlib.h>
#include "linksee.h"
#include <memory.h>
#include "ui.h"
int main()
{
int N;
N=setGrade();
int **allBlocks;
allBlocks=(int**)malloc(sizeof(int*)*N);
int i=0;
for(;i<N;i++)
{
allBlocks[i]=(int*)malloc(sizeof(int)*N);
}
memset(allBlocks[0],0,sizeof(allBlocks));
//printf("after memset/n");
/*i=0;////////////////////
for(;i<N;i++)//////////////////////////
{
int j=0;
for(;j<N;j++)
{
printf("%d/t",allBlocks[i][j]);
}
}*/
initBlocks(allBlocks,N);
//printf("after initBlocks/n");
display(allBlocks,N);
//printf("after display/n");
playgame(allBlocks,N);
//printf("after playGame/n");
i=0;
for(;i<N;i++)
{
free(allBlocks[i]);
}
free(allBlocks);
return 0;
}