[C语言]文字版2048

/*
    文字版2048
    2020.5.6
    by 小铭
*/
#include 
#include 
#include 
#include 
#include 
#define true 1
#define false 0

void square_frame(int array[4][4]);         //绘制方框
void output_array(int array[4][4] , int i); //打印数字层
void rand_array(int array[4][4]);           //矩阵在0处随机生成2或4
void moveway(char c , int array[4][4]);     //进行移动操作
void sum_a(int a[] , int n);                //相邻相同求和
void movezore(int a[] , int n);             //将非0数移动到行或列的某一端
void no_huanhang(char c);                   //不要输入换行符;
int search(int array[4][4]);                //判断游戏是否结束,继续返回1,结束返回0
void before(void);

static long score = 0;                      //记录分数:定义全局静态变量记录分数
int main()
{
    int a[4][4] = {{0,},} , count = 0 , m;      //count记录当前步数
    char c ;
    system("color f0");
    before();          
    system("cls");                  
    srand((unsigned)time(NULL));
    rand_array(a);                          //先生成2个随机数
    rand_array(a);                          
    printf("SCORE:%ld\n" , score);
    printf("当前步数是:%d\n" , count);
    square_frame(a);                       //打印方框与数字
    printf("请输入方向(w a s d):");            //输入操作方向
    while (1)
    {
        scanf("%c" , &c);              
        if(c != '\n')                      //scanf会存储换行符,用if跳过这种情况
        {
            moveway(c , a);                //进行矩阵的变化 
            system("cls");                 //清屏,然后重新打印方框
            count ++ ;                     //记录步数;
            printf("SCORE:%ld\n" , score);
            printf("当前步数是:%d\n" , count);
            square_frame(a);
            printf("请输入方向(w a s d):"); 
            Sleep(500);
            system("cls");
            rand_array(a);
            printf("SCORE:%ld\n" , score);
            printf("当前步数是:%d\n" , count);
            square_frame(a);
            printf("请输入方向(w a s d):");    //输入操作方向
            m = search(a) ;
            if(m == 0)
            {
                break ;
            }
        }
    }
    printf("\nGame Over!!!\n你的最后分数为:%ld\n" , score);
    system("pause") ;
    return 0;
}
void rand_array(int array[4][4])//矩阵在0处随机生成2或4
{
    int i , j , k;
    do
    {
        i = rand() % 4 ;
        j = rand() % 4 ;
    } while (array[i][j] != 0);
    k = rand() % 100 + 1 ;          //k取值范围为[1 , 100];
    if(k > 90) array[i][j] = 4;     //10%概率生成4
    else 
        array[i][j] = 2 ;           //90%概率生成2

}
void square_frame(int array[4][4]) //打印方框与数字
{
    int i = 0 ;
    printf("┌╌╌╌╌┬╌╌╌╌┬╌╌╌╌┬╌╌╌╌┐\n");
        output_array(array , i++);  //数字层1
    printf("├╌╌╌╌┼╌╌╌╌┼╌╌╌╌┼╌╌╌╌┤\n");
        output_array(array , i++);  //数字层2
    printf("├╌╌╌╌┼╌╌╌╌┼╌╌╌╌┼╌╌╌╌┤\n");
        output_array(array , i++);  //数字层3
    printf("├╌╌╌╌┼╌╌╌╌┼╌╌╌╌┼╌╌╌╌┤\n");
        output_array(array , i++);  //数字层4
    printf("└╌╌╌╌┴╌╌╌╌┴╌╌╌╌┴╌╌╌╌┘\n");
}
void output_array(int array[4][4] , int i)//打印数字层
{
    int j ;
    for(j = 0 ; j < 4; j ++)
    {
        /*if(array[i][j] < 100 && array != 0)
            printf("╎ %-2d " , array[i][j]);
        else if(array[i][j] >= 100 && array != 0)
            printf("╎%-4d" , array[i][j]);*/
        if(array[i][j] != 0)
        {
            if(array[i][j] < 100)
                printf("╎ %-2d " , array[i][j]);
            else if(array[i][j] >= 100)
                printf("╎%-4d" , array[i][j]);
        }
        else
            printf("╎    ");
    }
    printf("╎\n");
}
void moveway(char c , int array[4][4])
{
    switch(c)
    {
        int i , j , k;
        int a[4];
        case 'w':
            for(j = 0; j < 4; j++) //向上移,从列开始
            {
                a[0] = array[0][j], a[1] = array[1][j], a[2] = array[2][j], a[3] = array[3][j] ;
                movezore(a , 4);
                sum_a(a , 4) ;
                movezore(a , 4);
                array[0][j] = a[0], array[1][j] = a[1], array[2][j] = a[2], array[3][j] = a[3] ;
            }
            break;

        case 'a':
            for(j = 0; j < 4; j++) //向左移,从行开始
            {
                a[0] = array[j][0], a[1] = array[j][1], a[2] = array[j][2], a[3] = array[j][3] ;
                movezore(a , 4);
                sum_a(a , 4) ;
                movezore(a , 4);
                array[j][0] = a[0], array[j][1] = a[1], array[j][2] = a[2], array[j][3] = a[3] ;
            }
            break;

        case 's':
           for(j = 0; j < 4; j++) //向下移,从列开始
            {
                a[0] = array[3][j], a[1] = array[2][j], a[2] = array[1][j], a[3] = array[0][j] ;
                movezore(a , 4);
                sum_a(a , 4) ;
                movezore(a , 4);
                array[3][j] = a[0], array[2][j] = a[1], array[1][j] = a[2], array[0][j] = a[3] ;
            }
            break;

        case 'd':
            for(j = 0; j < 4; j++) //向左移,从行开始
            {
                a[0] = array[j][3], a[1] = array[j][2], a[2] = array[j][1], a[3] = array[j][0] ;
                movezore(a , 4);
                sum_a(a , 4) ;
                movezore(a , 4);
                array[j][3] = a[0], array[j][2] = a[1], array[j][1] = a[2], array[j][0] = a[3] ;
            }
            break;
    }
}
void movezore(int a[] , int n)  //将数组非0元素移动到前段,并保留相对位置
{
    int i , j = -1;
    for(i = 0; i < n; i ++ )
    {
        if(a[i] != 0)
        {
            ++j ;
            if(j != i)
            {
                a[j] = a[i] ;
                a[i] = 0 ;
            }
        }
    }
}
void sum_a(int a[] , int n)     //将排列后的数组合并操作
{
    int i , conditon ;
    conditon = true ;
    for(i = 0; i < n && conditon; i ++)
    {
        if(a[i] == a[i + 1] && a[i] != 0)
        {
            a[i] *= 2 ;
            a[i+1] = 0 ;
            score += a[i];
            conditon = false ;
        }
    }
}
int search(int array[4][4])
{
    int i , j ;
    for(i = 0 ; i < 4 ; i ++)
    {
        for(j = 0; j < 4; j ++)
        {
            if(array[i][j] == 0)
                return 1;
        }
    }
    return 0;
}
void before(void)
{
    printf("文字版2048\n");
    printf("制作人:小铭\n");
    printf("规则:与2048一样,当没有空的方框时游戏结束\n");
    printf("游戏马上开始了哦o((>ω< ))o");
    Sleep(7000);
}

你可能感兴趣的:(小白,C语言)