Game Tebak Angka Pemula

Sep 01 2020

Saya sudah mulai belajar program, dan sebagai program pertama yang saya tulis sendiri, saya ingin membuat permainan menebak angka - di bawah ini yang saya dapatkan.

Saya terutama mencari review dari Guessfungsi saya , tapi saya punya beberapa pertanyaan spesifik:

  1. Apakah masuk akal untuk memiliki variabel loop saya sebagai parameter fungsi?
  2. Saat ini saya mendefinisikan beberapa variabel (misalnya tries) di luar fungsi saya - apakah ini cara idiomatik untuk melakukannya?
import random
tries = [1]
def Guess(playing):
    number = random.randint(1,100)
    print(number)
    print("We are going to play high and low, the avabile numbers are from 1 to 100 included.")
    while playing == True:
        user_input = input("What is your number? ")
        if int(user_input) == number:
            print("You have won!")
            playing = False
        elif int(user_input) < number:
            print("You need to give a higher number")
            tries.append(1)
        elif int(user_input) > number:
            print("You need to give an lower number")
            tries.append(1)
        else:
            print("You have put an wrong number")
            playing = False
    print("It took you " + str(sum(tries)) + " turns to guess")
    still = input("Do you want to play again?")
    if still == "yes" or still == "YES" or still == "y" or still == "si":
        Guess(playing=True)
    else:
        playing=False

Guess(playing=True)

Jawaban

8 IEatBagels Sep 01 2020 at 21:02

Secara keseluruhan Anda telah melakukan pekerjaan yang baik dengan kode Anda, ada beberapa hal yang akan saya perhatikan:

  • Anda tidak membayar untuk whitespace! Yang saya maksud adalah penting untuk membiarkan kode Anda bernafas. Gunakan beberapa baris kosong, itu akan membuat mata Anda bertanya-tanya ketika berhadapan dengan potongan kode yang besar.
  • Mengapa triesarray? Menurut pendapat saya, triesharus mewakili jumlah percobaan, jadi itu harus angka!
  • Perhatikan bahwa Anda memiliki kondisi, ==, <, > and... ?Katakanlah saya meminta Anda memberi saya angka yang tidak sama, lebih kecil atau lebih besar dari 3, apakah ada opsi yang memungkinkan? Yang harus Anda lakukan adalah memastikan pemain memasukkan angka! Saat ini, jika saya harus menjawab "Saya tidak tahu nomor saya, saya hanya seorang bayi" menjadi "Kami akan bermain tinggi dan rendah, nomor yang tersedia adalah dari 1 hingga 100 disertakan.", Program Anda akan macet ! Anda harus melihat ke dalam try/catchbalok untuk menyelesaikan masalah ini, itu bisa menjadi hal berikutnya untuk dipelajari untuk Anda!
  • Katakanlah saya perlu tiga percobaan pada permainan pertama saya, lalu saya memulai permainan baru (menggunakan "ya" saat diminta) dan saya bisa berhasil pada percobaan pertama, kode Anda akan memberi tahu saya bahwa saya membutuhkan empat percobaan untuk berhasil. Dapatkah Anda mencari tahu mengapa dan bagaimana Anda dapat memperbaikinya?
  • Anda dapat menyederhanakan loop Anda menggunakan breakkata kunci, itu juga sesuatu yang harus Anda cari (sementara kami melakukannya, cobalah untuk memahami penggunaan break, returndan continue. Ketiga kata kunci tersebut cukup berguna, meskipun Anda mungkin sudah mengetahuinya return).
  • Bagaimana jika saya seorang jurusan bahasa Inggris dan saya tidak tahan membuat kesalahan tata bahasa (Ini jelas bukan kasus saya) dan saya menulis "Ya", bukannya "ya" atau "YA", ketika ditanya apakah saya ingin bermain lagi? Apa yang dapat Anda lakukan adalah membandingkan versi masukan yang diturunkan (atau di atas ) dengan apa yang ingin Anda periksa (mis. still.lower() == "yes").
1 ChristianDean Sep 02 2020 at 08:55

