104328896 發表於 2019-12-15 19:11:06

想問C#的老鼠走迷宮相關問題

本帖最後由 104328896 於 2019-12-17 18:38 編輯

在書上看到回溯法的老鼠走迷宮,自己也想做看看
因為看不懂,所以想先試著用自己的方法做

迷宮長這樣,7是牆,0是路
7777777
7077007
7000077
7077007
7777777
目標是從左上走到左下


我的程式:

using System;
using System.Collections;
using System.Collections.Generic;
using static System.Console;

namespace ConsoleApp2forTest
{
//玩家
public class Player
    {
      //所在地的xy
      public int px, py;
    }

    class Program
    {
      //牆壁=7,路=0,5*7
         public static int[,] maze = {
                        {7,7,7,7,7,7,7},
                        {7,0,7,7,0,0,7},
                        {7,0,0,0,0,7,7},
                        {7,0,7,7,0,0,7},
                        {7,7,7,7,7,7,7}
                  };

      static void Main(string[] args)
      {

            //印出初始迷宮
            for (int i = 0; i <5; i++)
            {
                for (int j = 0; j <7; j++)
                {
                  Write(maze);
                }
                Write("\n");
            }
            WriteLine();

            //起始點
            int x = 1, y = 1;
            //目的地
            int fx = 3, fy = 5;

            //用來記錄路徑
            Stack<int> isWalkedX_stack = new Stack<int>();
            Stack<int> isWalkedY_stack = new Stack<int>();
            //用來標記走過的路
            int[,] isWalked_map = maze;

            //玩家出場在起始點
            Player player01 = new Player();
            player01.px = x;
            player01.py = y;
            //起始點被走過了,設定為9
            isWalked_map = 9;
            //讓玩家以順時針、上右下左來找路
            while (player01.px!=fx&&player01.py!=fy)//當玩家還不到目的地時
            {
                //玩家走路            
                if (isWalked_map==0 )//如果上方有路
                {
                  //往上走
                  player01.px -= 1;
                  //標記為已經走過
                  isWalked_map =9;
                  //記住路徑
                  isWalkedX_stack.Push(player01.px);
                  isWalkedY_stack.Push(player01.py);

                  WriteLine(player01.px != fx && player01.py != fy);
                  WriteLine(""+player01.px+player01.py+"/"+fx+fy);
                }
               else if (isWalked_map == 0)//如果右方有路
                {
                  //往右走
                  player01.py += 1;
                  //標記為已經走過
                  isWalked_map =9;
                  //記住路徑
                  isWalkedX_stack.Push(player01.px);
                  isWalkedY_stack.Push(player01.py);

                  WriteLine(player01.px != fx && player01.py != fy);
                  WriteLine("" + player01.px + player01.py + "/" + fx + fy);

                }
                else if (isWalked_map == 0)//如果下方有路
                {
                  //往下走
                  player01.px += 1;
                  //標記為已經走過
                  isWalked_map =9;
                  //記住路徑
                  isWalkedX_stack.Push(player01.px);
                  isWalkedY_stack.Push(player01.py);

                  WriteLine(player01.px != fx && player01.py != fy);
                  WriteLine("" + player01.px + player01.py + "/" + fx + fy);

                }
                else if (isWalked_map == 0 )//如果左方有路
                {
                  //往左走
                  player01.py -= 1;
                  //標記為已經走過
                  isWalked_map =9;
                  //記住路徑
                  isWalkedX_stack.Push(player01.px);
                  isWalkedY_stack.Push(player01.py);

                  WriteLine(player01.px != fx && player01.py != fy);
                  WriteLine("" + player01.px + player01.py + "/" + fx + fy);

                }
                //沒路要往回走
                else if (isWalked_map !=0&& isWalked_map!=0&& isWalked_map!= 0&& isWalked_map!= 0)                else
                {
                  WriteLine("test");
                  //把路標記為7,代表不能走
                  isWalked_map = 7;
                  //以stack的資料往回走一格並清掉stack最上方資料
                  player01.px = isWalkedX_stack.Pop();
                  player01.py = isWalkedY_stack.Pop();
                }
                continue;

            }


            WriteLine(""+player01.px+player01.py);
            WriteLine(""+fx+fy);
            //印出走過的路
            for (int i = 0; i < 5; i++)
            {
                for (int j = 0; j < 7; j++)
                {
                  Write(isWalked_map);
                }
                Write("\n");
            }


            WriteLine();
            ReadLine();   
      }


    }
}


跑出的結果


為什麼放在while的條件會從true變成false,不是還沒到我設定的目的地嗎?
還有我放在 //沒路要往回走 的功能為什麼會會沒有執行到?我改成else也是一 樣結果
我的盲點在哪裡?

謝謝
-------------------------------------------------------------------------------------------
2019/12/17更新

我好像找到問題了
似乎是while理不方便直接放太多條件?
我把條件另外整理再放進去就可以了

謝謝


頁: [1]
查看完整版本: 想問C#的老鼠走迷宮相關問題