2016-04-05 13 views
-1

Yeni başlayan bir programcıyım ve python'u ilk dil olarak öğreniyorum. Uygulama için, tamamlanmış bir sudoku bulmacasını oluşturan bir program hazırladım, , daha sonra bir GUI ile bir sudoku oyununun parçası olarak kullanılmasını umuyorum. Fakat şu an itibariyle hiçbir şey yapmıyor. Ve bu demek oluyor ki, çalıştırıldığında ekranda hiçbir şey basılmaz. Her şeyin doğru bir şekilde biçimlendirildiğinden emin olmak için kontrol ettim ve en iyi şekilde benim sözdizimimin tamamı doğru. Bildirimi kaçtıran bazı mantıksal hata var mı? Her halükarda, bir şeylerin zaman döngüsünün kırılmasını engellediğinden şüpheleniyorum. Ayrıca, programımın gereksiz yere uzun sürdüğünün farkındayım, ancak hala programı öğrenmeye başladığımdan beri, çalışmak için çok sınırlı bir araç kitine sahibim. Bir çözülemeyen tahta haline olsun eğer sarfınazar yapabilir sizin algoritmada bir şey yok çünküPython programımdaki while döngüsü neden bitmiyor?

# Sudoku puzzle maker 
    # Practice game that makes an unfinished sudoku puzzle for the player to solve 

    import random 

    # The readout string stores the assigned numbers given to each square 
    # in the puzzle. 

    readout = "" 

    # The "c" strings store the numbers contained in each of the columns. 
    # The program will check these strings to make sure that only one of each 
    # number from 1 to 9 is in each column. 
    # The same is true for the "r" (row) and "b" (box) strings. 

    c1 = "" 
    c2 = "" 
    c3 = "" 
    c4 = "" 
    c5 = "" 
    c6 = "" 
    c7 = "" 
    c8 = "" 
    c9 = "" 

    r1 = "" 
    r2 = "" 
    r3 = "" 
    r4 = "" 
    r5 = "" 
    r6 = "" 
    r7 = "" 
    r8 = "" 
    r9 = "" 

    b1 = "" 
    b2 = "" 
    b3 = "" 
    b4 = "" 
    b5 = "" 
    b6 = "" 
    b7 = "" 
    b8 = "" 
    b9 = "" 

    # The "square" strings store the location of each square as a 3-digit code, 
    # the first digit is the column, the second the row, and the third the box. 
    # For example, the fourth square is in c4 (column 4), r1 (row 1), 
    # and b2 (3x3 box 2), so its corresponding string is "412". 

    square_1 = "111" 
    square_2 = "211" 
    square_3 = "311" 
    square_4 = "412" 
    square_5 = "512" 
    square_6 = "612" 
    square_7 = "713" 
    square_8 = "813" 
    square_9 = "913" 
    square_10 = "121" 
    square_11 = "221" 
    square_12 = "321" 
    square_13 = "422" 
    square_14 = "522" 
    square_15 = "622" 
    square_16 = "723" 
    square_17 = "823" 
    square_18 = "923" 
    square_19 = "131" 
    square_20 = "231" 
    square_21 = "331" 
    square_22 = "432" 
    square_23 = "532" 
    square_24 = "632" 
    square_25 = "733" 
    square_26 = "833" 
    square_27 = "933" 
    square_28 = "144" 
    square_29 = "244" 
    square_30 = "344" 
    square_31 = "445" 
    square_32 = "545" 
    square_33 = "645" 
    square_34 = "746" 
    square_35 = "846" 
    square_36 = "946" 
    square_37 = "154" 
    square_38 = "254" 
    square_39 = "354" 
    square_40 = "455" 
    square_41 = "555" 
    square_42 = "655" 
    square_43 = "756" 
    square_44 = "856" 
    square_45 = "956" 
    square_46 = "164" 
    square_47 = "264" 
    square_48 = "364" 
    square_49 = "465" 
    square_50 = "565" 
    square_51 = "665" 
    square_52 = "766" 
    square_53 = "866" 
    square_54 = "966" 
    square_55 = "177" 
    square_56 = "277" 
    square_57 = "377" 
    square_58 = "478" 
    square_59 = "578" 
    square_60 = "678" 
    square_61 = "779" 
    square_62 = "879" 
    square_63 = "979" 
    square_64 = "187" 
    square_65 = "287" 
    square_66 = "387" 
    square_67 = "488" 
    square_68 = "588" 
    square_69 = "688" 
    square_70 = "789" 
    square_71 = "889" 
    square_72 = "989" 
    square_73 = "197" 
    square_74 = "297" 
    square_75 = "397" 
    square_76 = "498" 
    square_77 = "598" 
    square_78 = "698" 
    square_79 = "799" 
    square_80 = "899" 
    square_81 = "999" 

    # The "master_list" is a tuple that stores all of the "square" strings in order 
    # of their appearance. I realize now that I could have just had it store the 
    # strings directly, but I'm too lazy to go back and change it. 

    master_list = (square_1, square_2, square_3, square_4, square_5, square_6, square_7, square_8, square_9,\ 

    square_10, square_11, square_12, square_13, square_14, square_15, square_16, square_17, square_18,\ 

    square_19, square_20, square_21, square_22, square_23, square_24, square_25, square_26, square_27,\ 

    square_28, square_29, square_30, square_31, square_32, square_33, square_34, square_35, square_36,\ 

    square_37, square_38, square_39, square_40, square_41, square_42, square_43, square_44, square_45,\ 

    square_46, square_47, square_48, square_49, square_50, square_51, square_52, square_53, square_54,\ 

    square_55, square_56, square_57, square_58, square_59, square_60, square_61, square_62, square_63,\ 

    square_64, square_65, square_66, square_67, square_68, square_69, square_70, square_71, square_72,\ 

    square_73, square_74, square_75, square_76, square_77, square_78, square_79, square_80, square_81) 

    # This for loop, for each square, picks a random number, converts it from an 
    # integer into a string, and checks to see if it is already in the same column, 
    # row, or box. It checks this by deciding which "c" "r" and "b" string 
    # to look into based on the 3-digit code in each "square" string, and if 
    # it finds that the number it picked is already in the same c, r, or b, it 
    # tries again with a new random number. If the number fits, it is added to 
    # the proper "c", "r", and "b" strings for future reference, and added to the 
    # "readout" string. 

    for square in master_list: 
     while True: 
      number = str(random.randint) 

    # Here the program finds which column the square is in, and checks that column.  

      if square[0] == "1": 
       column = c1 
       if number in c1: 
        continue 
      elif square[0] == "2": 
       column = c2 
       if number in c2: 
        continue 
      elif square[0] == "3": 
       column = c3 
       if number in c3: 
        continue 
      elif square[0] == "4": 
       column = c4 
       if number in c4: 
        continue 
      elif square[0] == "5": 
       column = c5 
       if number in c5: 
        continue 
      elif square[0] == "6": 
       column = c6 
       if number in c6: 
        continue 
      elif square[0] == "7": 
       column = c7 
       if number in c7: 
        continue 
      elif square[0] == "8": 
       column = c8 
       if number in c8: 
        continue 
      elif square[0] == "9": 
       column = c9 
       if number in c9: 
        continue 

    #Here the program finds which row it is in and checks the row. 


      if square[1] == "1": 
       row = r1 
       if number in r1: 
        continue 
      elif square[1] == "2": 
       row = r2 
       if number in r2: 
        continue 
      elif square[1] == "3": 
       row = r3 
       if number in r3: 
        continue 
      elif square[1] == "4": 
       row = r4 
       if number in r4: 
        continue 
      elif square[1] == "5": 
       row = r5 
       if number in r5: 
        continue 
      elif square[1] == "6": 
       row = r6 
       if number in r6: 
        continue 
      elif square[1] == "7": 
       row = r7 
       if number in r7: 
        continue 
      elif square[1] == "8": 
       row = r8 
       if number in r8: 
        continue 
      elif square[1] == "9": 
       row = r9 
       if number in r9: 
        continue 

    #Here it finds which box it is in and checks the box. 


      if square[2] == "1": 
       box = b1 
       if number in b1: 
        continue 
      elif square[2] == "2": 
       box = b2 
       if number in b2: 
        continue 
      elif square[2] == "3": 
       box = b3 
       if number in b3: 
        continue 
      elif square[2] == "4": 
       box = b4 
       if number in b4: 
        continue 
      elif square[2] == "5": 
       box = b5 
       if number in b5: 
        continue 
      elif square[2] == "6": 
       box = b6 
       if number in b6: 
        continue 
      elif square[2] == "7": 
       box = b7 
       if number in b7: 
        continue 
      elif square[2] == "8": 
       box = b8 
       if number in b8: 
        continue 
      elif square[2] == "9": 
       box = b9 
       if number in b9: 
        continue 


    # If a random number has gotten this far, it means it has passed inspection. 
    # Now the program concatenates the number to the correct "c", "r" and "b" 
    # strings for future reference. 


      if column == c1: 
        c1 += number 
      elif column == c2: 
        c2 += number 
      elif column == c3: 
        c3 += number 
      elif column == c4: 
        c4 += number 
      elif column == c5: 
        c5 += number 
      elif column == c6: 
        c6 += number 
      elif column == c7: 
        c7 += number 
      elif column == c8: 
        c8 += number 
      elif column == c9: 
        c9 += number 

      if row == r1: 
        r1 += number 
      elif row == r2: 
        r2 += number 
      elif row == r3: 
        r3 += number 
      elif row == r4: 
        r4 += number 
      elif row == r5: 
        r5 += number 
      elif row == r6: 
        r6 += number 
      elif row == r7: 
        r7 += number 
      elif row == r8: 
        r8 += number 
      elif row == r9: 
        r9 += number 

      if box == b1: 
        b1 += number 
      elif box == b2: 
        b2 += number 
      elif box == b3: 
        b3 += number 
      elif box == b4: 
        b4 += number 
      elif box == b5: 
        b5 += number 
      elif box == b6: 
        b6 += number 
      elif box == b7: 
        b7 += number 
      elif box == b8: 
        b8 += number 
      elif box == b9: 
        b9 += number 

    # Now the number is added to the readout and the while loop breaks, moving 
    # the for loop on to the next square. 

      readout += number 
      break 

    print(readout) 



    input("\n\nyay it worked.") 
