⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 maze3d.java

📁 Java编写的求解迷宫问题的小程序
💻 JAVA
📖 第 1 页 / 共 5 页
字号:
                            if (xNext > maxX)
                              ++adjacency;
                            else
                              if (yNext < 0)
                                ++adjacency;
                              else
                                if (yNext > maxY)
                                  ++adjacency;
                                else
                                  {
                                    if (computerPage[yNext][xNext] == '\001')
                                      ++adjacency;
                                  }
                        }
                    }
                }
              x-=2*hexDeltaX[stack[stackHead].index1][0];
              y-=2*hexDeltaY[stack[stackHead--].index1][0];
              ++numRoomsInSolution;
            }
          for (deltaIndex=0; deltaIndex < 6; ++deltaIndex)
            {
              xNext=x+hexDeltaX[deltaIndex][0];
              yNext=x+hexDeltaY[deltaIndex][0];
              if (computerPage[yNext][xNext] != '\002')
                {
                  if (computerPage[yNext][xNext] == '\000')
                    {
                      xNext+=hexDeltaX[deltaIndex][0];
                      yNext+=hexDeltaY[deltaIndex][0];
                      if (xNext < 0)
                        ++adjacency;
                      else
                        if (xNext > maxX)
                          ++adjacency;
                        else
                          if (yNext < 0)
                            ++adjacency;
                          else
                            if (yNext > maxY)
                              ++adjacency;
                            else
                              {
                                if (computerPage[yNext][xNext] == '\001')
                                  ++adjacency;
                              }
                    }
                }
            }
          return;
        }

    private void hexGenerateMaze(
      int      seed [])
        {
          int     columnNum;
          int     deltaIndex1;
          int     deltaIndex2;
          boolean passageFound;
          int     rN [];
          int     rNIndex1;
          int     rNIndex2;
          int     rowNum;
          boolean searchComplete;
          int     stackHead;
          int     temInt;
          int     x;
          int     xMod8;
          int     xNext;
          int     y;
          int     yMod4;
          int     yNext;

          yNext=0;
          xNext=0;
          rN=new int [8];
          rN[0]=seed[0]+1;
          rN[1]=seed[1]+1;
          rN[2]=seed[2]+1;
          rN[3]=seed[3]+1;
          rN[4]=seed[4]+1;
          rN[5]=seed[5]+1;
          rN[6]=seed[6]+1;
          rN[7]=seed[7]+1;
          yMod4=1;
          for (y=0; y <= maxY; ++y)
            {
              if (yMod4 == 1)
                {
                  xMod8=1;
                  for (x=0; x <= maxX; ++x)
                    {
                      if ((((xMod8 == 0) && (y != 0) && (y != maxY))
                      ||  (xMod8 == 3) || (xMod8 == 4) || (xMod8 == 5)))
                        computerPage[y][x]='\000';
                      else
                        computerPage[y][x]='\002';
                      if (++xMod8 >= 8)
                        xMod8=0;
                    }
                }
              else
                if ((yMod4 == 0) || (yMod4 == 2))
                  {
                    xMod8=1;
                    for (x=0; x <= maxX; ++x)
                      {
                        if ((xMod8 == 2) || (xMod8 == 6))
                          computerPage[y][x]='\000';
                        else
                          computerPage[y][x]='\002';
                        if (++xMod8 >= 8)
                          xMod8=0;
                      }
                  }
                else
                  {
                    xMod8=1;
                    for (x=0; x <= maxX; ++x)
                      {
                        if ((xMod8 == 0) || (xMod8 == 1) || (xMod8 == 4)
                        ||  (xMod8 == 7))
                          computerPage[y][x]='\000';
                        else
                          computerPage[y][x]='\002';
                        if (++xMod8 >= 8)
                          xMod8=0;
                      }
                  }
              if (++yMod4 >= 4)
                yMod4=0;
            }
          columnNum=rN[0];
          rNIndex1=0;
          rNIndex2=1;
          while (rNIndex2 < 8)
            {
              temInt=rN[rNIndex2];
              rN[rNIndex1]=temInt;
              columnNum+=temInt;
              if (columnNum >= 727)
                columnNum-=727;
              rNIndex1=rNIndex2++;
            }
          rN[7]=columnNum;
          columnNum%=numColumns;
          x=4*columnNum+3;
          rowNum=rN[0];
          rNIndex1=0;
          rNIndex2=1;
          while (rNIndex2 < 8)
            {
              temInt=rN[rNIndex2];
              rN[rNIndex1]=temInt;
              rowNum+=temInt;
              if (rowNum >= 727)
                rowNum-=727;
              rNIndex1=rNIndex2++;
            }
          rN[7]=rowNum;
          if (columnNum%2 == 0)
            {
              rowNum%=numRows;
              y=4*rowNum+2;
            }
          else
            {
              rowNum%=(numRows-1);
              y=4*rowNum+4;
            }
          computerPage[y][x]='\002';
          stackHead=-1;
          do
            {
              deltaIndex1=0;
              do
                {
                  deltaIndex2=rN[0];
                  rNIndex1=0;
                  rNIndex2=1;
                  while (rNIndex2 < 8)
                    {
                      temInt=rN[rNIndex2];
                      rN[rNIndex1]=temInt;
                      deltaIndex2+=temInt;
                      if (deltaIndex2 >= 727)
                        deltaIndex2-=727;
                      rNIndex1=rNIndex2++;
                    }
                  rN[7]=deltaIndex2;
                }
              while (deltaIndex2 >= 720);
              passageFound=false;
              searchComplete=false;
              while (! searchComplete)
                {
                  while ((deltaIndex1 < 6) && (! passageFound))
                    {
                      xNext=x+2*hexDeltaX[deltaIndex1][deltaIndex2];
                      if (xNext <= 0)
                        ++deltaIndex1;
                      else
                        if (xNext > maxX)
                          ++deltaIndex1;
                        else
                          {
                            yNext=y+2*hexDeltaY[deltaIndex1][deltaIndex2];
                            if (yNext <= 0)
                              ++deltaIndex1;
                            else
                              if (yNext > maxY)
                                ++deltaIndex1;
                              else
                                if (computerPage[yNext][xNext] == '\000')
                                  passageFound=true;
                                else
                                  ++deltaIndex1;
                          }
                    }
                  if (! passageFound)
                    {
                      if (stackHead >= 0)
                        {
                          deltaIndex1=stack[stackHead].index1;
                          deltaIndex2=stack[stackHead--].index2;
                          x-=2*hexDeltaX[deltaIndex1][deltaIndex2];
                          y-=2*hexDeltaY[deltaIndex1++][deltaIndex2];
                        }
                    }
                  searchComplete
                   =(passageFound || ((stackHead == -1) && (deltaIndex1 >= 6)));
                }
              if (passageFound)
                {
                  stack[++stackHead].index1=(short) deltaIndex1;
                  stack[stackHead].index2=(short) deltaIndex2;
                  computerPage[yNext][xNext]='\002';
                  computerPage[(y+yNext)/2][(x+xNext)/2]='\002';
                  x=xNext;
                  y=yNext;
                }
            }
          while (stackHead != -1);
          computerPage[0][3]='\001';
          computerPage[maxY][maxX-3]='\002';
          return;
        }

    private void hexSelectMaze()
        {
          Date   today;
          double elapsedTime;
          int    minAdjacency;
          int    numRoomsInSolutionAtMin;
          int    seedByte [];
          int    seedByteAtMin [];
          double startTime;

          adjacency=0;
          numRoomsInSolution=0;
          seedByte=new int [8];
          seedByteAtMin=new int [8];
          counter0=seed[0];
          counter1=seed[1];
          counter2=seed[2];
          counter3=seed[3];
          counter4=seed[4];
          counter5=seed[5];
          counter6=seed[6];
          counter7=seed[7];
          hash();
          minAdjacency=4*numRoomsInMaze+1;
          numRoomsInSolutionAtMin=0;
          seedByteAtMin[0]=counter0;
          seedByteAtMin[1]=counter1;
          seedByteAtMin[2]=counter2;
          seedByteAtMin[3]=counter3;
          seedByteAtMin[4]=counter4;
          seedByteAtMin[5]=counter5;
          seedByteAtMin[6]=counter6;
          seedByteAtMin[7]=counter7;
          today=new Date();
          startTime=((double) today.getTime())/1000.0;
          do
            {
              seedByte[0]=counter0;
              seedByte[1]=counter1;
              seedByte[2]=counter2;
              seedByte[3]=counter3;
              seedByte[4]=counter4;
              seedByte[5]=counter5;
              seedByte[6]=counter6;
              seedByte[7]=counter7;
              hexGenerateMaze(seedByte);
              hexSolveMaze();
              if (3*numRoomsInSolution >= numRoomsInMaze)
                {
                  if (adjacency < minAdjacency)
                    {
                      minAdjacency=adjacency;
                      numRoomsInSolutionAtMin=numRoomsInSolution;
                      seedByteAtMin[0]=seedByte[0];
                      seedByteAtMin[1]=seedByte[1];
                      seedByteAtMin[2]=seedByte[2];
                      seedByteAtMin[3]=seedByte[3];
                      seedByteAtMin[4]=seedByte[4];
                      seedByteAtMin[5]=seedByte[5];
                      seedByteAtMin[6]=seedByte[6];
                      seedByteAtMin[7]=seedByte[7];
                    }
                  else
                    {
                      if (adjacency == minAdjacency)
                        {
                          if (numRoomsInSolution > numRoomsInSolutionAtMin)
                            {
                              numRoomsInSolutionAtMin=numRoomsInSolution;
                              seedByteAtMin[0]=seedByte[0];
                              seedByteAtMin[1]=seedByte[1];
                              seedByteAtMin[2]=seedByte[2];
                              seedByteAtMin[3]=seedByte[3];
                              seedByteAtMin[4]=seedByte[4];
                              seedByteAtMin[5]=seedByte[5];
                              seedByteAtMin[6]=seedByte[6];
                              seedByteAtMin[7]=seedByte[7];
                            }
                        }
                    }
                }
              increment();
              today=new Date();
              elapsedTime=((double) today.getTime())/1000.0-startTime;
            }
          while ((elapsedTime >= 0.0)
          &&     (elapsedTime < SECONDS_FOR_MAZE_SELECTION));
          hexGenerateMaze(seedByteAtMin);
          hexSolveMaze();
          return;
        }

    public void hexDisplaySolution()
        {
          int     deltaIndex;
          boolean pathFound;
          int     x;
          int     xNext;
          int     xPrevious;
          double  xRelative;
          double  xRelativeNext;
          int     y;
          int     yNext;
          int     yPrevious;
          double  yRelative;
          double  yRelativeNext;

          xRelative=1.0;
          yRelative=sqrt3/2.0;
          xRelativeNext=0.0;
          yRelativeNext=0.0;
          graph.setColor(redGreenBlue[SOLUTION_COLOR]);
    

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -