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.mfbz.cn/a/296140.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

LINUX服务器防火墙nf_conntrack问题一例

一、故障现象 业务反馈服务异常,无法响应请求&#xff0c;从系统日志 dmesg 或 /var/log/messages 看到大量以下记录&#xff1a;kernel: nf_conntrack: table full, dropping packet. 二、问题分析 业务高峰期服务器访问量大&#xff0c;内核 netfilter 模块 conntrack 相关参…

听GPT 讲Rust源代码--compiler(19)

File: rust/compiler/rustc_target/src/spec/mips_unknown_linux_gnu.rs 该文件&#xff08;rust/compiler/rustc_target/src/spec/mips_unknown_linux_gnu.rs&#xff09;是Rust编译器针对MIPS架构上的Linux系统的目标描述文件。它的作用是定义了在这个目标上编译时的一些配置…

mysql之数据类型、建表以及约束

目录 一. CRUD 1.1 什么是crud 1.2 select(查询) 1.3 INSERT(新增) 1.4 UPDATE(修改&#xff09; 1.5 DELETE(删除) 二. 函数 2.1 常见函数 2.2 流程控制函数 2.3聚合函数 三. union与union all 3.1 union 3.2 union all 3.3 具体不同 3.4 结论 四、思维导图 一. CRUD 1.1…

建站指南,如何将拥有的域名自定义链接到wordpress

关于Dynadot Dynadot是通过ICANN认证的域名注册商&#xff0c;自2002年成立以来&#xff0c;服务于全球108个国家和地区的客户&#xff0c;为数以万计的客户提供简洁&#xff0c;优惠&#xff0c;安全的域名注册以及管理服务。 在Dynadot上&#xff0c;我们可已经账户中管理的…

OpenHarmony之消息机制实现

OpenHarmony之消息机制实现 背景 在之前的介绍&#xff08;OpenHarmony之HDF驱动框架&#xff09;中&#xff0c;了解到OpenHarmony的消息机制主要有以下两种&#xff1a; 用户态应用发送消息到驱动。用户态应用接收驱动主动上报事件。 下面我们分别来看看两种机制用户态的…

使用 dbgate 在 sealos 上完美管理 mysql pgsql 等数据库

先登录 sealos 创建数据库&#xff0c;可以创建个 pgsql: 再到模版市场启动 dbgate: 配置数据库的连接信息&#xff0c;即可搞定收工 sealos 以kubernetes为内核的云操作系统发行版&#xff0c;让云原生简单普及 laf 写代码像写博客一样简单&#xff0c;什么docker kubernete…

Linux系统使用超详细(七)~定时任务:crontab

目录 一、定时任务简介 1.1cron工具概述 1.2crontab命令简述 二、crontab安装与检查 2.1安装步骤 2.2查看crontab的状态 2.3查看crontab服务 三、crontab命令 3.1常用命令 3.2定时任务的写法 3.3实例 四、添加定时任务 4.1使用crontab -e命令 4.2创建一个独立的定…

银河麒麟Kylin-Server-V10-SP3使用ISO镜像搭建本地内网YUM/DNF源cdrom/http

机房服务器安装一般是内网环境&#xff0c;需要配置本地的YUM/DNF源。本文介绍通过ISO镜像搭建内网环境的UM/DNF源 准备工作&#xff1a; 提前准备好Kylin-Server-V10-SP3的ISO镜像文件。 本机IP地址&#xff1a;192.168.40.201 镜像存放目录/data/iso/Kylin-Server-V10-SP3-Ge…

编写一个弹跳小球的程序,小球在窗口中四处反弹(python)

import pygame import random# 初始化Pygame pygame.init()# 窗口尺寸 width 800 height 600# 创建窗口 screen pygame.display.set_mode((width, height)) pygame.display.set_caption("Bouncing Ball")# 小球初始位置和速度 ball_radius 20 ball_color (255, …

前端页面的生命周期

性能问题呈现给用户的感受往往就是简单而直接的&#xff1a;加载资源缓慢、运行过程卡顿或响应交互延迟等。而在前端工程师的眼中&#xff0c;从域名解析、TCP建立连接到HTTP的请求与响应&#xff0c;以及从资源请求、文件解析到关键渲染路径等&#xff0c;每一个环节都有可能因…

iOS苹果和Android安卓测试APP应用程序的区别差异

在移动应用开发中&#xff0c;测试是一个至关重要的环节。无论是iOS苹果还是Android安卓&#xff0c;测试APP应用程序都需要注意一些差异和细节。本文将详细介绍iOS和Android的测试差异&#xff0c;包括操作系统版本、设备适配、测试工具和测试策略&#xff0c;并回答一些新手容…

web3d-three.js场景设计器-TransformControls模型控制器

场景设计器-TransformControls 控制器 该控制器可以指定模型进入可控制模式-如图有三种控制方式 translate --移动模式 rotate -- 旋转模式 scale -- 缩放模式 方便布局过程中快捷对模型进行摆放操作。 引入方式 import { TransformControls } from three/examples/jsm/…

深入Pandas(二):高级数据处理技巧

文章目录 系列文章目录引言时间序列分析可视化示例 高级数据分析技术分组与聚合操作时间序列分析 高级数据操作数据合并与重塑示例&#xff1a;数据合并merge示例&#xff1a;数据合并concat示例&#xff1a;数据重塑 - 透视表 高级索引技巧 结论 系列文章目录 Python数据分析…

C++《异常》

前言&#xff1a;C有一套独立的异常处理机制,今天就来做详细的介绍try,catch这两个词等 在C语言中处理错误的方式和缺陷有&#xff1a; 返回错误码。 缺陷&#xff1a; 1.错误码不好设置&#xff0c;比如&#xff1a;除0操作&#xff0c;就不好返回错误码。如果返回一个数字&…

uniapp微信小程序投票系统实战 (SpringBoot2+vue3.2+element plus ) -小程序微信用户登录实现

锋哥原创的uniapp微信小程序投票系统实战&#xff1a; uniapp微信小程序投票系统实战课程 (SpringBoot2vue3.2element plus ) ( 火爆连载更新中... )_哔哩哔哩_bilibiliuniapp微信小程序投票系统实战课程 (SpringBoot2vue3.2element plus ) ( 火爆连载更新中... )共计21条视频…

LabVIEW在高级结构监测中的创新应用

LabVIEW在高级结构监测中的创新应用 LabVIEW作为一个强大的系统设计平台&#xff0c;其在基于BOTDA&#xff08;光时域反射分析&#xff09;技术的结构监测中发挥着核心作用。利用LabVIEW的高效数据处理能力和友好的用户界面&#xff0c;开发了一个先进的监测系统。该系统专门…

如何从格式化的 Windows 和 Mac 电脑硬盘恢复文件

格式化硬盘可为您提供全新的体验。它可以是硬盘驱动器定期维护的一部分&#xff0c;是清除不再使用的文件的一种方法&#xff0c;在某些情况下&#xff0c;它是处理逻辑损坏的万福玛利亚。但是&#xff0c;许多用户发现自己格式化了错误的分区或驱动器&#xff0c;或者后来意识…

箭头函数 - JavaScript的新宠儿

&#x1f4e2; 鸿蒙专栏&#xff1a;想学鸿蒙的&#xff0c;冲 &#x1f4e2; C语言专栏&#xff1a;想学C语言的&#xff0c;冲 &#x1f4e2; VUE专栏&#xff1a;想学VUE的&#xff0c;冲这里 &#x1f4e2; CSS专栏&#xff1a;想学CSS的&#xff0c;冲这里 &#x1f4…

C语言编译器(C语言编程软件)完全攻略(第二十七部分:VS安全函数问题(C语言安全函数)是怎么回事?如何解决?)

介绍常用C语言编译器的安装、配置和使用。 二十七、VS安全函数问题&#xff08;C语言安全函数&#xff09;是怎么回事&#xff1f;如何解决&#xff1f; 在 VS&#xff08;Visual Studio&#xff09;下编译C语言程序&#xff0c;如果使用了 scanf()、gets()、strcpy()、strca…

听GPT 讲Rust源代码--compiler(17)

File: rust/compiler/rustc_passes/src/debugger_visualizer.rs 文件rust/compiler/rustc_passes/src/debugger_visualizer.rs是Rust编译器中的一个代码文件&#xff0c;它包含了与调试器可视化相关的功能。 调试器可视化是一个在调试过程中有助于理解和分析代码执行的工具。它…
最新文章