c语言——制作钟表(与系统时间同步)

目录

前言

涉及到的知识

Sleep函数

 sin和cos函数

 Easyx中的函数

 SYSTEMTIME

 initgraph和closegraph函数

 setlinestyle和setcolor

line和circle函数

 制作代码


前言

声明:本游戏参考《c语言课程设计与游戏开发实践教程》。

视频效果如下:

钟表

  • 时针分针秒针分别是不同颜色、不同宽度、不同长度。
  • 时针分针秒针按照电脑系统上的时间转动。
  • 缺点就是画面显示有频闪问题,没有刻度。这些也可以当作思考题由你自己来解决哦😋

涉及到的知识

以下知识都会在文中有解析

  1. Easyx的使用,Sleep函数,SYSTEMTIME型变量的使用(系统时间变量),三角函数sin和cos。
  2. 利用三角函数计算针转动末尾的坐标和和角度。

Sleep函数

  • 属于windows.h函数库。根据不同系统和编译器,有时候也写做cwindow.h。头文件加上#include <windows.h>或者#include<cwindow.h>。
  • 作用:在此处让程序运行暂缓***毫秒。
  • 使用:Sleep();S是大写,括号内数字默认单位是毫秒。(根据不同系统和编译器,有时候也有可能是小写s)。

 sin和cos函数

这两个函数相信大家都不陌生吧,就是我们数学中所用三角函数

  • 属于<math.h>函数库。
  • 使用:sin(弧度制角度);

 Easyx中的函数

 SYSTEMTIME

这个可以看作是一个数据类型,用于引用系统时间。使用方法如下(下面展示的是代码段)

SYSTEMTIME ti;                      //定义一个变量ti

float s,m,h;                               //分别代表秒,分,时

GetLocalTime(&ti);

s=ti.wSecond;                         //ti.wSecond是固定写法。

m=ti.wMinute;

h=ti.wHour;

                                              //s,m,h这三个变量都会被赋予系统时间的值

 initgraph和closegraph函数

  • 这两个函数算是配合使用,前一个创建画面,后一个关闭画面。
  • 使用:initgraph(width, high);//括号内分别是画面宽度和高度。closegraph();//直接使用即可

 setlinestyle和setcolor

  • setlinestyle函数:用于设置画线风格(实线、虚线...)和画线宽度。既可以是圆也可以是直线。使用方法是setlinestyle(画线风格,画线宽度);
  • setcolor函数:用于设置画线颜色(RED、WHITE、BLACK、BLUE...也支持自定义RGB调色)。使用很简单,即:setcolor(颜色);

line和circle函数

很显然,一个是用来画直线,一个是用来画圆。下面直接来讲使用方法

  • line(起始x坐标,起始y坐标,终点x坐标,终点y坐标;
  • circle(圆心x坐标,圆心y坐标,半径);

 制作代码

思路是先制作一个会转的秒针,然后再按照同样的方法添加上分针和时针,最后再加上表盘。

废话不多说,直接上代码🐎

#include <graphics.h>    //easyx中的函数
#include <math.h>    //下面会使用sin和cos函数

//定义画面大小
#define high 480
#define width 640
#define PI 3.14159//圆周率

int main()
{
	initgraph(width, high);    //按上面宏定义的高和宽展现画面大小,这是easy中的函数,是以像素为单位
//定义表心位置
	int x, y;
	x = width / 2;
	y = high / 2;
//时、分、秒针的长度
	int s_long = width / 5;
	int m_long = width / 5;
	int h_long = width / 8;
//终点
/*
我们是通过在两个坐标点之间画一条直线来显示表针
划线起点是表心,现在定义划线终点
这个划线重点等会是要用三角函数计算的哦
*/
	int s_end_x, s_end_y;
	int m_end_x, m_end_y;
	int h_end_x, h_end_y;
//角度。我们下面计算会用到
	float s_angle;
	float m_angle;
	float h_angle;
//系统变量,用于查看电脑系统上的时间
	SYSTEMTIME ti;

//画表盘
	int ridus = width / 4;    //半径的意思
	int o_x, o_y;
	o_x = width / 2;
	o_y = high / 2;
	setlinestyle(PS_SOLID, 1);    //easyx函数,规定了画圆用实线,粗细为1像素
	circle(o_x, o_y, ridus);    //easyx函数,用于画圆,接收数据为表盘中心坐标,半径大小

//因为需要画面一直显示,所以除了定义初始化以外的操作都在死循环中
	while (1)
	{
		GetLocalTime(&ti);    //获取当前时间,后面用
//计算三个表针的角度
/*
ti引用的是实际时间,比如3点,15分,26秒
这个计算是把时间转换成弧度制,而且是假设表针初始状态指向最上方
举个例子,假设要转化30秒,经过计算s_angle=PI,即180°,也就是从最上方转到最下方的度数
*/
		s_angle = ti.wSecond * 2 * PI / 60;
		m_angle = ti.wMinute * 2 * PI / 60;
		h_angle = ti.wHour * 2 * PI / 12;

		//三个指针终点坐标的变化
		s_end_x = x + s_long * sin(s_angle);
		s_end_y = y - s_long * cos(s_angle);

		m_end_x = x + m_long * sin(m_angle);
		m_end_y = y - m_long * cos(m_angle);

		h_end_x = x + h_long * sin(h_angle);
		h_end_y = y - h_long * cos(h_angle);
/*之所以是-而不是+是因为要让秒针一开始显示在上方。
如果是加的话一开始会显示在下方。
*/

//显示三个表针,显示和隐藏表针操作用的都是easyx函数
		setlinestyle(PS_SOLID, 1);
		setcolor(WHITE);
		line(x, y, s_end_x, s_end_y);

		setlinestyle(PS_SOLID, 3);
		setcolor(BLUE);
		line(x, y, m_end_x, m_end_y);

		setlinestyle(PS_SOLID, 6);
		setcolor(RED);
		line(x, y, h_end_x, h_end_y);

		Sleep(10);

		//隐藏痕迹。原理是使用黑色的大小相同的表针将原来的位置覆盖
		setcolor(BLACK);
		line(x, y, s_end_x, s_end_y);
		setcolor(BLACK);
		line(x, y, m_end_x, m_end_y);
		setcolor(BLACK);
		line(x, y, h_end_x, h_end_y);
	}
	closegraph();
	return 0;
}

如果有不懂的地方可以随时问我

就酱,拜拜~

  • 15
    点赞
  • 61
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 9
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 9
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

若东

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值