首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> 關於C語言

純 C 語言控制台迷宮遊戲:文件讀取、動態渲染與鍵盤控制

     編輯:關於C語言

遊戲架構

  • 地圖存儲:文本文件 E:\file.txt 存放 11×11 整數矩陣(0 通道、1 牆壁)。
  • 雙重渲染:maze() 函數每次調用重新讀取文件、打印數字矩陣與字符畫面(█ 牆、★ 玩家、空格 路)。
  • 輸入處理:getch() 無回顯讀取 W/A/S/D,Q 退出確認。
  • 移動邏輯:目標座標為 0 則更新玩家座標並重繪,否則保持原位提示撞牆。
  • 勝利條件:到達 (10,9) 打印 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);
}

優化建議

  1. 一次性讀取地圖:主函數讀入內存數組,maze() 僅接收數組指針渲染,避免重複 I/O。
  2. 跨平台兼容:conio.h/getch()/system("cls") 僅限 Windows;Linux 用 ncurses 或 ANSI 轉義序列。
  3. 坐標一致性:代碼中 x/y(數組下標)與 m/n(顯示座標)易混淆,建議統一。且數組下標從 0 起,邊界檢查需防越界。
  4. 文件路徑硬編碼:改為命令行參數或相對路徑。
  5. 勝利判定:修改地圖數組作為循環終止條件屬副作用代碼,建議用獨立標志變量。

教學價值

涵蓋文件 I/O、二維數組、控制台繪圖、鍵盤交互、遊戲循環、狀態機等 C 語言核心知識點,適合初學者完整型項目練手。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved