Loading...
coaster avatar coaster 412 Точки

[Homework] C# Basics - Console Input Output - Problem {12**} - Falling Rocks

Здравейте, колеги!
Някой прегледа ли вече задачите за домашно от следващата лекция? Аз го направих вчера и останах заинтригувана от задача 12. Някой пробва ли се да я направи? За мен ще е голямо предизвикателство и надали ще се справя, но ми е много интересно по какъв начин се получават тези "падащи" елементи в конзолата. Нямам си и идея, може би ще трябва да се направи някакъв char array, който да съхранява въпросните "камъни", които да падат... Много различна задача от всички, които сме правили до сега, ще ми е интересно да видя решенията и идеите ви!
Ето и задачата за тези от вас, които още не са я прегледали :)

Problem12FallingRocks

Решения, пуснати в тази тема:

ViValDam
http://pastebin.com/R2VpdJ1H

mar0der
https://github.com/mar0der/FallingRocksGame/blob/master/FallingRocksGame.cs

vladislav_hadzhiyski
https://github.com/vladislavHadzhiyski/CSharpBasics/blob/master/SoftUniHW4/FallingRocks/FallingRocks.cs

achebg
http://pastebin.com/Q7TXRWbN

milen8204
http://pastebin.com/FNWjErFn

lubomirjurukov
http://pastebin.com/NtQiecwR

aslv1
http://pastebin.com/wijHas96

Fleshian
http://pastebin.com/bdfPJPHD

HPetrov
http://pastebin.com/AZjTNhE4

ZvetanIG
http://pastebin.com/W6f1virF

Darko
http://pastebin.com/LHhV3m4C

topalovr
https://www.dropbox.com/s/kk3ujtoxo2uf4pt/FallingRocks.rar

Samuil.Petrow
http://pastebin.com/1dzFDzYX

coaster
http://pastebin.com/LYKn26bH

 

 

 


Поздрави!

Тагове:
16
Programming Basics 04/09/2014 22:15:02
Iliya.Stoilov avatar Iliya.Stoilov 6 Точки

Абсолютно интересно звучи! Интересува ме мен има ли навитаци за отборно мислене по нея?

0
kiko144 avatar kiko144 795 Точки

Аз съм съгласен да се съберем в залата когато е свободна няколко човека и да се опитаме да я решим, не само нея а и другите с звездички от предишното и от следващото домашно! Ще бъде много полезно

2
Iliya.Stoilov avatar Iliya.Stoilov 6 Точки

Петък, събота и неделя съм зает през останалото време съм навит когато и да е! Свържи се с мен в скайп да се уговорим?

0
coaster avatar coaster 412 Точки

И аз съм навита, денят и часът нямат значение :)

0
beBoss avatar beBoss 507 Точки

Звучи лесничка и утре на бодър и свеж ум ще я напиша. Иначе ако има хора, които са започнали да я мъчат и нещо не се получава, може да разгледате, как са написани подобни почти идентични на тази задача в Академията. Едно-две видеа ще са добра инжекция за безброблемното написане на тази задача.:)

3
Iliya.Stoilov avatar Iliya.Stoilov 6 Точки

До колкото разбрах от лекцията, ще ни предоставят готов код без collision и някакъв вид скоринг система и ние трябва да свършим само това. Но щом ще я изядеш за закуска тази задача, давай! laughing

0
HPetrov avatar HPetrov 822 Точки

Ако дават готов код няма да е интересно :( Аз мисля да си поиграя малко с нея чак в понеделник... тъй де... нова седмица нов късмет :D

0
rosenrusev avatar rosenrusev 175 Точки

Здравейте,

 

Интересна задача и смятам да си блъскам главата над нея. Ето структуриран жокер от  "нинджи" какво трябва да се следва като стъпки, за да се реализира играта. Надявам се да съм бил полезен.

Важно е при писането, след като реализирате даден метод или няколко т.е. част от функционалността, да става на стъпки и да компилирате мнокоратно, а не да се стремите да напишете цялата програма на веднъж.  Така ще Ви е по-лесно да намирате допуснатите от Вас грешки на време :) Лично аз следвам тези стъпки при реализацията. Ще я имам тази задача и за закуска, и за  обяд, и за вечеря :))))))

