今天想来想去,也不知道发啥知识点,所以所来想去就写了一个消消乐,娱乐一下。解释一下,叫初始版的原因是生成的工具我只能想出来一个消除行和列的工具,下面先看看代码吧。
#pragma once
#define ROW 11
#define COL 11
#include
#include
#include
#include
void mnue();
void game_entertainment();
void init(char board[ROW][COL],int row,int col);
void print(char board[ROW][COL],int row,int col);
void play(char board[ROW][COL], int row, int col);
void set_up(char board[ROW][COL], int row, int col);
void prop(char board[ROW][COL], int row, int col);
void use(char board[ROW][COL], int row, int col);
void win(char board[ROW][COL], int row, int col);
#define _CRT_SECURE_NO_WARNINGS 1
#include "entertainment.h"
//游戏菜单
void mnue()
{
printf("**************************************\n");
printf("************ 消消乐游戏 **********\n");
printf("************1. play **********\n");
printf("************0. exit **********\n");
printf("**************************************\n");
}
void game_entertainment()
{
char board[ROW][COL] = { '\0' };
int i = 1;
//初始化棋盘
init(board, ROW, COL);
//打印棋盘
print(board, ROW, COL);
while (i)
{
//玩家开始选择坐标
play(board, ROW, COL);
//设置游戏规则
set_up(board, ROW, COL);
//生成道具
prop(board, ROW, COL);
//使用道具
use(board, ROW, COL);
//判断输赢
win(board, ROW, COL);
i--;
}
printf("很遗憾你没有闯关成功\n");
}
//初始化棋盘
void init(char board[ROW][COL], int row, int col)
{
//赋初值
int i = 0;
int j = 0;
int count = ((row - 1) * (col - 1)) / 2;
for (i = 0; i < row; i++)
{
for (j = 0; j < col; j++)
{
board[i][j] = '*';
}
}
//赋随机值
int x = 0;
int y = 0;
while (count)
{
x = rand() % 10 + 1;
y = rand() % 10 + 1;
if (board[x][y] == '#');
else
{
board[x][y] ='#';
count--;
}
}
}
//打印棋盘
void print(char board[ROW][COL],int row,int col)
{
int i = 0;
int j = 0;
for (i = 1; i < row; i++)
{
for (j = 1; j < col; j++)
{
printf(" %c ", board[i][j]);
if (j < col - 1)
{
printf("|");
}
}
printf("\n");
if (i < row - 1)
{
for (j = 1; j < col; j++)
{
printf("___");
if (j < col - 1)
{
printf("|");
}
}
printf("\n");
}
}
}
//玩家开始选择坐标
void play(char board[ROW][COL], int row, int col)
{
int i = 0;
int j = 0;
while (1)
{
//先判断是否合理
printf("请选择坐标\n");
scanf("%d %d", &i, &j);
if (i > row || j > col)
{
//不合理则继续输入,直到合理为止
printf("请重新输入,超出范围\n");
}
else
{
//合理的话判断他要与之交换的坐标
printf("请选择你要与之交换的坐标\n");
int x = 0;
int y = 0;
while (1)
{
//继续判断坐标是否合理
scanf("%d %d", &x, &y);
if (x > row || i > col)
{
printf("范围不符合与之交换的坐标,请重新选择要与之交换的坐标\n");
}
else
{
int tem = board[i][j];
board[i][j] = board[x][y];
board[x][y] = tem;
set_up(board, row, col);
//交换完之后再打印
system("cls");
print(board, row, col);
break;
}
}
break;
}
}
}
//游戏规则
void set_up(char board[ROW][COL], int row, int col)
{
int i = 1;
int j = 0;
//消除的规则(有四个一样的就消除)
for (i = 1; i < row; i++)
{
for (j = 1; j < col; j++)
{
if ((j + 3 )< col)
{
if ((board[i][j] == board[i][j + 1]) && (board[i][j + 1] == board[i][j + 2])&&(board[i][j + 2]== board[i][j + 3]))
{
board[i][j] = ' ';
board[i][j + 1] = ' ';
board[i][j + 2] = ' ';
board[i][j + 3] = ' ';
}
}
}
}
for (j = 1; j < col; j++)
{
for (i = 1; i < row; i++)
{
if ((j + 3) < row)
{
if ((board[j][i] == board[j][i + 1]) && (board[j][i + 1] == board[j][i + 2])&&(board[j][i+2]==board[j][i+3]))
{
board[j][i] = ' ';
board[j+1][i] = ' ';
board[j+2][i] = ' ';
board[j+3][i] = ' ';
}
}
}
}
}
//生成道具规则
void prop(char board[ROW][COL], int row, int col)
{
int i = 0;
int j = 0;
for (j = 0; j < col; j++)
{
for (i = 0; i < row; i++)
{
if ((j + 2) < row)
{
if (((board[j][i] == board[j][i + 1]) && (board[j][i + 1] == board[j][i + 2])))
{
board[j][i] = 36;
board[j+1][i] = ' ';
board[j+2][i] = ' ';
}
}
}
}
for (i = 0; i < row; i++)
{
for (j = 0; j < col; j++)
{
if ((j + 2) < col)
{
if (((board[i][j] == board[i][j + 1]) && (board[i][j + 1] == board[i][j + 2])))
{
board[i][j] = 36;
board[i][j + 1] = ' ';
board[i][j + 2] = ' ';
}
}
}
}
}
//使用道具
void use(char board[ROW][COL], int row, int col)
{
int i = 0;
int j = 0;
int t = 0;
int p = 0;
for (i = 0; i < row; i++)
{
for (j = 0; j < col; j++)
{
if (board[i][j] == 36)
{
p = i;
while (p < row)
{
board[p][j] = ' ';
p++;
}
while (t < col)
{
board[i][t] = ' ';
t++;
}
}
}
}
}
//判断输赢
void win(char board[ROW][COL], int row, int col)
{
int i = 0;
int j = 0;
int ret = 0;
for (i = 1; i < row; i++)
{
for (j = 1; j < col; j++)
{
if (board[i][j] == ' ')
{
ret++;
}
}
}
if (ret == ((row - 1) * (col - 1)))
{
printf("恭喜你,你赢了\n");
}
else;
}
#define _CRT_SECURE_NO_WARNINGS 1
#include "entertainment.h"
int main()
{
int input = 0;
srand((unsigned int)time(NULL));
do
{
mnue();
scanf("%d", &input);
/*system("cls");*/
switch (input)
{
case 1:
printf("play_entertainment\n");
printf("--------------------------------\n");
game_entertainment();
break;
case 0:
printf("exit\n");
break;
default :
printf("选择错误,请重新选择\n");
break;
}
} while (input);
return 0;
}
还是和以前一样,分了三个文件来写的,一个头文件,一个测试,一个是总结的文件
消消乐的规则相信大家都是知道的,所以我就让他们随机换位置(这个和正规的游戏规则不一样,因为这里生成随机数,要把数组复制成各种各样的不一样的,我感觉麻烦,所以就直接复制成*和#号了)。只要是有四个一样的,那就消除,把这四个一样的数组元素换成空格。如果换完有三个是一样的,那么就可以生成道具,道具的作用是消除行和列的所有元素,也是复制成空格。然后因为害怕出现死局(也就是小不完的情况,所以我就设置了次数,如果在规定次数内完成,那么就成功,否则失败)。下面是运行时的样子
生成工具的样子
我用的是ASCII码为36的字符,本来想ASCII为2的,但是打印不出来2的字符,可以看我的注释,因为我是生成工具,就使用,所以在棋盘上是显示不出来的 ,下面是赢了的时候
下面是闯关不成功的时候
想看源码点这:https://gitee.com/stickykkkkkk/game/tree/master/entertainment/game4/game4
其实我觉得在生成工具和实用工具那应该使用递归应该是很好的,但是我没有想出来,导致写的代码量很多,如果有老铁想出来,麻烦私信告知或是评论区留言。其实我想了好多天这个游戏的规则,但是我总感觉我自己不太清楚,所以拖了好几天,也是今天写了一下午,希望大家支持吧!后面会发升级版的消消乐。其实这个游戏我觉得思想和三子棋,五子棋有点像,就是很麻烦(今天有一个小地方内存访问越界了,找了一晚上)。
最后,希望大家多多支持,多多点赞!谢谢!如果老铁知道更好的方法,希望私信告知或是评论区留言。