连连看简单终端版(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;
}

posted @ 2010-07-29 18:37  $逝水无痕$  阅读(105)  评论(0编辑  收藏  举报