实战项目:俄罗斯方块(七)

news2024/9/20 16:56:02

文章目录

  • 🍊自我介绍
  • 🍊图形存储及输出设置
    • 类型设计
    • 图形输出代码设计
      • 要实现的结果展示
      • user_global.c(全局变量的C文件)
      • user_print.h
      • user_print.c
      • main.c


你的点赞评论就是对博主最大的鼓励
当然喜欢的小伙伴可以:点赞+关注+评论+收藏(一键四连)哦~


🍊自我介绍

  Hello,大家好,我是小珑也要变强(也是小珑),我是易编程·终身成长社群的一名“创始团队·嘉宾”“内容共创官” ,现在我来为大家介绍一下有关物联网-嵌入式方面的内容。


🍊图形存储及输出设置

类型设计

  前面的几个章节我们介绍过设计俄罗斯方块的类型设计的代码,在这里给大家简单提示一下,想要观看有关详细的代码程序,大家可以看一下前面写的几章内容。

int shape[7][4][18];
//7:代表7种图形
//4:代表每一种图形的四种变换
//18:前十六个数据代表的是数据点,第十七个代表距离右侧的距离,第十八个数据代表的是距离下侧的距离

图形输出代码设计

要实现的结果展示

在这里插入图片描述

user_global.c(全局变量的C文件)

#include "user_print.h"

//下一次出现图形的变量
int next_num = 0;
int next_mode = 0;
int next_color = 0;

//初始化图形坐标
int init_x = 24;
int init_y = 6;

//右侧图形的坐标位置
int next_x = 46;
int next_y = 8;

//实时动态变化的坐标位置(图形下移的时候的坐标变化,使用的变量)
int dynamic_x = 0;
int dynamic_y = 0;

//实时动态变化的具体形状,颜色,模式
int dynamic_num = 0;
int dynamic_mode = 0;
int dynamic_color = 0;


int shape[7][4][18] = 
{
	{
		{1,1,0,0, 1,1,0,0, 0,0,0,0, 0,0,0,0, 2,2},// [][]
		{1,1,0,0, 1,1,0,0, 0,0,0,0, 0,0,0,0, 2,2},// [][]
		{1,1,0,0, 1,1,0,0, 0,0,0,0, 0,0,0,0, 2,2},//
		{1,1,0,0, 1,1,0,0, 0,0,0,0, 0,0,0,0, 2,2},//
	},
	{
		{1,0,0,0, 1,0,0,0, 1,0,0,0, 1,0,0,0, 3,0},// []        [][][][]
		{1,1,1,1, 0,0,0,0, 0,0,0,0, 0,0,0,0, 0.3},// []
		{1,0,0,0, 1,0,0,0, 1,0,0,0, 1,0,0,0, 3,0},// []
		{1,1,1,1, 0,0,0,0, 0,0,0,0, 0,0,0,0, 0.3},// []
	},
	{
		{0,1,0,0, 1,1,1,0, 0,0,0,0, 0,0,0,0, 1,2},//   []  		[]		[][][]		  []
		{1,0,0,0, 1,1,0,0, 1,0,0,0, 0,0,0,0, 2,1},// [][][]		[][]	  []		[][]
		{1,1,1,0, 0,1,0,0, 0,0,0,0, 0,0,0,0, 1,2},// 			[]					  []
		{0,1,0,0, 1,1,0,0, 0,1,0,0, 0,0,0,0, 2,1},// 
	},
	{
		{1,1,0,0, 0,1,1,0, 0,0,0,0, 0,0,0,0, 1,2},// [][]		  []
		{0,1,0,0, 1,1,0,0, 1,0,0,0, 0,0,0,0, 2,1},//   [][]		[][]
		{1,1,0,0, 0,1,1,0, 0,0,0,0, 0,0,0,0, 1,2},// 			[]
		{0,1,0,0, 1,1,0,0, 1,0,0,0, 0,0,0,0, 2,1},// 
	},
	{
		{0,1,1,0, 1,1,0,0, 0,0,0,0, 0,0,0,0, 1,2},//   [][]		[]
		{1,0,0,0, 1,1,0,0, 0,1,0,0, 0,0,0,0, 2,1},// [][]		[][]
		{0,1,1,0, 1,1,0,0, 0,0,0,0, 0,0,0,0, 1,2},// 			  []
		{1,0,0,0, 1,1,0,0, 0,1,0,0, 0,0,0,0, 2,1},// 
	},
	{
		{0,0,1,0, 1,1,1,0, 0,0,0,0, 0,0,0,0, 1,2},//     []		[]		[][][]		[][]
		{1,0,0,0, 1,0,0,0, 1,1,0,0, 0,0,0,0, 2,1},// [][][]		[]		[]			  []
		{1,1,1,0, 1,0,0,0, 0,0,0,0, 0,0,0,0, 1,2},// 			[][]				  []
		{1,1,0,0, 0,1,0,0, 0,1,0,0, 0,0,0,0, 2,1},// 
	},
	{
		{1,0,0,0, 1,1,1,0, 0,0,0,0, 0,0,0,0, 1,2},// []			[][]	[][][] 		  []
		{1,1,0,0, 1,0,0,0, 1,0,0,0, 0,0,0,0, 2,1},// [][][]		[]		    []		  []
		{1,1,1,0, 0,0,1,0, 0,0,0,0, 0,0,0,0, 1,2},// 			[]					[][]
		{0,1,0,0, 0,1,0,0, 1,1,0,0, 0,0,0,0, 2,1},// 
	},
}