Главните етапи при реализирането на играта са:

  1. Премахване на scrollbar-а на конзолата чрез задаване на фиксирани ширина и височина.
  2. Създаване на обектите:
    - Създаване на структура за играч
    - Създаване на структура камъните
    - Създаване на обект “player” с начални координати
    - Създаване на обект “rock” – Чрез for цикъл на един етап от програмата се създават няколко обекта. Техният брой (на една линия) зависи от “density”. “density” е със стойност от 0 до 4 и се определя с помощтта на Random Generator.
    За създаването на “rock” обект с произволен символ и произволен цвят, се използват масиви, съдържащи всички възможни символи и цветове. С Random Generator сред тях избираме случаен елемент със случаен цвят и произволна “X” координатата. Създадените обекти се добавят в List objects.
  3. Създаване на методи за принтиране на играча и на камъните (установяване на курсора съобразно координатите x и y, принира се даден символ с даден цвят)
  4. Местене на обектите:
    - Чрез безкраен while(true) цикъл се осигурява постоянното изпълнение на програмата. През определен интервал от време, задаван посредством Thread.Sleep(150), на конзолата се принтират новите състояния на обектите, след което тя се изчиства – Console.Clear(). Така се създава представата за движение.
    - Местене на камъните – На всеки един етап се прави проверка дали камъкът не е достигнал земята. Ако не е, “y” координатата на “rock” обектите от List objects се увеличава с 1.
    - Местене на играча – В случай, че има натиснат бутон от клавиатурата, се прави проверка дали играчът не е достигнал левия или десния край на конзолата. Ако не е, в зависимаост от това дали е натисната лява или дясна стрелка, “x” координатата на играча се намалява или увеличава с едно.
  5. Добаяне на “Lives”:
    - Създава се променлива “lives” с определена стойност
    - Създава се променива “chance”. Нейната стойност е от 0 до 100, избрана чрез Random Generator. Ако генерираната стойност е по-малка от 4, се създава “live” обект от тип Object, в противен случай – “rock” обект от тип Object
  6. Намаляване и увеличаване на животите:
    - Ако координатите на играча (широк три позиции) са еднакви с тези на някой обект и той не е “live”, животите намаляват
    - Ако координатите съвпадат и обектът е “live”, животите се увеличават
    - Чрез Console.Beep() може да се генерира звук с определена дължина и честота
  7. Край на играта – когато животите станат = 0, на конзолата се изписва “Game Over” и “Press Enter”. Чрез Console.ReadLine() се изчаква въвеждане и с Environment.Exit(0) се излиза от играта.
  8. Остава писане, проби, грешки и часове в циклене на предните операции докато заработи функционалността.
20
rosenrusev avatar rosenrusev 175 Точки

Прилагам още два полезни линка към задачата:

1) за установена позиция да направим операция: http://msdn.microsoft.com/en-us/library/system.console.setcursorposition(v=vs.110).aspx

2) за добавяне на цвят в конзолата: http://msdn.microsoft.com/en-us/library/system.console.foregroundcolor(v=vs.110).aspx

 

Приятна работа Ви желая :)

п.с. Поради факта, че задачата е наистина сложна, благодаря на колежката, че е отворила отделна тема за нея :)

3
Samuil.Petrow avatar Samuil.Petrow 1550 Точки

Ето една базова имплементация (цък) , възможно е да има дребни бъгове, които в последствие ще оправя, но остава един сериозен проблем:

За да постигна constant game speed ползвам timer, защото иначе ReadKey-a си чака и елементите не падат. (Как да го измисля по-лесно и читаво? проверка за null не ми спестява главоболията, какво пропускам :?)

С тази скорост нa Thread.Sleep обаче изглежда не се постига достатъчно бързо clear-ване на конзолата и съответно се вижда как елементите премигват. Опитах с друг timer за чистенето, но не ми се получи.. Дайте някакви идеи и насоки, моля :)

2
beBoss avatar beBoss 507 Точки

Ами първо, можеш да си сложиш тялото на играта в един while цикъл, който винаги да е true. Така играта винаги ще работи.

След това ще си направиш да чете за копче, както си направил и до сега, обаче си имал проблеми, с това, че чака да се въведе нещо, за да тръгне. Ами това ще го провериш с един if.

Нещо от сорта:

while(true)
{
...
if(Console.KeyAvailable)
{
ConsoleKeyInfo pressedKey = Console.ReadKey(true);
if(pressedKey.Key == ConsoleKey.leftArrow)
{
...
}
else if(pressedKey.Key == ConsoleKey.RightArrow)
{

}
}
...
Console.Clear();
...
//redraw game
...
//slowdown game
Thread.Sleep(100);
}

 

Също така speed-а да ти е глобална променлива.

Може да добавиш и 

 

while(Console.KeyAvailable) Console.ReadKey(true); под 

ConsoleKeyInfo pressedKey = Console.ReadKey(true);

 

за да върви играта по плавно, не да се пълни буфера с комбинации за посоките и да не се мести плавно. И така.

Идеята е чертаеш, триеш пак пречертаваш, пак триеш и така безкрайно.

п.с. Не съм писал кода в visual studio и може да има грешки в имената, но идеята мисля, че ще я схванеш.

1
Samuil.Petrow avatar Samuil.Petrow 1550 Точки

