当前位置:首页 > C++知识 > 正文内容

C++小项目——实时钟表

亿万年的星光3年前 (2021-10-23)C++知识19399

0.前言

在很多游戏中,我们要使用时间,这个时间一个是系统当前的时间,一个是服务器给你的时间。这篇文章我们尝试做一个模拟时钟。

效果图如下


1.任务分解

1.首先我们尝试使用easyx来画一个。基本框架如下:

#include<graphics.h>
#include<conio.h>

#define High 480  //画布高
#define Width 640  //画布宽度

int main(){

	initgraph(Width,High);  //初始化

	getch();

	closegraph();  //结束

	return 0;
}


然后,我们先开始画时钟的线。

线是line。知道中心点和长度就可以了。

下面是画秒针的代码:

#include<graphics.h>
#include<conio.h>

#define High 480  //画布高
#define Width 640  //画布宽度

int main(){

	initgraph(Width,High);  //初始化
	int center_x,center_y; //定义时钟的中心
	center_x=Width/2;
	center_y=High/2;
	
	int secondLength; //定义秒针的长度
	secondLength=Width/5;

	int secondEnd_x,secondEnd_y; //定义秒针终点的坐标
	secondEnd_x =center_x + secondLength;  //终点坐标=中心点坐标+长度
	secondEnd_y =center_y + secondLength;
	
	//画秒针
	setlinestyle(PS_SOLID,2);
	setcolor(WHITE);
	line(center_x,center_y,secondEnd_x,secondEnd_y);


	getch();

	closegraph();  //结束

	return 0;
}

效果图:



2.让秒针转动

定义secondAngle为秒针对应的角度,利用三角几何知识求出秒针的终点坐标。

secondEnd_x =center_x + secondLength*sin(secondAngle);  
secondEnd_y =center_y - secondLength*cos(secondAngle);

这样就可以实现转动动画效果

画角度秒针:

#include<graphics.h>
#include<conio.h>
#include<cmath>

#define High 480  //画布高
#define Width 640  //画布宽度

int main(){

	initgraph(Width,High);  //初始化
	int center_x,center_y; //定义时钟的中心
	center_x=Width/2;
	center_y=High/2;
	
	int secondLength; //定义秒针的长度
	secondLength=Width/5;

	int secondEnd_x,secondEnd_y; //定义秒针终点的坐标
	secondEnd_x =center_x + secondLength;  //终点坐标=中心点坐标+长度
	secondEnd_y =center_y + secondLength;
	
	float secodeAngle=0; //秒针对应转动角度

	secondEnd_x =center_x + secondLength*sin(secodeAngle);  //终点坐标=中心点坐标+长度
	secondEnd_y =center_y - secondLength*cos(secodeAngle);
	//画秒针
	setlinestyle(PS_SOLID,2);
	setcolor(WHITE);
	line(center_x,center_y,secondEnd_x,secondEnd_y);


	getch();

	closegraph();  //结束

	return 0;
}

使用循环实现动的效果

#include<graphics.h>
#include<conio.h>
#include<cmath>

#define High 480  //画布高
#define Width 640  //画布宽度
#define PI 3.1415926

int main(){

	initgraph(Width,High);  //初始化
	int center_x,center_y; //定义时钟的中心
	center_x=Width/2;
	center_y=High/2;
	
	int secondLength; //定义秒针的长度
	secondLength=Width/5;

	int secondEnd_x,secondEnd_y; //定义秒针终点的坐标
	secondEnd_x =center_x + secondLength;  //终点坐标=中心点坐标+长度
	secondEnd_y =center_y + secondLength;
	
	float secodeAngle=0; //秒针对应转动角度

	while(1){
			secondEnd_x =center_x + secondLength*sin(secodeAngle);  
			secondEnd_y =center_y - secondLength*cos(secodeAngle);
			//画秒针
			setlinestyle(PS_SOLID,2);
			setcolor(WHITE);
			line(center_x,center_y,secondEnd_x,secondEnd_y);

			Sleep(50);  //休息几秒换颜色重新画

			setcolor(BLACK);
			line(center_x,center_y,secondEnd_x,secondEnd_y);

			secodeAngle = secodeAngle + 2*PI/60;  //求出一格的角度
	}



	getch();

	closegraph();  //结束

	return 0;
}


