การสร้างตารางคำศัพท์ Crossword

From eXceed Camp
Jump to: navigation, search

การสร้างตาราง Crossword นั้นมีลำดับดังนี้

จัดวางคำศัพท์ทั้งหมดให้ลงตำแหน่งก่อน

  • ใช้ Nested Array ในการสร้างสนามจำลองขึ้นมา
<source lang="csharp">
 field[][] = new string[15][];
 for(int i  = 0;i < field.Lenght;i++)
     field[i] = new string[15];
 </source>
  • Random tmpDiRect เพื่อสุ่มว่าศัพท์นั้นจะวางทางทิศใด ลง ขวา ซ้ายลง หรือ ขวาลง
  • Random tmpX tmpY เพื่อหาตำแหน่งที่จะลงคำศัพท์ได้ ซึ่งจะมาเป็นลักษณะ x,y โดยต้องไม่ลืมถึงความยาวของคำศัพท์นั้นด้วย
  • ทำการแทนค่าทีละตัวอักษรตามทิศที่สุ่มได้ ตัวอย่างการไล่ตัวอักษรลง
 <source lang="csharp">
 if (tmpDiRect == 0) //DOWN Direction
      {
          do
          {
               tmpY = RandSpe(0, 15 - vocab[i].Length);
          } while (15 - tmpY < vocab[i].Length);
          tmpX = Rand(15);
          for (int j = tmpY, k = 0; k < vocab[i].Length; j++, k++)
                x[j][tmpX] = vocab[i][k] + "";
      }
 </source>
 ในโปรแกรมนี้ เราจินตนาการว่า Index Array ตัวแรกเป็นการตามแกน Y ซึ่งเป็นแนวตั้งและตัวที่สองเป็น X ซึ่งเป็นแนวนอน
  • ทำการตรวจสอบว่าตัวอักษรที่ลงไป ไม่ไปทับกับตัวอักษรที่ลงก่อนหน้านี้ โดยการให้หา แล้วเช็คว่ามีเพียงศัพท์เดียวทั้งตาราง
 <source lang="csharp">
          check = Check(x, vocab, i + 1);
 </source>
  • ถ้าถูกต้องให้บันทึกไว้ ถ้าผิดให้ทำการ Random ใส่ศัพท์ตัวนั้นใหม่
 <source lang="csharp">
  if (!check)
      CopyTo(ResultTable, x);
 </source>
  • ทำอย่างนี้ไปจนครบทุกตัว และมีการตรวจสอบว่าถ้าทำแล้วไม่สามารถจัดลงได้ ให้ทำการจัดใหม่หมด
 <source lang="csharp">
  if (count > 20000)
      {
           ClearTable(x);
           return x;
      }
  </source>

ทำการใส่ตัวอักษรอื่นๆ

  • ทำการ Random ตัวอักษรจาก a - z ใส่ทุกช่องที่ไม่มีตัวอักษรอยู่

ตรวจสอบว่าการใส่ตัวอักษรนั้น ไม่ทำให้เกิดคำศัพท์ซ้ำ

  • ทำการหาศัพท์ทั้งหมดโดยตรวจสอบว่า ศัพท์คำนึงจะมีในตารางได้เพียงคำเดียวเท่านั้น
  <source lang="csharp">
  int[] count = new int[limit];
           for (int i = 0; i < limit; i++)
           {
               for (int j = 0; j < x.Length; j++)
                   for (int k = 0; k < x[0].Length; k++)
                       if (x[j][k][0] == vocab[i][0])
                           count[i] += CheckWord(x, j, k, vocab[i]);
           }
           for (int i = 0; i < limit; i++)
               if (count[i] != 1)
                   return false;
           return true;
  </source>
Personal tools
Namespaces

Variants
Actions
Navigation
Toolbox