Цель этой статьи - создать небольшую программу, которая генерирует случайное целое число (которое будет храниться в секрете от пользователя) и предлагает им вводить числа (догадки) в терминале (командная строка), пока они не введут число. это точное совпадение секретного целого числа.

То, что нам нужно

Следующие пакеты помогут нам выполнить нашу задачу:

- bufio - для захвата пользовательского ввода с терминала
- os - поле os. Stdin будет использоваться как в io reader, который передается в bufio
- math / rand - для генерации случайного целого числа
- log - для выхода из ОС при фатальной ошибке
- fmt - для печати строк на терминале
- strconv - для преобразования строковой записи в целое
- строки - для обрезки записи пользователя

Настраивать

Чтобы использовать новую функцию модулей Go, убедитесь, что в вашей системе установлен как минимум Go 1.11. Вы можете проверить версию Go с помощью этой команды на своем терминале:

идти версия

Создайте каталог в любом месте вашей системы (он может быть вне GOPATH) и вставьте в него cd, как показано ниже:

mkdir угадайка && игра угадайка компакт-диск

Оказавшись внутри каталога, введите следующую команду для инициализации модулей Go.

идти мод инициализировать угадайку

Это должно создать новый файл с именем go.mod внутри вашего каталога угадайка.

Теперь создайте файл main.go внутри каталога

коснитесь main.go

Ваша структура каталогов теперь должна выглядеть следующим образом:

- / угадайка

- main.go
- go.mod

Выполнение

Сгенерировать случайное целое число

import (
    "fmt"
    "math/rand"
)
var attempts []int
func main() {
    min := 1
    max := 10
    secret := rand.Intn(max-min) + min
    
    fmt.Println(secret)
}

Приведенный выше код генерирует случайное целое число от 1 до 100.
Вы можете увидеть метод Intn для rand пакету передается разница между максимальным и минимальным значениями, а минимальное значение добавляется к возвращаемому значению.

Чтобы не забыть, мы также создали глобальную переменную попытки, которая представляет собой фрагмент целых чисел. Этот срез необходим для отслеживания количества попыток, сделанных пользователем. При каждой попытке мы будем добавлять целое число к фрагменту попыток, и в конце, когда пользователь правильно угадает секретное целое число, мы просто получим длину фрагмента len (попытки) и уведомить пользователя с помощью следующего отформатированного сообщения:

message: = fmt.Sprintf («Поздравляю !!!, вы получили номер после% d попыток !!! \ n», len (попыток))

Проверьте свою реализацию

Сохраните приведенное выше, откройте свой терминал, соберите и запустите программу с помощью следующей команды:

иди строи && ./guessing-game

Предполагается, что команда выводит секретное целое число, которое находится между минимальным и максимальным значениями, которые вы указали для rand.Intn ().

Если вы углубитесь в каталог своей программы, вы найдете дополнительный файл, которого раньше не было. Это bin-файл, созданный командой go build, которую вы только что ввели в терминале.

Взаимодействовать с терминалом

Теперь вы можете использовать пакет bufio для захвата текста, вводимого пользователем в терминале.

func main() {
//...
    reader := bufio.NewReader(os.Stdin)
	fmt.Println("Enter an integer between 1 and 100")
	
	for {
		entry, err := reader.ReadString('\n')
		if err != nil {
			log.Fatal(err)
		}
		line := strings.Fields(entry)[0]
		num, err := strconv.Atoi(line)
		attempts = append(attempts, num)
	}
//...
}

Метод NewReader () из bufio принимает параметр io reader . В этом случае os.Stdin передается как параметр, и метод возвращает структуру reader, которая имеет метод под названием ReadString, который принимает разделитель (символ новой строки «\ n» в данном случае), который, в свою очередь, возвращает два значения (строку и ошибку), которые мы фиксируем в переменных entry и ошибся. Но до этого у нас есть простой оператор печати, предлагающий пользователю ввести целое число.

Цикл for выглядит странно, если вы переходите с другого языка программирования. Теоретически он похож на циклы while, которые есть в большинстве других языков. В этом случае цикл for выполняется бесконечно, пока мы не решим завершить программу. Позже мы добавим оператор break;, который выведет нас из цикла. Но код внутри этого цикла будет продолжать выполняться, пока программа работает и пользователь вводит значения на терминале.

После вызова ReadString ('\ n') мы проверяем, есть ли ошибка, и если это так, мы вызываем Неустранимый метод в пакете log для выхода из процесса. Но если ошибки нет, мы извлекаем первую запись с помощью метода Fields пакета strings. Метод Fields принимает строку (то, что пользователь вводит в терминале) и разбивает строку на фрагменты строк. Мы извлекаем первый элемент среза с помощью [0] и присваиваем значение переменной line.

Теперь, поскольку запись в терминале всегда имеет тип строка, нам нужно преобразовать ее в целое число, чтобы мы могли сравнить ее со значением в нашем секрете. переменная. Для этого мы будем использовать метод Atoi пакета strconv. Вы можете видеть, что мы передали строку в Atoi () выше и присвоили возвращенные значения num и ошибка.

Сравните запись с секретным числом

[code]
for {
    //...
        if err != nil {
            fmt.Println("Enter a number between 1 and 100.")
         } else if num < 1 || num > 100 {
fmt.Println("Enter a number between 1 and 100.")
        } else {
            if secret-5 <= num && num < secret {
                fmt.Println("You are extremely close from the left.")
            } else if secret-10 <= num && num < secret-5 {
                fmt.Println("You are very close from the left.")
            } else if secret-20 <= num && num < secret-10 {
                fmt.Println("You are somewhat close from the left.")
            } else if num < secret-20 { 
fmt.Println("You are way off from the left.") } else if secret+5 >= num && num > secret {
                fmt.Println("You are extremely close from the right.")
            } else if secret+10 >= num && num > secret+5 {
                fmt.Println("You are very close from the right.")
            } else if secret+20 >= num && num > secret+10 {
                fmt.Println("You are somewhat close from the right.")
            } else if num > secret+20 {
                fmt.Println("You are way off from the right.")
            } else if secret == num {
                message := fmt.Sprintf("Congrats!!!, You got the number after %d attempts!!!\n", len(attempts))
                fmt.Println(message)
                break
            }
        }

Наконец, мы сравниваем запись пользователя с секретным целым числом. Обратная связь предоставляется в зависимости от того, насколько близка запись к секретному номеру. Например, если пользователь вводит число, которое находится между целевым (секретным целым числом) и секретным целым числом минус 5, мы предоставляем им обратную связь вы очень близки слева . Если число меньше предыдущего диапазона, обратная связь также изменяется.

Когда пользователь вводит точное совпадение, создается форматированная строка, чтобы поздравить пользователя и уведомить его о количестве попыток, которые он сделал до достижения числа.

Резюме

Нам удалось реализовать небольшую программу Go, у которой был доступ к командной строке. Различные пакеты использовались для таких задач, как генерация случайного числа, чтение записей командной строки, преобразование строки в целое число и т. Д. Записи пользователя фиксировались и сравнивались с секретным целым числом, и различные обратные связи, основанные на близости, печатались на терминале.

Исходный код: Github

Подпишитесь на этот блог, чтобы получать больше статей и руководств по Golang.

Вы можете проверить наши другие курсы Golang на udemy: