羊了个羊 通关代码思路

羊了个羊过关思路

9.16重大更新

此题放弃了,这题无解。出题的随机性很大,到最后根本凑不成三个相同的。将近百分之一的有解率。坑人的游戏

前言

肝了几遍微信小程序“羊了个羊“,发现有大概的解题思路,需要用代码敲一下子。遂先写一下思路,有空的话代码实践一下子。
游戏胜利机制为消除背景上方所有图标,消除方法为点击三个相同的图标,难点在于当有超过三个相同图标时,需要考虑图标下一层掩盖的图标,从而实现最优选择。
总体来讲,分几大方面:

1.堆栈

羊了个羊游戏界面
堆栈实行先入后出原则,对应游戏里最下方的土坑样的储存空间,因此允许先存储暂时无法进行消除的图标。

stack = []
容量最多有7个,因此允许前四个图标不相同,但最后三个必须相同
当栈内检测到有三个相同图标时,进行出栈

2.Mask掩膜

主要焦点为高亮图标对暗处图标进行了一定程度的遮挡,通过图像识别对遮挡图标进行检测。

  • 检测高亮显示的图标
  • 检测被遮挡图标
  • 检测该层是否有可三连消除的图标
  • 更新图片,重新检测

3.识别

  • 识别高亮图标类别
  • 根据部分特征识别被遮挡图标类别
  • 标记被遮挡图标位置
imoport cv
利用OpenCV进行图像检测、识别

4.判断

  • 判断高亮图标消失后,可以将哪些”暗图标“变为”亮图标“

5.强化学习

奖励机制正在探索中

6.代码思路

注意只有思路

# 当前高亮显示的图标及对应位置
high_light_pic = [水桶,剪刀,饭团,饭团,饭团]
high_light_pic_xy = [[123321],[111,222],[333,444],[678,321],[555,666]]
if high_light_pic能进行三消:
	找到三个相同图标,进行消除
else:
	选择一个亮图标,该图标需具备入栈后其掩盖的暗图标可以实现三消的能力。
  • 16
    点赞
  • 52
    收藏
    觉得还不错? 一键收藏
  • 7
    评论
2048游戏的通关条件是达到2048分或者出现了一个数字为2048的方块。以下是一个简单的示例代码: ``` #include <stdio.h> #include <stdlib.h> #include <time.h> #define SIZE 4 #define WIN_SCORE 2048 int board[SIZE][SIZE]; // 保存游戏面板的二维数组 // 初始化游戏面板 void init_board() { srand(time(NULL)); // 设置随机数种子 for (int i = 0; i < SIZE; i++) { for (int j = 0; j < SIZE; j++) { board[i][j] = 0; // 将游戏面板上的所有方块置为0 } } // 随机生成两个数字为2的方块 int count = 0; while (count < 2) { int x = rand() % SIZE; int y = rand() % SIZE; if (board[x][y] == 0) { board[x][y] = 2; count++; } } } // 在游戏面板上随机生成一个数字为2或4的方块 void generate_block() { int x, y; do { x = rand() % SIZE; y = rand() % SIZE; } while (board[x][y] != 0); // 随机生成的位置必须是空的 board[x][y] = (rand() % 2 + 1) * 2; // 生成2或4的方块 } // 判断游戏是否结束 int is_game_over() { for (int i = 0; i < SIZE; i++) { for (int j = 0; j < SIZE; j++) { if (board[i][j] == WIN_SCORE) { // 出现了一个数字为2048的方块,游戏胜利 return 1; } if (board[i][j] == 0) { // 还有空位,游戏未结束 return 0; } if (i < SIZE - 1 && board[i][j] == board[i+1][j]) { // 上下相邻的方块值相等,游戏未结束 return 0; } if (j < SIZE - 1 && board[i][j] == board[i][j+1]) { // 左右相邻的方块值相等,游戏未结束 return 0; } } } return 1; // 游戏结束 } // 向左移动所有方块 void move_left() { for (int i = 0; i < SIZE; i++) { int last_merged = -1; // 上一个合并的方块的位置 for (int j = 1; j < SIZE; j++) { if (board[i][j] == 0) { // 空方块,跳过 continue; } int k = j - 1; while (k >= 0 && board[i][k] == 0) { // 向左移动方块 board[i][k] = board[i][k+1]; board[i][k+1] = 0; k--; } if (k >= 0 && board[i][k] == board[i][k+1] && k != last_merged) { // 合并相邻的相同方块 board[i][k] *= 2; board[i][k+1] = 0; last_merged = k; } } } } // 打印游戏面板 void print_board() { printf("\n"); for (int i = 0; i < SIZE; i++) { for (int j = 0; j < SIZE; j++) { printf("%d\t", board[i][j]); } printf("\n"); } } int main() { init_board(); // 初始化游戏面板 print_board(); // 打印游戏面板 while (!is_game_over()) { char c = getchar(); if (c == 'w') { // 向上移动 // TODO } else if (c == 's') { // 向下移动 // TODO } else if (c == 'a') { // 向左移动 move_left(); generate_block(); print_board(); } else if (c == 'd') { // 向右移动 // TODO } } printf("\nCongratulations! You win the game!\n"); return 0; } ``` 注意:上述代码仅实现了向左移动方块的功能,还需要实现向上、向下、向右移动的功能,这里留给读者自行实现。
评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值