diff --git a/.eslintrc.json b/.eslintrc.json
index e37e1e072..ef1409393 100644
--- a/.eslintrc.json
+++ b/.eslintrc.json
@@ -3,8 +3,8 @@
"plugins": ["prettier"],
"rules": {
"camelcase": ["error", { "properties": "never" }],
- "prettier/prettier": "error",
+ "prettier/prettier": ["error", { "endOfLine": "auto" }],
"eqeqeq": ["error", "always"],
"no-unused-vars": ["error"]
}
-}
+}
\ No newline at end of file
diff --git a/README.md b/README.md
index 9b90842c4..ed2cc1b75 100644
--- a/README.md
+++ b/README.md
@@ -1,3 +1,47 @@
+# Домашняя работа 1"
+
+Добавление нового режима: реализовать режим, при котором игра завершается после трех ошибок.
+
+Включение режима: режим должен включаться с помощью чек-бокса на странице выбора уровня.
+
+Счетчик ошибок: нужно добавить вывод количества оставшихся попыток на игровой экран («Осталось 3 попытки» и так далее).
+
+Отображение: внешний вид и расположение элементов остаются на ваше усмотрение, но выбор должен быть логически обоснован.
+
+Конец игры: при достижении трех ошибок должно появляться модальное окно о завершении игры, его можно взять из макета.
+
+Ожидаемое время выполнения работы: 4 часа
+Фактическое время выполнения работы: 6 часов
+
+
+
+
+# Домашняя работа 2"
+Создание страницы "Лидерборд": Требуется разработать новую страницу в игре, которая будет носить название "Лидерборд". Формат отображения нужно взять из макета.
+
+Отображение “Лидерборда”: На странице должны отображаться результаты пользователей в порядке возрастания по времени, затраченному на успешное прохождение игры.
+
+Результат игры: Если результат игры проходит в "Лидерборд по ТОП-3, то в модальном окне нужно запросить имя пользователя и указать затраченное на игру время. Формат отображения нужно взять из макета.
+
+Если пользователь не проходит в “Лидерборд”, однако он выиграл, то показываем ему модальное окно победы (уже реализовано в приложении).
+Отображение модального окна проигрыша остается без изменений.
+Страница выбора сложности: На страницу выбора сложности нужно добавить ссылку, которая ведет на страницу лидерборда. Отображение нужно взять из макета.
+
+Ожидаемое время выполнения работы: 6 часа
+Фактическое время выполнения работы: 8 часов
+
+
+
+# Курсовая работа"
+Часть 1. Создание суперсил
+Нужно создать и внедрить систему суперсил, которые будут действовать как упрощения или подсказки для игрока. Например, если игрок открывает неправильную карту, суперсила будет автоматически открывать соседнюю правильную пару. Подробная информация — в техническом задании. Для зачтения работы достаточно реализовать минимум одну из суперсил.
+
+Часть 2. Доработка лидерборда
+Добавьте к каждой позиции в лидерборде ачивки. Например, если пользователь прошел игру без использования суперсил или в сложном режиме. Подробная информация — в техническом задании.
+
+Ожидаемое время выполнения работы: 8 часа
+Фактическое время выполнения работы: часов
+
# MVP Карточная игра "Мемо"
В этом репозитории реализован MVP карточкой игры "Мемо" по [тех.заданию](./docs/mvp-spec.md)
diff --git a/docs/mvp-spec.md b/docs/mvp-spec.md
index fab47685e..e083d7788 100644
--- a/docs/mvp-spec.md
+++ b/docs/mvp-spec.md
@@ -14,9 +14,10 @@
Количество карточек для каждого уровня сложности можете назначать и свои или выбрать готовый пресет.
Предлагаем следующее пресеты:
- - Легкий уровень - 6 карточек (3 пары)
- - Средний уровень - 12 карточек (6 пар)
- - Сложный уровень - 18 карточек (9 пар)
+
+- Легкий уровень - 6 карточек (3 пары)
+- Средний уровень - 12 карточек (6 пар)
+- Сложный уровень - 18 карточек (9 пар)
Как только уровень сложности выбран, игроку показывается на игровой поле.
diff --git a/src/api.js b/src/api.js
new file mode 100644
index 000000000..cf670dc7c
--- /dev/null
+++ b/src/api.js
@@ -0,0 +1,26 @@
+const baseHost = "https://wedev-api.sky.pro/api/v2/leaderboard";
+//Получаем список лидеров
+export async function getLeaders() {
+ const response = await fetch(baseHost);
+ if (!response.status === 200) {
+ throw new Error("Ошибка");
+ }
+ const data = await response.json();
+ return data;
+}
+//Добавляем лидера в список
+export async function postLeader({ name, time, achievements }) {
+ const response = await fetch(baseHost, {
+ method: "POST",
+ body: JSON.stringify({
+ name: name,
+ time: time,
+ achievements: achievements,
+ }),
+ });
+ if (response.status === 400) {
+ throw new Error("Полученные данные не в формате JSON");
+ }
+ const data = await response.json();
+ return data;
+}
diff --git a/src/components/Achievment/Achievment.jsx b/src/components/Achievment/Achievment.jsx
new file mode 100644
index 000000000..5ea33c16a
--- /dev/null
+++ b/src/components/Achievment/Achievment.jsx
@@ -0,0 +1,9 @@
+import unsuper1 from "./unsuper1.svg";
+import super1 from "./super1.svg";
+
+export default function Achievment(isAchievment) {
+ console.log(Object.values(isAchievment)[2].isAchievment);
+ return (
+ <>{Object.values(isAchievment)[2].isAchievment ? : }>
+ );
+}
diff --git a/src/components/Achievment/super1.svg b/src/components/Achievment/super1.svg
new file mode 100644
index 000000000..3ee152c69
--- /dev/null
+++ b/src/components/Achievment/super1.svg
@@ -0,0 +1,17 @@
+
diff --git a/src/components/Achievment/unsuper1.svg b/src/components/Achievment/unsuper1.svg
new file mode 100644
index 000000000..934c9486e
--- /dev/null
+++ b/src/components/Achievment/unsuper1.svg
@@ -0,0 +1,15 @@
+
diff --git a/src/components/Cards/Cards.jsx b/src/components/Cards/Cards.jsx
index 7526a56c8..a213efbf6 100644
--- a/src/components/Cards/Cards.jsx
+++ b/src/components/Cards/Cards.jsx
@@ -5,6 +5,8 @@ import styles from "./Cards.module.css";
import { EndGameModal } from "../../components/EndGameModal/EndGameModal";
import { Button } from "../../components/Button/Button";
import { Card } from "../../components/Card/Card";
+import { useEasyMode } from "../../context/hooks/useEasyMode";
+import superImg from "./super.png";
// Игра закончилась
const STATUS_LOST = "STATUS_LOST";
@@ -41,6 +43,9 @@ function getTimerValue(startDate, endDate) {
* previewSeconds - сколько секунд пользователь будет видеть все карты открытыми до начала игры
*/
export function Cards({ pairsCount = 3, previewSeconds = 5 }) {
+ const [achievements, setAchievements] = useState([]);
+ const { easyMode } = useEasyMode();
+ const [countTry, setCountTry] = useState(null);
// В cards лежит игровое поле - массив карт и их состояние открыта\закрыта
const [cards, setCards] = useState([]);
// Текущий статус игры
@@ -63,6 +68,7 @@ export function Cards({ pairsCount = 3, previewSeconds = 5 }) {
}
function startGame() {
const startDate = new Date();
+ setCountTry(easyMode ? 3 : 1);
setGameEndDate(null);
setGameStartDate(startDate);
setTimer(getTimerValue(startDate, null));
@@ -82,17 +88,32 @@ export function Cards({ pairsCount = 3, previewSeconds = 5 }) {
* - "Игрок проиграл", если на поле есть две открытые карты без пары
* - "Игра продолжается", если не случилось первых двух условий
*/
+ function alohomora() {
+ if (achievements.includes(1)) {
+ alert("Подсказкой можно воспользоваться только 1 раз");
+ return;
+ }
+ let closedCards = cards.filter(card => !card.open);
+ closedCards = shuffle(closedCards);
+ closedCards[0].open = true;
+ closedCards.forEach(card => {
+ if (card.suit === closedCards[0].suit && card.rank === closedCards[0].rank) {
+ card.open = true;
+ }
+ });
+ setAchievements([1]);
+ }
+
const openCard = clickedCard => {
// Если карта уже открыта, то ничего не делаем
if (clickedCard.open) {
return;
}
// Игровое поле после открытия кликнутой карты
- const nextCards = cards.map(card => {
+ let nextCards = cards.map(card => {
if (card.id !== clickedCard.id) {
return card;
}
-
return {
...card,
open: true,
@@ -123,15 +144,23 @@ export function Cards({ pairsCount = 3, previewSeconds = 5 }) {
return false;
});
- const playerLost = openCardsWithoutPair.length >= 2;
+ if (openCardsWithoutPair.length >= 2) {
+ setTimeout(() => {
+ openCardsWithoutPair[1].open = false;
+ openCardsWithoutPair[0].open = false;
+ }, 1000);
+ setCountTry(countTry - 1);
- // "Игрок проиграл", т.к на поле есть две открытые карты без пары
- if (playerLost) {
- finishGame(STATUS_LOST);
- return;
- }
+ const playerLost = countTry === 1;
- // ... игра продолжается
+ // "Игрок проиграл", т.к на поле есть две открытые карты без пары
+ if (playerLost) {
+ finishGame(STATUS_LOST);
+ return;
+ }
+
+ // ... игра продолжается
+ }
};
const isGameEnded = status === STATUS_LOST || status === STATUS_WON;
@@ -195,7 +224,13 @@ export function Cards({ pairsCount = 3, previewSeconds = 5 }) {
>
)}
- {status === STATUS_IN_PROGRESS ? : null}
+ {status === STATUS_IN_PROGRESS ? (
+ <>
+