游戏设计

首先我们需要使用第三方框架,这里我使用的是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. 猜猜乐游戏php源码,C/C++百行代码实现热门游戏消消乐功能的示例代码

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

  2. 用python朗读字母-使用python编写一个语音朗读闹钟功能的示例代码

    想找一个可以播放文字的闹钟找不到,自己写一个更简单.TTS实现由很多种办法,百度等都提供了API接口,但类似百度,需要先注册等一系列动作. 其实windows自带的win32com功能可以简单实现TT ...

  3. php中target用法,Yii使用DbTarget实现日志功能的示例代码

    一:在配置文件的log组件中配置DbTarget 'log' => [ 'traceLevel' => YII_DEBUG ? 3 : 0, 'targets' => [ [ 'cl ...

  4. python在线朗读-使用python编写一个语音朗读闹钟功能的示例代码

    想找一个可以播放文字的闹钟找不到,自己写一个更简单.TTS实现由很多种办法,百度等都提供了API接口,但类似百度,需要先注册等一系列动作. 其实windows自带的win32com功能可以简单实现TT ...

  5. android仿微信语音聊天功能,Android仿微信发送语音消息的功能及示例代码

    微信的发送语音是有一个向上取消的,我们使用ontouchlistener来监听手势,然后做出相应的操作就行了. 直接上代码: //语音操作对象 private mediaplayer mplayer ...

  6. python闹钟源码_使用python编写一个语音朗读闹钟功能的示例代码

    想找一个可以播放文字的闹钟找不到,自己写一个更简单.TTS实现由很多种办法,百度等都提供了API接口,但类似百度,需要先注册等一系列动作. 其实windows自带的win32com功能可以简单实现TT ...

  7. 售后退款的java代码_SpringBoot 微信退款功能的示例代码

    一:微信支付证书配置 二:证书读取以及读取后的使用 package com.zhx.guides.assistant.config.wechatpay; import org.apache.commo ...

  8. python 语音朗读软件下载_使用python编写一个语音朗读闹钟功能的示例代码

    想找一个可以播放文字的闹钟找不到,自己写一个更简单.TTS实现由很多种办法,百度等都提供了API接口,但类似百度,需要先注册等一系列动作. 其实windows自带的win32com功能可以简单实现TT ...

  9. linux qt 打印预览控件,Qt实现保存、浏览、预览、打印功能的示例代码

    Qt提供了以文本.图片.HTML等方式来实现对文档的操作,主要用到了QPrinter类和QPainter类,用到了QFileDialog文件窗口.QPrintPreviewDialog预览窗口类和QP ...

最新文章

  1. Spring Cloud Alibaba 基础教程:Nacos 生产级版本 0.8.0
  2. 智源研究院发布世界首个“机器学习通用数学符号集”
  3. Simulink仿真---SPWM算法
  4. GRE核心词汇助记与精练-List11弯、折、扭
  5. 马克思关于劳动的八大金句
  6. 深度学习:Neural Network Layers Understanding
  7. java网络编程实例_关于java网络编程的实例代码
  8. Redis:08---字符串对象
  9. Directory /opt/jfrog/artifactory/var has bad permissions for user id 1030
  10. 【TensorFlow】TensorFlow从浅入深系列之一 -- 教你如何设置学习率(指数衰减法)
  11. 这就是数据分析之数据变换
  12. linux同时连接内外网的设置
  13. 我的前半生之六,创业维艰,我不想骂你,你滚吧
  14. 论文笔记4 --(ReID)Re-ranking Person Re-identification with k-reciprocal Encoding
  15. Python excel数据处理之公式---openpyxl
  16. 建站用Windows还是Linux,建站该选择Windows系统还是Linux系统
  17. valgrind:内存泄漏 memory leak 调试教程
  18. docker 启动失败:specified both as a flag and in the configuration fir/daemon.json
  19. ELADMIN学习第一次
  20. python列表元组字典集合实验心得_python学习小总结(列表、元组、字典、集合、字符串)...

热门文章

  1. 企企通“码上顺”清洗工具 | 让数据更有价值,让业务更出色
  2. Spring源码之@Lazy和预实例化
  3. Applovin/App Store/Google Play/Unity/Ironsource/Steam如何收款?
  4. 改革春风出满地= =#
  5. Raptor-回文字符串判断
  6. NFS的创建和使用及其快捷脚本
  7. 爬虫之爬取豆瓣排行榜
  8. 红警维修—华为Nova7 SE泡水不开机,屏灯闪烁,5G手机开修了
  9. 火爆全网的《鱿鱼游戏》,今天用 Python 分析一波影评
  10. 产品经理|产品设计理念