C语言实现消消乐

C语言课程设计实现消消乐,用到了数据结构相关知识,代码如下:

#include <stdio.h>
#include <string.h>
#include <math.h>
#include <time.h>
#include <stdlib.h>

typedef struct runParm_{
    int **matr; //m
    int row; // x
    int col;//y
    int emCount;//n
    int exCount;//op
    int over1;//GAMEOVER1
    int over2;//GAMEOVER2
    int score;//int SCORE = 0;//全局变量 总分数
}runParm;

int resetMap(runParm* parmsObj);
int  **delValue(runParm* parmsObj);
int** copyMatr(int** matr, int inRow, int inCol);

void main(){//主函数入口 
    srand(time(NULL));
    runParm parmsObj;
    memset(&parmsObj, 0, sizeof(runParm));
    printf("请输入矩阵行数:");
    scanf("%d", &parmsObj.row);
    printf("请输入矩阵列数:");
    scanf("%d", &parmsObj.col);
    printf("请输入元素个数:");
    scanf("%d", &parmsObj.emCount);
    printf("请输入交换次数:");
    scanf("%d", &parmsObj.exCount);
    
    printf("打印模拟的消消乐:\r\n");
    parmsObj.matr = (int**)malloc(sizeof(int*)* parmsObj.row);//m
    for (int i = 0; i < parmsObj.row; i++){
        parmsObj.matr[i] = (int*)malloc(sizeof(int)* parmsObj.col);
        for (int j = 0; j < parmsObj.col; j++) {
            parmsObj.matr[i][j] = 1 + rand() % parmsObj.emCount;
            printf("%d ", parmsObj.matr[i][j]);
        }
        printf("\n");
    }
    printf("\r\n++++++++++++++++++++++++++++++++++++\r\n");
    for (int i = 0; i < parmsObj.exCount; i++) {
        parmsObj.matr = delValue(&parmsObj);
        if (!parmsObj.matr)
            break;
        printf("第 %d 次变换后的矩阵如下:\r\n", i + 1);
        for (int i2 = 0; i2 < parmsObj.row; i2++) {
            for (int i3 = 0; i3 < parmsObj.col; i3++) {
                printf("%d ", parmsObj.matr[i][i3]);
            }
            printf("\r\n++++++++++++++++++++++++++++++++++++\r\n");
        }
    }
    printf("最终得分:%d\r\n", parmsObj.score);
}

int resetMap(runParm* parmsObj){
    int sum = 0;
    parmsObj->over1 = 0;
    for (int i = 0; i < parmsObj->row; i++){
        for (int j = 0; j < parmsObj->col; j++){
            if (parmsObj->matr[i][j]){
                int tag1 = 1;
                for (int p = j; p < (parmsObj->col - 1);)
                {
                    if (parmsObj->matr[i][j] == parmsObj->matr[i][p + 1])
                    {
                        tag1++;
                        p++;
                    }
                    else
                        break;
                }
                if (tag1 > 2 && tag1 < 6)
                {
                    for (int k = 0; k < tag1; k++)
                        parmsObj->matr[i][j + k] = 0;
                    switch (tag1){
                    case 3:
                        sum = sum + 1; break;
                    case 4:
                        sum = sum + 4; break;
                    default:
                        sum = sum + 10;
                    }
                    parmsObj->over1++;
                }
                int tag2 = 1;
                for (int p = i; p < (parmsObj->row - 1);)
                {
                    if (parmsObj->matr[i][j] == parmsObj->matr[p + 1][j])
                    {
                        tag2++;
                        p++;
                    }
                    else
                        break;
                }
                if (tag2 > 2 && tag2 < 6)
                {
                    for (int k = 0; k < tag2; k++)
                        parmsObj->matr[i + k][j] = 0;
                    switch (tag2) {
                    case 3:
                        sum = sum + 1; break;
                    case 4:
                        sum = sum + 4; break;
                    default:
                        sum = sum + 10;
                    }
                    parmsObj->over1++;
                }
            }
        }
    }
    return sum;
}

int** copyMatr(int** matr, int inRow, int inCol)
{
    int **tmpMatr = new int*[inRow];
    for (int row = 0; row < inRow; row++) {
        tmpMatr[row] = new int[inCol];
        for (int col = 0; col < inCol; col++){
            tmpMatr[row][col] = matr[row][col];
        }
    }
    return tmpMatr;
}

int  **delValue(runParm* parmsObj){
    int swapPoint[2][2];
    int **tmpMatr, **tmpMaxMatr;
    int maxscore = 0;
    int i = 0, j = 0, tmp = 0, temp = 0;
    parmsObj->over2 = 0;
    for (i = 0; i < parmsObj->row; i++){
        for (j = 0; j<parmsObj->col - 1; j++){

            tmpMatr = copyMatr(parmsObj->matr, parmsObj->row, parmsObj->col);

            tmp = tmpMatr[i][j];
            tmpMatr[i][j] = tmpMatr[i][j + 1];
            tmpMatr[i][j + 1] = tmp;

            temp = resetMap(parmsObj);
            if (parmsObj->over1 != 0) parmsObj->over2++;
            if (maxscore<temp){//记录一次最大
                tmpMaxMatr = copyMatr(tmpMatr, parmsObj->row, parmsObj->col);

                maxscore = temp;
                swapPoint[0][0] = i;
                swapPoint[0][1] = j;
                swapPoint[1][0] = i;
                swapPoint[1][1] = j + 1;
            }
        }
    }

    for (i = 0; i<parmsObj->row - 1; i++){
        for (j = 0; j<parmsObj->col; j++){
            tmpMatr = copyMatr(parmsObj->matr, parmsObj->row, parmsObj->col);

            tmp = tmpMatr[i][j];
            tmpMatr[i][j] = tmpMatr[i + 1][j];
            tmpMatr[i + 1][j] = tmp;

            int temp = resetMap(parmsObj);

            if (parmsObj->over1 != 0)
                parmsObj->over2++;

            if (maxscore < temp){
                tmpMaxMatr = copyMatr(tmpMatr, parmsObj->row, parmsObj->col);
                maxscore = temp;
                swapPoint[0][0] = i;//记录最大的那次的交换坐标 
                swapPoint[0][1] = j;
                swapPoint[1][0] = i + 1;
                swapPoint[1][1] = j;
            }
        }
    }
    if (parmsObj->over2 == 0)
    {
        printf("消除结束!!!\r\n");
        return NULL;
    }
    printf("把坐标<%d,%d> 换为了 <%d,%d>\r\n",
        swapPoint[0][0], swapPoint[0][1], swapPoint[1][0], swapPoint[1][1]);
    printf("当前得分:%d\r\n", maxscore);
    parmsObj->score += maxscore;
    int t = parmsObj->row;
    while (t--){
        for (i = parmsObj->row - 2; i >= 0; i--){
            for (j = 0; j<parmsObj->col; j++){
                if (tmpMaxMatr[i][j] != 0 && tmpMaxMatr[i + 1][j] == 0){
                    int tmp = tmpMaxMatr[i][j];
                    tmpMaxMatr[i][j] = tmpMaxMatr[i + 1][j];
                    tmpMaxMatr[i + 1][j] = tmp;
                }
            }
        }
    }
    return tmpMaxMatr;
}

  • 28
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

2193410903

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值