Второ домашно за шеста група (Семинар)
Здравейте!
Това е второто ви домашно за този семестър. Искам да обърнете малко повече внимание на изискванията в него, защото ще пускам тестове върху решенията ви и затова вие ще трябва да спазвате сигнатурите на методите, точно така като съм ги изискал от вас. В противен случай, дори и да имате коректна имплементация вие няма да получавате точки. ИЗИСКВАНИЯ:1. ИМЕНУВАЙТЕ ПРОМЕНЛИВИТЕ СИ СЪС ЗНАЧЕЩИ ИМЕНА.
2. МЕТОДИТЕ Е ПРЕПОРЪЧИТЕЛНО ДА НЕ НАДВИШАВАТ 15 РЕДА. АКО ЛОГИКАТА Е ТВЪРДЕ ОБЕМНА - ИЗНЕСЕТЕ Я В ПОДМЕТОДИ
3. СПАЗВАЙТЕ ПРИНЦИПИТЕ НА ООП, ЗА КОИТО СМЕ ГОВОРИЛИ НА УПРАЖНЕНИЯ. ВСЯКО ЕДНО НАРУШЕНИЕ НА ТЯХ, ЩЕ ВИ КОСТВА ДОСТА ТОЧКИ
4. СПАЗВАЙТЕ ИЗИСКВАНИТЕ В УСЛОВИЕТО НА ЗАДАЧАТА СИГНАТУРИ
Това домашно, ще е част от поредица домашни, които ще са обвързани помежду си. Идеята ми е следващото ви домашно да надгражда текущото.
Както бях споменал на предишното ви домашно, това ще трябва да го надргажда. С други думи, ние по някакъв начин ще трябва да "разширим" функционалността върху нашата игра. Преди да започнете да пишете вашият код, аз искам да проверите коментарите, които съм ви оставил по вашите решения и да коригирате, където е нужно. За тези от вас, които са изпитали сериозни затруднения, тук: https://github.com/mathinvalidnik/PeerCodeReview са решенията на вашите колеги. Съветът ми е да ги прегледате и да видите дали можете да използвате някои от техните идеи, а дори и да ги подобрите във вашето решение. От сега ви казва: НЕ ПРЕПИСВАЙТЕ. Има начини, по които мога да разбера дали сте го направили и ако това стане ще ви отнемам точки.
Преди да започнете да пишете вашето решение искам да направите някои корекции. Както някои ваши колега забелязаха CowElement и BullElement биха могли да се имплементират в Private или Protected частта на вашия клас без да се подава първият аргумент. Това наистина е така, просто библиотеката, която ползвам аз можеше да тества само публичните членове на вашите класове. Това беше причината и мисля, че се получи добре понеже доста от тестовете, които пуснах на тези ви методи fail-наха. След като вече съм ви оставил коментари, вие можете да преместите тези методи в private частта на вашите класове и те да придобият следната сигнатура:
bool CowElement(int position, int value)
bool BullElement(int position, int value)
=================================================================================================================
Условието на вашето задание е да добавите като функционалност "подсказки". Това означава, че при избор на потребителя да се ползват подсказки вие ще трябва при всеки негов опит за отгатване да изгенерирвате някакво допълнително съобщение, с което да опитате да му помогнете да отгатне числото. Най-прост пример за това е:
Подсказки обвързани с текущо предположение:
Ако потребителят е въвел 1234 и като резултат имаме : Cows:0 Bulls: 0 [това означава, че нито едно от числата 1, 2, 3, 4 не участват в нашето число].
Ако потребителят е въвел 1234 и като резултат имаме : Cows: 4 Bulls: 0 [това означава, че 1, 2, 3, 4 участват в нашето число, но са на различни от текущите си позиции].
Освен това, можете да направите Подсказки, които са обвързани с предишно предположение.
1. Потребителят въвежда: 1234 -> Cows:0 Bulls:2
2. Потребителят въвежда: 1243 -> Cows:0 Bulls:2 [Това означава, че 1 и 2 са бикове]
Както и Подсказки, които се базират на всички досегашни предположения:
1. 1234 -> Cows:1 Bulls:1
2. 2134 -> Cows:2 Bulls:0
3. 3214 -> Cows:2 Bulls:0 [Това означава, че 1 е бикът]
За да може да ви стане ясно, каква е идеята на последователността от домашните, това е Class диаграма, която я изобразява.
Сегашното изискване към вас е да имплементирате класа Hints както и структурата AccHint. На третото домашно тази ваша имплементиация ще трябва да участва в класа BullsAndCowsWithHints, в който ще трябва да упражним наследяване и полиморфизъм. Идеята е в третото домашно да можем да пуснем игра, в която се показват подсказки след всеки наш опит за отгатване. Нещо от сорта:
Hints:
int* allGuesses - всички досегашни предположения
int currentGuess - текущото предположение
int previousGuess - предишното предположение
NewGuess(int guess) - добавя към allGuesses като се прави валидация
CurrentGuessHint() - съобщение-подсказка, което е обвързано с текущото предположение
PreviousGuessHint() - съобщение-подсказка, което е обвързано с текущото и предишното предположениe
AllGuessesHint() - съобщение-подсказка, което е обвързано с всички или повечето предположения
AnyHint() - флаг дали има някакви възможни подсказки
AnyAccurate() - флаг дали има някакви конкретни подсказки(позиция и стойност)
АccurateHints() - връща масив съдържащ една или повече конкретни подсказни за позция-стойност.
AccHint: int position - позиция, на която е числото int value - стойност, която е на position-та позиция
Това е минималният интерфейс, който трябва да се добави към вашите нови клас и структура. Вие можете да добавите допълнителни членове ако сметнете за необходимо. Ясно е, че няма как да предвидя всички възможни подсказки. Именно затова, аз искам да имаме едно просто разделяне в 3 групи и вие добавяйте вашата логика, в която от тях пожелаете(CurrentGuessHint, PreviousGuessHint, AllGuessesHint). АКО имате някаква логика за изгенерирване на подсказа и тя не е описана в условието, вие ще трябва да ми изпратите и .txt, в който накратко сте описали логиката, на базата на която изгенерирвате вашата подсказка.
За въпроси можете да ползвате тази тема във форума: https://learn.fmi.uni-sofia.bg/mod/forum/discuss.php?d=9204
УСПЕХ!