C++学习day--25 俄罗斯方块游戏图像化开发

项目分析

  1. 项目演示、项目分析

  2. 启动页面

启动页面:

分析:

开发环境搭建

1)安装vc++2010, 或其他vs版本

2)安装easyX图形库

代码实现:

# include <stdio.h>

# include <graphics.h>

void welcome(void) {

initgraph(550, 660);

// 设置窗口标题

HWND hwnd = GetHWnd();

SetWindowText(hwnd, "俄罗斯方块         奇牛学院 Rock");

//Sleep(2000);

// 游戏标题

setfont(40, 0, "微软雅黑");

setcolor(WHITE);

outtextxy(205, 200, "俄罗斯方块!");

// 游戏副标题

setfont(22, 0, "楷体");

outtextxy(175, 300, "编程,从俄罗斯方块开始!");

Sleep(3000);

}

int main()

{

welcome();

closegraph();

return 0;

}


初始化游戏环境

效果:

分析:

实现:

int score = 0; // 总分

int rank = 0;  //等级

void initGameScene()

{

char str[16];

cleardevice();

setcolor(WHITE);

rectangle(29, 29, 334, 633);

rectangle(27, 27, 336, 635);

rectangle(370, 50, 515, 195);

setfont(24, 0, "楷体");

setcolor(LIGHTGRAY);

outtextxy(405, 215, "下一个:");

setcolor(RED);

outtextxy(405, 280, "分数:");

sprintf(str, "%d", score);

outtextxy(415, 310, str);

outtextxy(405, 375, "等级:");

sprintf(str, "%d", rank);

outtextxy(425, 405, str);

setfont(22, 0, "楷体");

setcolor(LIGHTBLUE);

outtextxy(390, 475, "操作说明:");

outtextxy(390, 500, "↑: 旋转");

outtextxy(390, 525, "↓: 下降");

outtextxy(390, 550, "←: 左移");

outtextxy(390, 575, "→: 右移");

outtextxy(390, 600, "空格: 暂停");

}

int main()

{

welcome();

initGameScene();

system("pause");

closegraph();

return 0;

}

  1. 新方块

效果:

分析:

  L型方块

每个方块有4种形态:

4个方向,所以使用4个二维数组来表示1种方块

{ 0,0,0,0,0,

0,0,1,0,0,

0,0,1,0,0,

0,0,1,1,0,

0,0,0,0,0 },

{ 0,0,0,0,0,

0,0,0,0,0,

0,1,1,1,0,

0,1,0,0,0,

0,0,0,0,0 },

{ 0,0,0,0,0,

0,1,1,0,0,

0,0,1,0,0,

0,0,1,0,0,

0,0,0,0,0 },

{ 0,0,0,0,0,

0,0,0,1,0,

0,1,1,1,0,

0,0,0,0,0,

0,0,0,0,0 }

实现:

#define  BLOCK_COUNT     5

#define  BLOCK_WIDTH 5

#define  BLOCK_HEIGHT       5

#define  UNIT_SIZE     20  //小砖块的宽度和高度

int color[BLOCK_COUNT] = {

GREEN,CYAN,MAGENTA,BROWN,YELLOW

};

int NextIndex = -1;

