Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
17 changes: 17 additions & 0 deletions Bevzyuk/README.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
# M3-Quest-NEW

## Опис
**M3-Quest-NEW** — це текстова гра-квест, реалізована за допомогою сервлетів. Гравець приймає рішення, які впливають на подальший розвиток сюжету.

## Функціонал
- Початковий екран з можливістю введення імені гравця.
- Взаємодія з грою через вибір відповідей.
- Перехід між етапами квесту на основі вибору користувача.
- Збереження поточного стану гри через `HttpSession`.

## Використані технології
- Java 21 (JDK 21)
- Java Servlet API
- JSP (JavaServer Pages)
- JUnit 5 (Jupiter API)
- Mockito
47 changes: 47 additions & 0 deletions Bevzyuk/pom.xml
Original file line number Diff line number Diff line change
@@ -0,0 +1,47 @@
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>org.example</groupId>
<artifactId>Bevzyuk</artifactId>
<packaging>war</packaging>
<version>1.0-SNAPSHOT</version>
<name>Bevzyuk Maven Webapp</name>
<url>http://maven.apache.org</url>
<dependencies>
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>javax.servlet-api</artifactId>
<version>3.1.0</version>
</dependency>

<!-- https://mvnrepository.com/artifact/org.junit.jupiter/junit-jupiter-engine -->
<dependency>
<groupId>org.junit.jupiter</groupId>
<artifactId>junit-jupiter-engine</artifactId>
<version>5.12.0</version>
<scope>test</scope>
</dependency>

<!-- https://mvnrepository.com/artifact/org.mockito/mockito-core -->
<dependency>
<groupId>org.mockito</groupId>
<artifactId>mockito-core</artifactId>
<version>5.15.2</version>
<scope>test</scope>
</dependency>

</dependencies>
<build>
<finalName>Bevzyuk</finalName>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<configuration>
<source>9</source>
<target>9</target>
</configuration>
</plugin>
</plugins>
</build>
</project>
83 changes: 83 additions & 0 deletions Bevzyuk/src/main/java/com/quest/GameServlet.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,83 @@
package com.quest;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import java.io.IOException;
import java.util.HashMap;
import java.util.Map;

@WebServlet("/game")
public class GameServlet extends HttpServlet {
Map<Integer, Question> questions;

@Override
public void init() {
questions = new HashMap<>();

questions.put(1, new Question("Ти стоїш перед дверима. Що робити?", Map.of(
"Відкрити двері", 2,
"Йти геть", 9
), false));

questions.put(2, new Question("Ти потрапив у темний коридор. Йти ліворуч чи праворуч?", Map.of(
"Ліворуч", 3,
"Праворуч", 4
), false));

questions.put(3, new Question("Ти знайшов стару скриню. Взяти ключ?", Map.of(
"Так", 6,
"Ні", 7
), false));

questions.put(4, new Question("Ти потрапив у пастку з шипами! Гра закінчена. 😵", Map.of(), true));

questions.put(6, new Question("Ти підійшов до великих воріт. Відкрити їх ключем?", Map.of(
"Відкрити", 8,
"Повернутися", 2
), false));

questions.put(7, new Question("Ти бачиш великі ворота, але вони зачинені. Що робити?", Map.of(
"Повернутися", 2,
"Сісти і чекати", 10
), false));

questions.put(8, new Question("Вітаю! Ти відкрив ворота і знайшов величезний скарб! 🏆", Map.of(), true));

questions.put(9, new Question("Ти вирішив покинути квест. Може, спробуєш ще раз? 🚪", Map.of(), true));

questions.put(10, new Question("Ти сів чекати, але ніхто не прийшов... Гра закінчена. ⏳", Map.of(), true));
}

@Override
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws IOException {
request.setCharacterEncoding("UTF-8");
HttpSession session = request.getSession();

Integer step = (Integer) session.getAttribute("step");

String choice = request.getParameter("choice");

Question currentQuestion = questions.get(step);
Integer nextStep = currentQuestion.getOptions().get(choice);

session.setAttribute("step", nextStep);

response.sendRedirect("game.jsp");
}

@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
HttpSession session = request.getSession();

session.setAttribute("questions", questions);
String playerName = request.getParameter("playerName");
session.setAttribute("playerName", playerName);
session.setAttribute("step", 1);

request.getRequestDispatcher("game.jsp").forward(request, response);
}
}
27 changes: 27 additions & 0 deletions Bevzyuk/src/main/java/com/quest/Question.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,27 @@
package com.quest;

