E:\file.txt 存放 11×11 整數矩陣(0 通道、1 牆壁)。maze() 函數每次調用重新讀取文件、打印數字矩陣與字符畫面(█ 牆、★ 玩家、空格 路)。getch() 無回顯讀取 W/A/S/D,Q 退出確認。YOU WIN 並將該格置 1 結束循環。#include <stdio.h> #include <stdlib.h> #include <conio.h> #define N 11 int main() { void maze(int, int); FILE *fp; int x=0, y=1, m=0, n=1, i, j; int migong[N][N]; char t; if ((fp = fopen("E:\\file.txt", "r")) == NULL) { printf("文件打開失敗!\n"); exit(-1); } while (!feof(fp)) { for (i=0; i<N; i++) for (j=0; j<N; j++) fscanf(fp, "%d ", &migong[i][j]); } maze(m, n); do { printf("請輸入:w:上,s:下,a:左,d:右,q:退出!\n"); t = getch(); system("cls"); switch (t) { case 'w' : if (migong[x-1][y]==0) { x--; m--; } maze(m,n); break; case 'a' : if (migong[x][y-1]==0) { y--; n--; } maze(m,n); break; case 's' : if (migong[x+1][y]==0) { x++; m++; } maze(m,n); break; case 'd' : if (migong[x][y+1]==0) { y++; n++; } maze(m,n); break; case 'q' : printf("確定退出?(y/n)"); if (getch() == 'y' ) exit(0); maze(m,n); break; default: maze(m,n); puts("按鍵錯誤!!"); } if (x==10 && y==9) { printf(" 【YOU WIN !!!】\n"); migong[10][9]=1; } } while (!migong[10][9]); return 0; } void maze(int m, int n) { FILE *fp; int migong[N][N], i, j; if ((fp = fopen("E:\\file.txt", "r")) == NULL) { printf("文件打開失敗!\n"); exit(-1); } while (!feof(fp)) { for (i=0; i<N; i++) { for (j=0; j<N; j++) fscanf(fp, "%d ", &migong[i][j]); } } for (i=0; i<N; i++) { for (j=0; j<N; j++) { if (migong[i][j]==1) printf("█"); else if (i==m && j==n) printf("★"); else printf(" "); } printf("\n"); } fclose(fp); }
maze() 僅接收數組指針渲染,避免重複 I/O。conio.h/getch()/system("cls") 僅限 Windows;Linux 用 ncurses 或 ANSI 轉義序列。x/y(數組下標)與 m/n(顯示座標)易混淆,建議統一。且數組下標從 0 起,邊界檢查需防越界。涵蓋文件 I/O、二維數組、控制台繪圖、鍵盤交互、遊戲循環、狀態機等 C 語言核心知識點,適合初學者完整型項目練手。