+0

İşler iyi gitmediğinde, büyük bir hata ayıklama tekniği sorununuzu basitleştirilmiş bir örnek oluşturmaktır. Bu durumda 2x2 Sudoku bulmacasını oluşturmayı deneyebilirsiniz. –

+0

Bu kodu okumaya bile katlanamıyorum, * yol * çok fazla değişken var. Listeler ve indeksleme gibi veri yapılarını kullanmak, adlarında sadece bir rakam ile farklılık gösteren düzinelerce değişkene sahip olmaktan çok daha iyidir. – Blckknght

+0

'str (random.randint)', 0x2402380 >> 'de döndüğünüzü ve beklediğiniz gibi, bir tamsayı bir tamsayı olarak döndürür. Bunu düzeltmek için bir başlangıç ​​ve bitiş numarası verin örn. 'Str (random.randint (0,9)) '. –

cevap

0

Kodunuz sonsuza çalıştırır:

Burada bütünüyle benim programıdır. Bir Örneğin, bu kurulun ilk iki satırda değerleri göz önünde bulundurun:

1 2 3 4 5 6 7 8 9 
5 6 7 8 9 1 2 3 

onlar satır, sütun veya kutuya örtüşmeyen beri, bugüne kadar girilen tüm yasal edilmiş sayılar. Fakat ikinci sıranın son sütununa konabilecek hiçbir yasal değer yoktur. Kodunuz rastgele ilk 17 sayıyı bu desene yerleştirdiyse, 18'ini yerleştirmeye çalışmak sonsuza dek takılırdı. Muhtemelen programınız, takılmadan önce biraz daha ilerler, ancak tam bir tahta oluşturmaktan takılıp kalması daha olasıdır (olasılıkların nasıl çalıştığını bilmiyorum).

