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

news2024/10/2 8:39:58

项目分析

  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.coloradmin.cn/o/1362426.html

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

相关文章

【MySQL】MySQL如何查询和筛选存储的JSON数据?

MySQL如何查询和筛选存储的JSON数据&#xff1f; 一、背景介绍二、支持的JSON数据类型三、基础数据3.1 创建表3.2 插入 JSON 数据3.3 查询 JSON 数据 四、操作函数4.1 JSON_OBJECT4.2 JSON_ARRAY4.3 JSON_EXTRACT 一、背景介绍 JSON(JavaScript Object Notation)是一种轻量级的…

如何通过内网穿透实现无公网IP远程访问内网的Linux宝塔面板

文章目录 一、使用官网一键安装命令安装宝塔二、简单配置宝塔&#xff0c;内网穿透三、使用固定公网地址访问宝塔 正文开始前给大家推荐个网站&#xff0c;前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。…

dubbo的基础知识

dubbo是什么 Dubbo是一个分布式服务框架&#xff0c;是一种高性能的远程通讯框架。它提供了基于Java的RPC&#xff08;远程过程调用&#xff09;通信机制&#xff0c;使得应用之间可以方便地进行远程调用&#xff0c;实现分布式服务的调用和管理。Dubbo提供了服务注册、发现、负…

轻松获取CHATGPT API:免费、无验证、带实例

免费获取和使用ChatGPT API的方法 快速开始&#xff1a;视频教程 章节一&#xff1a;GPT-API-Free开源项目介绍 GPT-API-Free 是一个开源项目&#xff0c;它提供了一个中转API KEY&#xff0c;使用户能够调用多个GPT模型&#xff0c;包括gpt-3.5-turbo、embedding和gpt-4。这…

cesium键盘控制模型

效果&#xff1a; 由于对添加模型和更新位置api进行二次了封装&#xff0c;下面提供思路 1.添加模型 const person reactive({modelTimer: null,position: {lon: 104.07274,lat: 30.57899,alt: 1200,heading: 0,pitch: 0,roll: 0,}, }); window.swpcesium.addEntity.addMo…

8.1分发饼干(LC455-E)

算法&#xff1a; 局部最优&#xff1a;大尺寸的饼干既可以满足胃口大的孩子也可以满足胃口小的孩子&#xff0c;那么就应该优先满足胃口大的。局部最优就是大饼干喂给胃口大的&#xff0c;充分利用饼干尺寸喂饱一个。 全局最优&#xff1a;喂饱尽可能多的小孩。 为什么局部…

C++开发小技巧

C开发一些小技巧 积累一些能用得到的C开发小技巧。 错误码/状态码 错误码/状态码在项目很常见&#xff0c;用于提示错误类型、状态&#xff0c;通常还会附带一些相关描述。通常错误码是统一管理的&#xff0c;例如使用宏或者枚举定义。 平时我的做法 使用宏或者枚举定义错…

Redis缓存保卫战:拒绝缓存击穿的进攻【redis问题 三】

欢迎来到我的博客&#xff0c;代码的世界里&#xff0c;每一行都是一个故事 Redis缓存保卫战&#xff1a;拒绝缓存击穿的进攻 前言缓存击穿的定义和原理为何会发生缓存击穿缓存击穿的危害防范缓存击穿结语: 前言 你是否曾经遇到过系统在高并发情况下出现严重性能问题&#xff…

【ASP.NET Core 基础知识】--环境设置

一、简介 1.1 .NET Core SDK 概述 .NET Core SDK&#xff08;Software Development Kit&#xff09;是Microsoft推出的一个开源跨平台框架&#xff0c;用于开发和部署.NET应用程序。它是.NET Core平台的核心组件之一&#xff0c;为开发者提供了在多个操作系统上构建高性能、可…

ssm基于VUE的图书馆管理系统的设计与实现论文

摘 要 互联网发展至今&#xff0c;无论是其理论还是技术都已经成熟&#xff0c;而且它广泛参与在社会中的方方面面。它让信息都可以通过网络传播&#xff0c;搭配信息管理工具可以很好地为人们提供服务。针对信息管理混乱&#xff0c;出错率高&#xff0c;信息安全性差&#x…

