سلام من این پروژه مکتب خانه که در مورد بازی حدس عدد هست اصلا متوجه نمیشم اصلا چجوری باید برنامه جوری نوشت که کامپیوتر تشخیص بده عدد بزرگتره یا کوچکتر و این رو ادامه بده در ادامه تسک ها میزارم براتون
مراحل بازی شامل پنج تسک میشه
1) ابتدا کاربر یک عدد را در ذهن خود مشخص می کند و به کامپیوتر این عدد را نمی گوید (به عنوان ورودی به کامپیوتر عدد را نمی دهد)(عددی بین ۱ تا ۹۹)
2) برنامه یک عدد را حدس زده و چاپ می کند
3) عدد چاپ شده سه حالت را ایجاد می کند
4-یا از عددی که شما در ذهن خود دارید بزرگتر هست که شما با تایپ حرف k به برنامه می گویید که عدد در ذهن شما از عددی که برنامه چاپ کرده کوچکتر است و برنامه باید عدد دیگری را حدس زده و نمایش بدهد و ... (قابل ذکر است که در این حالت با تایپ k برنامه باید عدد کوچکتری از حدس قبلی خود حدس بزند تا بازی زودتر تمام شود)
5-و یا اینکه عدد چاپ شده از از عددی که شما در ذهن خود دارید کوچکتر هست که با تاپ حرف b به برنامه می گویید که عدد در ذهن شما از عددی که برنامه چاپ کرده بزرگتر است و برنامه باید عدد دیگری را حدس زده و نمایش بدهد و ... (قابل ذکر است که در این حالت با تایپ b برنامه باید عدد بزرگتری از حدس قبلی خود حدس بزند تا بازی زودتر تمام شود)
6- و یا اینکه عدد چاپ شده همان عددی است که در ذهن شما بود و با تایپ حرف d به برنامه می گویید که درست حدس زده و برنامه تمام می شود
برای نمونه کد می توانید از این لینک استفاده کنید اما باز من متوجه الگوریتم نشدم ، کد خودم رو دیگه نزاشتم که متن طولانی نشه ممنون میشم سورس کد اش بهم بگید یا اگه روش راحت تری هست مثلا استفاده از choice برای حدس زدن و این جور ترفندها :)
کد @abdolrahman
را اگر از نخواهیم از مپ و فیلتر استفاده کنیم به صورت زیر مینویسیم:
import random
numbers = list(range(1,100))
while True:
guess = random.choice(numbers)
print(guess)
inp = input('Enter k or b or d: ')
if inp == 'k':
del numbers[numbers.index(guess):] # del numbers >= guess
elif inp == 'b':
del numbers[:numbers.index(guess)+1] # del numbers <= guess
elif inp =='d':
print('hooooo!! my guess is True!')
break
سلام
روش های زیادی برای حل این مسئله وجود داره، چیزی که اینجا مهمه یافتن روشی برای یافتن پاسخ با کمترین میزان حدس است.
می تونید از روش نیوتن رافسون در ریشه یابی یا حتی درون یابی خطی الگو بگیرید یعنی هر بار نصف بازه رو هدف قرار بدید حالا نصف رو چطور تشخیص می دید از راهنمایی کاربر که کلید k یا b رو انتخاب میکنه شما میتونید جهت کاوش رو تعیین کنید. این کار رو آنقدر ادامه می دید تا به جواب برسید.
فرض کنید می خوایم این بازی رو باهم انجام بدیم. شما یک عدد توی ذهن تون هستش و من می خوام اون عدد رو حدس بزنم. مهمترین مسئله هم اینه که سریعتر به جواب برسم، چون نمی خوام وقت خودم رو هدر بدم :)
شما یک عدد توی ذهن تون هستش در بازه بین 1 تا 99.
حالا مثلا من می خوام حدس بزنم چه عددی هستش، خب بهترین راهکار اینه که حدسی رو بزنم که تکلیف نصف اعداد رو مشخص کنم، پس عدد وسطی در این بازه رو میگم، یعنی 99 + 1 تقسیم بر 2: میشه 50.
سه حالت می تونه پیش میاد:
1) عدد شما 50 باشه، پس به جواب درست رسیدم و تمام.
2) عدد شما از 50 بزرگتر هستش. پس نتیجه می گیریم که اعداد 1 تا 50 دیگه سوختن. در بازه بین 51 تا 99 باید دنبال عدد شما بگردم، دوباره چیکار می کنم؟ عددی رو انتخاب می کنم که وسط این بازه باشه یعنی بین 51 تا 99. بنابراین 99 + 50 + 1 تقسیم بر 2: میشه 75.
((50+1)+99)/2 = 75
3) عدد شما از 50 کوچکتر هستش. پس نتیجه می گیریم که اعداد 50 تا 99 دیگه سوختن. در بازه بین 1 تا 49 باید دنبال عدد شما بگردم، دوباره چیکار می کنم؟ عددی رو انتخاب می کنم که وسط این بازه باشه یعنی بین 1 تا 49. بنابراین:
(1+(50-1))/2 = 25
این دنباله رو انقدر ادامه میدم تا به حدس درست برسم.
سخت نیست که
یه روشی که یهویی به ذهنم رسید اینه که یه لیست از اعدادی بین ۹۹ بسازین ( با حلقه ) بعد بیاین یکی از اعداد داخل لیست رو بصورت رندوم بردارین و به کاربر نشون بدین. ببینین کاربر چه کارااکتری بهتون میده.
اگه بهتون k داد با تابع map همه اعدادی که بزرگتر از عددی که دادین هستن و همون عدد رو از لیست حذف کنید. و اگر b داد برعکس
به همین صورت پیش برین تا بهتون d بده و بالاخره بازی تموم میشه.
همون طور که گفتم یهو به ذهنم رسید و مطمئنا راه های بهتری هم هست
سر فرصت کدش رو مینویسم و میفرستم :)
import random
numbers = []
for i in range(1,100):
numbers.append(i)
isTrue = False
while not isTrue:
myRandom = random.choice(numbers)
print(myRandom)
inp = input('--->')
if inp == 'k':
numbers = list(filter(lambda a: a < myRandom, numbers))
elif inp == 'b':
numbers = list(filter(lambda a: a > myRandom, numbers))
elif inp =='d':
print('hooooo!! my guess is True!')
break
else:
print('what is this command? idont know this')
اینم از کد :)
امیدوارم مفید بوده باشه :)
و البته از نظر دوستانی که قبل از این گفته بودن هم استفاده کنید که کو خیلی بهتر میشه
سلام بازم متوجه نشدم این روشی که دوستان گفتن امتحان کردم و میخوام برنامه ای بنویسم که هر بار به جای filter که روش زمان بری هست از روشی که دوستمون @milad گفتن استفاده بشه خسته شدم اون قدر سرچ کردم چقدر کسل کننده بود این کدش آخه !
def computer_guess(num):
low = 1
high = 100
guess = (low+high)//2
while guess != num:
guess = (low+high)//2
print("The computer takes a guess...", guess)
if guess > num:
high = guess
elif guess < num:
low = guess + 1
print("The computer guessed", guess, "and it was correct!")
def main():
num = int(input("Enter a number: "))
if num < 1 or num > 100:
print("Must be in range [1, 100]")
else:
computer_guess(num)
if __name__ == '__main__':
main()
@mohammadrezah
شما تو کودتون عدد کاربر رو میگیرید بنا بر این نیازی باز به کامند d نیست
و خب شما اصولا نباید عدد کاربر رو داشته باشید
@abdolrahman
شما چند روز پیش گفتید که دوازده سالتونه
قطعا کسی که با لامدا کار کرده و برنامه نویسی تابعی رو بلده و این کدی که شما نوشتید و جاوا اسکریپت و اچ تی ام ال هم بلدید باید دو سالی برنامه نویسی کار کرده باشه
یعنی شما نه سالتون بوده برنامه نویسی و شروع کردید؟
نه سالگی فک کنم تازه به آدم جدول ضرب یاد میدن :)
@nimabandari27
نه بابا من متولد 88 هستم و نیمه اولیم. الان نیمه دومیا باید برن ششم و نیمه اولیا برن هفتم
اگه حساب کنید که وقتی 6 سالم بود رفتم کلاس اول ، میفهمید چه خبره
کد @abdolrahman
را اگر از نخواهیم از مپ و فیلتر استفاده کنیم به صورت زیر مینویسیم:
import random
numbers = list(range(1,100))
while True:
guess = random.choice(numbers)
print(guess)
inp = input('Enter k or b or d: ')
if inp == 'k':
del numbers[numbers.index(guess):] # del numbers >= guess
elif inp == 'b':
del numbers[:numbers.index(guess)+1] # del numbers <= guess
elif inp =='d':
print('hooooo!! my guess is True!')
break
@mohammadrezah
کجاش رو متوجه نشدین؟
چیزی که من نوشتم گویا بود؟ بله یا خیر؟
اگر بله، حالا بگید کدوم بخش کد رو مبهم هستش؟
بعلاوه اگر این مسئله مشکل هستش، روی مسائل ساده تر کار کنید.
کد زیر هم از روش خودتون
ولی روش @abdolrahman بسیار بهتر
import random
low,high = 1,100
while True:
guess = random.choice(list(range(low,high)))
print("The computer takes a guess...", guess)
inp = input('Enter k or b or d: ')
if inp == 'k':
high = guess
elif inp == 'b':
low = guess + 1
elif inp == 'd':
print('hooooo!! my guess is True!')
break
آیا مایل به ارسال نوتیفیکیشن و اخبار از طرف راکت هستید ؟