import java.util.Map;

public class Question {
private String text;
private Map<String, Integer> options;
private boolean isEnding;

public Question(String text, Map<String, Integer> options, boolean isEnding) {
this.text = text;
this.options = options;
this.isEnding = isEnding;
}

public String getText() {
return text;
}

public Map<String, Integer> getOptions() {
return options;
}

public boolean isEnding() {
return isEnding;
}
}
15 changes: 15 additions & 0 deletions Bevzyuk/src/main/java/com/quest/RestartServlet.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
package com.quest;

import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;

@WebServlet("/restart")
public class RestartServlet extends HttpServlet {
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws IOException {
request.getSession().invalidate();
response.sendRedirect("index.jsp");
}
}
7 changes: 7 additions & 0 deletions Bevzyuk/src/main/webapp/WEB-INF/web.xml
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
<!DOCTYPE web-app PUBLIC
"-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN"
"http://java.sun.com/dtd/web-app_2_3.dtd" >

<web-app>
<display-name>Archetype Created Web Application</display-name>
</web-app>
48 changes: 48 additions & 0 deletions Bevzyuk/src/main/webapp/game.jsp
Original file line number Diff line number Diff line change
@@ -0,0 +1,48 @@
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@ page import="java.util.Map" %>
<%@ page import="com.quest.Question" %>
<%@ page import="javax.servlet.http.HttpSession" %>
<html>
<head>
<title>Квест</title>
<link rel="stylesheet" type="text/css" href="style.css">
</head>
<body>
<%
session = request.getSession();
String playerName = (String) session.getAttribute("playerName");
Integer step = (Integer) session.getAttribute("step");
Map<Integer, Question> questions = (Map<Integer, Question>) session.getAttribute("questions");

Question question = (questions != null) ? questions.get(step) : null;

String headerText;
if (question != null && !question.isEnding()) {
headerText = "Удачі, " + (playerName != null ? playerName : "Гравцю") + "! Обери свій шлях:";
} else if (question != null && question.isEnding()) {
headerText = "Кінець гри, " + (playerName != null ? playerName : "Гравцю") + "!";
} else {
headerText = "Щось пішло не так, спробуй ще раз!";
}
%>

<h2><%= headerText %></h2>

<% if (question != null) { %>
<p><%= question.getText() %></p>

<% if (!question.isEnding()) { %>
<form action="game" method="post">
<% for (String option : question.getOptions().keySet()) { %>
<button type="submit" name="choice" value="<%= option %>"><%= option %></button>
<% } %>
</form>
<% } else { %>
<p><strong>Гра закінчена!</strong></p>
<a href="restart">Почати знову</a>
<% } %>
<% } else { %>
<p>Щось пішло не так. <a href="restart">Спробуйте знову</a></p>
<% } %>
</body>
</html>
18 changes: 18 additions & 0 deletions Bevzyuk/src/main/webapp/index.jsp
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>Квест: Початок</title>
<link rel="stylesheet" type="text/css" href="style.css">
</head>
<body class="start-page">
<div class="container">
<h1>🔮 Ласкаво просимо до квесту! 🔮</h1>
<p>Відчуй себе справжнім шукачем пригод! Введи своє ім’я та вирушай у подорож повну таємниць і небезпек.</p>
<form action="game" method="get">
<label for="playerName">Як тебе звати?</label>
<input type="text" id="playerName" name="playerName" placeholder="Введіть ім'я" required>
<button type="submit">🔓 Почати гру</button>
</form>
</div>
</body>
</html>
Loading