100行代码教你写个卡牌翻翻乐小游戏

本文介绍了如何使用JavaScript制作卡牌翻翻乐小游戏,包括随机打乱卡牌顺序、实现翻转动画及匹配规则。通过CSS布局完成6x4的卡牌展示,并详细讲解了点击卡牌时的翻转效果以及匹配逻辑。

卡牌翻翻乐这种小游戏相信大家都玩过,一组卡牌随机翻面平铺在面前,用户点击卡牌翻转,两两配对消除卡牌,游戏的玩法主要是通过玩家自己对卡牌位置的记忆,快速匹配出相同的卡牌予以消除。

那么我们自己来写一个这个小游戏,大致的思路会是什么呢?首先我们先找来卡牌素材,这里取的是12张生肖图案【图片来源于网络侵删】。那么我们就一共要展示24张卡片,布局上我们就按6x4的格子摆放吧。那么接下来主要工作分为:

1、打乱顺序随机摆放卡牌

2、卡牌翻转动画

3、卡牌翻转后的匹配规则,如果未匹配,两张牌自行翻转回去;如果匹配,则消失

思路很清晰,就从第一步开始把!

1、打乱顺序随机摆放卡牌

为了方便图片渲染,我们给12张图片取名为1.png,2.png……12.png。把12x2=24张牌放到一个数组里就是[1,1,2,2,3,3,4,4,5,5,6,6,7,7,8,8,9,9,10,10,11,11,12,12],这个数组手敲起来眼花还容易写错,用个函数生成吧:

const generateArr = useCallback((): Array<number> => {
      let cur = 1;
      const initArr = Array(24).fill(1).map((item, index) => {
         if (index % 2 === 1) {
            item = cur - 1;
         } else {
            item = cur++;
         }
         return item
      })
      return initArr // 输出[1,1,2,2,3,3,4,4,5,5,6,6,7,7,8,8,9,9,10,10,11,11,12,12]
   }, [])

好了,接下来的步骤就是把24张牌通过洗牌算法打乱顺序。之前说展示6x4的布局,会有人想到说把一维数组转成二维数组然后双层for循环

### 翻翻游戏的C语言实现 以下是一个简单的翻翻游戏的C语言代码示例。该游戏的基本逻辑是:玩家翻开两张,如果它们匹配,则保留;否则翻回。游戏的目标是找到所有匹配的对。 ```c #include <stdio.h> #include <stdlib.h> #include <time.h> #define ROWS 4 #define COLS 4 // 定义一个全局变量来存储状态 int cards[ROWS][COLS]; int revealed[ROWS][COLS] = {0}; // 用于跟踪哪些已被翻开 // 初始化 void initializeCards() { int values[] = {1, 1, 2, 2, 3, 3, 4, 4, 5, 5, 6, 6, 7, 7, 8, 8}; int index = 0; // 随机打乱 srand(time(0)); for (int i = 0; i < ROWS * COLS; i++) { int j = rand() % (ROWS * COLS); int temp = values[i]; values[i] = values[j]; values[j] = temp; } for (int i = 0; i < ROWS; i++) { for (int j = 0; j < COLS; j++) { cards[i][j] = values[index++]; } } } // 显示 void displayCards() { printf(" "); for (int j = 0; j < COLS; j++) { printf(" %d ", j); } printf("\n"); for (int i = 0; i < ROWS; i++) { printf("%d ", i); for (int j = 0; j < COLS; j++) { if (revealed[i][j]) { printf("[%d]", cards[i][j]); } else { printf("[*]"); } } printf("\n"); } } // 检查是否所有都被匹配 int checkWin() { for (int i = 0; i < ROWS; i++) { for (int j = 0; j < COLS; j++) { if (!revealed[i][j]) { return 0; } } } return 1; } int main() { initializeCards(); // 初始化 int firstRow, firstCol, secondRow, secondCol; int turnCount = 0; while (1) { displayCards(); printf("Turns: %d\n", turnCount); // 玩家选择第一张 printf("Enter the row and column of the first card: "); scanf("%d %d", &firstRow, &firstCol); // 玩家选择第二张 printf("Enter the row and column of the second card: "); scanf("%d %d", &secondRow, &secondCol); // 检查输入的有效性 if (firstRow < 0 || firstRow >= ROWS || firstCol < 0 || firstCol >= COLS || secondRow < 0 || secondRow >= ROWS || secondCol < 0 || secondCol >= COLS || revealed[firstRow][firstCol] || revealed[secondRow][secondCol] || (firstRow == secondRow && firstCol == secondCol)) { printf("Invalid input. Try again.\n"); continue; } // 揭示两张 revealed[firstRow][firstCol] = 1; revealed[secondRow][secondCol] = 1; displayCards(); // 检查是否匹配 if (cards[firstRow][firstCol] == cards[secondRow][secondCol]) { printf("Match found!\n"); } else { printf("No match. Cards will be covered again.\n"); revealed[firstRow][firstCol] = 0; revealed[secondRow][secondCol] = 0; } // 增加回合数 turnCount++; // 检查是否获胜 if (checkWin()) { printf("Congratulations! You've matched all the cards in %d turns.\n", turnCount); break; } } return 0; } ``` ### 代码说明 - **初始化**:通过`initializeCards`函数生成一组随机排列的,并将它们分配到二维数组中。 - **显示**:通过`displayCards`函数显示当前的游戏状态,未翻开的用`[*]`表示。 - **检查胜利条件**:通过`checkWin`函数检查是否所有都已匹配[^2]。 - **主循环**:玩家轮流选择两张,程序会检查它们是否匹配。如果不匹配,会被重新覆盖。 ### 注意事项 - 程序使用了随机数生成器来打乱顺序,确保每次游戏的排列不同。 - 游戏结束时,会显示玩家完成游戏所需的回合数。
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值