user_print.h

#ifndef _USER_PRINT_H_
#define _USER_PRINT_H_

extern int next_num;
extern int next_mode;
extern int next_color;


//初始化图形坐标
extern int init_x;
extern int init_y;

//右侧图形的坐标位置
extern int next_x;
extern int next_y;

//实时动态变化的坐标位置(图形下移的时候的坐标变化,使用的变量)
extern int dynamic_x;
extern int dynamic_y;

//实时动态变化的具体形状,颜色,模式
extern int dynamic_num;
extern int dynamic_mode;
extern int dynamic_color;

//三维数组存储俄罗斯方块
extern int shape[7][4][18];

extern void print_mode_shape(int n,int m,int x,int y,int c);
extern void print_next_shape();
extern void erase_last_shape(int n,int m,int x,int y);

#endif

user_print.c

#include <stdio.h>
#include <signal.h>
#include <sys/time.h>
#include <stdlib.h>
#include "user_print.h"

void print_mode_shape(int n,int m,int x,int y,int c)//指定位置输出图形
{
	int i = 0;
	int xx = x;
	int yy =y;

	for(i = 0;i < 16;i++)//横坐标的变化
	{
		shape[n][m][i];

		if(shape[n][m][i] == 1)
		{
			printf("\033[%d;%dH",yy,xx);//指定坐标输出
			printf("\033[%dm[]",c);//输出颜色
			printf("\033[0m");//关闭属性
		}
		xx += 2;  //这里之所以加2 是因为我们是用[]表示方格,一个 [ 代表一列
		
		if(i != 0 && i% 4 ==0) 
		{
			yy += 1;//我们用4 * 4 的空间来打印方格,当一行中四个方格打印完成之后,换行,横坐标重新变为初识横坐标
			xx = x;
		}
	}
}

void eraser_shape(int n,int m,int x,int y)//清除指定位置的图案
{
	int i = 0;
	int xx = x;
	int yy = y;

	for(i = 0;i < 16;i++)
	{
		if(i != 0 && i % 4 ==0)
		{
			yy++;
			xx = x;
		}
		if(shape[n][m][i] == 1)
		{
			printf("\033[%d;%dH  \033[0m",yy,xx);
		}
		//[]占两个坐标点的位置
		xx += 2;
	}
	fflush(NULL);
}

