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.hqwc.cn/news/324483.html

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

相关文章

实验笔记之——基于COLMAP的Instant-NGP与3D Gaussian Splatting的对比

之前博客进行了COLMAP在服务器下的测试 实验笔记之——Linux实现COLMAP-CSDN博客文章浏览阅读794次&#xff0c;点赞24次&#xff0c;收藏6次。学习笔记之——NeRF SLAM&#xff08;基于神经辐射场的SLAM&#xff09;-CSDN博客NeRF 所做的任务是 Novel View Synthesis&#xf…

给新手的25个建议

前言 最近知乎上&#xff0c;有一位大佬邀请我回答下面这个问题&#xff0c;看到这个问题我百感交集&#xff0c;感触颇多。 在我是新人时&#xff0c;如果有前辈能够指导方向一下&#xff0c;分享一些踩坑经历&#xff0c;或许会让我少走很多弯路&#xff0c;节省更多的学习的…

各类Java对象

相关概念的混淆 在某一时间段&#xff0c;人们对某种编程困境感到烦恼&#xff0c;不少人脑中产生了一种新开发方式的概念 一些代表人物提出了他们的意见&#xff0c;而同一时期可能又不少人对同一问题&#xff0c;用自己的不同语言提出不同概念 如果又官方组织维护概念&#x…

vmware安装redhat 7.6 操作系统

vmware安装redhat 7.6 操作系统 1、下载redhat 7.6 操作系统镜像文件2、安装redhat 7.6操作系统3、配置redhat 7.6 操作系统3.1、配置静态IP地址 和 dns3.2、查看磁盘分区3.3、查看系统版本 1、下载redhat 7.6 操作系统镜像文件 链接: 盘盘 zwzg 文件名&#xff1a;rhel-serv…

主题-----读微信公众号

1.SOA 面向服务的架构&#xff08;Service-Oriented Architecture&#xff0c;SOA&#xff09;还没有一个公认的定义。许多组织从不同的角度和不同的侧面对 SOA 进行了描述&#xff0c;较为典型的有以下三个&#xff1a; &#xff08;1&#xff09;W3C 的定义&#xff1a;SOA 是…

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

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

数据结构:图详解

图的存储方式 邻接矩阵 首先先创建图&#xff0c;这一个我们可以使用邻接矩阵或者邻接链 表来进行存储&#xff0c;我们要实现的无向图的创建&#xff0c;我们先创建 一个矩阵尺寸为n*n&#xff0c;n为图中的节点个数如图所示 可以看出图中有5个结点&#xff0c;那我们创建…

【C#】网址不进行UrlEncode编码会存在一些问题

欢迎来到《小5讲堂》&#xff0c;大家好&#xff0c;我是全栈小5。 这是2024年第3篇文章&#xff0c;此篇文章是C#知识点实践序列文章&#xff0c;博主能力有限&#xff0c;理解水平有限&#xff0c;若有不对之处望指正&#xff01; 目录 前言数据丢失效果请求端代码接口端代码…

数据结构学习 jz34 二叉树中和为某一值的路径

关键词&#xff1a;回溯 二叉树 前序遍历 路径记录 因为我没有仔细接触过二叉树的遍历过程&#xff0c;所以我是懵懵懂懂按照dfs的方法写的。没想到写对了&#xff0c;看了解答发现这叫做二叉树的前序遍历。用时29min。 这让我明白了前序遍历和dfs原来是有相同之处的。&#…

记一次canal除坑记录

记一次canal除坑记录 错误信息 Caused by :com.alibaba.otter.canal.parse.exception.CanalParseException: column size is not match for table 问题处理 今天对Canal相关程序进行升级&#xff0c;原监听的表及业务都正常&#xff1b;遇到新增加的表时总是不走&#xff1b;…

Jenkins分布式实现: 构建弹性和可扩展的CI/CD环境!

Jenkins是一个流行的开源持续集成&#xff08;Continuous Integration&#xff0c;CI&#xff09;和持续交付&#xff08;Continuous Delivery&#xff0c;CD&#xff09;工具&#xff0c;它通过自动化构建、测试和部署过程&#xff0c;帮助开发团队更高效地交付软件。Jenkins的…

UG装配-沿线运动

如果希望图中圆柱销沿着槽运动&#xff0c;直接约束面是困难的&#xff0c;我们可以画出圆弧的中心线和圆柱销的中心点&#xff0c;约束点在线上&#xff0c;进行移动 需要注意的是&#xff0c;我们在零件中画点和线的时候&#xff0c;在装配体默认加载模型引用集的时候是无法显…