int block[BLOCK_COUNT * 4][BLOCK_HEIGHT][BLOCK_WIDTH] = {

// | 形方块

{ 0,0,0,0,0,

0,0,1,0,0,

0,0,1,0,0,

0,0,1,0,0,

0,0,0,0,0 },

{ 0,0,0,0,0,

0,0,0,0,0,

0,1,1,1,0,

0,0,0,0,0,

0,0,0,0,0 },

{ 0,0,0,0,0,

0,0,1,0,0,

0,0,1,0,0,

0,0,1,0,0,

0,0,0,0,0 },

{ 0,0,0,0,0,

0,0,0,0,0,

0,1,1,1,0,

0,0,0,0,0,

0,0,0,0,0 },

// L 形方块

{ 0,0,0,0,0,

0,0,1,0,0,

0,0,1,0,0,

0,0,1,1,0,

0,0,0,0,0 },

{ 0,0,0,0,0,

0,0,0,0,0,

0,1,1,1,0,

0,1,0,0,0,

0,0,0,0,0 },

{ 0,0,0,0,0,

0,1,1,0,0,

0,0,1,0,0,

0,0,1,0,0,

0,0,0,0,0 },

{ 0,0,0,0,0,

0,0,0,1,0,

0,1,1,1,0,

0,0,0,0,0,

0,0,0,0,0 },

// 田 形方块

{ 0,0,0,0,0,

0,1,1,0,0,

0,1,1,0,0,

0,0,0,0,0,

0,0,0,0,0 },

{ 0,0,0,0,0,

0,1,1,0,0,

0,1,1,0,0,

0,0,0,0,0,

0,0,0,0,0 },

{ 0,0,0,0,0,

0,1,1,0,0,

0,1,1,0,0,

0,0,0,0,0,

0,0,0,0,0 },

{ 0,0,0,0,0,

0,1,1,0,0,

0,1,1,0,0,

0,0,0,0,0,

0,0,0,0,0 },

// T 形方块

{ 0,0,0,0,0,

0,1,1,1,0,

0,0,1,0,0,

0,0,0,0,0,

0,0,0,0,0 },

{ 0,0,0,0,0,

0,0,0,1,0,

0,0,1,1,0,

0,0,0,1,0,

0,0,0,0,0 },

{ 0,0,0,0,0,

0,0,1,0,0,

0,1,1,1,0,

0,0,0,0,0,

0,0,0,0,0 },

{ 0,0,0,0,0,

0,1,0,0,0,

0,1,1,0,0,

0,1,0,0,0,

0,0,0,0,0 },

// Z 形方块

{ 0,0,0,0,0,

0,1,1,0,0,

0,0,1,1,0,

0,0,0,0,0,

0,0,0,0,0 },

{ 0,0,0,0,0,

0,0,1,0,0,

0,1,1,0,0,

0,1,0,0,0,

0,0,0,0,0 },

{ 0,0,0,0,0,

0,1,1,0,0,

0,0,1,1,0,

0,0,0,0,0,

0,0,0,0,0 },

{ 0,0,0,0,0,

0,0,1,0,0,

0,1,1,0,0,

0,1,0,0,0,

0,0,0,0,0 },

};

void clearBlock(int x, int y) {

setcolor(BLACK);

setfont(23, 0, "楷体");

for (int i = 0; i<BLOCK_HEIGHT; i++)

for (int j = 0; j<BLOCK_WIDTH; j++)

outtextxy(x + UNIT_SIZE*j, y + UNIT_SIZE*i, "■");

}

void drawBlock(int x, int y, int next) {

setfont(23, 0, "楷体");

setcolor(color[NextIndex]);

for (int i = 0; i<5; i++)

for (int j = 0; j<5; j++)

if (block[4 * NextIndex][i][j] == 1)

outtextxy(x + 20 * j, y + 20 * i, "■");

}

void nextblock()

{

int x = 391, y = 71;

//在右侧的提示区清除原来的方块

clearBlock(x, y);

// 在右侧的提示区绘制新方块

// 1. 产生新的方块

srand(time(NULL));

NextIndex = rand() % BLOCK_COUNT;

// 2. 绘制

drawBlock(x, y, NextIndex);

}

int main()

{

welcome();

initGameScene();

nextblock();

system("pause");

closegraph();

return 0;

}

  1. 降落方块

使用“访问数组”来确定是否有方块

int visit[30][15], Color[30][15]; // visit[i][j] == 1 表示该位置有方块

int main()

{

welcome();

initGameScene();

nextblock();

// 清空访问数组

Sleep(500);

memset(visit, 0, sizeof(visit));

system("pause");

closegraph();

return 0;

}

设计游戏循环

int BlockIndex = -1;  //当前方块的序号

void newblock() { //新方块下降

}

int main()

{

welcome();

initGameScene();

nextblock();

//  清空访问数组

Sleep(500);

memset(visit, 0, sizeof(visit));

// 最开始时, 第一个方块,就是下一个方块

BlockIndex = NextIndex;

while (1)

{

newblock();

}

system("pause");

closegraph();

return 0;

}

方块下降

详见视频。

  1. 消行检测

详见视频。

  1. 更新积分
  2. 进一步优化
  1. 游戏音效
  1. 消除行的音效
  2. 多行同时消除的附加音效
  3. 下降时的音效

  1. 网络对战功能