void print_next_shape()//右侧准备生成下一个位置的图形并输出
{	
	//擦除上一次图形
	erase_last_shape(next_num,next_mode,next_x,next_y);

	next_num = random() % 7;   //随机生成图形
	next_mode = random() % 4;  //随机生成图形状态
	next_color = random() % 7 + 40;//随机生成图形颜色

	//在指定位置输出图形
	printf_mode_shape(next_num,next_mode,next_x,next_y,next_color);

	fflush(NULL);//刷新缓存

}

main.c

#include <stdio.h>
#include <termios.h>
#include <signal.h>
#include <time.h>
#include <sys/time.h>
#include <stdlib.h>
#include "user_print.h"

int score_x = 45;
int score_y = 18;
int level_x = 45;
int level_y = 22;

int getch()//获得一个字符,不回显;切记是1个字符
{
	struct termios tm,tm_old;
	//1.获得用户输入的属性到 tm_old
	tcgetattr(0,&tm_old);
	//2.获取原始输入的属性
	cfmakeraw(&tm);
	//3.把输入的属性设置到终端上
	tcsetattr(0,0,&tm);
	//4.读取用户输入的一个字符
	int ch = getchar();
	//5.恢复正常输入
	tcsetattr(0,0,&tm_old);

	return ch;
}

void print_start_ui()
{
	printf("\33[2J");//清屏

	int i;

	for(i = 0;i < 47;i++)//输出黄色最顶行。最低行
	{
		printf("\033[%d;%dH\033[43m \033[0m",5,i+10);
		printf("\033[%d;%dH\033[43m \033[0m",30,i+10);
	}
	for(i = 0;i < 26;i++)
	{
		printf("\033[%d;%dH\033[43m  \033[0m",i+5,10);
		printf("\033[%d;%dH\033[43m  \033[0m",i+5,40);
		printf("\033[%d;%dH\033[43m  \033[0m",i+5,56);
	}
	for(i = 0;i < 17;i++)//输出用户下一图形分割行
	{
		printf("\033[%d;%dH\033[43m \033[0m",12,40+i);
	}
	printf("\033[%d;%dH分数:\033[0m",score_y,score_x);//输出分数

	printf("\033[%d;%dH分数:\033[0m",level_y,level_x);//输出等级
}

void init_game_ui()
{
	print_start_ui();//输出窗体界面

	getch();//等待用户输出,然后程序开始运行


	//获取随机数;设置随机数种子
	srand(timr(NULL));

	dynamic_num = random()%7;
	dynamic_mode = random()%4;
	dynamic_color = random()%7+40;

	dynamic_x = init_x;
	dynamic_y = init_y;

	//生成图形
	print_mode_shape(dynamic_num,dynamic_mode,dynamic_x,dynamic_y,dynamic_color);
	print_next_shape();
	printf("\033[?25l");
}
int main()
{
	init_game_ui();
	return 0;
}

  最后将上面的文件一起运行之后就可以实现要实现的内容!!!

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

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

相关文章

股指期货与股指期权为什么是熊市中的风险管理利器?

在如今波动剧烈的熊市环境中&#xff0c;期货市场的多空双边机制和T0的交易制度显得尤为灵活和必要。对于投资者而言&#xff0c;利用期货市场对冲股票现货风险成为了一种重要的策略。在期货市场中&#xff0c;股指期货、股指期权以及股票期权是三大得力工具&#xff0c;它们为…

Windows下安装ELK8(elasticsearch、logstash、kibana)及相关工具插件

目录 概述 ELK简介 安装elasticsearch 下载elasticsearch 解压 配置不用登录及关闭SSL 启动elasticsearch 访问elasticsearch 安装elasticsearch-head 提前准备node.js 下载elasticsearch-head 解压 浏览器打开index.html 安装kibana 下载kibana 解压 运行kib…

渠道招商经理岗位职责和任职要求?