Berikut adalah beberapa perbaikan yang menurut saya dapat Anda lakukan (IEatBabels menyentuh banyak hal ini, tetapi saya ingin memperluas pada beberapa area dan menambahkan frase saya sendiri):

  • Mengapa triesdaftar? Akan lebih mudah dan lebih masuk akal untuk membiarkan tries = 0memulai, dan kemudian meningkatkan mencoba ( tries += 1) setiap kali pengguna memasukkan nomor yang salah.
  • Karena Anda tidak memiliki fungsi lain dalam program Anda, saya tidak akan repot-repot membuat Guessfungsi. Cukup tulis kodenya langsung di program.
  • Anda mungkin baru saja debugging program Anda, tetapi Anda menunjukkan pengguna jumlah mereka seharusnya menebak dengan menulis print(number)di Guess!
  • Apa yang terjadi jika pengguna memutuskan untuk menjadi kurang ajar dan omong kosong (yaitu sesuatu yang bukan angka)? Program Anda akan memunculkan pengecualian saat mencoba mengubah input menjadi angka. Apa yang harus Anda lakukan adalah membungkus kode di bawah loop Anda dalam satu try/exceptblok. Dengan begitu, setiap kali pengguna memasukkan omong kosong, Anda dapat meminta mereka untuk memasukkan seluruh nomor yang valid.
  • Saya tidak yakin mengapa Anda elsediblokir setelah if/elifpernyataan Anda ? Jika input pengguna tidak sama dengan angka, dan tidak kurang dari angka, dan tidak lebih besar dari angka, apa lagi yang bisa? Tidak ada! Jadi sebenarnya tidak perlu elseada pernyataan di sana. Anda mungkin telah mencoba menggunakan elsepernyataan jika input pengguna tidak valid. Ini tidak akan berhasil. Jika itu yang Anda coba lakukan, lihat poin terakhir saya.
  • Ubah input pengguna menjadi integer sekali, dan simpan dalam variabel. Ini menghemat waktu dan terlihat lebih rapi daripada mengubah input pengguna setiap kali Anda ingin mengujinya.
  • Saya tidak yakin mengapa Anda menggunakan rekursi di sini? Rekursi adalah alat yang sangat baik, tetapi seringkali whileatau forloop bekerja lebih baik. Saya pikir program Anda adalah salah satu kasus tersebut. Cukup gunakan dua putaran - satu putaran untuk menanyakan pengguna apakah mereka ingin bermain lagi, dan satu putaran untuk game sebenarnya.
  • Saya perhatikan Anda menggunakan bendera untuk keluar dari loop kami. Ini adalah metode yang bagus. Tapi saya lebih suka di sini untuk hanya menggunakan break. breakadalah pernyataan yang memberitahu Python untuk segera keluar dari loop yang saat ini masuk. Ini memiliki efek yang sama seperti mengatur flag ke Truedan / atau False.
  • Anda cukup ahli dalam hal ini dalam program Anda, tetapi selalu pastikan untuk menggunakan nama variabel deskriptif, dan tulis kode yang jelas dan eksplisit. Ini membuat kode Anda bersih dan terdokumentasi sendiri, dan ini memungkinkan Anda kembali ke sana beberapa bulan dari sekarang dan dengan cepat memahami apa fungsinya dan cara kerjanya.

Inilah cara saya menulis ulang program Anda, dengan memasukkan saran di atas, dan beberapa perbaikan pemformatan, logika, dan penamaan (juga IEatBagels membuat poin yang sangat baik tentang spasi. Pastikan Anda memperhatikan ini!):

import random


print("We are going to play high and low, the avabile numbers are from 1 to 100 included.")

tries = 0
while True:
    number_to_guess = random.randint(1, 100)
    while True:
        try:
            user_input = input("What is your number? ")
            guess = int(user_input)
        except ValueError:
            print("That's not a valid number! Try again.")
        else:
            if guess == number_to_guess:
                print("You have won!")
                break
            elif int(user_input) < number_to_guess:
                print("You need to give a higher number")
                tries += 1
            elif int(user_input) > number_to_guess:
                print("You need to give a lower number")
                tries += 1

    print("It took you " + str(tries) + " turns to guess")
    still = input("Do you want to play again?")

    if not (still == "yes" or still == "YES" or still == "y" or still == "si"):
        break