双人对战

多人对战

  1. 3D化

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/599560.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

鹿目标检测数据集VOC格式500张

鹿&#xff0c;一种优雅而神秘的哺乳动物&#xff0c;以其优美的外形和独特的生态习性而备受人们的喜爱。 鹿的体型通常中等&#xff0c;四肢细长&#xff0c;身体线条流畅。它们的头部较小&#xff0c;耳朵大而直立&#xff0c;眼睛明亮有神。鹿的毛色因品种而异&#xff0c;…

计算机Java项目|Springboot医院固定资产系统

项目编号&#xff1a;L-BS-ZXBS-06 一&#xff0c;环境介绍 语言环境&#xff1a;Java: jdk1.8 数据库&#xff1a;Mysql: mysql5.7 应用服务器&#xff1a;Tomcat: tomcat8.5.31 开发工具&#xff1a;IDEA或eclipse 二&#xff0c;项目简介 困扰医院管理的许多问题当…

Spring学习 Spring IOC

创建工程&#xff1a; 2.1.程序的耦合 耦合&#xff1a;耦合指的就是对象之间的依赖关系。对象之间的耦合越高&#xff0c;维护成本越高。 案例&#xff1a;没有引入IOC容器时系统的Web层、业务层、持久层存在耦合 /*** 持久层实现类*/ public class UserDaoImpl implements U…

SpringBoot内嵌的Tomcat启动过程以及请求

