Игра NIM, случайный диапазон имеет ошибку, когда диапазон составляет от 1 до 1, требуется быстрое исправление (не дублировать) - PullRequest
0 голосов
/ 28 июня 2018

ребята. Я программирую игру NIM по следующим правилам:

  • Начните с n шариков
  • по очереди удаляет от 1 до половины шариков (в настоящее время) в стопке
  • Проигравший забирает последний мрамор / с

Я рандомизировал начальное количество шариков. Я определил значение «take» как случайное целое число от 1 до половины стопки. То, как я это сделал, было

nHalf = int(nNumMarbles/2)
nCTake = int(random.randrange(1,nHalf))

Я сделал это так, чтобы половина нечетного числа округлялась вниз (что и происходит). Проблема возникает в конце игры, когда пользователь снизил nNumMarbles до 2, и компьютер должен nCTake случайное число от 1 до nHalf - то есть от 1 до 1. Вот как игра шла, когда он был запущен (ошибка внизу):

Python 3.6.3 (v3.6.3: 2c5fed8, 3 октября 2017, 18:11:49) [MSC v.1900 64 бит (AMD64)] на win32 Введите «copyright», «credits» или «license ()» для больше информации.

============ RESTART: C: /Users/Name/Documents/CISPROG1/NIM.py ============ 14 Добро пожаловать в игру NIM! В куче 14 шариков. Вы и компьютер будете по очереди брать шарики из куча Любой из вас может взять не более половины того, что осталось за очередь. Проигравший берет последний мрамор / с.

Компьютер пойдет первым.

Очередь за компьютером! Компьютер занимает 3 шарика.

11 осталось!

Твоя очередь! Возьмите от 1 до 7 шариков:

2 Вы взяли 2 шарика.

9 осталось!

Очередь за компьютером! Компьютер занимает 1 шарик.

8 осталось!

Твоя очередь! Возьмите от 1 до 4 шариков:

1 Вы взяли 1 шарик.

7 осталось!

Очередь за компьютером! Компьютер занимает 2 шарика.

5 осталось!

Твоя очередь! Возьмите от 1 до 3 шариков:

1 Вы взяли 1 шарик.

4 осталось!

Очередь за компьютером! Компьютер занимает 1 шарик.

3 осталось!

Твоя очередь! Возьмите от 1 до 2 шариков:

1 Вы взяли 1 шарик.

2 осталось!

Traceback (последний вызов был последним): File «C: /Users/Name/Documents/CISPROG1/NIM.py», строка 27, в nCTake = int (random.randrange (1, nHalf)) Файл "C: \ Program Files (x86) \ Microsoft Visual Studio \ Shared \ Python36_64 \ lib \ random.py", строка 198, в рандоме повысить ValueError («пустой диапазон для randrange () (% d,% d,% d)»% (istart, istop, width)) ValueError: пустой диапазон для randrange () (1,1, 0)

... и вот моя программа:

import random
import sys
import time

nNumMarbles = int(random.randrange(10,100))
print(str(nNumMarbles))
print("Welcome to the game of NIM! \n"
      "There are " + str(nNumMarbles) + " marbles in the pile. \n"
      "You and the computer will take turns taking marbles from the pile. \n"
      "Either of you can take at most half of what remains per turn. \n"
      "The loser takes the last marble/s. \n")
#let 1 --> computer goes first, 2 --> user goes first
nFirst = random.randint(1,2)
if nFirst == 1:
    print("The computer will go first. \n")
else:
    print("You will go first. \n")

#Game progression if Computer goes first (only case I am testing)
if nFirst == 1:
    while nNumMarbles > 0:
        #Computer's turn:
        nHalf = int(nNumMarbles/2)
        nCTake = int(random.randrange(1,nHalf))
        nNumMarbles = nNumMarbles - nCTake
        print("Computer's turn! Computer takes " + str(nCTake) + " marbles. \n")
        if nNumMarbles == 0:
            print("The computer took the last marble! You win!")
            time.sleep(3)
            exit()
        else:
            pass
        print(str(nNumMarbles) + " left! \n")
        #User's turn:
        print("Your turn! Take between 1 and " +str(nHalf) + " marbles: \n")
        nUTake = int(input())
        nNumMarbles = nNumMarbles - nUTake
        print("You took " + str(nUTake) + " marbles. \n")
        if nNumMarbles == 0:
            print("You took the last marble! You lose!")
            time.sleep(3)
            exit()
        else:
            pass
        print(str(nNumMarbles) + " left! \n")

Что пошло не так? Как это исправить, чтобы при диапазоне от 1 до 1 компьютер брал (nCTake) 1, последний шарик?

1 Ответ

0 голосов
/ 28 июня 2018

«Проблема наступает в конце игры». На самом деле проблема возникает гораздо раньше. Ты просто не замечаешь этого до конца. random.randrange(a,b) возвращает случайное целое число в интервале [a,b). Обратите внимание, что это никогда не включает b. Ваш код не выбирает случайное целое число от 1 до половины количества оставшихся шариков. Вместо этого он выбирает случайное число от 1 до 1, которое меньше половины шариков.

Исправление простое: используйте random.randint(a,b). Эта функция работает так, как вы ожидали, что random.randrange будет работать.

Небольшое замечание: вам не нужно использовать int с регулярным делением для вычисления nHalf. Просто используйте nHalf = nNumMarbles//2. Кроме того, никогда не было смысла использовать int с random.randrange. Эта функция уже возвращает целое число, даже если это не совсем целые числа, которые вы хотите.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...