游戏设计

首先我们需要使用第三方框架,这里我使用的是sfml,不会使用sfml在我的上几篇文章当中-扫雷(上)有详细的开发环境搭建介绍

首先准备图片资源

一张背景图片,一张宝石图片

窗口初始化加载图片

Texture t1;

t1.loadFromFile(“images/bg2.png”);

当鼠标第一次单击时,记录下位置,第二次单击又记录一下位置,如果两个小方块相邻就交换位置,如果不相邻如图c的位置则,不发生变化

判断行或列如果三张一样的图片相邻,清除一下图片,进行刷新

实列

#include

#include

#include

using namespace sf;

#define GAME_ROWS_COUNT 8

#define GAME_COLS_COUNT 8

int ts = 57; // 每一个游戏小方块区域的大小

bool isMoving = false;

bool isSwap = false;

// 相邻位置的第几次单击,第2次单击才交换方块

int click = 0;

Vector2i pos; //鼠标单击时的位置

Vector2i offset(15, 273);

int posX1, posY1; //第一次单击的位置(记录行和列的序号)

int posX2, posY2; //第二次单击的位置(记录行和列的序号)

struct Block {

int x, y; //坐标值 x == col * ts y == row * ts;

int row, col; //第几行,第几列

int kind; //表示第几种小方块

bool match; //表示是否成三

int alpha; //透明度

Block() {

match = false;

alpha = 255;

kind = -1;

}

} grid[GAME_ROWS_COUNT + 2][GAME_ROWS_COUNT + 2];

void swap(Block p1, Block p2) {

std::swap(p1.col, p2.col);

std::swap(p1.row, p2.row);

grid[p1.row][p1.col] = p1;

grid[p2.row][p2.col] = p2;

}

void doEvent(RenderWindow* window) {

Event e;

while (window->pollEvent(e)) {

if (e.type == Event::Closed) {

window->close();

}

if (e.type == Event::MouseButtonPressed) {

if (e.key.code == Mouse::Left) {

if (!isSwap && !isMoving) click++;

pos = Mouse::getPosition(*window) - offset;

}

}

}

if (click == 1) {

posX1 = pos.x / ts + 1;

posY1 = pos.y / ts + 1;

}

else if (click == 2) {

posX2 = pos.x / ts + 1;

posY2 = pos.y / ts + 1;

// 是相邻方块就交换位置

if (abs(posX2 - posX1) + abs(posY2 - posY1) == 1) {

// 交换相邻的两个小方块

// 消消乐的方块,怎么表示?

swap(grid[posY1][posX1], grid[posY2][posX2]);

isSwap = 1;

click = 0;

}

else {

click = 1;

}

}

}

void check() {

for (int i = 1; i <= GAME_ROWS_COUNT; i++) {

for (int j = 1; j <= GAME_COLS_COUNT; j++) {

if (grid[i][j].kind == grid[i + 1][j].kind &&

grid[i][j].kind == grid[i - 1][j].kind) {

//grid[i - 1][j].match++;

//grid[i][j].match++;

//grid[i + 1][j].match++;

for (int k = -1; k <= 1; k++) grid[i + k][j].match++;

}

if (grid[i][j].kind == grid[i][j - 1].kind &&

grid[i][j].kind == grid[i][j + 1].kind) {

//grid[i][j - 1].match++;

//grid[i][j + 1].match++;

//grid[i][j].match++;

for (int k = -1; k <= 1; k++) grid[i][j + k].match++;

}

}

}

}

void doMoving() {

isMoving = false;

for (int i = 1; i <= GAME_ROWS_COUNT; i++) {

for (int j = 1; j <= GAME_COLS_COUNT; j++) {

Block& p = grid[i][j]; // 引用p, 就是grid[i][j]的别名

int dx, dy;

for (int k = 0; k < 4; k++) {

dx = p.x - p.col * ts;

dy = p.y - p.row * ts;

if (dx) p.x -= dx / abs(dx);

if (dy) p.y -= dy / abs(dy);

}

if (dx || dy) isMoving = true;

}

}

}

void xiaochu() {

for (int i = 1; i <= GAME_ROWS_COUNT; i++) {

for (int j = 1; j <= GAME_COLS_COUNT; j++) {

if (grid[i][j].match && grid[i][j].alpha > 10) {

grid[i][j].alpha -= 10;

isMoving = true;

}

}

}

}

