C++实现消消乐游戏

本文实例为大家分享了C++实现消消乐游戏的具体代码,供大家参考,具体内容如下

问题描述

给定一个矩阵, 判断移动哪一个格子,可以实现消除。(定义连续三个即可消除)

据说是华为的笔试题。

分析

先写一个函数,判断包含(i, j)的格子是否可能实现消除。

然后就是向右向下交换,然后调用上面写好的函数判断
被交换的两个格子是否实现消除。

重点是:

1、只需要向右向下交换,因为遍历的时候,后面的交换会重复。前一个判断了向右交换是否消除,后一个遍历就不需要再判断向左交换是否重复了。
2、一定要对被交换的两个格子都判断是否能消除,才能实现全面的判断。

代码

//
//  main.cpp
//  huawei
//
//  Created by SteveWong on 11/10/2016.
//  Copyright  2016 SteveWong. All rights reserved.
//

#include <iostream>
#include <string>
#include <vector>
#include <ctime>
//#include <cstdlib>
using namespace std;

const int LEN = 8;

void pmap(int map[][LEN])
{
    for (int i = 0; i < LEN; ++i)
    {
        for (int j = 0; j < LEN; ++j)
        {
            cout << map[i][j] << " ";
        }
        cout << endl;
    }
}

// 检查以(i,j)为中心的点, 看是否可以消除
bool check(int map[][LEN], int i, int j)// 保证i、j不越界,
{
    if (
        (i-1>=0 && i+1<LEN && map[i-1][j]==map[i][j]&&map[i][j]==map[i+1][j])
        || (j-1>=0 && j+1<LEN && map[i][j-1]==map[i][j]&&map[i][j]==map[i][j+1])
        || (i-2>=0 && map[i-2][j]==map[i-1][j]&&map[i-1][j]==map[i][j])
        || (j-2>=0 && map[i][j-2]==map[i][j-1]&&map[i][j-1]==map[i][j])
        || (i+2<LEN && map[i+2][j]==map[i+1][j]&&map[i+1][j]==map[i][j])
        || (j+2<LEN && map[i][j+2]==map[i][j+1]&&map[i][j+1]==map[i][j])
        )
    {
        return true;
    }
    return false;
}

bool swapAndJudge(int m[][LEN], int i, int j)// 保证i、j不越界, 应该对被swap的两个点都做纵向和横向的检查
{
    int map[LEN][LEN];
    for (int ii = 0; ii < LEN; ++ii)
    {
        for (int jj = 0; jj < LEN; ++jj)
        {
            map[ii][jj] = m[ii][jj];
        }
    }
    // 原来就可以消除
    if (check(map, i, j))
    {
        printf("no need to swap at (%d, %d)\n", i, j);
        return true;
    }
    // 只需要向下换和向右换
    // 向下换
    if (i + 1 < LEN)
    {
        swap(map[i+1][j], map[i][j]);

        if (check(map, i, j))
        {
            printf("# swap and sweap! (%d, %d)\n", i, j);
            return true;
        }
        if (check(map, i+1, j))
        {
            printf("# swap and sweap! (%d, %d)\n", i+1, j);
            return true;
        }

        swap(map[i+1][j], map[i][j]);// 换回来
    }

    // 向右换
    if (j + 1 < LEN)
    {
        swap(map[i][j+1], map[i][j]);

        if (check(map, i, j))
        {
            printf("# swap and sweap! (%d, %d)\n", i, j);
            return true;
        }
        if (check(map, i, j+1))
        {
            printf("# swap and sweap! (%d, %d)\n", i, j+1);
            return true;
        }

        swap(map[i][j+1], map[i][j]);// 换回来
    }

    return false;

}

void findMinSwap(int map[][LEN])
{
    for (int i = 0; i < LEN; ++i)
    {
        for (int j = 0; j < LEN; ++j)
        {
            if (swapAndJudge(map, i, j))
            {
                printf("gotcha! (%d, %d)\n", i, j);
            }
        }
    }
}

int main(int argc, const char * argv[]) {
    // insert code here...
//    std::cout << "Hello, World!\n";
    srand(unsigned(time(0)));
    for (int i = 0; i < LEN; ++i)
    {
        for (int j = 0; j < LEN; ++j)
        {
            map[i][j] = rand() % 5;
        }
    }
    cout << "xiaoxiaole!\n";
    findMinSwap(map);
    pmap(map);
    return 0;
}

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持我们。

(0)

