zoukankan      html  css  js  c++  java
  • C++编写简单的俄罗斯方块游戏

    代码地址如下:
    http://www.demodashi.com/demo/14593.html

    C++编写简单的俄罗斯方块游戏

    使用C++编写一个简单的俄罗斯方块游戏。

    1 环境要求

    使用C++图形库SFML,官网下载地址为https://www.sfml-dev.org/download.php

    1. 解压安装

      假设安装路径为:C:Program FilesSFML

    2. VS配置

      • 新建项目以后,选中项目右击选中属性
      • 在左上方的平台选择:X64
      • 左边的配置属性选择:VC++ 目录,在右边方框可以看到,可执行目录、包含目录等等
      • 可执行目录中添加 C:Program FilesSFMLSFML-2.4.2in(添加的路径已本教程 SFML 的解压路径相应来写的,看官自己的路径对照着来就行了)
      • 包含目录添加:C:Program FilesSFMLSFML-2.4.2include
      • 库目录添加:C:Program FilesSFMLSFML-2.4.2lib
      • 选择连接器–输入–附加依赖项,添加:
        sfml-graphics-d.lib
        sfml-window-d.lib
        sfml-audio-d.lib
        sfml-network-d.lib

    2 项目目录结构

    就一个.cpp 文件,同目录下有两个文件夹:用来描绘背景的图片素材的images 和 音乐素材的 audio

    3. 游戏逻辑结构

    整个代码分为简单的5个模块:计时器检查转换消除新块生成

    • 计时器

      游戏运行核心、设置 delay 值后,计时器每到delay值,处理游戏的检查、消除和新块生成逻辑

      //// Timer 逻辑
      while(window.isOpen())   // SFML 窗口
      {
          timer += time;   // time是上次计时到本次的时间
          if(timer>delay){
              // check
              // transpose
              // new block
              timer = 0;
          }
      }
      
    • 检查

      检查主要检查两样东西:1是检查是否当前块落地,2是检查构成消除条件的行。

      1.检查是否落地

      砖块描述存储在 int field[20][10] 中,每次有砖块落地,都会将该砖块的对应的位置赋值,后续砖块在下落过程中遇到有值的场地,则停止下落。检查落地用 check 描述

      bool check()
      {
      	for (int i = 0; i<4; i++)
      		if (a[i].x<0 || a[i].x >= N || a[i].y >= M) return 0;
      		else if (field[a[i].y][a[i].x]) return 0;
      
      		return 1;
      };
      

      2.检查消除行

      当满足一行的field值都不为0的时候,构成消除行,消除逻辑由 checkline 描述

      int k = M - 1;
      for (int i = M - 1; i>0; i--)
      {
          int count = 0;
          for (int j = 0; j<N; j++)
          {
              if (field[i][j]) count++;
              field[k][j] = field[i][j];
          }
          if (count < N) { k--; }
          else {
              score += 1;
          }
      }
      
    • 新块生成

      新块生成无非是rand一个颜色和砖块样式。对于砖块样式,罗列在下:

      用位置描述所有类型的俄罗斯砖块。之后再转换为坐标即可。

    • 画图

      只要窗口打开着,就需要画图,画图用draw描述:

      /////////draw//////////
      window.clear(Color::White);
      window.draw(background);
      
      for (int i = 0; i<M; i++)
      	for (int j = 0; j<N; j++)
      	{
      		if (field[i][j] == 0) continue;
      		s.setTextureRect(IntRect(field[i][j] * 18, 0, 18, 18));
      		s.setPosition(j * 18, i * 18);
      		s.move(28, 31); //offset
      		window.draw(s);
      	}
      
      for (int i = 0; i<4; i++)
      {
      	s.setTextureRect(IntRect(colorNum * 18, 0, 18, 18));
      	s.setPosition(a[i].x * 18, a[i].y * 18);
      	s.move(28, 31); //offset
      	window.draw(s);
      }
      
      // next box
      nextBox.setTextureRect(IntRect(0, 0, 72, 108));
      nextBox.setPosition(240, 20);
      window.draw(nextBox);
      
      // draw next item
      for (int i = 0; i<4; i++)
      {
      	s.setTextureRect(IntRect(colorNum_next * 18, 0, 18, 18));
      	s.setPosition(240+18+a[i].x_next * 18, 20+18+a[i].y_next* 18);
      	//s.move(28, 31); //offset
      	window.draw(s);
      }
      
      window.draw(frame);
      window.display();
      

    4. 运行演示

    C++编写简单的俄罗斯方块游戏

    代码地址如下:
    http://www.demodashi.com/demo/14593.html

    注:本文著作权归作者,由demo大师代发,拒绝转载,转载需要作者授权

  • 相关阅读:
    NEFU84——五指山(Exgcd)
    Scoi2010——传送带(三分套三分=九分)
    POJ3352Road construction(边双联通分量)
    CEOI2005——关键网线(割边)
    ZJOI2004——嗅探器
    POJ1845s——Sumdiv()
    Web 服务器安全
    渗透测试神器Cobalt Strike的使用
    Windows中的用户和组以及用户密码处理
    漏洞及渗透练习平台 【大全】
  • 原文地址:https://www.cnblogs.com/demodashi/p/10474121.html
Copyright © 2011-2022 走看看