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;
}