程序运行的样子,以下是原程序。

#include <SFML/Graphics.hpp>
#include <time.h>
using namespace std;

int total=0;   //总共消了多少棋子,数字显示在标题栏
int ts= 80;   //格子大小
sf::Vector2i offset(48,48);  //偏差48,24
class  piece                //棋子对象
{
public:
    int x,y;      //棋子画图坐标
    int col,row;  //棋子所在棋盘的行、列
    int kind;     //棋子类型
    int match,alpha;  //是否有>3的相同棋子,如有match=1,alpha为透明度,255是不透明
    piece(){match=0;alpha=255;}
}grid[10][10];

void swap(piece p1,piece 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;
}

int main()
{
    sf::RenderWindow app(sf::VideoMode(730, 730), "SFML window");
    app.setFramerateLimit(60);  //设置帧率

for(int i=1;i<=8;i++)  //积木初始化
    {
        for(int j=1;j<=8;j++)
        {
            grid[i][j].kind=rand()%7;
            grid[i][j].col=j;
            grid[i][j].row=i;
            grid[i][j].x=j*ts;
            grid[i][j].y=i*ts;
        }
    }

int x0,y0,x,y;
    int click=0;
    sf::Vector2i pos;
    bool isSwap=false,isMoving=false;  //是否交换,是否移动
    while (app.isOpen())
    {
        sf::Event event;
        while (app.pollEvent(event))
        {
            if (event.type == sf::Event::Closed)
                app.close();
            if(event.type==sf::Event::MouseButtonPressed)
            {
                if(event.key.code==sf::Mouse::Left)
                {
                    if(!isSwap && !isMoving ) click++;
                    pos=sf::Mouse::getPosition(app)-offset;
                }

}
        }

if(click==1)     // 鼠标左击1次,位置计算行、列
        {
            x0=pos.x/ts+1;
            y0=pos.y/ts+1;
        }
        if(click==2)      // 鼠标左击2次,位置计算行、列
        {
            x=pos.x/ts+1;
            y=pos.y/ts+1;
            if((abs(x-x0)+abs(y-y0))==1) //判断是否相邻
            {
                swap(grid[y0][x0],grid[y][x]); //grid[][]相邻积木对调,但未更新x,y画图坐标,所以才有下面判断dx,dy,来调整画图坐标值
                isSwap=1;
                click=0;
            }
            else
                click=1;
        }

for(int i=1;i<=8;i++)          //判断相邻积木是否相同,相同match=1
            for(int j=1;j<=8;j++)
            {
                 if (grid[i][j].kind==grid[i+1][j].kind)
                 if (grid[i][j].kind==grid[i-1][j].kind)
                     for(int n=-1;n<=1;n++) grid[i+n][j].match++;

if (grid[i][j].kind==grid[i][j+1].kind)
                 if (grid[i][j].kind==grid[i][j-1].kind)
                     for(int n=-1;n<=1;n++) grid[i][j+n].match++;
            }

isMoving=false;
        for(int i=1;i<=8;i++)
        {
            for(int j=1;j<=8;j++)
            {
                piece &p=grid[i][j];
                int dx,dy;
                for(int n=0;n<4;n++)        //n是速度,4就是每次走4个像素。
                {
                    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=1;      //说明处在移动中

}
        }

if(!isMoving)             //如果移动到位了,不移动了
       {
           for(int i=1;i<=8;i++)
           {
              for(int j=1;j<=8;j++)
              {
                  if(grid[i][j].match)       //待销积木颜色变浅
                  {
                      if(grid[i][j].alpha>10)
                      {
                          grid[i][j].alpha-=10;
                          isMoving=true;
                      }
                  }
              }
           }
       }
       int score=0;
       for (int i=1;i<=8;i++)
           for (int j=1;j<=8;j++)
               score+=grid[i][j].match;    //待销积木统计

if(isSwap && !isMoving)    //条件为已交换并且还没有移动,判断一下移动的积木是否三个相同,如不同交换回去。
        {
            if (!score)
               swap(grid[y0][x0],grid[y][x]);
            isSwap=0;

}

if(!isMoving)       //如果移动到位了,不移动了
        {

for (int i=8;i>0;i--)           //match=1的积木从下向上移动
               for (int j=1;j<=8;j++)
               {
                   if(grid[i][j].match)
                   {
                       for(int n=i;n>0;n--)
                       {
                           if(!grid[n][j].match)
                           {
                               swap(grid[n][j],grid[i][j]);
                               break;
                           }
                       }
                   }
               }

for(int j=1;j<=8;j++)         //match=1的积木,变更为新积木,坐标位置放到棋盘外。新积木实际行、列(row,col)未变,通过上面dx,dy移动到(row*54,col*54)处。
               for(int i=8,n=0;i>0;i--)
                  if (grid[i][j].match)
                  {
                      grid[i][j].kind = rand()%7;   //新图形
                      grid[i][j].y = -ts*n++;       //新y坐标
                      grid[i][j].match=0;
                      total++;                      //统计消灭积木数
                      grid[i][j].alpha = 255;
                  }

}
        app.clear();          //图形清空

for(int i=1;i<=8;i++)   //根据积木对象信息,重新绘制
        {
            for(int j=1;j<=8;j++)
            {
                piece p=grid[i][j];
                sf::Color color7;
                switch(p.kind)
                {
                case 0:
                    color7=sf::Color(255,0,0,p.alpha);
                    break;
                case 1:
                    color7=sf::Color(0,255,0,p.alpha);
                    break;
                case 2:
                    color7=sf::Color(0,0,255,p.alpha);
                    break;
                case 3:
                    color7=sf::Color(0,255,255,p.alpha);
                    break;
                case 4:
                    color7=sf::Color(255,0,255,p.alpha);
                    break;
                case 5:
                    color7=sf::Color(255,255,0,p.alpha);
                    break;
                case 6:
                    color7=sf::Color(0,199,140,p.alpha);
                    break;
                }

sf::CircleShape shape(35.f);    //画园
                shape.setFillColor(color7);
                shape.setPosition(p.x-ts+offset.x,p.y-ts+offset.y);
                app.setTitle(to_string(total));
                app.draw(shape);

}
        }
        app.display();
    }

return EXIT_SUCCESS;
}

用sfml(c++)写消消乐游戏(三消)相关推荐

  1. 用Python写个开心消消乐小游戏!自己写的游戏就是好玩!

    提到开心消消乐这款小游戏,相信大家都不陌生,其曾在 2015 年获得过玩家最喜爱的移动单机游戏奖,受欢迎程度可见一斑,本文我们使用 Python 来做个简单的消消乐小游戏. 实现 消消乐的构成主要包括 ...

  2. 用Python 写个 开心消消乐小游戏

    源码在python学习交流q群:733089476 获取 提到开心消消乐这款小游戏,相信大家都不陌生,它曾在 2015 年获得过玩家最喜爱的移动单机游戏奖,受欢迎程度可见一斑,本文我们使用 Pytho ...

  3. python开心消消乐辅助_用Python写个开心消消乐小游戏

    提到开心消消乐这款小游戏,相信大家都不陌生,其曾在 2015 年获得过玩家最喜爱的移动单机游戏奖,受欢迎程度可见一斑,本文我们使用 Python 来做个简单的消消乐小游戏. 实现 消消乐的构成主要包括 ...

  4. python 小游戏程序_用 Python 写个消消乐小游戏

    文 |野客 来源:Python 技术「ID: pythonall」 提到开心消消乐这款小游戏,相信大家都不陌生,其曾在 2015 年获得过玩家最喜爱的移动单机游戏奖,受欢迎程度可见一斑,本文我们使用 ...

  5. python实现消消乐游戏_用Python写个开心消消乐小游戏

    本文的文字及图片来源于网络,仅供学习.交流使用,不具有任何商业用途,如有问题请及时联系我们以作处理 提到开心消消乐这款小游戏,相信大家都不陌生,其曾在 2015 年获得过玩家最喜爱的移动单机游戏奖,受 ...

  6. python编写小游戏教程_用Python开发 写个消消乐小游戏

    提到开心消消乐这款小游戏,相信大家都不陌生,其曾在 2015 年获得过玩家最喜爱的移动单机游戏奖,受欢迎程度可见一斑,本文我们使用 Python 来做个简单的消消乐小游戏. 实现 消消乐的构成主要包括 ...

  7. python迷宫小游戏代码_用 Python 写个消消乐小游戏

    提到开心消消乐这款小游戏,相信大家都不陌生,其曾在 2015 年获得过玩家最喜爱的移动单机游戏奖,受欢迎程度可见一斑,本文我们使用 Python 来做个简单的消消乐小游戏. 很多人学习python,不 ...

  8. 用Python写个开心消消乐小游戏

    本文的文字及图片来源于网络,仅供学习.交流使用,不具有任何商业用途,如有问题请及时联系我们以作处理 提到开心消消乐这款小游戏,相信大家都不陌生,其曾在 2015 年获得过玩家最喜爱的移动单机游戏奖,受 ...

  9. python写个消消乐小游戏

    导语: 哈喽,哈喽~小编想问到底为什么消消乐游戏这么好玩?是精致的画面还是有趣的音效,让我们心 情不好的时候玩,等车玩,睡前也玩.而且每一关必须是三星... 小编今天就用python,码一个消消乐小游 ...

  10. c++消消乐游戏课程设计

    1. 系统概述 1.1系统简介 消除类游戏是益智游戏的一种,玩家游戏过程中主要是将一定量相同的游戏元素,如水果.宝石.动物头像.积木麻将牌等,使它们彼此相邻配对消除来获胜.通常是将三个同样的元素配对消 ...

最新文章

  1. argparse库 学习记录
  2. 其实Go 1.17 就支持泛型了,具体该怎么用呢?
  3. python向量化编程技巧_Python学习(六)向量化
  4. vue保存页面的值_vue前端页面跳转参数传递及存储
  5. SAP License:CKMLCP运行物料帐时单个物料冲突无法运行
  6. Jasmine基础API
  7. 添加同名工具后台验证后不跳转且保留用户输入的数值
  8. 漫画 | 为什么美国人发明了互联网?
  9. 手机号格式校验(大陆,香港)
  10. Microsoft365 与 visio2016 共存
  11. Windows下利用Python自动切换IP/DNS
  12. 【书影观后感 十三】甲申三百七十八年祭
  13. 禁止spotlight索引外置硬盘或者网络硬盘
  14. 快速将彩色照片变成黑白照片(仅适用于jpg格式)
  15. 虚拟机Ubuntu安装中文输入法
  16. 醋泡三宝可以吃出长寿
  17. “我们“App功能介绍
  18. 高德地图四:关键字搜索
  19. 如何快速优雅地导入第三方Android项目
  20. Wikioi 1261 龙王的礼物

热门文章

  1. SpringMVC学习笔记14-CORS policy
  2. 如何在github上提交PR(Pull Request)
  3. 由 TCP 报文格式谈 TCP — 源端口号、目的端口号、报文段序号(一)
  4. python123平台作业答案进制转换_各种进制转换详解-python
  5. TDSQL新增子set报错,DB资源异常告警解决实战
  6. 前端学习之仿小米官网HTML+CSS
  7. html5支持4k视频,视频:4K高分辨率 锐度表现有提升_尼康 D5_数码影音评测-中关村在线...
  8. 阿里平头哥数字IC验证笔试题
  9. JAVA编程卡的充值消费,RFID——充值消费系统
  10. 全国计算机二级java考试官网_全国计算机二级Java考试题库