渠道经理&#xff0c;作为企业与投资者之间的沟通桥梁&#xff0c;角色是非常重要。 作为一名手工酸奶品牌的创始人&#xff0c;我一直扮演渠道招商经理的角色&#xff0c;我来为大家分享职责和任职要求&#xff01; 一、渠道经理的职责&#xff01; 1、渠道开发 负责公司渠…

Vue3+TypeScript+Vite集成mars3d.layer.WeiVectorTileLayer加载本地shp文件

前景提要&#xff0c;在新建的vite项目中&#xff0c;想要实现mars3d的矢量瓦片方式加载geojson数据。加载本地shp文件。 代码说明&#xff1a; 1.在项目中集成mars3d后&#xff0c;构造map后开始在map上增加读取数据的操作&#xff1a; mars3d.Util.fetchJson({ url: "…

Git学习尚硅谷(003 git分支操作)

尚硅谷Git入门到精通全套教程&#xff08;涵盖GitHub\Gitee码云\GitLab&#xff09; 总时长 4:52:00 共45P 此文章包含第15p-第p18的内容 文章目录 git分支操作分支介绍分支的好处 分支的操作查看分支创建分支切换分支&修改分支合并分支正常合并分支冲突合并 git分支操作…

10,sql约束(2)

MySQL中primary key和unique的区别 在sql、oracle中的constrain有两种约束&#xff0c;都是对列的唯一性限制&#xff1a;unique与primary key&#xff0c;它们的区别如下&#xff1a; 1、unique key要求列唯一&#xff0c;但不包括Null字段&#xff0c;也就是约束的列可以为空…

docker制作达梦数据库驱动的Python镜像记录

docker制作达梦数据库驱动的Python镜像记录 使用Sqlalchemy ORM 操作达梦 提供构建好的docker镜像 docker pull chongjing001/python:3.12 使用虚拟环境(source /venv/bin/activate) 后pip其他库 镜像中安装Python参考上一篇 下载DM8安装包 版本选择 官网 Linux安装包只有 r…

完整指南:CNStream流处理多路并发框架适配到NVIDIA Jetson Orin (二) 源码架构流程梳理、代码编写

目录 1 视频解码代码编写----利用jetson-ffmpeg 1.1 nvstream中视频解码的代码流程框架 1.1.1 类的层次关系 1.1.2 各个类的初始化函数调用层次关系 1.1.3 各个类的process函数调用层次关系 1.2 编写视频解码代码 1.2.1 修改VideoInfo结构体定义 1.2.2 修改解封装代码 …

Kafka【五】Buffer Cache (缓冲区缓存)、Page Cache (页缓存)和零拷贝技术

【1】Buffer Cache (缓冲区缓存) 在Linux操作系统中&#xff0c;Buffer Cache&#xff08;缓冲区缓存&#xff09;是内核用来优化对块设备&#xff08;如磁盘&#xff09;读写操作的一种机制&#xff08;故而有一种说法叫做块缓存&#xff09;。尽管在较新的Linux内核版本中&a…

Spring Cloud全解析:熔断之Hystrix服务监控

Hystrix服务监控 Hystrix除了熔断降级之外&#xff0c;还提供了准实时的调用监控&#xff0c;持续的记录所有通过Hystrix发起的请求的执行信息&#xff0c;并以统计报表的形式展示出来&#xff0c;包括有每秒执行多少请求&#xff0c;多少成功&#xff0c;多少失败等&#xff…

【C++】vector类:模拟实现(适合新手手撕vector)

在实现本文的vector模拟前&#xff0c;建议先了解关于vector的必要知识&#xff1a;【C】容器vector常用接口详解-CSDN博客https://blog.csdn.net/2301_80555259/article/details/141529230?spm1001.2014.3001.5501 目录 一.基本结构 二.构造函数&#xff08;constructor&…

【算法】位运算

