Форум программистов, компьютерный форум, киберфорум
Наши страницы
Clojure
Войти
Регистрация
Восстановить пароль
 
sodda
11 / 9 / 3
Регистрация: 28.07.2018
Сообщений: 21
1

Отладка программы

26.01.2019, 11:10. Просмотров 1758. Ответов 0
Метки нет (Все метки)

Лучший ответ Сообщение было отмечено iSmokeJC как решение

Решение

Решил потренироваться и написать небольшую программу.
Суть ее такова: у нас есть загаданное слово (в последствии оно может загружаться откуда-нибудь из файла)
и пользователю предлагается его отгадать.
После трех неудачных попыток пользователю предлагается воспользоваться подсказкой, если он отказываются, то продолжает дальше отгадывать, если соглашается, то ему выводится подсказка. Подсказок всего три, которые градируются по уровню того, что может из них почерпнуть пользователь.

Сам код:

Lisp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
(require '[clojure.string :as string])
 
(def y (atom 3)) ;первый счетчик
(def into-y (atom 4)) ;второй счетчик
 
(do
 (println "Угадай существо. Оно живет в океане.")
 (println "Введите \033[33mвыход\033[0m для завершения.\n") 
(defn trygame [] 
 (let [x (string/lower-case (read-line))]
  (when (not= x  "выход")
     (cond (some #{\1 \2 \3 \4 \5 \6 \7 \8 \9 \0} (vec x)) ;проверяем, вводит ли  пользователь  цифры 
              (println "Цифры тут не причем.\n")
           (> (count x) 20) 
              (println "Слишком много букв.\n")   ;проверяем длину вводимой строки
           (= x "кит")
              (println "Тепло.\n")                ;первая подсказка
           (not (= x "нарвал"))
              (println "Нет, это не" x"\b.""\n")  ;если введенное слово, не соответствует нашему загаданному, то сообщаем об этом
           :default
              (println "Да! Это" x"\b.""\n"))     ;если пользователь угадал слово, то так же сообщаем об этом
   (if (= (swap! y dec) 0) ;уменьшаем счетчик и заодно проверяем чему он равен.
      (do (println "\033[3;31mПодсказку?[да/нет]:\033[0m") ;входим или не входим в подсказку 
          (reset! y 4) ;перезагружаем счетчик
          (let [w (string/lower-case (read-line))] 
            (if (not (or (= w  "да") (= w "нет"))) 
                 (println "Введите да или нет:")  ;если пользователь не ввел требуемое да/нет, просим это сделать
                    (if (= w "да")  ;если ввел да
                     (do (swap! into-y dec) ;уменьшаем второй счетчик
                           (cond 
                              (= @into-y 3) 
                                  (println "\033[3;33mЭто млекопитающее.\033[0m\n")
                              (= @into-y 2) 
                                  (println "\033[3;33mЭто кит.\033[0m\n")
                              (= @into-y 1) 
                                  (do
                                    (println "\033[3;33mУ него есть огромной бивень.\033[0m\n")
                                    (reset! into-y 4)))) ;перезагружаем второй счетчик
                     (println "\nПродолжим:")))))) ;если пользователь ввел нет, то просим продолжить без подсказок      
   (recur)))))
 
(trygame)
Такая загвоздка возникла. После того как пользователю предлагается взять подсказку и он вводит не то, что ожидается, а это либо да, либо нет, выводится сообщение на экран о том, что нужно выбрать из этих двух вариантов.
И, соответственно введя, вариант да либо нет, он эту подсказку должен либо получить, либо нет.
Но после вывода сообщения и ввода да/нет у меня получается, что введенное слово расценивается как сопоставляемое со загаданным словом, поэтому никакой подсказки пользователь не получает.
Как это исправить? Может это связано с binding и областью видимости?

Добавлено через 3 часа 46 минут
Отвлекся, посмотрел свежими глазами, и проблема стала, вроде, вырисовываться.
Поскольку использован оператор if, то он возвращает результат и все на этом заканчивается.
Функция do не помогла в этом случае.
Отдельную функцию чтоль писать для этого?

Добавлено через 9 часов 53 минуты
Решение. Теперь все работает как надо. Правда получилось все громоздким.
Нужна анонимная функция и жизнь станет легче, но внутри нее нужна функция, реализующая функционал
C
1
do while
в С. Нужно узнать, если в Clojure нечто подобное иди попробовать самому ее реализовать.

Код:


Lisp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
(require '[clojure.string :as string])
 
(def y (atom 3)) ;первый счетчик
(def into-y (atom 4)) ;второй счетчик
 
(do
 (println "Угадай существо. Оно живет в океане.")
 (println "Введите \033[33mвыход\033[0m для завершения.\n") 
(defn trygame [] 
 (let [x (string/lower-case (read-line))]
  (when (not= x  "выход")
     (cond (some #{\1 \2 \3 \4 \5 \6 \7 \8 \9 \0} (vec x)) ;проверяем, вводит ли  пользователь  цифры 
              (println "Цифры тут не причем.\n")
           (> (count x) 20) 
              (println "Слишком много букв.\n")   ;проверяем длину вводимого слова  
           (= x "кит")
              (println "Тепло.\n")                ;первая подсказка
           (not (= x "нарвал"))
              (println "Нет, это не" x"\b.""\n")  ;если введенное слово не соответствует нашему загаданному, то сообщаем об этом
           :default
              (println "Да! Это" x"\b.""\n"))     ;если пользователь угадал слово, то так же сообщаем об этом
   (if (= (swap! y dec) 0) ;уменьшаем счетчик и заодно проверяем чему он равен.
      (do (println "\033[3;31mПодсказку?[да/нет]:\033[0m") ;входим или не входим в подсказку 
          (reset! y 3) ;перезагружаем счетчик
          (let [w (string/lower-case (read-line))] 
            (if (not (or (= w  "да") (= w "нет")))  
                 (do (println "Введите да или нет:") ;если пользователь не ввел требуемое да/нет, просим это сделать
                   (let [z (string/lower-case(read-line))]
                     (if (= z "да")  ;если ввел да
                        (do (swap! into-y dec) ;уменьшаем второй счетчик
                           (cond 
                              (= @into-y 3) 
                                  (println "\033[3;33mЭто млекопитающее.\033[0m\n")
                              (= @into-y 2) 
                                  (println "\033[3;33mЭто кит.\033[0m\n")
                              (= @into-y 1) 
                                  (do
                                    (println "\033[3;33mУ него есть огромной бивень.\033[0m\n")
                                    (reset! into-y 4)))) ;перезагружаем второй счетчик
                     (println "\nПродолжим:"))))
                 (do
                  (if (= w "да") 
                    (do (swap! into-y dec)
                       (cond
                          (= @into-y 3)
                              (println "\033[3;33mЭто млекопитающее.\033[0m\n")
                          (= @into-y 2)                   
                              (println "\033[3;33mЭто кит.\033[0m\n")
                          (= @into-y 1)
                              (do 
                                 (println "\033[3;33mУ него есть огромной бивень.\033[0m\n")          
                                 (reset! into-y 4))))
                            (println "\nПродолжим:"))))))) ;если пользователь ввел нет, то просим продолжить без подсказок      
     (recur)))))
 
(trygame)
Добавлено через 4 минуты
Админ, отметь тему как решенную пожалуйста или закрой.
0
Лучшие ответы (1)
QA
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
26.01.2019, 11:10
Ответы с готовыми решениями:

Отладка программы
1) Вывести первую и предпоследнюю строки файла. Если в файле только одна строка, то выводить...

Отладка программы
Здравствуйте, по заданию нужно было скомпилировать в командной строке вот такой код: .DATA a DB...

Отладка программы
Помогите отладить программу контроля CRC Вот сама прога Ругается на include cls.prc ...

Отладка программы.
Для заданного а вычислить f(a), где f(x) задана графиком ( график во вложении) . Вопрос: как...

Отладка программы
Здраствуйте! Написал программу под кодовый замок. В железе естественно не работает, т.к. только...

0
Answers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
26.01.2019, 11:10

Отладка программы в С++
Дали программу, которая должна считать количество введенных букв А, пробелов и остальных символов....

Отладка программы
Написал код для C89 стандарта. Пробую запускать на Dev С++ и Peller С, другие IDE в данный момент...

Отладка программы
Есть небольшие проблемы с отладкой программы. Компилятор молчит #include <stdio.h> #include...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
1
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2019, vBulletin Solutions, Inc.
Рейтинг@Mail.ru