#include <stdio.h> #include <stdlib.h> #include <windows.h> #include <math.h> #include <time.h> #define PI 3.1415926536 #define HIGH 40 // 定义界面高度 #define WIDE 80 // 定义界面宽度 void drawCircle(int radius, int x, int y); int main() { // 初始化随机数种子 srand((unsigned)time(NULL)); // 输出提示信息 printf("按下空格键停止程序,任意键继续。\n"); // 初始化圆的半径、圆心坐标 int radius = rand()%10 + 10; int x = rand()%70 + 5; int y = rand()%30 + 5; // 不断绘制圆,直到用户按下空格键 while (1) { // 绘制圆 drawCircle(radius, x, y); // 等待一段时间 Sleep(500); // 生成新的圆的半径和坐标 int newRadius = rand()%10 + 10; int newX = rand()%70 + 5; int newY = rand()%30 + 5; // 判断新生成的圆是否与已有圆重叠或越界 int isOverlap = 0; if (newX-newRadius < 0 || newX+newRadius > WIDE || newY-newRadius < 0 || newY+newRadius > HIGH) { isOverlap = 1; } double distance = sqrt(pow((newX-x), 2) + pow((newY-y), 2)); if (distance <= radius+newRadius) { isOverlap = 1; } // 如果没有重叠或越界的情况,更新圆的半径和坐标 if (!isOverlap) { radius = newRadius; x = newX; y = newY; } // 如果用户按下了空格键,跳出循环 if (GetKeyState(VK_SPACE) & 0x8000) { printf("程序已结束。按任意键退出。\n"); break; } } // 暂停程序,等待用户输入任意键结束程序 system("pause"); return 0; } // 绘制圆函数 void drawCircle(int radius, int x, int y) { system("cls"); int i, j; for (i = 0; i <= HIGH; i++) { for (j = 0; j <= WIDE; j++) { double distance = sqrt(pow(i - y, 2) + pow(j - x, 2)); if (fabs(distance - radius) < 0.5) { // 判断是否在圆上 printf("*"); Sleep(5); // 适当延时,以免输出速度过快 } else { printf(" "); } } printf("\n"); } } 把结果的圆改成正圆
时间: 2023-12-10 15:42:18 浏览: 91
要让圆更加正圆,可以在绘制圆的函数中,判断当前点到圆心的距离是否小于半径,如果是,则输出 *,否则输出空格。这样可以避免在输出圆时,出现较明显的锯齿状。以下是修改后的代码:
```c
#include <stdio.h>
#include <stdlib.h>
#include <windows.h>
#include <math.h>
#include <time.h>
#define PI 3.1415926536
#define HIGH 40 // 定义界面高度
#define WIDE 80 // 定义界面宽度
void drawCircle(int radius, int x, int y);
int main()
{
// 初始化随机数种子
srand((unsigned)time(NULL));
// 输出提示信息
printf("按下空格键停止程序,任意键继续。\n");
// 初始化圆的半径、圆心坐标
int radius = rand()%10 + 10;
int x = rand()%70 + 5;
int y = rand()%30 + 5;
// 不断绘制圆,直到用户按下空格键
while (1) {
// 绘制圆
drawCircle(radius, x, y);
// 等待一段时间
Sleep(500);
// 生成新的圆的半径和坐标
int newRadius = rand()%10 + 10;
int newX = rand()%70 + 5;
int newY = rand()%30 + 5;
// 判断新生成的圆是否与已有圆重叠或越界
int isOverlap = 0;
if (newX-newRadius < 0 || newX+newRadius > WIDE || newY-newRadius < 0 || newY+newRadius > HIGH) {
isOverlap = 1;
}
double distance = sqrt(pow((newX-x), 2) + pow((newY-y), 2));
if (distance <= radius+newRadius) {
isOverlap = 1;
}
// 如果没有重叠或越界的情况,更新圆的半径和坐标
if (!isOverlap) {
radius = newRadius;
x = newX;
y = newY;
}
// 如果用户按下了空格键,跳出循环
if (GetKeyState(VK_SPACE) & 0x8000) {
printf("程序已结束。按任意键退出。\n");
break;
}
}
// 暂停程序,等待用户输入任意键结束程序
system("pause");
return 0;
}
// 绘制圆函数
void drawCircle(int radius, int x, int y)
{
system("cls");
int i, j;
for (i = 0; i <= HIGH; i++) {
for (j = 0; j <= WIDE; j++) {
double distance = sqrt(pow(i - y, 2) + pow(j - x, 2));
if (distance <= radius) { // 判断是否在圆上
printf("*");
Sleep(5); // 适当延时,以免输出速度过快
} else {
printf(" ");
}
}
printf("\n");
}
}
```
阅读全文