效果图



我们可以用

SYSTEMTIME ti; //获取系统时间

来获取系统时间

代码:

#include<graphics.h>
#include<conio.h>
#include<cmath>

#define High 480  //画布高
#define Width 640  //画布宽度
#define PI 3.1415926

int main(){

	initgraph(Width,High);  //初始化
	int center_x,center_y; //定义时钟的中心
	center_x=Width/2;
	center_y=High/2;
	
	int secondLength; //定义秒针的长度
	secondLength=Width/5;

	int secondEnd_x,secondEnd_y; //定义秒针终点的坐标
	secondEnd_x =center_x + secondLength;  //终点坐标=中心点坐标+长度
	secondEnd_y =center_y + secondLength;
	
	float secodeAngle=0; //秒针对应转动角度
	
	SYSTEMTIME ti; //获取系统时间

	BeginBatchDraw();
	while(1){
			GetLocalTime(&ti); //获取当前时间
			secodeAngle = ti.wSecond * 2*PI/60;  //求出一格的角度

			secondEnd_x =center_x + secondLength*sin(secodeAngle);  
			secondEnd_y =center_y - secondLength*cos(secodeAngle);
			//画秒针
			setlinestyle(PS_SOLID,2);
			setcolor(WHITE);
			line(center_x,center_y,secondEnd_x,secondEnd_y);
			
			FlushBatchDraw();

			Sleep(50);  //休息几秒换颜色重新画

			setcolor(BLACK);
			line(center_x,center_y,secondEnd_x,secondEnd_y);

		
	}


	EndBatchDraw();
	getch();

	closegraph();  //结束

	return 0;
}

效果图:



最终代码,我们补全时针与分针。

#include <graphics.h>
#include <conio.h>
#include <math.h>

#define High 480  // 游戏画面尺寸
#define Width 640
#define	PI	3.14159

