Visual Studio 控制台程序世界杯足球C语言版
- 程序之美
- 前言
- 主体
- 运行效果
- 核心代码
- 逻辑分析
- 结束语
程序之美
前言
一年一度的世界杯如期而至,相信很多球迷小伙伴们一定不会错过这个难得的好机会,大饱眼福,美美的看上几场。
说起国际足联世界杯(FIFA World Cup),简称“世界杯”,我相信很多小伙伴们都一定不陌生,下面是百度百科中对世界杯的相关介绍:世界杯是由全世界国家级别球队参与,象征足球界最高荣誉,并具有最大知名度和影响力的足球赛事。 世界杯全球电视转播观众超过35亿 [1] 。 世界杯每四年举办一次,任何 国际足联 会员国(地区)都可以派出代表队报名参加这项赛事。 巴西国家队 是夺得世界杯冠军最多的球队(5次),并且在3夺世界杯后永久地保留了前任世界杯冠军奖杯 雷米特杯 。 现代足球发源地为英格兰 [2] ,其代表队在1966年首夺世界杯。 而现在的 世界杯奖杯 是 大力神杯 ,由4夺世界杯冠军的德国在1974年首次捧杯并一直沿用。 2002年韩日世界杯,中国国家队首次晋级世界杯决赛圈 [3] 。 2022年卡塔尔世界杯于北京时间2022年11月21日至12月18日举行。
作为一名程序员,为了能够表达出对世界杯的钦慕和爱意,我们只能够拿起手中的键盘,绘制出生动的足球,为足球喝彩,为世界杯喝彩!
故此,整理出一个世界杯的C语言测试程序,希望能够帮助到各位初学C语言的小伙伴,避免走弯路,费时费力。
主体
本篇我们先看下基于Visual Studio 控制台程序世界杯足球C语言版。话不多说,先看下效果图。
运行效果
静态的足球:
旋转的球体:
C语言一共只有32个关键字,9种控制语句,程序书写自由,主要用小写字母表示。它把高级语言的基本结构和语句与低级语言的实用性结合起来。 C 语言可以象汇编语言一样对位、字节和地址进行操作, 而这三者是计算机最基本的工作单元,可以用来写系统软件。
C的数据类型有:整型、实型、字符型、数组类型、指针类型、结构体类型、共用体类型等。能用来实现各种复杂的数据类型的运算。并引入了指针概念,使程序效率更高。另外C语言具有强大的图形功能, 支持多种显示器和驱动器。且计算功能、逻辑判断功能强大。
核心代码
静态的足球:
#include<graphics.h>
#include<math.h>
#include<conio.h>
#define PI acos(-1.0)
int main()
{
initgraph(640, 480);
setbkcolor(BLUE);
setlinecolor(BLACK);
cleardevice();
setlinestyle(PS_SOLID, 4);
setfillcolor(WHITE);
fillcircle(320, 240, 150); // 绘制一个球形状
setlinestyle(PS_SOLID, 2);
POINT pts[5];
POINT Fpts[5];
POINT Zpts[5];
// 计算五边形的五个顶点坐标
double a = PI / 2;
for (int i = 0; i < 5; i++)
{
pts[i].x = int(320 + cos(a) * 60);
pts[i].y = int(240 - sin(a) * 60);
Zpts[i].x = int(320 + cos(a) * 100);
Zpts[i].y = int(240 - sin(a) * 100);
Fpts[i].x = int(320 + cos(a) * 110);
Fpts[i].y = int(240 - sin(a) * 110);
a += PI * 2 / 5;
}
setlinecolor(BLACK);
setfillcolor(RED);
solidpolygon(pts, 5);
for (int i = 0; i < 5; i++)
{
line(pts[i].x, pts[i].y, Zpts[i].x, Zpts[i].y);
}
POINT Spts[10];
POINT Wpts[20];
a = PI / 2 + PI / 20;
for (int i = 0; i < 20; i++)
{
Wpts[i].x = int(320 + cos(a) * 150);
Wpts[i].y = int(240 - sin(a) * 150);
a += PI * 1 / 10;
}
a = PI / 2 + PI / 10;
for (int i = 0; i < 10; i++)
{
Spts[i].x = int(320 + cos(a) * 128);
Spts[i].y = int(240 - sin(a) * 128);
a += PI * 1 / 5;
}
int P = 9;
for (int i = 0; i < 5; i++)
{
line(Zpts[i].x, Zpts[i].y, Spts[P].x, Spts[P].y);
P++;
if (P == 10)
{
P = 0;
}
line(Zpts[i].x, Zpts[i].y, Spts[P].x, Spts[P].y);
P++;
}
for (int i = 0; i < 9; i++)
{
line(Spts[i].x, Spts[i].y, Spts[i + 1].x, Spts[i + 1].y);
i++;
}
int PS = 0;
for (int i = 0; i < 20; i++)
{
if (i % 2 == 0)
{
if (PS % 2 == 0)
{
line(Wpts[i].x, Wpts[i].y, Spts[i / 2].x, Spts[i / 2].y);
}
else
{
line(Wpts[i + 1].x, Wpts[i + 1].y, Spts[i / 2].x, Spts[i / 2].y);
}
PS++;
}
}
polygon(Wpts, 20);
setlinestyle(PS_SOLID, 3);
circle(320, 240, 150);
setfillcolor(RED);
for (int i = 0; i < 5; i++)
{
floodfill(Fpts[i].x, Fpts[i].y, BLACK);
}
_getch();
return 0;
}
旋转的球体:
#include <math.h>
#include <windows.h>
#define PI 3.1415926
#define SX 8
#define SY 16
#define DX PI / SX
#define DY PI * 2 / SY
#define X(a, b) (cx + v[a][b].x * r), (cy + v[a][b].y * r)
typedef struct { double x, y; } Vec;
void calc(double i, double j, double rot, Vec* v) {
double x = sin(i) * cos(j), y = sin(i) * sin(j), z = cos(i),
s = sin(rot), c = cos(rot), c1 = 1 - c, u = 1 / sqrt(3), u2 = u * u;
v->x = x * (c + u2 * c1) + y * (u2 * c1 - u * s) + z * (u2 * c1 + u * s);
v->y = x * (u2 * c1 + u * s) + y * (c + u2 * c1) + z * (u2 * c1 - u * s);
}
int main() {
HWND hwnd = GetConsoleWindow();
HDC hdc1 = GetDC(hwnd);
double rot = 0;
while (1) {
RECT rect;
GetClientRect(hwnd, &rect);
int w = rect.right, h = rect.bottom, cx = w / 2, cy = h / 2, r = h * 0.375;
HDC hdc2 = CreateCompatibleDC(hdc1);
HBITMAP bmp = CreateCompatibleBitmap(hdc1, w, h);
SelectObject(hdc2, bmp);
SelectObject(hdc2, GetStockObject(WHITE_PEN));
Vec v[SX + 1][SY + 1];
for (int i = 0; i <= SX; ++i) for (int j = 0; j <= SY; ++j)
calc(i * DX, j * DY, rot, &v[i][j]);
for (int i = 0; i < SX; ++i) for (int j = 0; j < SY; ++j) {
MoveToEx(hdc2, X(i, j), NULL); LineTo(hdc2, X(i + 1, j));
MoveToEx(hdc2, X(i, j), NULL); LineTo(hdc2, X(i, j + 1));
}
BitBlt(hdc1, 0, 0, w, h, hdc2, 0, 0, SRCCOPY); DeleteObject(bmp); DeleteDC(hdc2);
rot += 0.01;
Sleep(5);
}
}
逻辑分析
代码中进行了相应的函数封装,包含主函数,函数体,头文件,库函数等,有助于小伙伴们学习和研究。另外小伙伴们可以在其基础上进行改进,满足自己的程序需求。
对于静态的足球,需关注响应的系统函数。
比如设置足球的颜色:
setfillcolor(RED);
设置背景色:
setbkcolor(BLUE);
设置足球纹理线条的粗细:
setlinestyle(PS_SOLID, 3);
对于旋转的球体,精华主要在函数calc中:
void calc(double i, double j, double rot, Vec* v) {
double x = sin(i) * cos(j), y = sin(i) * sin(j), z = cos(i),
s = sin(rot), c = cos(rot), c1 = 1 - c, u = 1 / sqrt(3), u2 = u * u;
v->x = x * (c + u2 * c1) + y * (u2 * c1 - u * s) + z * (u2 * c1 + u * s);
v->y = x * (u2 * c1 + u * s) + y * (c + u2 * c1) + z * (u2 * c1 - u * s);
}
通过calc的计算,得到相应的坐标变换,然后通过绘图函数BitBlt将图像绘制到DC中,完成显示。
结束语
好了,今天就说这么多了,希望小伙伴们能从这篇文章中学到东西,也真心希望能够帮助正在苦学Visual Studio 程序设计的小伙伴们,你们的成长是我最大的幸福。很感谢您能够在百忙之中浏览我的文章,有需要源码的小伙伴可以私信我。
源码地址:https://download.csdn.net/download/hnjzfwy/87296180