void huanYuan() {

if (isSwap && !isMoving) {

// 如果此时没有产生匹配效果,就要还原

int score = 0;

for (int i = 1; i <= GAME_ROWS_COUNT; i++) {

for (int j = 1; j <= GAME_COLS_COUNT; j++) {

score += grid[i][j].match;

}

}

if (score == 0) {

swap(grid[posY1][posX1], grid[posY2][posX2]);

}

isSwap = false;

}

}

void updateGrid() {

for (int i = GAME_ROWS_COUNT; i > 0; i--) {

for (int j = 1; j <= GAME_COLS_COUNT; j++) {

if (grid[i][j].match) {

for (int k = i - 1; k > 0; k--) {

if (grid[k][j].match == 0) {

swap(grid[k][j], grid[i][j]);

break;

}

}

}

}

}

for (int j = 1; j <= GAME_COLS_COUNT; j++) {

int n = 0;

for (int i = GAME_ROWS_COUNT; i > 0; i--) {

if (grid[i][j].match) {

grid[i][j].kind = rand() % 7;

grid[i][j].y = -ts * n;

n++;

grid[i][j].match = false;

grid[i][j].alpha = 255;

}

}

}

}

void drawBlocks(Sprite* sprite, RenderWindow* window) {

for (int i = 1; i <= GAME_ROWS_COUNT; i++) {

for (int j = 1; j <= GAME_COLS_COUNT; j++) {

Block p = grid[i][j];

sprite->setTextureRect(

IntRect(p.kind * 52, 0, 52, 52));

// 设置透明度

sprite->setColor(Color(255, 255, 255, p.alpha));

sprite->setPosition(p.x, p.y);

// 因为数组gird中的Block, 每个Block的行标,列标是从1计算的,

// 并根据行标和列表来计算的x,y坐标

// 所以坐标的偏移,需要少便宜一些,也就是相当于在正方形区域的左上角的左上角方向偏移一个单位

// 在这个位置开发存放第0行第0列(实际不绘制第0行第0列)

sprite->move(offset.x - ts, offset.y - ts); // to do

window->draw(*sprite);

}

}

}

void initGrid() {

for (int i = 1; i <= GAME_ROWS_COUNT; i++) {

for (int j = 1; j <= GAME_COLS_COUNT; j++) {

grid[i][j].kind = rand() % 3;

grid[i][j].col = j;

grid[i][j].row = i;

grid[i][j].x = j * ts;

grid[i][j].y = i * ts;

}

}

}

int main(void) {

srand(time(0));

RenderWindow window(VideoMode(485, 917), "canxin-xiaoxiaole");

// 设置刷新的最大帧率

window.setFramerateLimit(60);

Texture t1, t2;

t1.loadFromFile("images/bg2.png");

if (!t2.loadFromFile("images/1.png")) {

return -1;

}

Sprite spriteBg(t1);

Sprite spriteBlock(t2);

initGrid();

while (window.isOpen()) {

// 处理用户的点击事件

doEvent(&window);

// 检查匹配情况

check();

// 移动处理

doMoving();

// 消除

if (!isMoving) {

xiaochu();

}

// 还原处理

huanYuan();

if (!isMoving) {

updateGrid();

}

// 渲染游戏画面

window.draw(spriteBg);

// 渲染所有的小方块

drawBlocks(&spriteBlock, &window);

// 显示

window.display();

}

return 0;

}

总结

到此这篇关于C/C++百行代码实现热门游戏消消乐功能的示例代码的文章就介绍到这了,更多相关C++ 消消乐内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