相关推荐

  • C++语言实现开心消消乐

    本文实例为大家分享了C++实现开心消消乐的具体代码,供大家参考,具体内容如下 用C++实现的开心消消乐主要分成一个一个模块去实现的,较少代码的耦合性,在这里用了一个xiaoxiaogame类去实现,其中构造函数中对数组和变量的初始化 xiaoxiaogame(int row1, int col1); 用void display();这样一个函数实现显示,用bool isvalid(int x, int y);来判断一个坐标所在的位置能不能消除, 用bool isgameover();判断游戏有没

  • C/C++百行代码实现热门游戏消消乐功能的示例代码

    游戏设计 首先我们需要使用第三方框架,这里我使用的是sfml,不会使用sfml在我的上几篇文章当中-扫雷(上)有详细的开发环境搭建介绍 首先准备图片资源 一张背景图片,一张宝石图片 窗口初始化加载图片 Texture t1; t1.loadFromFile("images/bg2.png"); 当鼠标第一次单击时,记录下位置,第二次单击又记录一下位置,如果两个小方块相邻就交换位置,如果不相邻如图c的位置则,不发生变化 判断行或列如果三张一样的图片相邻,清除一下图片,进行刷新 实列 #i

  • Vue实现开心消消乐游戏算法

    之前做过一个算法题,算法要求就是写一个开心消消乐的逻辑算法,当时也是考虑了一段时间才做出来.后来想了想,既然核心算法都有了,能不能实现一个开心消消乐的小游戏呢,于是花了两天时间做了一个小游戏出来. 效果展示# 先在这里放一个最终实现的效果,还是一个比较初级的版本,大家有什么想法欢迎评论哦 游戏规则: 初始时会给玩家十分的初始分,每拖动一次就减一分,每消除一个方块就加一分,直到最后分数为0游戏结束 任意两个方块都可以拖动 界面设计# 页面的布局比较简单,格子的数据是一个二维数组的形式,说到这里大家

  • C语言实现消消乐小游戏

    本文实例为大家分享了C语言实现消消乐小游戏的具体代码,供大家参考,具体内容如下 代码: #include<iostream> #include<cstdlib> #include<bitset> #include<conio.h> #include<time.h> #include <windows.h> #include<queue> #include<algorithm> using namespace s

  • C语言实现消消乐游戏

    本文实例为大家分享了C语言实现消消乐游戏的具体代码,供大家参考,具体内容如下 问题描述 给定一个矩阵, 判断移动哪一个格子,可以实现消除.(定义连续三个即可消除) 据说是华为的笔试题. 分析 先写一个函数,判断包含(i, j)的格子是否可能实现消除. 然后就是向右向下交换,然后调用上面写好的函数判断 被交换的两个格子是否实现消除. 重点是: 1.只需要向右向下交换,因为遍历的时候,后面的交换会重复.前一个判断了向右交换是否消除,后一个遍历就不需要再判断向左交换是否重复了. 2.一定要对被交换的两

  • 使用python+pygame开发消消乐游戏附完整源码

    效果是这样的 ↓ ↓ ↓ 一.环境要求 windows系统,python3.6+ pip21+ 开发环境搭建地址 一起来学pygame吧 游戏开发30例(开篇词)--环境搭建+游戏效果展示 安装游戏依赖模块 pip install pygame 二.游戏简介 消消乐应该大家都玩过,或者看过.这个花里胡哨的小游戏 用python的pygame来实现,很简单. 今天带大家,用Python来实现一下这个花里胡哨的小游戏. 三.完整开发流程 1.项目主结构 首先,先整理一下项目的主结构,其实看一下主结构

  • Python实现消消乐小游戏

    本文实例为大家分享了Python实现消消乐小游戏的具体代码,供大家参考,具体内容如下 玩法:三个相连就能消除 源码分享: import os import sys import cfg import pygame from modules import * '''游戏主程序''' def main(): pygame.init() screen = pygame.display.set_mode(cfg.SCREENSIZE) pygame.display.set_caption('Gemgem

  • Unity3D实现甜品消消乐游戏

    目录 前言 项目效果展示 项目概况 素材展示 场景展示 场景元素 玩法介绍 版本说明 项目源码 前言 解释: 之前用的ScreenToGif录屏,因为上传的.gif最大不超过5MB,所以做了不少删帧和色彩弱化等处理,这才导致色彩看上去不是很舒服,不要盯着它看太久,不然会有点难受... 由于使用的素材是现成的,没有花时间精力去扒,所以细节方面可能不是做的很好. 说明: 这次的甜品消消乐虽然看上去好像挺简单普通的,但是相对于之前的坦克大战,某种程度上已然提升难度了,归类到了算法类层的游戏. 拉到最后

  • 基于Python编写一个宝石消消乐小游戏

    目录 开发工具 环境搭建 原理简介 开发工具 python版本:3.6.4 相关模块: pygame:以及一些python自带的模块. 环境搭建 安装python并添加到环境变量,pip安装需要的相关模块即可. 原理简介 游戏规则: 玩家通过鼠标交换相邻的拼图,若交换后水平/竖直方向存在连续三个相同的拼图,则这些拼图消失,玩家得分,同时生成新的拼图以补充消失的部分,否则,交换失败,玩家不得分.玩家需要在规定时间内获取尽可能高的得分. 实现过程: 首先加载一些必要的游戏素材: 加载背景音乐: py

  • C++实现消消乐游戏

    本文实例为大家分享了C++实现消消乐游戏的具体代码,供大家参考,具体内容如下 问题描述 给定一个矩阵, 判断移动哪一个格子,可以实现消除.(定义连续三个即可消除) 据说是华为的笔试题. 分析 先写一个函数,判断包含(i, j)的格子是否可能实现消除. 然后就是向右向下交换,然后调用上面写好的函数判断被交换的两个格子是否实现消除. 重点是: 1.只需要向右向下交换,因为遍历的时候,后面的交换会重复.前一个判断了向右交换是否消除,后一个遍历就不需要再判断向左交换是否重复了.2.一定要对被交换的两个格

  • 基于Python实现开心消消乐小游戏的示例代码

    目录 前言 一.准备 1.1 图片素材 1.2 音频素材 二.代码 2.1 导入模块 2.2 游戏音乐设置 2.3 制作树类 2.4 制作鼠标点击效果 2.5 制作出现元素 2.6 数组 2.7 制作人物画板 三.效果展示(仅部分) 3.1 初始页面 3.2 第一关画面 3.3 失败画面 3.4 第十关画面 穿过云朵升一级是要花6个金币的,有的时候金币真的很重要 前言 嗨喽,大家好呀!这里是魔王~ 一天晚上,天空中掉下一颗神奇的豌豆种子,正好落在了梦之森林的村长屋附近. 种子落地后吸收了池塘的水

随机推荐