diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..df54656 --- /dev/null +++ b/.gitignore @@ -0,0 +1,43 @@ +.gradle +build/ +!gradle/wrapper/gradle-wrapper.jar +!**/src/main/**/build/ +!**/src/test/**/build/ + +### IntelliJ IDEA ### +.idea/ +.idea/modules.xml +.idea/jarRepositories.xml +.idea/compiler.xml +.idea/libraries/ +*.iws +*.iml +*.ipr +out/ +!**/src/main/**/out/ +!**/src/test/**/out/ + +### Eclipse ### +.apt_generated +.classpath +.factorypath +.project +.settings +.springBeans +.sts4-cache +bin/ +!**/src/main/**/bin/ +!**/src/test/**/bin/ + +### NetBeans ### +/nbproject/private/ +/nbbuild/ +/dist/ +/nbdist/ +/.nb-gradle/ + +### VS Code ### +.vscode/ + +### Mac OS ### +.DS_Store \ No newline at end of file diff --git a/build.gradle.kts b/build.gradle.kts new file mode 100644 index 0000000..b4c6aaf --- /dev/null +++ b/build.gradle.kts @@ -0,0 +1,32 @@ +plugins { + id("java") +} + +group = "org.example" +version = "1.0-SNAPSHOT" + +repositories { + mavenCentral() +} + +dependencies { + testImplementation(platform("org.junit:junit-bom:5.10.0")) + testImplementation("org.junit.jupiter:junit-jupiter") + testRuntimeOnly("org.junit.platform:junit-platform-launcher") +} + +tasks.test { + useJUnitPlatform() +} +tasks.register("runLesson") { + group = "Execution" + description = "Run a specified main class" + if (project.hasProperty("mainClass")) { + mainClass.set(project.property("mainClass") as String) + classpath = sourceSets.main.get().runtimeClasspath + } else { + throw GradleException("Please specify mainClass. Example: ./gradlew runLesson -PmainClass=lessons.lesson02.Main") + } + + standardInput = System.`in` +} diff --git a/gradle/wrapper/gradle-wrapper.jar b/gradle/wrapper/gradle-wrapper.jar new file mode 100644 index 0000000..249e583 Binary files /dev/null and b/gradle/wrapper/gradle-wrapper.jar differ diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties new file mode 100644 index 0000000..213e688 --- /dev/null +++ b/gradle/wrapper/gradle-wrapper.properties @@ -0,0 +1,6 @@ +#Fri Sep 26 12:12:43 UZT 2025 +distributionBase=GRADLE_USER_HOME +distributionPath=wrapper/dists +distributionUrl=https\://services.gradle.org/distributions/gradle-8.14-bin.zip +zipStoreBase=GRADLE_USER_HOME +zipStorePath=wrapper/dists diff --git a/gradlew b/gradlew new file mode 100755 index 0000000..1b6c787 --- /dev/null +++ b/gradlew @@ -0,0 +1,234 @@ +#!/bin/sh + +# +# Copyright © 2015-2021 the original authors. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# https://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# + +############################################################################## +# +# Gradle start up script for POSIX generated by Gradle. +# +# Important for running: +# +# (1) You need a POSIX-compliant shell to run this script. If your /bin/sh is +# noncompliant, but you have some other compliant shell such as ksh or +# bash, then to run this script, type that shell name before the whole +# command line, like: +# +# ksh Gradle +# +# Busybox and similar reduced shells will NOT work, because this script +# requires all of these POSIX shell features: +# * functions; +# * expansions «$var», «${var}», «${var:-default}», «${var+SET}», +# «${var#prefix}», «${var%suffix}», and «$( cmd )»; +# * compound commands having a testable exit status, especially «case»; +# * various built-in commands including «command», «set», and «ulimit». +# +# Important for patching: +# +# (2) This script targets any POSIX shell, so it avoids extensions provided +# by Bash, Ksh, etc; in particular arrays are avoided. +# +# The "traditional" practice of packing multiple parameters into a +# space-separated string is a well documented source of bugs and security +# problems, so this is (mostly) avoided, by progressively accumulating +# options in "$@", and eventually passing that to Java. +# +# Where the inherited environment variables (DEFAULT_JVM_OPTS, JAVA_OPTS, +# and GRADLE_OPTS) rely on word-splitting, this is performed explicitly; +# see the in-line comments for details. +# +# There are tweaks for specific operating systems such as AIX, CygWin, +# Darwin, MinGW, and NonStop. +# +# (3) This script is generated from the Groovy template +# https://github.com/gradle/gradle/blob/master/subprojects/plugins/src/main/resources/org/gradle/api/internal/plugins/unixStartScript.txt +# within the Gradle project. +# +# You can find Gradle at https://github.com/gradle/gradle/. +# +############################################################################## + +# Attempt to set APP_HOME + +# Resolve links: $0 may be a link +app_path=$0 + +# Need this for daisy-chained symlinks. +while + APP_HOME=${app_path%"${app_path##*/}"} # leaves a trailing /; empty if no leading path + [ -h "$app_path" ] +do + ls=$( ls -ld "$app_path" ) + link=${ls#*' -> '} + case $link in #( + /*) app_path=$link ;; #( + *) app_path=$APP_HOME$link ;; + esac +done + +APP_HOME=$( cd "${APP_HOME:-./}" && pwd -P ) || exit + +APP_NAME="Gradle" +APP_BASE_NAME=${0##*/} + +# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. +DEFAULT_JVM_OPTS='"-Xmx64m" "-Xms64m"' + +# Use the maximum available, or set MAX_FD != -1 to use that value. +MAX_FD=maximum + +warn () { + echo "$*" +} >&2 + +die () { + echo + echo "$*" + echo + exit 1 +} >&2 + +# OS specific support (must be 'true' or 'false'). +cygwin=false +msys=false +darwin=false +nonstop=false +case "$( uname )" in #( + CYGWIN* ) cygwin=true ;; #( + Darwin* ) darwin=true ;; #( + MSYS* | MINGW* ) msys=true ;; #( + NONSTOP* ) nonstop=true ;; +esac + +CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar + + +# Determine the Java command to use to start the JVM. +if [ -n "$JAVA_HOME" ] ; then + if [ -x "$JAVA_HOME/jre/sh/java" ] ; then + # IBM's JDK on AIX uses strange locations for the executables + JAVACMD=$JAVA_HOME/jre/sh/java + else + JAVACMD=$JAVA_HOME/bin/java + fi + if [ ! -x "$JAVACMD" ] ; then + die "ERROR: JAVA_HOME is set to an invalid directory: $JAVA_HOME + +Please set the JAVA_HOME variable in your environment to match the +location of your Java installation." + fi +else + JAVACMD=java + which java >/dev/null 2>&1 || die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. + +Please set the JAVA_HOME variable in your environment to match the +location of your Java installation." +fi + +# Increase the maximum file descriptors if we can. +if ! "$cygwin" && ! "$darwin" && ! "$nonstop" ; then + case $MAX_FD in #( + max*) + MAX_FD=$( ulimit -H -n ) || + warn "Could not query maximum file descriptor limit" + esac + case $MAX_FD in #( + '' | soft) :;; #( + *) + ulimit -n "$MAX_FD" || + warn "Could not set maximum file descriptor limit to $MAX_FD" + esac +fi + +# Collect all arguments for the java command, stacking in reverse order: +# * args from the command line +# * the main class name +# * -classpath +# * -D...appname settings +# * --module-path (only if needed) +# * DEFAULT_JVM_OPTS, JAVA_OPTS, and GRADLE_OPTS environment variables. + +# For Cygwin or MSYS, switch paths to Windows format before running java +if "$cygwin" || "$msys" ; then + APP_HOME=$( cygpath --path --mixed "$APP_HOME" ) + CLASSPATH=$( cygpath --path --mixed "$CLASSPATH" ) + + JAVACMD=$( cygpath --unix "$JAVACMD" ) + + # Now convert the arguments - kludge to limit ourselves to /bin/sh + for arg do + if + case $arg in #( + -*) false ;; # don't mess with options #( + /?*) t=${arg#/} t=/${t%%/*} # looks like a POSIX filepath + [ -e "$t" ] ;; #( + *) false ;; + esac + then + arg=$( cygpath --path --ignore --mixed "$arg" ) + fi + # Roll the args list around exactly as many times as the number of + # args, so each arg winds up back in the position where it started, but + # possibly modified. + # + # NB: a `for` loop captures its iteration list before it begins, so + # changing the positional parameters here affects neither the number of + # iterations, nor the values presented in `arg`. + shift # remove old arg + set -- "$@" "$arg" # push replacement arg + done +fi + +# Collect all arguments for the java command; +# * $DEFAULT_JVM_OPTS, $JAVA_OPTS, and $GRADLE_OPTS can contain fragments of +# shell script including quotes and variable substitutions, so put them in +# double quotes to make sure that they get re-expanded; and +# * put everything else in single quotes, so that it's not re-expanded. + +set -- \ + "-Dorg.gradle.appname=$APP_BASE_NAME" \ + -classpath "$CLASSPATH" \ + org.gradle.wrapper.GradleWrapperMain \ + "$@" + +# Use "xargs" to parse quoted args. +# +# With -n1 it outputs one arg per line, with the quotes and backslashes removed. +# +# In Bash we could simply go: +# +# readarray ARGS < <( xargs -n1 <<<"$var" ) && +# set -- "${ARGS[@]}" "$@" +# +# but POSIX shell has neither arrays nor command substitution, so instead we +# post-process each arg (as a line of input to sed) to backslash-escape any +# character that might be a shell metacharacter, then use eval to reverse +# that process (while maintaining the separation between arguments), and wrap +# the whole thing up as a single "set" statement. +# +# This will of course break if any of these variables contains a newline or +# an unmatched quote. +# + +eval "set -- $( + printf '%s\n' "$DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS" | + xargs -n1 | + sed ' s~[^-[:alnum:]+,./:=@_]~\\&~g; ' | + tr '\n' ' ' + )" '"$@"' + +exec "$JAVACMD" "$@" diff --git a/gradlew.bat b/gradlew.bat new file mode 100644 index 0000000..ac1b06f --- /dev/null +++ b/gradlew.bat @@ -0,0 +1,89 @@ +@rem +@rem Copyright 2015 the original author or authors. +@rem +@rem Licensed under the Apache License, Version 2.0 (the "License"); +@rem you may not use this file except in compliance with the License. +@rem You may obtain a copy of the License at +@rem +@rem https://www.apache.org/licenses/LICENSE-2.0 +@rem +@rem Unless required by applicable law or agreed to in writing, software +@rem distributed under the License is distributed on an "AS IS" BASIS, +@rem WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +@rem See the License for the specific language governing permissions and +@rem limitations under the License. +@rem + +@if "%DEBUG%" == "" @echo off +@rem ########################################################################## +@rem +@rem Gradle startup script for Windows +@rem +@rem ########################################################################## + +@rem Set local scope for the variables with windows NT shell +if "%OS%"=="Windows_NT" setlocal + +set DIRNAME=%~dp0 +if "%DIRNAME%" == "" set DIRNAME=. +set APP_BASE_NAME=%~n0 +set APP_HOME=%DIRNAME% + +@rem Resolve any "." and ".." in APP_HOME to make it shorter. +for %%i in ("%APP_HOME%") do set APP_HOME=%%~fi + +@rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. +set DEFAULT_JVM_OPTS="-Xmx64m" "-Xms64m" + +@rem Find java.exe +if defined JAVA_HOME goto findJavaFromJavaHome + +set JAVA_EXE=java.exe +%JAVA_EXE% -version >NUL 2>&1 +if "%ERRORLEVEL%" == "0" goto execute + +echo. +echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. +echo. +echo Please set the JAVA_HOME variable in your environment to match the +echo location of your Java installation. + +goto fail + +:findJavaFromJavaHome +set JAVA_HOME=%JAVA_HOME:"=% +set JAVA_EXE=%JAVA_HOME%/bin/java.exe + +if exist "%JAVA_EXE%" goto execute + +echo. +echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME% +echo. +echo Please set the JAVA_HOME variable in your environment to match the +echo location of your Java installation. + +goto fail + +:execute +@rem Setup the command line + +set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar + + +@rem Execute Gradle +"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %* + +:end +@rem End local scope for the variables with windows NT shell +if "%ERRORLEVEL%"=="0" goto mainEnd + +:fail +rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of +rem the _cmd.exe /c_ return code! +if not "" == "%GRADLE_EXIT_CONSOLE%" exit 1 +exit /b 1 + +:mainEnd +if "%OS%"=="Windows_NT" endlocal + +:omega diff --git a/settings.gradle.kts b/settings.gradle.kts new file mode 100644 index 0000000..32f0fe9 --- /dev/null +++ b/settings.gradle.kts @@ -0,0 +1 @@ +rootProject.name = "java-core" \ No newline at end of file diff --git a/src/main/java/lessons/lesson02/BaseTasks.java b/src/main/java/lessons/lesson02/BaseTasks.java new file mode 100644 index 0000000..ffbf055 --- /dev/null +++ b/src/main/java/lessons/lesson02/BaseTasks.java @@ -0,0 +1,208 @@ +package lessons.lesson02; + +import java.util.Scanner; + +public class BaseTasks { + private final Scanner scanner; + + public BaseTasks(final Scanner scanner) { + this.scanner = scanner; + } + + public void run() { + System.out.println("Вывести числа от 1 до 100"); + + printHundred(); + + System.out.println("---------------------"); + + System.out.println("Сумма чисел от 1 до N"); + System.out.print("Введите N:"); + + int sum = getSumOfNNumbers(); + + System.out.printf("Сумма: %d%n", sum); + + System.out.println("---------------------"); + + System.out.println("Произведение чисел от 1 до N."); + System.out.print("Введите N:"); + + int mult = getMultiplicationOfNumbers(); + + System.out.printf("Произведение: %d%n", mult); + + System.out.println("---------------------"); + + System.out.println("Сумма четных чисел от 1 до N."); + + System.out.print("Введите N:"); + + int sumOfEven = getSumOfEvenNNumbers(); + + System.out.printf("Сумма четных чисел: %d%n", sumOfEven); + + System.out.println("---------------------"); + + System.out.println("Сумма цифр числа N"); + + System.out.print("Введите N:"); + + int sumOfDigits = getDigitSum(); + + System.out.printf("Сумма цифр числа N: %d%n", sumOfDigits); + + System.out.println("---------------------"); + + System.out.println("Разворот числа N"); + + System.out.print("Введите N:"); + + printNumberReverse(); + + System.out.println("---------------------"); + + System.out.printf("первое число, которое делится на 7 и больше 1000: %d%n", getFirstDivisionBySeven()); + + + System.out.println("---------------------"); + + System.out.println("Вывести все простые числа до N."); + System.out.print("Введите N:"); + printPrimeNumbers(); + + System.out.println("---------------------"); + + System.out.println("треугольники из звездочек:"); + + printTriangles(); + } + + public void printHundred() { + for (int i = 1; i <= 100; i++) { + System.out.printf("%d, ", i); + + if (i % 10 == 0) { + System.out.print("\n"); + } + } + } + + public int getSumOfNNumbers() { + int sum = 0; + + int n = scanner.nextInt(); + + for (int i = 1; i < n; i++) { + sum += i; + } + + return sum; + } + + public int getMultiplicationOfNumbers() { + int mult = 1; + + int n = scanner.nextInt(); + + for (int i = 2; i <= n; i++) { + mult *= i; + } + + return mult; + } + + public int getSumOfEvenNNumbers() { + int sum = 0; + + int n = scanner.nextInt(); + + for (int i = 2; i < n; i += 2) { + sum += i; + } + + return sum; + } + + public int getDigitSum() { + int sum = 0; + + scanner.nextLine(); + String number = String.valueOf(scanner.nextInt()); + + String[] digitsAsStringList = number.split(""); + + for (String digitAsString : digitsAsStringList) { + sum += Integer.parseInt(digitAsString); + } + + return sum; + } + + public void printNumberReverse() { + String number = scanner.nextLine(); + + StringBuilder stringBuilder = new StringBuilder(number); + + System.out.println(stringBuilder.reverse()); + } + + public int getFactorial() { + return getMultiplicationOfNumbers(); + } + + public int getFirstDivisionBySeven() { + int number = 1000; + + while (number % 7 != 0) { + number++; + } + + return number; + } + + public boolean isPrime(int number) { + if (number < 1) return false; + + for (int i = 2; i < number; i++) { + if (number % i == 0) return false; + } + + return true; + } + + public void printPrimeNumbers() { + int number = scanner.nextInt(); + + for (int i = 2; i < number; i++) { + if (isPrime(i)) { + System.out.print(i); + + if (i != number - 1) { + System.out.print(", "); + } + } + } + + System.out.print("\n"); + } + + public void printTriangles() { + int triangleWidth = 5; + int gap = 4; + + for (int i = 1; i < triangleWidth; i++) { + System.out.print("*".repeat(i)); + System.out.print(" ".repeat(gap)); + System.out.println("*".repeat(triangleWidth - i)); + } + + System.out.println("\n"); + + for (int i = triangleWidth - 1; i > 0; i--) { + System.out.print("*".repeat(i)); + System.out.print(" ".repeat(gap)); + System.out.println("*".repeat(triangleWidth - i)); + } + } +} diff --git a/src/main/java/lessons/lesson02/Main.java b/src/main/java/lessons/lesson02/Main.java new file mode 100644 index 0000000..3dd0663 --- /dev/null +++ b/src/main/java/lessons/lesson02/Main.java @@ -0,0 +1,27 @@ +package lessons.lesson02; + +import java.util.Scanner; + +public class Main { + public static void main(String[] args) { + System.out.println("Выберите программу:"); + System.out.println("1 - Базовые задания"); + System.out.println("2 - Практические задания"); + System.out.println("3 - Квест"); + + Scanner scanner = new Scanner(System.in); + + String programNumber = scanner.nextLine(); + + + switch (programNumber) { + case "1" -> new BaseTasks(scanner).run(); + + case "2" -> new PracticeTasks(scanner).run(); + + case "3" -> new Quest(scanner).run(); + } + + scanner.close(); + } +} diff --git a/src/main/java/lessons/lesson02/PracticeTasks.java b/src/main/java/lessons/lesson02/PracticeTasks.java new file mode 100644 index 0000000..4b7396b --- /dev/null +++ b/src/main/java/lessons/lesson02/PracticeTasks.java @@ -0,0 +1,195 @@ +package lessons.lesson02; + +import java.util.Random; +import java.util.Scanner; + +public class PracticeTasks { + private final Scanner scanner; + + public PracticeTasks(Scanner scanner) { + this.scanner = scanner; + } + + public void run() { + System.out.println("Обмен значений"); + + System.out.println("Введите два числа"); + + swapValues(); + + System.out.println("------------"); + + System.out.println("Таблица умножения"); + + System.out.print("Введите число:"); + + printMultiplicationTable(); + + System.out.println("------------"); + + System.out.println("Конвертер валют"); + + System.out.print("Введите сумму в долларах:"); + + convertCurrency(); + + System.out.println("------------"); + + System.out.println("Чётное или нечётное"); + + System.out.print("Введите число:"); + + findEvenOrOdd(); + + System.out.println("------------"); + + System.out.println("Максимум из трёх"); + + maximumOfThree(); + + System.out.println("------------"); + + System.out.println("Калькулятор"); + + calculator(); + + System.out.println("------------"); + + System.out.println("Среднее арифметическое"); + + findAvg(); + + System.out.println("------------"); + + System.out.println("Поиск элемента"); + + System.out.println(checkArrayForNumber()); + + System.out.println("------------"); + + System.out.println("Мини-игра \"Угадай число\" "); + + guessTheNumber(); + } + + public void swapValues() { + int numberOne = scanner.nextInt(); + int numberTwo = scanner.nextInt(); + + System.out.println(numberTwo); + System.out.println(numberOne); + } + + public void printMultiplicationTable() { + int number = scanner.nextInt(); + + for (int i = 1; i < 10; i++) { + System.out.printf("%d x %d = %d%n", number, i, number * i); + } + } + + public void convertCurrency() { + int exchange = 12500; + + long money = scanner.nextLong(); + + System.out.println(money * exchange); + } + + public void findEvenOrOdd() { + int number = scanner.nextInt(); + + if (number % 2 == 0) { + System.out.println("Чётное"); + } else { + System.out.println("нечётное"); + } + } + + public void maximumOfThree() { + int a = scanner.nextInt(); + int b = scanner.nextInt(); + int c = scanner.nextInt(); + + if (a > b && a > c) { + System.out.println(a); + } else if (b > a && b > c) { + System.out.println(b); + } else if (c > b && c > a) { + System.out.println(c); + } + } + + public void calculator() { + int a = scanner.nextInt(); + int b = scanner.nextInt(); + scanner.nextLine(); + String operation = scanner.nextLine(); + + switch (operation) { + case "+": { + System.out.println(a + b); + return; + } + + case "-": { + System.out.println(a - b); + return; + } + + case "*": { + System.out.println(a * b); + return; + } + + case "/": { + System.out.println(a / b); + } + } + } + + public void findAvg() { + String numbersAsString = scanner.nextLine(); + + String[] numbersAsStringList = numbersAsString.split(", "); + + int sumOfNumbers = 0; + + for (String s : numbersAsStringList) { + sumOfNumbers += Integer.parseInt(s); + } + + System.out.println(sumOfNumbers / numbersAsStringList.length); + } + + public boolean checkArrayForNumber() { + String numbersAsString = scanner.nextLine(); + String[] numbersAsStringList = numbersAsString.split(", "); + + String numberAsString = scanner.nextLine(); + + for (String number : numbersAsStringList) { + if (number.equals(numberAsString)) { + return true; + } + } + + return false; + } + + public void guessTheNumber() { + int number = new Random().nextInt(); + int tryCount = 3; + + while (tryCount != 0) { + int inputNumber = scanner.nextInt(); + + if (inputNumber == number) { + System.out.println("You win!"); + } + + tryCount--; + System.out.printf("Wrong! %d tries left! %n", tryCount); + } + } +} diff --git a/src/main/java/lessons/lesson02/Quest.java b/src/main/java/lessons/lesson02/Quest.java new file mode 100644 index 0000000..2a6a0f7 --- /dev/null +++ b/src/main/java/lessons/lesson02/Quest.java @@ -0,0 +1,162 @@ +package lessons.lesson02; + +import java.util.HashMap; +import java.util.Map; +import java.util.Scanner; + +public class Quest { + private final Scanner scanner; + private State state; + private boolean isRunning; + private Map scenes; + + enum State { + S_1, S_2A, S_2B, S_2C, S_3A, S_3B, S_3C, S_3D, S_3E, S_3F, S_4A, S_4B + } + + public Quest(Scanner scanner) { + this.scanner = scanner; + this.state = State.S_1; + this.isRunning = true; + this.scenes = new HashMap<>(); + + scenes.put(State.S_1, sceneOne()); + scenes.put(State.S_2A, sceneTwoA()); + scenes.put(State.S_2B, sceneTwoB()); + scenes.put(State.S_2C, sceneTwoC()); + scenes.put(State.S_3A, sceneThreeA()); + scenes.put(State.S_3B, sceneThreeB()); + scenes.put(State.S_3C, sceneThreeC()); + scenes.put(State.S_3D, sceneThreeD()); + scenes.put(State.S_3E, sceneThreeE()); + scenes.put(State.S_3F, sceneThreeF()); + scenes.put(State.S_4A, sceneFourA()); + scenes.put(State.S_4B, sceneFourB()); + } + + public void run() { + while (isRunning) { + scenes.get(this.state).run(); + } + } + + public Runnable sceneOne() { + return () -> { + System.out.println("Ты приходишь в себя на холодном песке у берега озера. Вокруг — туман, ночь, ни души. Телефон в кармане почти разряжен (1%).\n" + "В другом кармане — спичка и клочок бумаги с надписью:\n" + "\"Не доверяй голосам. Иди к северу.\"\n"); + + System.out.println("1 - \uD83D\uDD26 Пойти на восток, туда, где в тумане мерцает свет."); + System.out.println("2 - \uD83E\uDDED Пойти на север, как советует записка."); + System.out.println("3 - \uD83E\uDEB5 Остаться у озера, может, кто-то придёт."); + + int choice = getChoice(3); + + switch (choice) { + case 1 -> state = State.S_2A; + + case 2 -> state = State.S_2B; + + case 3 -> state = State.S_2C; + } + }; + } + + + private Runnable sceneTwoA() { + return () -> { + System.out.println("\n📍 Сцена 2A: Восточный свет"); + System.out.println("Ты идёшь на свет и находишь старую электростанцию. Внезапно загорается прожектор.\n" + "Голос в громкоговорителе: «Стоять. Идентификация...\"\n" + "Ты ничего не понимаешь.\n"); + System.out.println("Выбор:"); + System.out.println("1 - 🤖 Ответить: «Я человек, я потерялся!»"); + System.out.println("2 - 🏃 Убежать назад в лес."); + + int choice = getChoice(2); + state = (choice == 1) ? State.S_3A : State.S_3B; + }; + } + + private Runnable sceneTwoB() { + return () -> { + System.out.println("\n📍 Сцена 2B: Северный путь"); + System.out.println("Ты следуешь на север и находишь заброшенную деревню. " + "Дома пусты, но в одном — следы костра и дневник.\n" + "\"Озеро просыпается в полнолуние. Не верь голосам. Прячься до рассвета.\"\n"); + System.out.println("Выбор:"); + System.out.println("1 - 🔥 Остаться в доме до рассвета."); + System.out.println("2 - 🚪 Выйти и идти дальше в туман."); + + int choice = getChoice(2); + state = (choice == 1) ? State.S_3C : State.S_3D; + }; + } + + private Runnable sceneTwoC() { + return () -> { + System.out.println("\n📍 Сцена 2C: Ожидание у озера"); + System.out.println("Ты остаёшься на месте. Из тумана слышишь детский голос:\n" + "«Помоги мне… пожалуйста…»\n" + "Тебя охватывает страх.\n"); + System.out.println("Выбор:"); + System.out.println("1 - 👧 Пойти на голос."); + System.out.println("2 - 😨 Убежать прочь в лес."); + + int choice = getChoice(2); + state = (choice == 1) ? State.S_3E : State.S_3F; + }; + } + + private Runnable sceneThreeA() { + return endScene("📍 Сцена 3A: Попытка общения", "Ты кричишь, но свет слепит тебя. Из темноты появляется фигура в противогазе.\nВас усыпляют. Очнулся ты уже в лаборатории. Ты стал частью эксперимента.\nКонцовка: Неудача"); + } + + private Runnable sceneThreeB() { + return endScene("📍 Сцена 3B: Побег", "Ты бежишь, но спотыкаешься. Прожектор гаснет. Что-то двигается в кустах.\nТы исчез без следа.\nКонцовка: Неудача"); + } + + private Runnable sceneThreeC() { + return endScene("📍 Сцена 3C: Ожидание", "Ты сидишь у костра. Проходят часы. На рассвете из тумана выходит группа людей — выжившие.\nОни помогают тебе выбраться.\nКонцовка: Победа"); + } + + private Runnable sceneThreeD() { + return endScene("📍 Сцена 3D: Поиски", "Ты блуждаешь в тумане и выходишь к маяку. Там — старая рация. Связь удаётся установить.\nНа следующий день — эвакуация.\nКонцовка: Победа"); + } + + private Runnable sceneThreeE() { + return endScene("📍 Сцена 3E: Девочка", "Ты идёшь на голос и видишь девочку в белом. Она улыбается и исчезает в воде.\nВокруг тебя — тени. Ты не можешь двигаться.\nКонцовка: Проклятие озера"); + } + + private Runnable sceneThreeF() { + return () -> { + System.out.println("\n📍 Сцена 3F: Побег в лес"); + System.out.println("Ты бежишь прочь. Натыкаешься на подземный люк. Внутри — бункер. Там — доказательства эксперимента: мониторы, карты, журналы.\n"); + System.out.println("Выбор:"); + System.out.println("1 - 💣 Разрушить центр управления."); + System.out.println("2 - 🧠 Присоединиться к проекту."); + + int choice = getChoice(2); + state = (choice == 1) ? State.S_4A : State.S_4B; + }; + } + + private Runnable sceneFourA() { + return endScene("📍 Сцена 4A: Разрушение", "Ты активируешь самоуничтожение. Озеро начинает светиться. Тьма уходит. Ты спас мир… но погиб.\nКонцовка: Герой"); + } + + private Runnable sceneFourB() { + return endScene("📍 Сцена 4B: Присоединение", "Ты входишь в проект. Тебе дают новое имя. Ты становишься частью того, что раньше преследовало тебя.\nКонцовка: Тайный участник"); + } + + + private Runnable endScene(String title, String text) { + return () -> { + System.out.println("\n" + title); + System.out.println(text); + isRunning = false; + }; + } + + private int getChoice(int max) { + int choice = scanner.nextInt(); + + while (choice < 1 || choice > max) { + System.out.println("Неверный ввод. Введите от 1 до " + max); + choice = scanner.nextInt(); + } + return choice; + } +} diff --git a/src/main/java/lessons/lesson03/bankaccount/BankAccount.java b/src/main/java/lessons/lesson03/bankaccount/BankAccount.java new file mode 100644 index 0000000..9523d0b --- /dev/null +++ b/src/main/java/lessons/lesson03/bankaccount/BankAccount.java @@ -0,0 +1,48 @@ +package lessons.lesson03.bankaccount; + + +public class BankAccount { + private final String fio; + private final Integer accountNumber; + private Double balance; + + + public BankAccount(String fio, Integer accountNumber, Double balance) { + this.fio = fio; + this.accountNumber = accountNumber; + this.balance = balance; + } + + public void deposit(double amount) { + if (amount > 0) { + balance += amount; + System.out.println("Внесено: " + amount); + } else { + System.out.println("Сумма должна быть больше 0"); + } + } + + public void withdraw(double amount) { + if (amount > 0 && amount <= balance) { + balance -= amount; + System.out.println("Снято: " + amount); + } else if (amount <= 0) { + System.out.println("Сумма должна быть больше 0"); + } else { + System.out.println("Недостаточно средств на счете"); + } + } + + public Double getBalance() { + return this.balance; + } + + + public String getFio() { + return fio; + } + + public Integer getAccountNumber() { + return accountNumber; + } +} diff --git a/src/main/java/lessons/lesson03/bankaccount/BankAccountApplication.java b/src/main/java/lessons/lesson03/bankaccount/BankAccountApplication.java new file mode 100644 index 0000000..61078d9 --- /dev/null +++ b/src/main/java/lessons/lesson03/bankaccount/BankAccountApplication.java @@ -0,0 +1,19 @@ +package lessons.lesson03.bankaccount; + + +public class BankAccountApplication { + + public static void main(String[] args) { + BankAccount bankAccount = new BankAccount("My Name", 345666, 69.99); + + System.out.printf("Balance: %s\n", bankAccount.getBalance()); + + bankAccount.deposit(1000.0); + + System.out.printf("Balance: %s\n", bankAccount.getBalance()); + + bankAccount.withdraw(70.00); + + System.out.printf("Balance: %s\n", bankAccount.getBalance()); + } +} diff --git a/src/main/java/lessons/lesson03/banksystem/BankAccount.java b/src/main/java/lessons/lesson03/banksystem/BankAccount.java new file mode 100644 index 0000000..7d8f76c --- /dev/null +++ b/src/main/java/lessons/lesson03/banksystem/BankAccount.java @@ -0,0 +1,35 @@ +package lessons.lesson03.banksystem; + +public class BankAccount { + private final String fio; + private final Integer accountNumber; + private Double balance; + + public BankAccount(String fio, Integer accountNumber, Double balance) { + this.fio = fio; + this.accountNumber = accountNumber; + this.balance = balance; + } + + public Double getBalance() { + return this.balance; + } + + public String getFio() { + return fio; + } + + public Integer getAccountNumber() { + return accountNumber; + } + + public void setBalance(final Double amount) { + this.balance = amount; + } + + + @Override + public String toString() { + return String.format("Fio: %s\nAccount number: %s\nBalance: %s", fio, accountNumber, balance); + } +} diff --git a/src/main/java/lessons/lesson03/banksystem/BankAccountRepository.java b/src/main/java/lessons/lesson03/banksystem/BankAccountRepository.java new file mode 100644 index 0000000..6778fe2 --- /dev/null +++ b/src/main/java/lessons/lesson03/banksystem/BankAccountRepository.java @@ -0,0 +1,39 @@ +package lessons.lesson03.banksystem; + +import java.util.HashMap; +import java.util.Map; +import java.util.Optional; + +public class BankAccountRepository { + private final Map acounts; + + public BankAccountRepository() { + this.acounts = new HashMap<>(); + } + + + public Optional findByAccountNumber(final Integer accountNumber) { + return Optional.ofNullable(acounts.get(accountNumber)); + } + + public boolean existsByAccountNumber(final Integer accountNumber) { + return acounts.containsKey(accountNumber); + } + + + public void save(final BankAccount bankAccount) { + Integer accountNumber = bankAccount.getAccountNumber(); + + acounts.put(accountNumber, bankAccount); + } + + + public void updateBalance(final Integer accountNumber, final Double balance) { + acounts.get(accountNumber).setBalance(balance); + } + + + public void delete(final Integer accountNumber) { + acounts.remove(accountNumber); + } +} diff --git a/src/main/java/lessons/lesson03/banksystem/BankSystem.java b/src/main/java/lessons/lesson03/banksystem/BankSystem.java new file mode 100644 index 0000000..855c061 --- /dev/null +++ b/src/main/java/lessons/lesson03/banksystem/BankSystem.java @@ -0,0 +1,91 @@ +package lessons.lesson03.banksystem; + +import java.util.Scanner; + +public class BankSystem { + private final BankSystemService bankSystemService; + private final Scanner scanner; + + public BankSystem(BankSystemService bankSystemService, Scanner scanner) { + this.bankSystemService = bankSystemService; + this.scanner = scanner; + } + + public void getAccountInfo() { + System.out.print("Enter account number:"); + + Integer accountNumber = scanner.nextInt(); + + scanner.nextLine(); + + try { + System.out.println("Bank Account Info"); + BankAccount bankAccount = bankSystemService.getBankAccount(accountNumber); + System.out.println(bankAccount.toString()); + } catch (Exception e) { + System.out.printf("Error - %s\n", e.getMessage()); + } + } + + public void addAccount() { + System.out.println("Adding new account"); + + System.out.print("Enter fio:"); + String fio = scanner.nextLine(); + + BankAccount bankAccount = bankSystemService.createBankAccount(fio); + + System.out.printf("Account created with number: %d\n", bankAccount.getAccountNumber()); + } + + public void replenishAccount() { + System.out.println("Replenish account"); + + System.out.print("Enter account number: "); + Integer accountNumber = scanner.nextInt(); + scanner.nextLine(); + + System.out.print("Enter the amount: "); + double amount = scanner.nextDouble(); + scanner.nextLine(); + + try { + bankSystemService.replenishAccount(accountNumber, amount); + } catch (Exception e) { + System.out.printf("Error - %s\n", e.getMessage()); + } + } + + public void deleteAccount() { + System.out.println("Delete account"); + + System.out.print("Enter account number:"); + + Integer accountNumber = scanner.nextInt(); + + try { + bankSystemService.deleteAccount(accountNumber); + } catch (Exception e) { + System.out.printf("Error - %s\n", e.getMessage()); + } + } + + public void transferMoneyBetweenAccounts() { + System.out.println("Transfer money"); + + System.out.print("Enter account number to transfer money from:"); + Integer fromAccountNumber = scanner.nextInt(); + + System.out.print("Enter account number to transfer money to:"); + Integer toAccountNumber = scanner.nextInt(); + + System.out.print("Enter the amount to transfer:"); + Double amount = scanner.nextDouble(); + + try { + bankSystemService.transferMoneyBetweenAccounts(fromAccountNumber, toAccountNumber, amount); + } catch (Exception e) { + System.out.printf("Error - %s\n", e.getMessage()); + } + } +} diff --git a/src/main/java/lessons/lesson03/banksystem/BankSystemApplication.java b/src/main/java/lessons/lesson03/banksystem/BankSystemApplication.java new file mode 100644 index 0000000..a142260 --- /dev/null +++ b/src/main/java/lessons/lesson03/banksystem/BankSystemApplication.java @@ -0,0 +1,54 @@ +package lessons.lesson03.banksystem; + +import java.util.Random; +import java.util.Scanner; + +public class BankSystemApplication { + + public static void main(String[] args) { + try (Scanner scanner = new Scanner(System.in)) { + Random random = new Random(); + BankAccountRepository bankAccountRepository = new BankAccountRepository(); + BankSystemService bankSystemService = new BankSystemService(bankAccountRepository, random); + BankSystem bankSystem = new BankSystem(bankSystemService, scanner); + + + printOptions(); + String option = scanner.nextLine(); + + while (true) { + switch (option) { + case "I" -> bankSystem.getAccountInfo(); + + case "A" -> bankSystem.addAccount(); + + case "R" -> bankSystem.replenishAccount(); + + case "T" -> bankSystem.transferMoneyBetweenAccounts(); + + case "D" -> bankSystem.deleteAccount(); + + case "Q" -> { + clearTerminal(); + System.exit(0); + } + } + + printOptions(); + option = scanner.nextLine(); + clearTerminal(); + } + } + } + + public static void printOptions() { + System.out.println( + "Choose section:\n[I] - get account info\n[A] - Add account\n[R] - Replenish account\n[D] - Delete account\n[T] - Transfer money\n[Q] - Quit" + ); + } + + public static void clearTerminal() { + System.out.print("\033[H\033[2J"); + System.out.flush(); + } +} diff --git a/src/main/java/lessons/lesson03/banksystem/BankSystemService.java b/src/main/java/lessons/lesson03/banksystem/BankSystemService.java new file mode 100644 index 0000000..bab5bb3 --- /dev/null +++ b/src/main/java/lessons/lesson03/banksystem/BankSystemService.java @@ -0,0 +1,83 @@ +package lessons.lesson03.banksystem; + +import java.util.Random; + +public class BankSystemService { + private final BankAccountRepository bankAccountRepository; + private final Random random; + + + public BankSystemService(BankAccountRepository bankAccountRepository, Random random) { + this.bankAccountRepository = bankAccountRepository; + this.random = random; + } + + + public BankAccount getBankAccount(final Integer accountNumber) throws Exception { + return bankAccountRepository.findByAccountNumber(accountNumber).orElseThrow(() -> new Exception("Bank account not found")); + } + + private Integer generateAccountNumber() { + int MIN = 100000; + int MAX = 999999; + + int randomNumber = random.nextInt((MAX - MIN) + 1) + MIN; + + if (bankAccountRepository.existsByAccountNumber(randomNumber)) { + return generateAccountNumber(); + } + + return randomNumber; + } + + + public BankAccount createBankAccount(final String fio) { + Integer accountNumber = generateAccountNumber(); + + BankAccount bankAccount = new BankAccount(fio, accountNumber, 0.0); + + bankAccountRepository.save(bankAccount); + + return bankAccount; + } + + + public void replenishAccount(final Integer accountNumber, final Double amount) throws Exception { + BankAccount bankAccount = getBankAccount(accountNumber); + + if (amount <= 0) { + throw new Exception("Amount must be greater then 0"); + } + + Double newBalance = bankAccount.getBalance() + amount; + + bankAccountRepository.updateBalance(accountNumber, newBalance); + } + + public void deleteAccount(final Integer accountNumber) throws Exception { + boolean accountExists = bankAccountRepository.existsByAccountNumber(accountNumber); + + if (!accountExists) { + throw new Exception("Account doesn't exist"); + } + + bankAccountRepository.delete(accountNumber); + + System.out.println("Account deleted"); + } + + public void transferMoneyBetweenAccounts(final Integer fromAccountNumber, final Integer toAccountNumber, final Double amount) throws Exception { + BankAccount fromAccount = getBankAccount(fromAccountNumber); + BankAccount toAccount = getBankAccount(toAccountNumber); + + if (amount < 0 || fromAccount.getBalance() < amount) { + throw new Exception("Amount invalid"); + } + + Double fromAccountNewBalance = fromAccount.getBalance() - amount; + Double toAccountNewBalance = toAccount.getBalance() + amount; + + bankAccountRepository.updateBalance(fromAccountNumber, fromAccountNewBalance); + bankAccountRepository.updateBalance(toAccountNumber, toAccountNewBalance); + } +} diff --git a/src/main/java/lessons/lesson03/bookstore/AddBookService.java b/src/main/java/lessons/lesson03/bookstore/AddBookService.java new file mode 100644 index 0000000..81c72a4 --- /dev/null +++ b/src/main/java/lessons/lesson03/bookstore/AddBookService.java @@ -0,0 +1,49 @@ +package lessons.lesson03.bookstore; + +import java.util.Scanner; + +public class AddBookService { + private final BookRepository bookRepository; + private final Scanner scanner; + + public AddBookService(BookRepository bookRepository, Scanner scanner) { + this.bookRepository = bookRepository; + this.scanner = scanner; + } + + public Integer promptIsbn() { + System.out.print("Enter unique book isbn: "); + + Integer isbn = scanner.nextInt(); + + if (bookRepository.existsByKey(isbn)) { + return promptIsbn(); + } + + scanner.nextLine(); + + return isbn; + } + + public String promptName() { + System.out.print("Enter book name: "); + + return scanner.nextLine(); + } + + public String promptAuthor() { + System.out.print("Enter book author:"); + + return scanner.nextLine(); + } + + public Integer promptYear() { + System.out.print("Enter book's year: "); + + Integer year = scanner.nextInt(); + + scanner.nextLine(); + + return year; + } +} diff --git a/src/main/java/lessons/lesson03/bookstore/Book.java b/src/main/java/lessons/lesson03/bookstore/Book.java new file mode 100644 index 0000000..fa554ab --- /dev/null +++ b/src/main/java/lessons/lesson03/bookstore/Book.java @@ -0,0 +1,46 @@ +package lessons.lesson03.bookstore; + +public class Book { + private final Integer isbn; + private final String name; + private final String author; + private final Integer year; + private BookStatus status; + + public Book(Integer isbn, String name, String author, Integer year, BookStatus status) { + this.isbn = isbn; + this.name = name; + this.author = author; + this.year = year; + this.status = status; + } + + + public void setStatus(BookStatus status) { + this.status = status; + } + + public Integer getIsbn() { + return isbn; + } + + public String getName() { + return name; + } + + public String getAuthor() { + return author; + } + + public Integer getYear() { + return year; + } + + public BookStatus getStatus() { + return status; + } + + public String getBookInfo() { + return String.format("Isbn: %s\nName: %s\nAuthor: %s\nYear: %d\nStatus: %s", isbn, name, author, year, status); + } +} diff --git a/src/main/java/lessons/lesson03/bookstore/BookRepository.java b/src/main/java/lessons/lesson03/bookstore/BookRepository.java new file mode 100644 index 0000000..34643af --- /dev/null +++ b/src/main/java/lessons/lesson03/bookstore/BookRepository.java @@ -0,0 +1,37 @@ +package lessons.lesson03.bookstore; + +import java.util.HashMap; +import java.util.Map; +import java.util.Optional; + +public class BookRepository { + private Map books; + + public BookRepository() { + this.books = new HashMap<>(); + } + + public Map getBooks() { + return books; + } + + + public boolean existsByKey(final Integer key) { + return books.containsKey(key); + } + + + public void save(final Book book) { + Integer isbn = book.getIsbn(); + + books.put(isbn, book); + } + + public void updateStatus(final Integer isbn, final BookStatus status) { + books.get(isbn).setStatus(status); + } + + public Optional findBookByIsbn(final Integer isbn) { + return Optional.ofNullable(books.get(isbn)); + } +} diff --git a/src/main/java/lessons/lesson03/bookstore/BookStatus.java b/src/main/java/lessons/lesson03/bookstore/BookStatus.java new file mode 100644 index 0000000..c1188c9 --- /dev/null +++ b/src/main/java/lessons/lesson03/bookstore/BookStatus.java @@ -0,0 +1,6 @@ +package lessons.lesson03.bookstore; + +public enum BookStatus { + AVAILABLE, + RESERVED +} diff --git a/src/main/java/lessons/lesson03/bookstore/BookStore.java b/src/main/java/lessons/lesson03/bookstore/BookStore.java new file mode 100644 index 0000000..fdc02fb --- /dev/null +++ b/src/main/java/lessons/lesson03/bookstore/BookStore.java @@ -0,0 +1,58 @@ +package lessons.lesson03.bookstore; + +import java.util.Map; + +public class BookStore { + private final BookRepository bookRepository; + private final AddBookService addBookService; + + public BookStore(BookRepository bookRepository, AddBookService addBookService) { + this.bookRepository = bookRepository; + this.addBookService = addBookService; + } + + public void getBooks() { + System.out.println("Books list:\n"); + + Map books = bookRepository.getBooks(); + + + System.out.println("=".repeat(10)); + + for (Map.Entry entry : books.entrySet()) { + String bookInfo = entry.getValue().getBookInfo(); + System.out.println(bookInfo); + System.out.println("=".repeat(10)); + } + } + + + public void addNewBook() { + System.out.println("Adding new book"); + + Integer isbn = addBookService.promptIsbn(); + String name = addBookService.promptName(); + String author = addBookService.promptAuthor(); + Integer year = addBookService.promptYear(); + + Book book = new Book(isbn, name, author, year, BookStatus.AVAILABLE); + + bookRepository.save(book); + + System.out.printf("Book added:\n%s\n", book.getBookInfo()); + } + + + public void reserveBook(final Integer isbn) throws Exception { + Book book = bookRepository.findBookByIsbn(isbn).orElseThrow(() -> new Exception("Book does not exist")); + + if (book.getStatus().equals(BookStatus.RESERVED)) { + throw new Exception("Book already reserved"); + } + + bookRepository.updateStatus(isbn, BookStatus.RESERVED); + + System.out.printf("Book '%s' reserved\n", book.getName()); + } + +} diff --git a/src/main/java/lessons/lesson03/bookstore/BookStoreApplication.java b/src/main/java/lessons/lesson03/bookstore/BookStoreApplication.java new file mode 100644 index 0000000..d759a3c --- /dev/null +++ b/src/main/java/lessons/lesson03/bookstore/BookStoreApplication.java @@ -0,0 +1,61 @@ +package lessons.lesson03.bookstore; + +import java.util.Scanner; + +public class BookStoreApplication { + + public static void main(String[] args) { + try (Scanner scanner = new Scanner(System.in)) { + BookRepository bookRepository = new BookRepository(); + AddBookService addBookService = new AddBookService(bookRepository, scanner); + + BookStore bookStore = new BookStore(bookRepository, addBookService); + + printOptions(); + String option = scanner.nextLine(); + + + while (true) { + switch (option) { + case "L" -> bookStore.getBooks(); + + case "A" -> bookStore.addNewBook(); + + case "R" -> { + System.out.println("Reserving book"); + System.out.print("Enter book isbn: "); + + Integer bookIsbn = scanner.nextInt(); + + scanner.nextLine(); + + try { + bookStore.reserveBook(bookIsbn); + } catch (Exception e) { + System.out.printf("404 - %s\n", e.getMessage()); + } + } + + case "Q" -> { + clearTerminal(); + System.exit(0); + } + } + + printOptions(); + option = scanner.nextLine(); + clearTerminal(); + } + } + } + + + public static void printOptions() { + System.out.println("Choose section:\n[L] - Books list\n[A] - Add book\n[R] - Reserve book\n[Q] - Quit"); + } + + public static void clearTerminal() { + System.out.print("\033[H\033[2J"); + System.out.flush(); + } +} diff --git a/src/main/java/lessons/lesson03/car/Car.java b/src/main/java/lessons/lesson03/car/Car.java new file mode 100644 index 0000000..ca4c622 --- /dev/null +++ b/src/main/java/lessons/lesson03/car/Car.java @@ -0,0 +1,19 @@ +package lessons.lesson03.car; + +public class Car { + private final String country; + private final String model; + private final Integer yearOfManufacture; + + public Car(String country, String model, Integer yearOfManufacture) { + this.country = country; + this.model = model; + this.yearOfManufacture = yearOfManufacture; + } + + public void printCarInfo() { + String cardInfoString = String.format("Country: %s\nModel: %s\nYear of Manufacture: %d", country, model, yearOfManufacture); + + System.out.println(cardInfoString); + } +} diff --git a/src/main/java/lessons/lesson03/car/CarApplication.java b/src/main/java/lessons/lesson03/car/CarApplication.java new file mode 100644 index 0000000..92e9b92 --- /dev/null +++ b/src/main/java/lessons/lesson03/car/CarApplication.java @@ -0,0 +1,9 @@ +package lessons.lesson03.car; + +public class CarApplication { + public static void main(String[] args) { + Car car = new Car("Uzb", "Ferari", 2004); + + car.printCarInfo(); + } +} diff --git a/src/main/java/lessons/lesson03/fighting/FighterRepository.java b/src/main/java/lessons/lesson03/fighting/FighterRepository.java new file mode 100644 index 0000000..9d63a7e --- /dev/null +++ b/src/main/java/lessons/lesson03/fighting/FighterRepository.java @@ -0,0 +1,23 @@ +package lessons.lesson03.fighting; + +import lessons.lesson03.fighting.model.FighterInfo; + +import java.util.List; +import java.util.Map; +import java.util.Optional; + +public class FighterRepository { + private Map fighters; + + public FighterRepository(Map fighters) { + this.fighters = fighters; + } + + public List findAll() { + return fighters.values().stream().toList(); + } + + public Optional findFighterByCode(final String code) { + return Optional.ofNullable(fighters.get(code)); + } +} diff --git a/src/main/java/lessons/lesson03/fighting/FightingApplication.java b/src/main/java/lessons/lesson03/fighting/FightingApplication.java new file mode 100644 index 0000000..fb389fb --- /dev/null +++ b/src/main/java/lessons/lesson03/fighting/FightingApplication.java @@ -0,0 +1,73 @@ +package lessons.lesson03.fighting; + +import lessons.lesson03.fighting.model.FighterInfo; +import lessons.lesson03.fighting.service.ui.AnimationService; +import lessons.lesson03.fighting.service.ui.FightScreenService; +import lessons.lesson03.fighting.service.FightService; +import lessons.lesson03.fighting.service.ui.HealthBarService; +import lessons.lesson03.fighting.service.ui.KeyboardService; +import lessons.lesson03.fighting.utils.FighterGenerator; +import lessons.lesson03.fighting.utils.GameState; +import lessons.lesson03.fighting.utils.Utils; + +import java.util.Map; +import java.util.Random; +import java.util.Scanner; + +public class FightingApplication { + public static void main(String[] args) { + try (Scanner scanner = new Scanner(System.in)) { + StreetFighter streetFighter = getStreetFighter(scanner); + + System.out.println("========= STREET FIGHTER ========="); + + streetFighter.getFighters(); + + + printKeyboard(); + String choice = scanner.nextLine(); + + while (true) { + switch (choice) { + case "I" -> streetFighter.getFighterInfo(); + + case "F" -> streetFighter.fight(); + + case "Q" -> { + Utils.clearTerminal(); + System.exit(0); + } + } + + + printKeyboard(); + choice = scanner.nextLine(); + } + } + } + + public static void printKeyboard() { + System.out.println("\n[I] - Get fighter info | [F] - Fight | [Q] - Quit"); + } + + + public static StreetFighter getStreetFighter(final Scanner scanner) { + Map fighters = FighterGenerator.generatePlayers(); + + GameState gameState = new GameState(); + Random random = new Random(); + + FighterRepository fighterRepository = new FighterRepository(fighters); + + HealthBarService healthBarService = new HealthBarService(); + FightScreenService fightScreenService = new FightScreenService(healthBarService); + + KeyboardService keyboardService = new KeyboardService(gameState); + + AnimationService animationService = new AnimationService(fightScreenService); + + FightService fightService = new FightService(fighterRepository, fightScreenService, scanner, gameState, random, keyboardService, animationService); + + return new StreetFighter(fightService, fighterRepository, scanner); + } +} diff --git a/src/main/java/lessons/lesson03/fighting/StreetFighter.java b/src/main/java/lessons/lesson03/fighting/StreetFighter.java new file mode 100644 index 0000000..cbcae8c --- /dev/null +++ b/src/main/java/lessons/lesson03/fighting/StreetFighter.java @@ -0,0 +1,69 @@ +package lessons.lesson03.fighting; + +import lessons.lesson03.fighting.model.Fighter; +import lessons.lesson03.fighting.model.FighterInfo; +import lessons.lesson03.fighting.service.FightService; + +import java.util.List; +import java.util.Scanner; + +public class StreetFighter { + private final FightService fightService; + private final FighterRepository fighterRepository; + private final Scanner scanner; + + public StreetFighter(FightService fightService, FighterRepository fighterRepository, Scanner scanner) { + this.fightService = fightService; + this.fighterRepository = fighterRepository; + this.scanner = scanner; + } + + public void fight() { + try { + System.out.println("CHOOSE YOUR FIGHTER!"); + + String fighterOneCode = scanner.nextLine(); + FighterInfo fighterOneInfo = fightService.getFighter(fighterOneCode); + Fighter fighterOne = new Fighter(fighterOneInfo); + + System.out.println("CHOOSE YOUR ENEMY!"); + + String fighterTwoCode = scanner.nextLine(); + FighterInfo fighterTwoInfo = fightService.getFighter(fighterTwoCode); + Fighter fighterTwo = new Fighter(fighterTwoInfo); + + System.out.println("FIGHT!"); + + fightService.fight(fighterOne, fighterTwo); + } catch (Exception e) { + System.out.printf("Error - %s\n", e.getMessage()); + } + } + + + public void getFighters() { + System.out.println("======= FIGHTERS ======="); + + List fighters = fighterRepository.findAll(); + + System.out.println("=".repeat(20)); + + for (FighterInfo fighterInfo : fighters) { + System.out.println(fighterInfo.toString()); + System.out.println("=".repeat(20)); + } + } + + public void getFighterInfo() { + System.out.print("Enter fighter code: "); + + String code = scanner.nextLine(); + + try { + fightService.getFighterInfo(code); + } catch (Exception e) { + System.out.printf("Error - %s\n", e.getMessage()); + } + + } +} diff --git a/src/main/java/lessons/lesson03/fighting/model/Fighter.java b/src/main/java/lessons/lesson03/fighting/model/Fighter.java new file mode 100644 index 0000000..cd38d07 --- /dev/null +++ b/src/main/java/lessons/lesson03/fighting/model/Fighter.java @@ -0,0 +1,67 @@ +package lessons.lesson03.fighting.model; + +import lessons.lesson03.fighting.utils.FighterState; +import lessons.lesson03.fighting.utils.Utils; + +public class Fighter { + private FighterInfo info; + private FighterState state; + private Integer health; + + public Fighter(FighterInfo info) { + this.health = info.maxHealth(); + this.info = info; + this.state = FighterState.IDLE; + } + + public FighterInfo getInfo() { + return info; + } + + + public String getColoredFighterAttribute(final String value) { + return String.format("%s%s%s", state.getColor(), value, Utils.RESET_COLOR); + } + + public String getColoredName() { + return getColoredFighterAttribute(info.name()); + } + + public String getHealthStatus() { + String healthStatus = String.format("%d/%d", health, info.maxHealth()); + return getColoredFighterAttribute(healthStatus); + } + + public String getMessage() { + String message = state.getMessage(); + return getColoredFighterAttribute(message); + } + + public Integer getHealth() { + return health; + } + + public FighterState getState() { + return state; + } + + public void changeHealthBy(Integer health) { + this.health += health; + } + + public void takeDamage(final Integer attack) { + this.health -= attack; + } + + public boolean canHeal() { + return this.health <= (info.maxHealth() / 2); + } + + public void heal() { + this.health+=2; + } + + public void setState(FighterState state) { + this.state = state; + } +} diff --git a/src/main/java/lessons/lesson03/fighting/model/FighterInfo.java b/src/main/java/lessons/lesson03/fighting/model/FighterInfo.java new file mode 100644 index 0000000..36952e6 --- /dev/null +++ b/src/main/java/lessons/lesson03/fighting/model/FighterInfo.java @@ -0,0 +1,8 @@ +package lessons.lesson03.fighting.model; + +public record FighterInfo(String code, String name, Integer attack, Integer maxHealth) { + @Override + public String toString() { + return String.format("Code: %s\nName: %s\nHealth: %d\nAttack: %s", code, name, maxHealth, attack); + } +} diff --git a/src/main/java/lessons/lesson03/fighting/service/FightService.java b/src/main/java/lessons/lesson03/fighting/service/FightService.java new file mode 100644 index 0000000..27d76bd --- /dev/null +++ b/src/main/java/lessons/lesson03/fighting/service/FightService.java @@ -0,0 +1,96 @@ +package lessons.lesson03.fighting.service; + +import lessons.lesson03.fighting.model.Fighter; +import lessons.lesson03.fighting.model.FighterInfo; +import lessons.lesson03.fighting.FighterRepository; +import lessons.lesson03.fighting.service.action.EnemyActionService; +import lessons.lesson03.fighting.service.action.PlayerActionService; +import lessons.lesson03.fighting.service.ui.AnimationService; +import lessons.lesson03.fighting.service.ui.FightScreenService; +import lessons.lesson03.fighting.service.ui.KeyboardService; +import lessons.lesson03.fighting.utils.FighterState; +import lessons.lesson03.fighting.utils.GameState; +import lessons.lesson03.fighting.utils.Utils; + +import java.util.Random; +import java.util.Scanner; + +public class FightService { + private final FighterRepository fighterRepository; + private final FightScreenService fightScreenService; + private final Scanner scanner; + private final GameState gameState; + private final Random random; + private final KeyboardService keyboardService; + private final AnimationService animationService; + + public FightService(FighterRepository fighterRepository, FightScreenService fightScreenService, Scanner scanner, GameState gameState, Random random, KeyboardService keyboardService, AnimationService animationService) { + this.fighterRepository = fighterRepository; + this.fightScreenService = fightScreenService; + this.scanner = scanner; + this.gameState = gameState; + this.random = random; + this.keyboardService = keyboardService; + this.animationService = animationService; + } + + public void fight(final Fighter player, final Fighter enemy) throws Exception { + fightScreenService.printScreen(player, enemy); + + PlayerActionService playerService = new PlayerActionService(player, enemy, scanner, random, gameState, fightScreenService, keyboardService, animationService); + EnemyActionService enemyActionService = new EnemyActionService(player, enemy, fightScreenService, random, animationService); + + while (player.getHealth() > 0 && enemy.getHealth() > 0) { + int turn; + + if (player.getState().equals(FighterState.BLOCK)) { + turn = 2; + } else if (enemy.getState().equals(FighterState.BLOCK)) { + turn = 1; + } else { + turn = random.nextInt(2) + 1; + } + + switch (turn) { + case 1 -> playerService.action(); + + case 2 -> enemyActionService.action(); + } + + if (enemy.getState().equals(FighterState.DIE)) { + Utils.clearTerminal(); + System.out.println("YOU WON!"); + break; + } + + if (player.getState().equals(FighterState.DIE)) { + Utils.clearTerminal(); + System.out.println("YOU LOST!"); + break; + } + + if (!player.getState().equals(FighterState.BLOCK)) { + player.setState(FighterState.IDLE); + } + + if (!enemy.getState().equals(FighterState.BLOCK)) { + enemy.setState(FighterState.IDLE); + } + + fightScreenService.printScreen(player, enemy); + } + + gameState.setPlayerCanFatality(false); + gameState.setPlayerCanHeal(false); + } + + public FighterInfo getFighter(final String code) throws Exception { + return fighterRepository.findFighterByCode(code).orElseThrow(() -> new Exception("Fighter code invalid")); + } + + public void getFighterInfo(final String code) throws Exception { + FighterInfo fighter = getFighter(code); + + System.out.println(fighter.toString()); + } +} diff --git a/src/main/java/lessons/lesson03/fighting/service/action/EnemyActionService.java b/src/main/java/lessons/lesson03/fighting/service/action/EnemyActionService.java new file mode 100644 index 0000000..9c26fb9 --- /dev/null +++ b/src/main/java/lessons/lesson03/fighting/service/action/EnemyActionService.java @@ -0,0 +1,96 @@ +package lessons.lesson03.fighting.service.action; + +import lessons.lesson03.fighting.model.Fighter; +import lessons.lesson03.fighting.service.ui.FightScreenService; +import lessons.lesson03.fighting.service.ui.AnimationService; +import lessons.lesson03.fighting.utils.FighterState; + +import java.util.Random; + +public class EnemyActionService { + private final Fighter player; + private final Fighter enemy; + private final FightScreenService fightScreenService; + private final Random random; + private final AnimationService animationService; + + public EnemyActionService(Fighter player, Fighter enemy, FightScreenService fightScreenService, Random random, AnimationService animationService) { + this.player = player; + this.enemy = enemy; + this.fightScreenService = fightScreenService; + this.random = random; + this.animationService = animationService; + } + + public void action() throws Exception { + if (enemy.canHeal()) { + int allowHealing = random.nextInt(4) + 1; + if (allowHealing == 4) { + heal(); + return; + } + } + + int attackOrBlock = random.nextInt(4) + 1; + + if (attackOrBlock == 1) { + block(); + } else { + attack(); + } + + if (enemy.getInfo().attack() >= player.getHealth()) { + fatality(); + } + } + + private void block() { + enemy.setState(FighterState.BLOCK); + + fightScreenService.printScreen(player, enemy); + } + + private void attack() throws Exception { + int attackDamage = enemy.getInfo().attack(); + + if (player.getState().equals(FighterState.BLOCK)) { + player.setState(FighterState.IDLE); + return; + } + + enemy.setState(FighterState.ATTACK); + player.setState(FighterState.TAKE_DAMAGE); + + for (int i = 0; i < attackDamage; i+=5) { + player.takeDamage(5); + animationService.animate(player, enemy); + } + } + + private void heal() throws Exception { + int healBy = (enemy.getHealth() / 2); + enemy.setState(FighterState.HEAL); + + for (int i = 0; i < healBy; i+=2) { + enemy.heal(); + animationService.animate(player, enemy); + } + } + + private void fatality() throws Exception { + enemy.setState(FighterState.ATTACK); + player.setState(FighterState.TAKE_FATALITY); + + Integer health = player.getHealth(); + int changer = -1; + + for (int i = 0; i < 5; i++) { + player.changeHealthBy(health * changer); + changer *= -1; + + animationService.animate(player, enemy); + } + + player.setState(FighterState.DIE); + } +} diff --git a/src/main/java/lessons/lesson03/fighting/service/action/PlayerActionService.java b/src/main/java/lessons/lesson03/fighting/service/action/PlayerActionService.java new file mode 100644 index 0000000..269f355 --- /dev/null +++ b/src/main/java/lessons/lesson03/fighting/service/action/PlayerActionService.java @@ -0,0 +1,127 @@ +package lessons.lesson03.fighting.service.action; + +import lessons.lesson03.fighting.model.Fighter; +import lessons.lesson03.fighting.service.ui.FightScreenService; +import lessons.lesson03.fighting.service.ui.AnimationService; +import lessons.lesson03.fighting.service.ui.KeyboardService; +import lessons.lesson03.fighting.utils.FighterState; +import lessons.lesson03.fighting.utils.GameState; + +import java.util.Random; +import java.util.Scanner; + +public class PlayerActionService { + private final Fighter player; + private final Fighter enemy; + private final Scanner scanner; + private final Random random; + private final GameState gameState; + private final FightScreenService fightScreenService; + private final KeyboardService keyboardService; + private final AnimationService animationService; + + public PlayerActionService(Fighter player, Fighter enemy, Scanner scanner, Random random, GameState gameState, FightScreenService fightScreenService, KeyboardService keyboardService, AnimationService animationService) { + this.player = player; + this.enemy = enemy; + this.scanner = scanner; + this.random = random; + this.gameState = gameState; + this.fightScreenService = fightScreenService; + this.keyboardService = keyboardService; + this.animationService = animationService; + } + + + public void action() throws Exception { + System.out.println(keyboardService.getKeyboard()); + + System.out.print("Choose action: "); + + String key = scanner.nextLine(); + + switch (key) { + case "A" -> attack(); + + case "B" -> block(); + + case "H" -> heal(); + + case "F" -> fatality(); + } + + if (player.canHeal()) { + int giveHealingAbility = random.nextInt(4) + 1; + + if (giveHealingAbility == 4) { + gameState.setPlayerCanHeal(true); + } + } + + if (player.getInfo().attack() >= enemy.getHealth()) { + gameState.setPlayerCanFatality(true); + } + } + + private void attack() throws Exception { + int attackDamage = player.getInfo().attack(); + + if (enemy.getState().equals(FighterState.BLOCK)) { + enemy.setState(FighterState.IDLE); + return; + } + + player.setState(FighterState.ATTACK); + enemy.setState(FighterState.TAKE_DAMAGE); + + for (int i = 0; i < attackDamage; i += 5) { + enemy.takeDamage(5); + + animationService.animate(player, enemy); + } + + player.setState(FighterState.IDLE); + } + + private void block() { + player.setState(FighterState.BLOCK); + + fightScreenService.printScreen(player, enemy); + } + + private void heal() throws Exception { + if (!gameState.canPlayerHeal()) { + System.out.println("Not available"); + System.out.println(keyboardService.getKeyboard()); + } + + if (!player.canHeal()) return; + + int healBy = (player.getHealth() / 2); + player.setState(FighterState.HEAL); + + for (int i = 0; i < healBy; i += 2) { + player.heal(); + animationService.animate(player, enemy); + } + + player.setState(FighterState.IDLE); + gameState.setPlayerCanHeal(false); + } + + private void fatality() throws Exception { + player.setState(FighterState.ATTACK); + enemy.setState(FighterState.TAKE_FATALITY); + + Integer health = enemy.getHealth(); + int changer = -1; + + for (int i = 0; i < 5; i++) { + enemy.changeHealthBy(health * changer); + changer *= -1; + + animationService.animate(player, enemy); + } + + enemy.setState(FighterState.DIE); + } +} diff --git a/src/main/java/lessons/lesson03/fighting/service/ui/AnimationService.java b/src/main/java/lessons/lesson03/fighting/service/ui/AnimationService.java new file mode 100644 index 0000000..c3a26c0 --- /dev/null +++ b/src/main/java/lessons/lesson03/fighting/service/ui/AnimationService.java @@ -0,0 +1,22 @@ +package lessons.lesson03.fighting.service.ui; + +import lessons.lesson03.fighting.model.Fighter; +import lessons.lesson03.fighting.utils.Utils; + +public class AnimationService { + private final FightScreenService fightScreenService; + + public AnimationService(FightScreenService fightScreenService) { + this.fightScreenService = fightScreenService; + } + + public void animate(final Fighter player, final Fighter enemy) throws Exception { + String screen = fightScreenService.getFightScreen(player, enemy); + + Utils.clearTerminal(); + + System.out.println(screen); + + Thread.sleep(1000); + } +} diff --git a/src/main/java/lessons/lesson03/fighting/service/ui/FightScreenService.java b/src/main/java/lessons/lesson03/fighting/service/ui/FightScreenService.java new file mode 100644 index 0000000..a083cc8 --- /dev/null +++ b/src/main/java/lessons/lesson03/fighting/service/ui/FightScreenService.java @@ -0,0 +1,77 @@ +package lessons.lesson03.fighting.service.ui; + +import lessons.lesson03.fighting.model.Fighter; +import lessons.lesson03.fighting.utils.Utils; + +public class FightScreenService { + private final int SCREEN_WIDTH = 100; + + private final HealthBarService healthBarService; + + public FightScreenService(HealthBarService healthBarService) { + this.healthBarService = healthBarService; + } + + + public void printScreen(final Fighter player, final Fighter enemy) { + String screen = getFightScreen(player, enemy); + + Utils.clearTerminal(); + + System.out.println(screen); + } + + + public String getFightScreen(final Fighter fighterOne, final Fighter fighterTwo) { + String nameLine = getNameLine(fighterOne, fighterTwo); + String healthBarLine = getHealthBarLine(fighterOne, fighterTwo); + String healthLine = getHealthLine(fighterOne, fighterTwo); + String messageLine = getMessageLine(fighterOne, fighterTwo); + + return String.format("%s\n\n%s\n%s\n%s\n", nameLine, healthBarLine, healthLine, messageLine); + } + + + public String getHealthBarLine(final Fighter fighterOne, final Fighter fighterTwo) { + String fighterOneHealthBar = healthBarService.getHealthBarLeft(fighterOne); + String fighterTwoHealthBar = healthBarService.getHealthBarRight(fighterTwo); + + int gapWidth = SCREEN_WIDTH - fighterOneHealthBar.length() - fighterTwoHealthBar.length(); + + return String.format("%s%s%s", fighterOneHealthBar, getGap(gapWidth), fighterTwoHealthBar); + } + + + public String getNameLine(final Fighter fighterOne, final Fighter fighterTwo) { + String fighterOneName = fighterOne.getColoredName(); + String fighterTwoName = fighterTwo.getColoredName(); + + int gapWidth = SCREEN_WIDTH - fighterOneName.length() - fighterTwoName.length(); + + return String.format("%s%s%s", fighterOneName, getGap(gapWidth), fighterTwoName); + } + + + public String getHealthLine(final Fighter fighterOne, final Fighter fighterTwo) { + String fighterOneHealth = fighterOne.getHealthStatus(); + String fighterTwoHealth = fighterTwo.getHealthStatus(); + + int gapWidth = SCREEN_WIDTH - fighterOneHealth.length() - fighterTwoHealth.length(); + + return String.format("%s%s%s", fighterOneHealth, getGap(gapWidth), fighterTwoHealth); + } + + public String getMessageLine(final Fighter fighterOne, final Fighter fighterTwo) { + String fighterOneMessage = fighterOne.getMessage(); + String fighterTwoMessage = fighterTwo.getMessage(); + + int gapWidth = SCREEN_WIDTH - fighterOneMessage.length() - fighterTwoMessage.length(); + + return String.format("%s%s%s", fighterOneMessage, getGap(gapWidth), fighterTwoMessage); + } + + + public String getGap(final int gapWidth) { + return " ".repeat(gapWidth); + } +} diff --git a/src/main/java/lessons/lesson03/fighting/service/ui/HealthBarService.java b/src/main/java/lessons/lesson03/fighting/service/ui/HealthBarService.java new file mode 100644 index 0000000..b2246a3 --- /dev/null +++ b/src/main/java/lessons/lesson03/fighting/service/ui/HealthBarService.java @@ -0,0 +1,43 @@ +package lessons.lesson03.fighting.service.ui; + + +import lessons.lesson03.fighting.model.Fighter; +import lessons.lesson03.fighting.utils.Utils; + +public class HealthBarService { + private final int HEALTH_BAR_MAX = 15; + + private int getHealthProportion(final Integer health, final Integer maxHealth) { + return (health * HEALTH_BAR_MAX) / maxHealth; + } + + public String getHealthBarLeft(final Fighter fighter) { + String color = fighter.getState().getColor(); + String healthBar = getHealthBarLeft(fighter.getHealth(), fighter.getInfo().maxHealth()); + + return String.format("%s%s%s", color, healthBar, Utils.RESET_COLOR); + } + + public String getHealthBarRight(final Fighter fighter) { + String color = fighter.getState().getColor(); + String healthBar = getHealthBarRight(fighter.getHealth(), fighter.getInfo().maxHealth()); + + return String.format("%s%s%s", color, healthBar, Utils.RESET_COLOR); + } + + public String getHealthBarLeft(final Integer health, final Integer maxHealth) { + int proportionHealth = getHealthProportion(health, maxHealth); + + String gap = " ".repeat(HEALTH_BAR_MAX - proportionHealth); + + return String.format("|%s%s|", "=".repeat(proportionHealth), gap); + } + + public String getHealthBarRight(final Integer health, final Integer maxHealth) { + int proportionHealth = getHealthProportion(health, maxHealth); + + String gap = " ".repeat(HEALTH_BAR_MAX - proportionHealth); + + return String.format("|%s%s|", gap, "=".repeat(proportionHealth)); + } +} diff --git a/src/main/java/lessons/lesson03/fighting/service/ui/KeyboardService.java b/src/main/java/lessons/lesson03/fighting/service/ui/KeyboardService.java new file mode 100644 index 0000000..13e6402 --- /dev/null +++ b/src/main/java/lessons/lesson03/fighting/service/ui/KeyboardService.java @@ -0,0 +1,35 @@ +package lessons.lesson03.fighting.service.ui; + + +import lessons.lesson03.fighting.utils.GameState; + +public class KeyboardService { + private final GameState gameState; + + public KeyboardService(GameState gameState) { + this.gameState = gameState; + } + + public String getKeyboard() { + if (gameState.canPlayerHeal()) { + return getHealingKeyboard(); + } else if (gameState.canPlayerFatality()) { + return getFatalityKeyboard(); + } + + return getBasicKeyboard(); + } + + private String getBasicKeyboard() { + return "[A] - Attack | [B] - Block"; + } + + private String getHealingKeyboard() { + + return getBasicKeyboard() + " | [H] - Heal"; + } + + private String getFatalityKeyboard() { + return getBasicKeyboard() + " | [F] - Fatality"; + } +} diff --git a/src/main/java/lessons/lesson03/fighting/utils/FighterGenerator.java b/src/main/java/lessons/lesson03/fighting/utils/FighterGenerator.java new file mode 100644 index 0000000..8916914 --- /dev/null +++ b/src/main/java/lessons/lesson03/fighting/utils/FighterGenerator.java @@ -0,0 +1,24 @@ +package lessons.lesson03.fighting.utils; + +import lessons.lesson03.fighting.model.FighterInfo; + +import java.util.HashMap; +import java.util.Map; + +public class FighterGenerator { + public static Map generatePlayers() { + FighterInfo subZero = new FighterInfo("1", "Sub-Zero", 20, 100); + FighterInfo scorpion = new FighterInfo("2", "Scorpion", 20, 100); + FighterInfo lukang = new FighterInfo("3", "Liu Kang", 15, 90); + FighterInfo cage = new FighterInfo("4", "Johnny Cage", 15, 90); + + Map fighters = new HashMap<>(); + + fighters.put("1", subZero); + fighters.put("2", scorpion); + fighters.put("3", lukang); + fighters.put("4", cage); + + return fighters; + } +} diff --git a/src/main/java/lessons/lesson03/fighting/utils/FighterState.java b/src/main/java/lessons/lesson03/fighting/utils/FighterState.java new file mode 100644 index 0000000..6e2a908 --- /dev/null +++ b/src/main/java/lessons/lesson03/fighting/utils/FighterState.java @@ -0,0 +1,34 @@ +package lessons.lesson03.fighting.utils; + +public enum FighterState { + IDLE("39m", "READY!"), + + TAKE_DAMAGE("31m", "DAMAGE!"), + + TAKE_FATALITY("35m","GETTING DESTROYED!"), + + HEAL("32m", "RESTORE HEALTH!"), + + BLOCK("33m", "BLOCK!"), + + ATTACK("36m", "ATTACK!"), + + DIE("100m", "DEATH!"); + + + public final String color; + public final String message; + + FighterState(String color, String message) { + this.color = color; + this.message = message; + } + + public String getColor() { + return "\033[" + color; + } + + public String getMessage() { + return message; + } +} diff --git a/src/main/java/lessons/lesson03/fighting/utils/GameState.java b/src/main/java/lessons/lesson03/fighting/utils/GameState.java new file mode 100644 index 0000000..adfce51 --- /dev/null +++ b/src/main/java/lessons/lesson03/fighting/utils/GameState.java @@ -0,0 +1,28 @@ +package lessons.lesson03.fighting.utils; + +public class GameState { + private boolean playerCanHeal; + private boolean playerCanFatality; + + public GameState() { + this.playerCanHeal = false; + this.playerCanFatality = false; + } + + public void setPlayerCanHeal(boolean playerCanHeal) { + this.playerCanHeal = playerCanHeal; + } + + public void setPlayerCanFatality(boolean playerCanFatality) { + this.playerCanFatality = playerCanFatality; + } + + public boolean canPlayerHeal() { + return this.playerCanHeal; + } + + public boolean canPlayerFatality() { + return this.playerCanFatality; + } +} + diff --git a/src/main/java/lessons/lesson03/fighting/utils/Utils.java b/src/main/java/lessons/lesson03/fighting/utils/Utils.java new file mode 100644 index 0000000..121b9d4 --- /dev/null +++ b/src/main/java/lessons/lesson03/fighting/utils/Utils.java @@ -0,0 +1,10 @@ +package lessons.lesson03.fighting.utils; + +public class Utils { + public static final String RESET_COLOR = "\033[0m"; + + public static void clearTerminal() { + System.out.print("\033[H\033[2J"); + System.out.flush(); + } +} diff --git a/src/main/java/lessons/lesson03/onlinestore/OnlineStore.java b/src/main/java/lessons/lesson03/onlinestore/OnlineStore.java new file mode 100644 index 0000000..8413f1a --- /dev/null +++ b/src/main/java/lessons/lesson03/onlinestore/OnlineStore.java @@ -0,0 +1,94 @@ +package lessons.lesson03.onlinestore; + +import java.util.List; +import java.util.Scanner; + +public class OnlineStore { + private final ProductRepository productRepository; + private final ProductAddService productAddService; + private final Scanner scanner; + + public OnlineStore(ProductRepository productRepository, ProductAddService productAddService, Scanner scanner) { + this.productRepository = productRepository; + this.productAddService = productAddService; + this.scanner = scanner; + } + + public void getProducts() { + List products = productRepository.findAll(); + + System.out.println("Products list"); + + for (Product product : products) { + System.out.println(product.toString()); + } + } + + private Product getProduct(final String code) throws Exception { + return productRepository.findProductByCode(code).orElseThrow(() -> new Exception("Product not found")); + } + + public void getProductInfo() { + System.out.print("Enter the product code: "); + String code = scanner.nextLine(); + + try { + Product product = getProduct(code); + + System.out.printf("Product #%s info:\n", code); + + System.out.println(product.toString()); + } catch (Exception e) { + System.out.println(e.getMessage()); + } + } + + public void addProduct() { + System.out.println("Adding new product"); + + String code = productAddService.promptProductCode(); + String name = productAddService.promptProductName(); + Double price = productAddService.promptProductPrice(); + int count = productAddService.promptProductCount(); + + Product product = new Product(code, name, price, count); + + productRepository.save(product); + + System.out.println("Product created"); + + System.out.println(product); + } + + public void buyProduct() { + System.out.println("Buying product"); + System.out.print("Enter the product code:"); + String code = scanner.nextLine(); + + System.out.print("Enter the quantity you want to buy:"); + int quantityToBuy = scanner.nextInt(); + + scanner.nextLine(); + + + try { + buyProduct(code, quantityToBuy); + } catch (Exception e) { + System.out.printf("Error - %s\n", e.getMessage()); + } + } + + private void buyProduct(final String code, final int quantityToBuy) throws Exception { + Product product = getProduct(code); + + if (quantityToBuy > product.getCount()) { + throw new Exception("demand is exceeding supply"); + } + + int newCount = product.getCount() - quantityToBuy; + + productRepository.updateCount(code, newCount); + + System.out.println("Product bought"); + } +} diff --git a/src/main/java/lessons/lesson03/onlinestore/OnlineStoreApplication.java b/src/main/java/lessons/lesson03/onlinestore/OnlineStoreApplication.java new file mode 100644 index 0000000..cba087f --- /dev/null +++ b/src/main/java/lessons/lesson03/onlinestore/OnlineStoreApplication.java @@ -0,0 +1,51 @@ +package lessons.lesson03.onlinestore; + +import java.util.Scanner; + +public class OnlineStoreApplication { + + public static void main(String[] args) { + try (Scanner scanner = new Scanner(System.in)) { + ProductRepository productRepository = new ProductRepository(); + ProductAddService productAddService = new ProductAddService(productRepository, scanner); + + OnlineStore onlineStore = new OnlineStore(productRepository, productAddService, scanner); + + + printOptions(); + String option = scanner.nextLine(); + + while (true) { + switch (option) { + case "L" -> onlineStore.getProducts(); + + case "I" -> onlineStore.getProductInfo(); + + case "A" -> onlineStore.addProduct(); + + case "B" -> onlineStore.buyProduct(); + + case "Q" -> { + clearTerminal(); + System.exit(0); + } + } + + printOptions(); + option = scanner.nextLine(); + clearTerminal(); + } + } + } + + + public static void printOptions() { + System.out.println("Choose section:\n[L] - Product list\n[I] - get product info\n[A] - Add product\n[B] - Buy product\n[Q] - Quit"); + } + + public static void clearTerminal() { + System.out.print("\033[H\033[2J"); + System.out.flush(); + } + +} diff --git a/src/main/java/lessons/lesson03/onlinestore/Product.java b/src/main/java/lessons/lesson03/onlinestore/Product.java new file mode 100644 index 0000000..22b19f9 --- /dev/null +++ b/src/main/java/lessons/lesson03/onlinestore/Product.java @@ -0,0 +1,41 @@ +package lessons.lesson03.onlinestore; + +public class Product { + private final String code; + private final String name; + private final Double price; + private int count; + + public Product(String code, String name, Double price, int count) { + this.code = code; + this.name = name; + this.price = price; + this.count = count; + } + + public String getCode() { + return code; + } + + public String getName() { + return name; + } + + public Double getPrice() { + return price; + } + + public int getCount() { + return count; + } + + public void setCount(final int count) { + this.count = count; + } + + + @Override + public String toString() { + return String.format("Code: %s\nName: %s\nPrice: %s\nCount: %d", code, name, price, count); + } +} diff --git a/src/main/java/lessons/lesson03/onlinestore/ProductAddService.java b/src/main/java/lessons/lesson03/onlinestore/ProductAddService.java new file mode 100644 index 0000000..a593dd5 --- /dev/null +++ b/src/main/java/lessons/lesson03/onlinestore/ProductAddService.java @@ -0,0 +1,53 @@ +package lessons.lesson03.onlinestore; + +import java.util.Scanner; + +public class ProductAddService { + private final ProductRepository productRepository; + private final Scanner scanner; + + + public ProductAddService(ProductRepository productRepository, Scanner scanner) { + this.productRepository = productRepository; + this.scanner = scanner; + } + + public String promptProductCode() { + System.out.print("Enter unique product code: "); + + String code = scanner.nextLine(); + + if (productRepository.existsByCode(code)) { + return promptProductCode(); + } + + return code; + } + + public String promptProductName() { + System.out.print("Enter product name: "); + + return scanner.nextLine(); + } + + public Double promptProductPrice() { + System.out.print("Enter product price: "); + + Double price = scanner.nextDouble(); + + scanner.nextLine(); + + return price; + } + + + public int promptProductCount() { + System.out.print("Enter product count: "); + + int count = scanner.nextInt(); + + scanner.nextLine(); + + return count; + } +} diff --git a/src/main/java/lessons/lesson03/onlinestore/ProductRepository.java b/src/main/java/lessons/lesson03/onlinestore/ProductRepository.java new file mode 100644 index 0000000..3335df2 --- /dev/null +++ b/src/main/java/lessons/lesson03/onlinestore/ProductRepository.java @@ -0,0 +1,36 @@ +package lessons.lesson03.onlinestore; + +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.Optional; + +public class ProductRepository { + private final Map products; + + public ProductRepository() { + this.products = new HashMap<>(); + } + + public void save(final Product product) { + String code = product.getCode(); + + products.put(code, product); + } + + public void updateCount(final String code, final int count) { + products.get(code).setCount(count); + } + + public Optional findProductByCode(final String code) { + return Optional.ofNullable(products.get(code)); + } + + public List findAll() { + return products.values().stream().toList(); + } + + public boolean existsByCode(final String code) { + return products.containsKey(code); + } +} diff --git a/src/main/java/lessons/lesson03/person/Person.java b/src/main/java/lessons/lesson03/person/Person.java new file mode 100644 index 0000000..ba97342 --- /dev/null +++ b/src/main/java/lessons/lesson03/person/Person.java @@ -0,0 +1,17 @@ +package lessons.lesson03.person; + +public class Person { + private final String name; + private final int age; + + public Person(String name, int age) { + this.name = name; + this.age = age; + } + + public void introduce() { + String introductionString = String.format("Hello, my name is %s. I am %d.", name, age); + + System.out.println(introductionString); + } +} diff --git a/src/main/java/lessons/lesson03/person/PersonApplication.java b/src/main/java/lessons/lesson03/person/PersonApplication.java new file mode 100644 index 0000000..6cb3c1c --- /dev/null +++ b/src/main/java/lessons/lesson03/person/PersonApplication.java @@ -0,0 +1,10 @@ +package lessons.lesson03.person; + +public class PersonApplication { + + public static void main(String[] args) { + Person person = new Person("Mark", 19); + + person.introduce(); + } +} diff --git a/src/main/java/lessons/lesson03/ractangle/Rectangle.java b/src/main/java/lessons/lesson03/ractangle/Rectangle.java new file mode 100644 index 0000000..16ea4f4 --- /dev/null +++ b/src/main/java/lessons/lesson03/ractangle/Rectangle.java @@ -0,0 +1,22 @@ +package lessons.lesson03.ractangle; + + +public class Rectangle { + private final int length; + private final int width; + + public Rectangle(int length, int width) { + this.width = width; + this.length = length; + } + + public int calculateSquare() { + return this.length * this.width; + } + + public int calculatePerimeter() { + int PERIMETER_MULTIPLIER = 2; + return (this.length + this.width) * PERIMETER_MULTIPLIER; + } +} + diff --git a/src/main/java/lessons/lesson03/ractangle/RectangleApplication.java b/src/main/java/lessons/lesson03/ractangle/RectangleApplication.java new file mode 100644 index 0000000..b2a5d74 --- /dev/null +++ b/src/main/java/lessons/lesson03/ractangle/RectangleApplication.java @@ -0,0 +1,18 @@ +package lessons.lesson03.ractangle; + +import java.util.Scanner; + +public class RectangleApplication { + + public static void main(String[] args) { + try (Scanner scanner = new Scanner(System.in)) { + int length = scanner.nextInt(); + int width = scanner.nextInt(); + + Rectangle rectangle = new Rectangle(length, width); + + System.out.printf("Area: %s\n", rectangle.calculateSquare()); + System.out.printf("Perimeter: %s\n", rectangle.calculatePerimeter()); + } + } +}