+0

Bu iyi bir fikir, ancak kodun neden çalışmadığını açıklayandan emin değilim. Eğer arayarak 'if-else' değerini kaldırırsanız, kod master_list'de kare için 'ye düşer: True iken: number = str (random.randint); okuma + = sayı; break'. Noktalı virgüller satır sonu gösterir, girintinin kolonda meydana geldiği varsayılır. En azından _something_ yazdırılmalıdır. –

+0

Hayır, anlattığım gibi imkansız bir tahta durumu olmasaydı, algoritmanın genel teorisi işe yarayabilirdi. 'If'/'elif' bloklarının ikinci yarısı atlıyorsunuz bazı işler yapıyorsunuz: geçerli bir hareketin her bulunuşunda "cN", "rN" ve "bN" değişkenlerinin her birini değiştiriyorlar. Ve eğer bulunursa, 'readout' bitmiş tahta olacak. – Blckknght

+0

İkinize de çok teşekkürler. Programın problemini çözen, imkansız tahta durumları ile sıkışan özellikler ekledim, ama yine de olması gerektiği gibi çalışmıyor. Sadece koştuktan sonra "yeniden başlat" diyor. Diğer insanlar da bu problemi yaşamışlar, ortaya çıkıyor ve sorun, uygun bir dosya yoluna sahip olmamasından kaynaklanıyor. Yine, içgörü için teşekkürler ve son kodu, nasıl çalıştığımı açıklayan bir açıklama ile göndereceğime emin olacağım. –

İlgili konular