【ps】本篇有 10 道 leetcode OJ。 目录 一、算法简介 二、相关例题 1&#xff09;位1的个数 .1- 题目解析 .2- 代码编写 2&#xff09;比特位计数 .1- 题目解析 .2- 代码编写 3&#xff09;汉明距离 .1- 题目解析 .2- 代码编写 4&#xff09;只出现一次的数字 .…

3000字带你了解SD提示词用法,一点就通,小白轻松上手(附提示词生成器)(1.4 SD提示词运用)

提示词是什么 提示词是我们向AI模型发出的指令。正确的提示词能让AI准确反馈所需的输出&#xff0c;而优质的提示词则能使AI生成的内容更优质、更符合你的期望。这与编写程序代码颇为相似&#xff0c;准确的代码逻辑是程序正常运行的前提&#xff0c;而优秀的代码则能减少运行…

知识付费小程序源码轻松实现一站式运营,开启知识变现之旅

技术栈&#xff1a; 以下是一个简单的知识付费小程序的示例代码&#xff1a; app.js&#xff1a;小程序的入口文件 App({onLaunch: function () {// 在小程序启动时执行的代码},globalData: {// 存储全局数据userInfo: null // 用户信息} })pages/index/index.js&#xff1…

【学术会议征稿】第四届智能电网与能源互联网国际会议(SGEI 2024)

第四届智能电网与能源互联网国际会议&#xff08;SGEI 2024&#xff09; 2024 4th International Conference on Smart Grid and Energy Internet 为交流近年来国内外在智能电网和能源互联网领域的理论、技术和应用的最新进展&#xff0c;展示最新成果&#xff0c;由沈阳工业…

Visual Studio 2022 下载和安装

文章目录 概述一&#xff0c;下载步骤二&#xff0c;安装过程 概述 Visual Studio 提供 AI 增强功能&#xff0c;例如用于上下文感知代码补全的 IntelliSense 和可利用开源代码中的 AI 模式的 IntelliCode。 集成的 GitHub Copilot 提供 AI 支持的代码补全、聊天辅助、调试建议…

ElasticSearch学习笔记(三)RestClient操作文档、DSL查询文档、搜索结果排序

文章目录 前言5 RestClient操作文档5.4 删除文档5.4 修改文档5.5 批量导入文档 6 DSL查询文档6.1 准备工作6.2 全文检索查询6.3 精准查询6.4 地理坐标查询6.5 复合查询6.5.1 相关性算分6.5.2 布尔查询 7 搜索结果处理7.1 排序7.1.1 普通字段排序7.1.2 地理坐标排序 前言 Elast…

qmt量化交易策略小白学习笔记第59期【qmt编程之期权数据--获取指定期权品种的详细信息--原生Python】

qmt编程之获取期权数据 qmt更加详细的教程方法&#xff0c;会持续慢慢梳理。 也可找寻博主的历史文章&#xff0c;搜索关键词查看解决方案 &#xff01; 基于BS模型计算欧式期权理论价格 基于Black-Scholes-Merton模型&#xff0c;输入期权标的价格、期权行权价、无风险利率…

Mac 安装Hadoop教程(HomeBrew安装)

1. 引言 本教程旨在介绍在Mac 电脑上安装Hadoop&#xff0c;便于编程开发人员对大数据技术的熟悉和掌握。 2.前提条件 2.1 安装JDK 想要在你的Mac电脑上安装Hadoop&#xff0c;你必须首先安装JDK。具体安装步骤这里就不详细描述了。你可参考Mac 安装JDK8。 2.2 配置ssh环境…

从腰子的营养成分来分析腰子能否“壮阳”,健康地吃腰子。

文章目录 引言I 腰子的营养优点缺点吃腰子无“壮阳”效果II 健康地吃腰子食用前充分清洗浸泡高尿酸及痛风群体慎吃适量吃引言 很多人认为动物内脏有着“以形补形”的好处,如吃动物腰子,能补肾、壮阳,这让很多人对“腰子”非常热爱。 腰子的营养到底如何?经常吃腰子对身体…