От целия пост единствено това за хващането на key-овете ми свърши работа и сега как отново да не ти кажа, че дори не си ми отворил кода, за да видиш, че другите неща са написани? :D Трябва ми конкретна причина, стъпките, които си написал съм ги направил, но не чисти достатъчно бързо... Благодаря ти иначе :)

2
HPetrov avatar HPetrov 822 Точки

Пробрах ти играта и ми стана доста интересно как си ги направил като "големи" камъни от по 2 символа и като цяло изглежда, че работи някък... Примигването го правеше доста неприятно обаче и мисля, че проблем прави това, че всичко пречертаваш наново с доста цикли и това го бави толкова дълго. Поне това е моето обяснение. За ReadKey пробвай с if или while да ти ги чете и може би ще бъде доста responsive и ще ти пести време от премигванията, не съм на 100% сигурен. Има проблем обаче при това как задаваш размери на конзолата. По твоя начин ми гърми като го стартирам докато не намаля шрифта на конзолата си до минималния (14px на Consolas). Пробвай с Console.BufferWidth и Console.BufferHeight да ги направиш на Console.WindowWidth/WindowHeight = нещо си. Не съм от най-добре обесняващите и ако има нещо не ясно просто погледни моето решение по-надолу :)

3
HPetrov avatar HPetrov 822 Точки

Ето я и моята имплементация на играта. Използвани са доста неща, които ще се вземат след 1-2 лекции и материал чак от C# 2-ра част но в случая са достатъчно опростени, че да може всеки да ги разбере. Единственото по не ясно е един for цикъл, който се изпълнява по време на играта и използва новосъздаден лист и създава нови елементи. Той служи за да може вече създадените елементи да се преместят на нова позиция. По-точно не може един елемент да се вземе от лист и да му се зададе просто нова стойност на една част от него. За целта създавам нов лист, в който създавам нови елементи и им придавам свойствата от старите елементи но вече с новата позиция. Накрая на for цикъла просто всички стойности от новата колекция елементи ги придавам към старите елементи от старата колекция и така с всяка итерация на while цикъла целия процес се повтаря всеки път. Поиграх си и да направя някакво intro на играта за да изглежда по-интересно, както и когато "умрем" също става нещо. Признавам, че доста взаимствах от една друга, доста подобна игра, но целях колкото мога повече да е приспособя към моята идея и виждане за нея. Мисля по нататък да добавя и някакви бонуси като например да добавят животи, екстра точки и каквото друго ми дойде на ум.

Ако има нещо не ясно питайте :P Otherwise play and enjoy!

1
Fleshian avatar Fleshian 379 Точки

Здравей :) .Ето няколко препоръки с които да съкратиш кода. В началото на while цикъла, където избираш кой "камък" да ти принтира , вместо switch statemnt може предваиртелно да добавиш всички знаци в char масив и да имаш: 
rock.c = stonesArray[rockDispenser.Next(stonesArray.Lenght)]
(и ако случайно незнаеш, като зададеш една стойност в Next, ти избира число от 0 до зададената стойност) .Това би премахнало целия switch statement. Другото което можеш да погледнеш е как да си направиш масив от цветове и да си избираш рандом цвят от масива. На мен ми беше полезен ей този линк .

0
HPetrov avatar HPetrov 822 Точки

Мерси, ще я оптимизирам малко по нататък като се върна към нея. Ще трябва да tweek-на малко scoring системата и 100% трябва да добавя бонуси. Може и също така на определени моменти от играта да пусне цяла стена от камъни само с 1 дупка през която да може да се мине.

0
milen8204 avatar milen8204 296 Точки

Ето едно решение (естествено не мое) намерих го от едни задачи на Telerik, но нищо не разбрах, кое как става така, че ако някой има мерак нека го обясни. Но по - добре е сами да стигнем до него, жокер по  жокер от по - знаещите :)

П.С. Сега да обмислим вариант как да пуснем на бек гроунд  песентта "Каманите падат". embarassed

0
ZloboMiR avatar ZloboMiR 50 Точки

Напиши мелодията да се тананика през спикъра като на истинска ДОС-игрица. :)

0
nikolay.paskulov avatar nikolay.paskulov 55 Точки

Имам един въпрос относно играта.

(малка предистория)

-Махнах scrollbars.

-Нарисувах играча.

-Направих така, че да може да се движи наляво и надясно.

(въпросът)

Как да направя така, че играчът да не може да напуска игралното поле, т.е конзолата, защото както добре се досещате ми изписва грешка, че съм надвишил Console.BufferWidth.

0
RoYaL avatar RoYaL Trainer 6849 Точки

Задал ли си размери? По принцип много зависи от начина ти на имплементация на всичко. Ама например можеш да не викаш MoveRight метода например, ако currPos == maxPos.