猜猜乐游戏php源码,C/C++百行代码实现热门游戏消消乐功能的示例代码相关推荐

  1. 星益小游戏平台源码 内置80多个在线小游戏

    简介: 星益小游戏平台源码是一款星益在线小游戏可的网站源码,本程序由小星合集整理制作,共计80个小游戏. 内置了80个在线小游戏,直接就能玩耍,上传到空间用! 本程序大部分都是自适应,但是使用电脑端体 ...

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

    游戏设计 首先我们需要使用第三方框架,这里我使用的是sfml,不会使用sfml在我的上几篇文章当中-扫雷(上)有详细的开发环境搭建介绍 首先准备图片资源 一张背景图片,一张宝石图片 窗口初始化加载图片 ...

  3. python跑酷游戏源码_Phaser.js实现简单的跑酷游戏附源码下载

    采用的物理引擎是Phaser.js 在这里对此引擎不做过多介绍(因为我也是小白,嘿嘿) 效果展示: 源码(详细源码图片资源可点击文章下方或屏幕右上方的github链接进行clone) 1.创建游戏舞台 ...

  4. java手机象棋软件下载,Java手机网络版象棋游戏附源码JAVA游戏源码下载

    运行于手机上的中国象棋游戏,鉴于JAVA J2ME技术,本游戏分服务端和客户端,导入JAR包即可在手机上运行,内有开发文档和运用说明. Java手机网络版象棋游戏附源码 (1 folders, 2 f ...

  5. python小游戏-16行代码实现3D撞球小游戏!-源码下载

    python小游戏-16行代码实现3D撞球小游戏!-源码下载 所属网站分类: 资源下载 > python小游戏 作者:搞笑 链接: http://www.pythonheidong.com/bl ...

  6. c语言贪吃蛇游戏编程视频教程,C语言贪吃蛇游戏精典源码 - 视频教程 - VC中文网-VC-MFC编程论坛 - Powered by Discuz!...

    19f700059b660539d5dc (38.08 KB, 下载次数: 0) 2017-11-14 16:28 上传 C语言贪吃蛇游戏精典源码 19f500058fe8fcaf675a (2.98 ...

  7. python 传奇服务端_传奇游戏服务器源码学习

    依据传奇游戏服务器源码总结了一下服务器开发中比较关心的一些问题. (1)线程之间的共享数据如何同步 CIntLock封装了临界区管理,包含了Lock()和Unlock()两个操作函数,所有 需要同步的 ...

  8. 微信网页小游戏网站源码带后台+可后台添加游戏+推荐到微信

    微信网页小游戏网站源码带后台,淘宝上卖的很火的源码,免费公开!

  9. 遥控汽车网页小游戏html源码

    这是一个网页小游戏源代码 你可以开着小汽车在整个地图中旅行 可撞墙.可鸣笛.自己发现吧 无聊时可以用它打消下无聊的时间 首页注释挺详细的,可自行修改 运行不成功注意文件引用的路径 路径 路径 快来下载 ...

最新文章

  1. 【linux命令】setterm控制终端属性命令(中英文)
  2. 毛永胜计算机教师,中国文化中心笛子教师与毛国立音乐学院师生交流
  3. ant导入Zookeeper到Eclipse错误path contains invalid character
  4. 什么电线适合在面包板上布线?
  5. 启明云端分享| 图文+实操+视频,手把手教你Eclipse搭建esp-idf环境
  6. Scikit-learn数据预处理分类变量编码之多标签二值化
  7. Ubuntu14.04无法在var/www内新建文档
  8. Git Gitlab 使用指南之TortoiseGit
  9. docker:安装mysql多个
  10. Gitl用户在组中有五种权限:Guest、Reporter、Developer、Master、Owner 解释
  11. 配置标准IP ACL实验
  12. 【有感】聆听哈佛幸福课 (上)
  13. java 用户留存率_Java后台实现日留存率,求解!
  14. 使用C++让鼠标指针抖动
  15. 【jquery-跨域】
  16. 深圳小汽车车牌竞拍价格预测
  17. 【腾讯QQ官方正式版下载】基于Internet的即时通信(IM)软件
  18. python斜杠用法_Python中正反斜杠(‘/’和‘\’)的意义与用法
  19. 电磁攻击方法与能量攻击方法的对比
  20. 【微信小程序】点击图标跳转页面

热门文章

  1. 2020-12-4((ARM汇编)mov指令,LDR指令,LDR伪指令)
  2. 【web安全】Spring boot heapdump获取敏感信息
  3. 【安全漏洞】ProxyShell利用分析2——CVE-2021-34523
  4. 别再问Cloudflare CDN 漏洞是怎么被利用的啦!这篇文就来告诉你
  5. Fuzz学习笔记(一)—— WinAFL环境搭建与基本使用
  6. 3、MySQL优化数据库结构的3种方法
  7. 1043 Is It a Binary Search Tree (25 分)【难度: 中 / 知识点: 构造二叉搜索树(BST) 】
  8. 深度优先搜索(DFS)相关习题
  9. python 使用全局变量_如何在Python中的不同模块中使用全局变量
  10. logitech g hub一直在初始化_Wi-Fi中“2.4G”和“5G”的那些事儿