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

純 C 語言控制台拼圖遊戲(3x3/4x4/5x5)完整實現與算法解析

     編輯:關於C語言

遊戲規則

  • 支持 3×3 (8數字)、4×4 (15數字)、5×5 (24數字) 三種難度
  • 數字 1~n-1 打亂,0 代表空格
  • WASD 移動空格相鄰數字(實際是移動空格)
  • 統計步數,'4' 鍵退出

核心算法:打亂與移動合法性

1. 生成可解的隨機排列


void InitMap(int *a, int m) { // m = 9/16/25
    a[0] = 0; // 空格固定在位置 0?實際應隨機
    for (int i=1; i

關鍵數學結論:N-Puzzle 可解條件為逆序對數 + 空格行號 奇偶性不變。隨機打亂有 50% 不可解。正確做法:從目標態出發隨機合法移動 N 步,保證可解。

2. 移動邏輯:二維映射一維


void Move(int *a, int m, int r) { // r=3/4/5
    char ch = _getch();
    int offset;
    if (ch=='w') offset = -r;      // 上:索引 - 列數
    else if (ch=='s') offset = r;  // 下:索引 + 列數
    else if (ch=='a') offset = -1; // 左:索引 -1
    else if (ch=='d') offset = 1;  // 右:索引 +1
    else return;

    // 關鍵:防止跨行移動(如第3列左移到第2列末尾)
    int zeroPos = FindZero(a, m);
    if (ch=='a' && zeroPos % r == 0) return; // 左邊界不能左移
    if (ch=='d' && zeroPos % r == r-1) return; // 右邊界不能右移
    if (ch=='w' && zeroPos < r) return; // 頂行不能上移
    if (ch=='s' && zeroPos >= m-r) return; // 底行不能下移

    // 交換
    a[zeroPos] = a[zeroPos + offset];
    a[zeroPos + offset] = 0;
    step++;
}

3. 繪製函數


void Draw(int *a, int m, int r) {
    system("cls");
    for (int i=0; i

完整主流程


int main() {
    srand(time(NULL));
    char ch;
    printf("Select: 1.3x3 2.4x4 3.5x5 4.Exit\n");
    ch = _getch();
    int m, r;
    if (ch=='1') { m=9; r=3; }
    else if (ch=='2') { m=16; r=4; }
    else if (ch=='3') { m=25; r=5; }
    else return 0;

    int a[25];
    InitMap(a, m);
    Draw(a, m, r);
    while (1) Move(a, m, r); // 內部含死循環讀取按鍵
}

代碼優化與擴展建議

  1. 可解性保證:實現 Fisher-Yates 洗牌 + 逆序對檢查,或從目標態隨機合法移動 1000 步。
  2. 自動求解:引入 A* 算法(曼哈頓距離啟發式)實現自動解謎演示。
  3. 界面優化:雙緩衝/光標定位消除閃爍,支持方向鍵、鼠標點擊。
  4. 計時/步數排行榜:文件存儲最佳成績。
  5. 圖片拼圖:將數字替換為圖片塊(需圖形庫支持)。

總結

拼圖遊戲是練習一維數組模擬二維邏輯、邊界條件處理、隨機算法、遊戲循環的優秀案例。核心難點在於跨行移動阻擋與可解性生成,掌握這兩點即可舉一反三實現更複雜的棋類/益智遊戲邏輯。

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