int main()
{
	initgraph(Width, High);		// 初始化 640 x 480 的绘图窗口	
	int center_x,center_y;      // 中心点的坐标,也是表的中心
	center_x = Width/2;
	center_y = High/2;
	int secondLength = Width/5;           // 秒针的长度
	int minuteLength = Width/6;           // 分针的长度
	int hourLength = Width/7;             // 时针的长度
	
	int secondEnd_x,secondEnd_y;    // 秒针的终点
	int minuteEnd_x,minuteEnd_y;    // 分针的终点
	int hourEnd_x,hourEnd_y;    // 时针的终点
	float secondAngle;       // 秒钟对应的角度
	float minuteAngle;       // 分钟对应的角度
	float hourAngle;         // 时钟对应的角度
	
	SYSTEMTIME ti;				// 定义变量保存当前时间
	
	BeginBatchDraw();
	while (1)
	{
		// 绘制一个简单的表盘
		setlinestyle(PS_SOLID, 1);
		setcolor(WHITE);
		circle(center_x, center_y, Width/4);
		
		// 画刻度
		int x, y,i;
		for (i=0; i<60; i++)
		{
			x = center_x + int(Width/4.3 * sin(PI * 2 * i / 60));
			y = center_y + int(Width/4.3 * cos(PI * 2 * i / 60));
			
			if (i % 15 == 0)
				bar(x - 5, y - 5, x + 5, y + 5);
			else if (i % 5 == 0)
				circle(x, y, 3);
			else
				putpixel(x, y, WHITE);
		}
		
		outtextxy(center_x - 25, center_y + Width/6, "我的时钟");
		
		GetLocalTime(&ti);		// 获取当前时间
		// 秒钟角度变化
		secondAngle = ti.wSecond * 2*PI/60;  // 一圈一共2*PI,一圈60秒,一秒钟秒钟走过的角度为2*PI/60
		// 分钟角度变化
		minuteAngle = ti.wMinute * 2*PI/60 + secondAngle/60;  // 一圈一共2*PI,一圈60分,一分钟分钟走过的角度为2*PI/60
		// 时钟角度变化
		hourAngle = ti.wHour * 2*PI/12 + minuteAngle/12;  // 一圈一共2*PI,一圈12小时,一小时时钟走过的角度为2*PI/12		
		// 由角度决定的秒针端点坐标
		secondEnd_x = center_x + secondLength*sin(secondAngle);
		secondEnd_y = center_y - secondLength*cos(secondAngle);
		
		// 由角度决定的分针端点坐标
		minuteEnd_x = center_x + minuteLength*sin(minuteAngle);
		minuteEnd_y = center_y - minuteLength*cos(minuteAngle);
		
		// 由角度决定的时针端点坐标
		hourEnd_x = center_x + hourLength*sin(hourAngle);
		hourEnd_y = center_y - hourLength*cos(hourAngle);		
		
		setlinestyle(PS_SOLID, 2);  
		setcolor(YELLOW);
		line(center_x, center_y, secondEnd_x, secondEnd_y); // 画秒针
		
		setlinestyle(PS_SOLID, 5);  
		setcolor(BLUE);
		line(center_x, center_y, minuteEnd_x, minuteEnd_y); // 画分针
		
		setlinestyle(PS_SOLID, 10);  
		setcolor(RED);
		line(center_x, center_y, hourEnd_x, hourEnd_y); // 画时针
		
		FlushBatchDraw();		
		Sleep(10);
		
		setcolor(BLACK);
		setlinestyle(PS_SOLID, 2); 
		line(center_x, center_y, secondEnd_x, secondEnd_y);  // 隐藏前一帧的秒针
		setlinestyle(PS_SOLID, 5);  
		line(center_x, center_y, minuteEnd_x, minuteEnd_y); // 隐藏前一帧的分针
		setlinestyle(PS_SOLID, 10);  
		line(center_x, center_y, hourEnd_x, hourEnd_y); // 隐藏前一帧的时针
	}
	
	EndBatchDraw();
	getch();				// 按任意键继续	
	closegraph();			// 关闭绘图窗口
	return 0;
}


扫描二维码推送至手机访问。

版权声明:本文由青少年编程知识记录发布,如需转载请注明出处。

分享给朋友:

相关文章

【题解】小X玩游戏

【题目描述】小X喜欢玩游戏。  这天,小X觉得传统的游戏都玩腻了,自己随手在草稿纸上画了一行N个格子作为棋盘, 制定了如下规则:格子从左到右依次编号为1到N,玩家初始位于格子1,初...

【高级篇】C++中的sort函数详解

【高级篇】C++中的sort函数详解

0.简介sort函数用于C++中,对给定区间所有元素进行排序,默认为升序,也可进行降序排序。sort函数进行排序的时间复杂度为n*log2n,比冒泡之类的排序算法效率要高,sort函数包含在头文件为#...

【数论】快速乘

【数论】快速乘

上一篇文章简单说了龟速乘的问题,有人觉得龟速乘还是太慢了,有没有什么办法再快一点,实际是有的,就是我们今天介绍的 快速乘。快速乘的原理和龟速乘不同,快速乘并不是基于二进制和位运算,严格来说,快速乘是利...

拓扑排序

拓扑排序

一、定义对一个有向无环图(Directed Acyclic Graph简称DAG)G进行拓扑排序,是将G中所有顶点排成一个线性序列,使得图中任意一对顶点u和v,若边<u,v>∈E(G),则...

STL入门——容器2:set

一、简单介绍    set是STL中一个很有用的容器,用来存储同一种数据类型的数据结构(可以称之为K的模型),基本功能与数组相似。set与数组不同的是,在set...

【算法】前缀和与差分(3)二维数组前缀和

【算法】前缀和与差分(3)二维数组前缀和

0.前言前面的一篇文章,介绍了一维数组的前缀和,这篇文章中,介绍一下二维数组的前缀和1.定义二维数组的前缀和就是按照二维数组求和。公式如下:那二维前缀和中一个f[i][j]表示的意思就是以(1,1)为...