imazing破解版百度云2.17.3(附激活许可证下载)

iMazing是一款强大的 iOS 设备管理软件&#xff0c;不管是 iPhone、iPad 或 iPod Touch 设备&#xff0c;只要将 iOS 设备连接到计算机&#xff0c;就可以处理不同类型的数据。 iPhone 和 iPad 备份 借助 iMazing 的独有 iOS 备份技术&#xff08;无线、隐私和自动&#xff09…

CarRacing DQN: 深度 Q 学习训练自驾车

OpenAI GYM CarRacing DQN: 深度 Q 学习训练自驾车 引言DQN 算法原理Q 值和 Bellman 方程DQN 结构 训练过程设计经验回放&#xff08;Experience Replay&#xff09;目标网络&#xff08;Target Network&#xff09;训练循环 训练结果和模型演变400 轮训练后500 轮训练后600 轮…

tomcat session cookie值设置逻辑

tomcat session cookie 值设置&#xff0c;tomcat jsessionid设置 ##调用request.getSession() Controller RequestMapping("/cookie") public class CookieController {RequestMapping("/tomcatRequest")ResponseBodypublic String tomcatRequest(HttpS…

buuctf-Misc 题目解答分解109-111

109.[CFI-CTF 2018]webLogon capture 流量包分析&#xff0c; wireshark 打开 就这几个数据包&#xff0c;追踪http 进行url 解码 URL网址解码器 - 在线网址解码 得到flag CFI{1ns3cur3_l0g0n} 110.[GKCTF 2021]excel 骚操作 下载 excel 文件 &#xff0c;打开 发现点击其他地…

编程语言的发展趋势和未来方向

1、编程语言的未来&#xff1f; 随着科技的飞速发展&#xff0c;编程语言在计算机领域中扮演着至关重要的角色。它们是软件开发的核心&#xff0c;为程序员提供了与机器沟通的桥梁。那么&#xff0c;在技术不断进步的未来&#xff0c;编程语言的走向又将如何呢&#xff1f; 方…

通信原理期末复习——计算大题(一)

个人名片&#xff1a; &#x1f981;作者简介&#xff1a;一名喜欢分享和记录学习的在校大学生 &#x1f42f;个人主页&#xff1a;妄北y &#x1f427;个人QQ&#xff1a;2061314755 &#x1f43b;个人邮箱&#xff1a;2061314755qq.com &#x1f989;个人WeChat&#xff1a;V…

金和OA C6 MailTemplates.aspx sql注入漏洞

产品介绍 金和网络是专业信息化服务商,为城市监管部门提供了互联网监管解决方案,为企事业单位提供组织协同OA系统开发平台,电子政务一体化平台,智慧电商平台等服务。 漏洞概述 金和 OA C6 MailTemplates.aspx接口处存在SQL注入漏洞&#xff0c;攻击者除了可以利用 SQL 注入漏…

计算机毕业设计选题分享-SSM律师事务所业务管理系统01664(赠送源码数据库)JAVA、PHP,node.js,C++、python,大屏数据可视化等

SSM律师事务所业务管理系统 摘 要 随着科学技术的飞速发展&#xff0c;社会的方方面面、各行各业都在努力与现代的先进技术接轨&#xff0c;通过科技手段来提高自身的优势&#xff0c;律师事务所业务管理系统当然也不能排除在外。律师事务所业务管理系统是以实际运用为开发背景…

牛客网BC12-字符圣诞树

字符圣诞树 解题思路&#xff1a; 确定行数&#xff0c;一共5行&#xff0c;循环5次确定每行答应的内容&#xff0c;分成两部分&#xff0c;空格和字符 打印空格的个数依次递减打印字符的个数依次递增 找出打印空格和字符的个数与行数之间的关系 int main() {char ch 0;scanf(…

【C++】内存对齐

本篇文章介绍C中的内存对齐&#xff0c;后续介绍C的union和C的variant的时候&#xff0c;需要用到这部分的知识。 占用内存 先回忆下C各个数据类型占用的内存大小&#xff1a; int&#xff1a;所占内存大小&#xff1a;4byte 32bit&#xff1b;char&#xff1a;所占内存大小…