將控制台視為座標平面,原點 (0,0) 在左上角或中心。雙層循環遍歷行 (y) 和列 (x),判斷座標是否滿足圖形方程。
#include <stdio.h>
#include <stdlib.h>
int main() {
int a = 5; // 菱形「半徑」
for (int y = -a; y <= a; y++) {
for (int x = -a; x <= a; x++) {
if (abs(x) + abs(y) == a) // 滿足方程邊界
printf("*");
else
printf(" ");
}
printf("\n");
}
return 0;
}
優點:只要能寫出方程(圓 x²+y²=r²、三角形、心形等)就能打印,邏輯統一。
缺點:雙層循環效率較低,複雜圖形方程難推導。
使用 SetConsoleCursorPosition 將光標移動到任意 (x,y) 直接打印,無需逐行填充空格。
#include <windows.h>
#include <stdio.h>
void gotoxy(int x, int y) {
COORD pos = {x, y};
SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE), pos);
}
int main() {
// 打印菱形:只在邊界點輸出 *
for (int i = 0; i <= 5; i++) {
gotoxy(10 + i, 5 - i); printf("*");
gotoxy(10 - i, 5 + i); printf("*");
gotoxy(10 + i, 5 + i); printf("*");
gotoxy(10 - i, 5 - i); printf("*");
}
return 0;
}
優點:精確控制、支援動畫效果(如旋轉、移動)。
缺點:Windows 專用,跨平台需用 ANSI 轉義序列 (\033[y;xH) 或 ncurses。
在編輯器中手工畫好圖形,存為文本文件或字符串陣列,程序啟動時直接讀取/遍歷輸出。
const char *diamond[] = {
" * ",
" * * ",
" * * ",
" * * ",
"* *",
" * * ",
" * * ",
" * * ",
" * "
};
for (int i = 0; i < 9; i++) puts(diamond[i]);
優點:零算法、極簡代碼、任意複雜圖形皆可。
缺點:不靈活、無法動態參數化(如可變大小)。
| 場景 | 推薦思路 |
|---|---|
| 教學/算法練習/需參數化大小 | 座標系 + 方程判斷 |
| 控制台遊戲/動畫/光標遊戲 | API 光標定位 (SetConsoleCursorPosition / ANSI) |
| 固定 Logo/裝飾/一次性輸出 | 預存文本/字符串陣列 |
打印圖形三大核心思路:**座標系方程判斷(通用)、光標定位(動態)、預存文本(靜態)**。初學者先練「行、列、條件」分析法,畫草稿找規律,再轉為代碼;進階學習光標控制實現動畫;實際項目中固定圖形直接預存最省事。