1
HPetrov avatar HPetrov 822 Точки

Просто направи проверка дали следващата позиция, била тя на ляво или на дясно, и ако не е извън границите на игралното ти поле значи можеш да се движиш.

1
topalovr avatar topalovr 16 Точки

Относно игричката доста е интересна и зарибяваща, а ето го и моето решение Цък

Ако на някой му е трудно, да изгледа видеото на Николай Костов Just Car, доста добре е обяснено, а и самата игра е подобна, само малко въображение и ще се получи. Цък

0
ViValDam avatar ViValDam 15 Точки

ексето ти блокира !

-2
ViValDam avatar ViValDam 15 Точки

Аз вече съм готова с Падащите камъни  smile  -  работи вече идеално , само още малко ще  си поиграя с играта  , за да я направя по -красива wink  и интересна и след малко ще я пусна тук .

Ето това видео , от Телерик, ми помогна да разбера как става това с игрите , играта във видеото се казава Just cars , но на практика е същата като нашата .

 

Ето ви линка и приятно занимание - на мен ми беше много забавно и още е cool !

 

http://www.youtube.com/watch?v=bQexyufgclY

 

4
Fleshian avatar Fleshian 379 Точки

Ето го и моето Решение .
Аз също съм използвал видеото от Софтуерната академия JustCars като основа за играта ми.
Правилата са прости, започва се с 2 живота, и може да събирате животчета с буквичка 'L' до максимум от 5 живота.
Печелят се по 10 точки за всеки камък който разминем а при загуба на живот се намаляват с 1000.
На всеки 1000 точки скоросто се увеличава като намалям threadSleep с -5.
Има и 20% шанс да се принитра празен ред тъй къто беше доста трудно , ако на всеки ред има камъни.
Доста си поиграх да не е твърде лесна или твърде трудна и мисля че се получи, макар че понякога каманите стават доста на гъсто и е невъзможно да ги избегнеш , но пък заради това има повече животи. Мисля да добавя функционалност при натискане на бутон да се жертват 2 живота за да се намали скороста на падане.  
Препоръчвам на всички да гледат видеото и да се опитат да я напрвят, дори и да не успеят ще научат много!  А това е по важно от направата на играта.
Feedback от всякакъв вид е добре дошъл. :)

1
ViValDam avatar ViValDam 15 Точки

Аз увеличавам скоростта след сблъсък с камък и намалявам при бонус за скорост - като съм сложила ограничения надолу и нагоре за да не падне съвсем скоростта или да не се увеличи прекалено - на 5 стъпки е увеличението .

Взимам живот при сблъсък с камък и давам живот при сблъсък с бонус за живот , като тук имама 3 различни бонуса за живот - за 1 , за 2 и за 3 живота, като тези за 3 са с мини шанс да се появат - 3 %

Друго интересно - вкарах и звуци cool  при сблъсък издава различни звуци конзолата.

За бонус точки си мисля също  - но трябва или точки да се събират и тогава бонус или направо с бонусите, като до сега да се получава награда  - живот или по-малка  скорост , а сега си мисля и да мелодия от конзолата ,като награда ...wink

 

Много забавна задача , ужасно ми хареса !cool

 

И се научават много неща !

5
ViValDam avatar ViValDam 15 Точки

За проблема ,че излизат много нагъсто камъните - разшири си игралното поле !

Така , ще имат по-малък шанс да се появяват на често, в една и съща х -позиция - успех ! smile

Моето поле playfield е 25 и е добре така .

 

Някой питаtе на горе за играча, че му падал - сложи му ограничение за х координата да е по-голяма и равна на 0 и по-малка и равна на големината на игралното ти поле и няма да пада wink

 

 

1
Можем ли да използваме бисквитки?
Ние използваме бисквитки и подобни технологии, за да предоставим нашите услуги. Можете да се съгласите с всички или част от тях.
Назад
Функционални
Използваме бисквитки и подобни технологии, за да предоставим нашите услуги. Използваме „сесийни“ бисквитки, за да Ви идентифицираме временно. Те се пазят само по време на активната употреба на услугите ни. След излизане от приложението, затваряне на браузъра или мобилното устройство, данните се трият. Използваме бисквитки, за да предоставим опцията „Запомни Ме“, която Ви позволява да използвате нашите услуги без да предоставяте потребителско име и парола. Допълнително е възможно да използваме бисквитки за да съхраняваме различни малки настройки, като избор на езика, позиции на менюта и персонализирано съдържание. Използваме бисквитки и за измерване на маркетинговите ни усилия.
Рекламни
Използваме бисквитки, за да измерваме маркетинг ефективността ни, броене на посещения, както и за проследяването дали дадено електронно писмо е било отворено.