1.springboot内嵌的tomcat的pom坐标 启动后可以看到tomcat版本为9.0.46 2.springboot 内嵌tomcat启动流程 点击进入SpringApplication.run()方法里面 看这次tomcat启动相关的核心代码refreshContext(context);刷新上下文方法 public ConfigurableApplicationContext run(Stri…

微信小程序如何搜索iBeacon设备

1.首先在utils文件夹下创建bluetooth.js和ibeacon.js 2.在 bluetooth.js文件中写入 module.exports {initBluetooth: function () {// 初始化蓝牙模块wx.openBluetoothAdapter({success: function (res) {console.log(蓝牙模块初始化成功);},fail: function (res) {console.l…

如何使用loki查询日志中大于某一数字的值的日志

简介 loki是一款轻量级的日志收集中间件&#xff0c;比elk体系占用的内存更小&#xff0c;采用go语言开发&#xff0c;可以利用grafana来查询loki中存储的日志&#xff0c;loki存储日志只对提前预设的标签做索引&#xff0c;所以日志存储空间占用比elk小很多。 方法 loki只对…

深圳易图讯实景三维数字孪生系统 实景三维电子沙盘

深圳易图讯实景三维数字孪生系统是一款基于三维地理空间的数字孪生系统&#xff0c;首先&#xff0c;该系统集成了多维度地理空间数据&#xff0c;可以将各类数据与应用需求进行充分整合&#xff0c;实现数据跨界融合、场景全角度可视等功能。其次&#xff0c;该系统具备智能化…

在 Windows 中安装 SQLite 数据库

在 Windows 上安装 SQLite 步骤1 请访问 SQLite 下载页面&#xff0c;从 Windows 区下载预编译的二进制文件 ​ 步骤2 您需要下载 sqlite-dll-win-x64-3440200.zip 和 sqlite-tools-win-x64-3440200.zip 压缩文件 步骤3 创建文件夹 C:\Program Files\SQLite&#xff0c;并在…

PostGIS学习教程十七:线性参考

PostGIS学习教程十七&#xff1a;线性参考 线性参考是一种表示要素的方法&#xff0c;这些要素可以通过引用一个基本的线性要素来描述。使用线性参照建模的常见示例包括&#xff1a; 公路资产&#xff0c;这些资产使用公路网络沿线的英里来表示。 道路养护作业&#xff0c;指…

java大数据hadoop2.92安装伪分布式文件系统

Apache Hadoop 3.3.6 – Hadoop: Setting up a Single Node Cluster. 1、解压缩到某个路径 /usr/local/hadoop 2、修改配置文件 /usr/local/hadoop/etc/hadoop/hadoop-env.sh export JAVA_HOME/usr/local/javajdk 3、修改配置文件 /usr/local/hadoop/etc/hadoop/core-sit…

(八)矩阵按键

文章目录 本章学习类比独立按键矩阵按键原理图三行代码法简单概述代码书写键码推算如何使用短按键长按键不松手长按键松手长按键 状态机法简单概述代码书写键码推算如何使用短按键长按键不松手长按键松手长按键 部分代码展示现象演示 本章学习类比独立按键 矩阵按键原理图 三行…

Swagger Editor 教程:从入门到精通编写 API 文档

在 API 开发的领域中&#xff0c;Swagger 以其卓越的使用效率与便捷性&#xff0c;备受开发者欢迎。它是一个强大的接口设计工具&#xff0c;允许开发人员对 RESTful API 进行高效的设计、构建及测试工作。本文旨在深入探讨其中一个子工具——Swagger Editor的使用介绍及它的有…

《知识扫盲》ROS和ROS2对比

文章摘选自&#xff1a;ROS与ROS2对比 1.ROS问题举例 ROS的设计目标是简化机器人的开发&#xff0c;如何简化呢&#xff1f;ROS为此设计了一整套通信机制&#xff08;话题、服务、参数、动作&#xff09;。 通过这些通信机制&#xff0c;ROS实现了将机器人的各个组件给的连接…

如何用自助法或刀切法来估计偏差、方差?

自助法和刀切法&#xff08;也叫水手刀法&#xff09;为计算标准误差和置信区间的非参数方法。刀切法耗费较少计算机资源&#xff0c;但自助法有某些统计优势。 1. 刀切法 由Quenouille(1949)提出的刀切法是用来对估计的偏差和方差进行近似的一个简单方法。 符号说明&#x…

VMware--安装CentOS系统

在虚拟机安装CentOS系统 1 下载CentOS镜像 方式一&#xff1a;可以到官网下载&#xff0c;下载速度较慢。 https://vault.centos.org/7.6.1810/isos/x86_64/ &#xff08;最后的 / 不要漏掉&#xff09; 方式二&#xff1a;可以到国内的镜像网站下载。 阿里开源镜像站&…

线性代数_逆矩阵性质

逆矩阵是线性代数中一个非常重要的概念&#xff0c;它具有以下几个基本性质&#xff1a; 1. 可逆矩阵一定是方阵&#xff1a;一个矩阵若要可逆&#xff0c;必须是方阵&#xff0c;即它的行数和列数相等。 2. 逆矩阵的唯一性&#xff1a;如果矩阵\( A \)是可逆的&#xff0c;那么…

sun.misc.BASE64Encoder() 找不到jar包

import sun.misc.BASE64Decoder;新下载的项目&#xff0c;在配置好maven之后&#xff0c;也更新完了Maven文件&#xff0c;还是发现有部分jar没有导入&#xff0c;报红信息如上所示。 其实这个是 Sun 的专用 API &#xff0c; rt.jar 是jre 中自带的 jar 包&#xff0c;所以就可…

ubuntu18.04+realsenseD455制作TUM数据集

教程目录 一、本机环境二、安装RealSense SDK三、录制rosbag四、制作数据集四、安装ROS-RealSense五、测试数据集一、本机环境 Ubuntu系统ROS系统RealSense18.04melodicD455二、安装RealSense SDK 1、首先注册服务器的公钥 sudo apt-key adv --keyserver keyserver.ubuntu.co…

全网最全fiddler使用教程和fiddler如何抓包(fiddler手机抓包)-笔者亲测

一、前言 抓包工具有很多&#xff0c;比如常用的抓包工具Httpwatch&#xff0c;通用的强大的抓包工具Wireshark.为什么使用fiddler?原因如下&#xff1a; 1.Wireshark是通用的抓包工具&#xff0c;但是比较庞大&#xff0c;对于只需要抓取http请求的应用来说&#xff0c;似乎…

Linux操作系统基础(09):Linux的文件权限

1. 文件权限是什么 在Linux系统中&#xff0c;文件权限是指对文件或目录的访问权限控制&#xff0c;它由三个部分组成&#xff1a;所有者权限、组权限和其他用户权限。文件权限和用户权限之间有密切的关系&#xff0c;文件权限规定了用户对文件的操作权限&#xff0c;而用户权…