Nasıl bir scrabble uygulamasında bir 'boş bir karo' arayabilirim?

3 Cevap php

Ben birkaç ay önce bu uygulamayı oluşturduk: http://www.mondofacto.com/word-tools/scrabble-solver.html

Uygulama kullanıcı onlar bu harfleri kullanarak elde edecek skoru ne ile birlikte kendilerine verilen harf seti, ve geçerli sözler ne kullanabilirsiniz yankılanırken geri girmenizi sağlar.

Bu alfabenin 26 harf gibi herhangi geçerli olabilir ve geçerli olan sözcükleri geri yankı biri olan -. Temelde, ne yapmak isteyen kullanıcılar bir 'boş bir karo' girebilirsiniz böylece uygulama genişletmek olduğunu

Aşağıda veritabanı yapısının bir ekran görüntüsü.

http://i37.tinypic.com/28v6a8h.png

Siz tarayıcınıza ^ anlaşıldı gerekebilir.

Bir kullanıcının girdiği bu veriler üzerinde çalışacak sorgu, örneğin, 'yerdomuzu' - aşağıdaki gibidir:

SELECT * FROM scrabble WHERE a <= 3 AND b <= 0 AND c <= 0 AND d <= 1 AND e <= 0 AND f <= 0 AND g <= 0 AND h <= 0 AND i <= 0 AND j <= 0 AND k <= 1 AND l <= 0 AND m <= 0 AND n <= 0 AND o <= 0 AND p <= 0 AND q <= 0 AND r <= 2 AND s <= 0 AND t <= 0 AND u <= 0 AND v <= 1 AND w <= 0 AND x <= 0 AND y <= 0 AND z <= 0 AND length <= 8 ORDER BY scrabble DESC

Eğer görmek istiyorsan sonuçlar ben en başında bağlantı içine bir sözcüğü yazın.

Sağ

Yani herkes bu yaptığını yaklaşım nasıl bir fikrin var mı? Ben onlar (boş kiremit olmak mekanlarda) boşluk koyarsanız, kullanıcı tarafından girilen dize ucuna her alfabe karakteri ekler, aşağıdaki kodu ile başladı.

 if (preg_match('/[\s]/', $string)) { 

     $wild_string = $string;

     foreach (range('a','z') as $i) { 

        $wild_string = $string;
        $wild_string .= $i; 

        }

$ Wild_string değişkeni her harf döngü üzerine eklenir biridir. Her döngü ilk dizeye sıfırlayarak o girilen dize üzerine 26 harf ekleyerek kod durur.

Ben waffled varsa özür biri yardımcı olabilir umuyoruz, ve :)

Andy.

3 Cevap

Benim önerim şudur:

ab* burada * joker: adlı kullanıcı girişi diyelim. Bilinen tüm harfleri ve joker saymak ve eleman 0 joker karakterler ve diğer her eleman kilit kez sayı kullanıcı girişi verilen bir değer ile bilinen bir mektup sayısının bir dizi oluşturmak:

function GetArrayLetters($userInput) {
  ...
  // produces something like $letters = ( 0 => 1, 'a' => 1, 'b' => 1);
  return $letters;
}

Bu diziyi her harf ve kelime boyu joker karakter sayısını ekleyerek sorgu değiştirmek kullanma:

# with only one wildcard, the query will become:
SELECT * FROM scrabble WHERE a <= 2 AND b <= 2 AND c <= 1 ....
    ... AND length <= 3

Şimdi sırayla her kelimeyi bir yerde sonuçları (bir dizi) koymak ve incelemek. Her harf geçmesi ve $ mektuplar diziden bilinen her bir harfi için çıkarma; Bilinen bir mektup değeri sıfırsa, yerine eleman 0 (joker) çıkarma. Eğer joker için negatif bir değer alırsanız, o kelimeyi atmak:

foreach ($result_set AS $word) {
  $letters = GetArrayLetters($userInput);
  for ($i = 0; $i < str_len($word); $i++) {
    $letter = substr($word, $i, 1);
    if ( array_key_exists( $letter, $letters )) {
      if ($letters[$letter]) > 0 {
        $letters[$letter] -= 1;
      } else {
        $letters[0] -= 1; // else subtract from the wildcard
      }
    } else {
      $letters[0] -= 1;
    }

    if ($letters[0] < 0) {
      // if wildcard falls bellow zero, discard the word
    }
  }
}

Aklıma tek yöntem her zaman alfabenin farklı bir harf 1 ekleyerek yanı sıra, 1 uzunluk sınırı, ve sonra çiftleri ortadan kaldırarak, 26 kez yukarıdaki sorguyu çalıştırmak için.

Ben boş bir kiremit işaretlemek ve giriş DOR * olsaydı aşağıdakileri yapmak için bir yıldız kullanabilirsiniz:

SELECT * FROM scrabble WHERE d + o + r + $number_of_wildcards >= length

Ben doğru veritabanı yapısını anlaşılması durumunda, bu vb, kapı, yurt, salak, koku dönmelidir

EDIT: Bu sürüm aynı zamanda böylece do, çubuk ve benzeri kısa kelimeleri aynı olmalıdır.