From 61f2a71410435f49e81e3304671e643690181e45 Mon Sep 17 00:00:00 2001 From: root Date: Mon, 17 Nov 2025 23:07:52 +0300 Subject: [PATCH] Added quiz starter templates --- .DS_Store | Bin 6148 -> 6148 bytes Battleships/.DS_Store | Bin 6148 -> 0 bytes Battleships/Lesson1.html | 121 ------ Battleships/Lesson2.html | 138 ------- Battleships/battleships-137-main/.DS_Store | Bin 6148 -> 0 bytes Battleships/battleships-137-main/.gitignore | 9 - .../battleships-137-main/.gitpod.dockerfile | 84 ---- Battleships/battleships-137-main/.gitpod.yml | 14 - Battleships/battleships-137-main/.replit | 8 - .../.vscode/arctictern.py | 186 --------- .../.vscode/heroku_config.sh | 40 -- .../.vscode/init_tasks.sh | 13 - .../battleships-137-main/.vscode/make_url.py | 14 - .../.vscode/settings.json | 17 - .../battleships-137-main/.vscode/uptime.sh | 23 -- Battleships/battleships-137-main/Procfile | 1 - Battleships/battleships-137-main/README.md | 284 -------------- .../controllers/default.js | 60 --- Battleships/battleships-137-main/index.js | 30 -- .../battleships-137-main/package-lock.json | 106 ----- Battleships/battleships-137-main/package.json | 23 -- .../readme/board_size.jpg | Bin 58924 -> 0 bytes .../readme/flow_chart.jpg | Bin 108942 -> 0 bytes .../readme/flow_chart.png | Bin 141902 -> 0 bytes .../battleships-137-main/readme/game_over.jpg | Bin 53143 -> 0 bytes .../readme/player_turn.jpg | Bin 50332 -> 0 bytes .../readme/pylint_screenshot.jpg | Bin 26025 -> 0 bytes .../readme/save_high_score.jpg | Bin 38597 -> 0 bytes .../readme/screenshot.jpg | Bin 58148 -> 0 bytes .../readme/screenshot.png | Bin 67455 -> 0 bytes .../battleships-137-main/readme/welcome.jpg | Bin 51841 -> 0 bytes .../battleships-137-main/requirements.txt | 20 - Battleships/battleships-137-main/run.py | 371 ------------------ Battleships/battleships-137-main/runtime.txt | 1 - .../battleships-137-main/views/index.html | 27 -- .../battleships-137-main/views/layout.html | 173 -------- Battleships/lesson_1.py | 41 -- Battleships/lesson_2.py | 22 -- README.md | 13 +- app.py | 44 +++ pingpong/pingpong.html | 97 ----- questions.json | 12 + requirements.txt | 1 + static/script.js | 104 +++++ static/style.css | 105 +++++ templates/game.html | 47 +++ templates/index.html | 30 ++ 47 files changed, 355 insertions(+), 1924 deletions(-) delete mode 100644 Battleships/.DS_Store delete mode 100644 Battleships/Lesson1.html delete mode 100644 Battleships/Lesson2.html delete mode 100644 Battleships/battleships-137-main/.DS_Store delete mode 100644 Battleships/battleships-137-main/.gitignore delete mode 100644 Battleships/battleships-137-main/.gitpod.dockerfile delete mode 100644 Battleships/battleships-137-main/.gitpod.yml delete mode 100644 Battleships/battleships-137-main/.replit delete mode 100644 Battleships/battleships-137-main/.vscode/arctictern.py delete mode 100644 Battleships/battleships-137-main/.vscode/heroku_config.sh delete mode 100644 Battleships/battleships-137-main/.vscode/init_tasks.sh delete mode 100644 Battleships/battleships-137-main/.vscode/make_url.py delete mode 100644 Battleships/battleships-137-main/.vscode/settings.json delete mode 100644 Battleships/battleships-137-main/.vscode/uptime.sh delete mode 100644 Battleships/battleships-137-main/Procfile delete mode 100644 Battleships/battleships-137-main/README.md delete mode 100644 Battleships/battleships-137-main/controllers/default.js delete mode 100644 Battleships/battleships-137-main/index.js delete mode 100644 Battleships/battleships-137-main/package-lock.json delete mode 100644 Battleships/battleships-137-main/package.json delete mode 100644 Battleships/battleships-137-main/readme/board_size.jpg delete mode 100644 Battleships/battleships-137-main/readme/flow_chart.jpg delete mode 100644 Battleships/battleships-137-main/readme/flow_chart.png delete mode 100644 Battleships/battleships-137-main/readme/game_over.jpg delete mode 100644 Battleships/battleships-137-main/readme/player_turn.jpg delete mode 100644 Battleships/battleships-137-main/readme/pylint_screenshot.jpg delete mode 100644 Battleships/battleships-137-main/readme/save_high_score.jpg delete mode 100644 Battleships/battleships-137-main/readme/screenshot.jpg delete mode 100644 Battleships/battleships-137-main/readme/screenshot.png delete mode 100644 Battleships/battleships-137-main/readme/welcome.jpg delete mode 100644 Battleships/battleships-137-main/requirements.txt delete mode 100644 Battleships/battleships-137-main/run.py delete mode 100644 Battleships/battleships-137-main/runtime.txt delete mode 100644 Battleships/battleships-137-main/views/index.html delete mode 100644 Battleships/battleships-137-main/views/layout.html delete mode 100644 Battleships/lesson_1.py delete mode 100644 Battleships/lesson_2.py create mode 100644 app.py delete mode 100644 pingpong/pingpong.html create mode 100644 questions.json create mode 100644 requirements.txt create mode 100644 static/script.js create mode 100644 static/style.css create mode 100644 templates/game.html create mode 100644 templates/index.html diff --git a/.DS_Store b/.DS_Store index cab3426f2ee34d7a97bae192901440ecca67cebd..e4f57bfe7949b116d7e08f43a4d2852bd9cfec42 100644 GIT binary patch delta 142 zcmZoMXfc=|#>CJzu~2NHo}wrt0|NsP3otNbGUPJkGn4?a?!-cMbC856Lm@*cP@)Q1 zk|7DGB$FYBA(f$sp#VrH0yU+k6es5-<>%*YKFI9GviSn@f2Pgs9Q+(Wi-02EnJ4p$ W=yHOLJOIQDlWlmUH^+!9VFm!3X(0;$ literal 6148 zcmeHK%}T>S5T32oCKRCug&r5Y7Htm(#Y>F!1&ruHr6#7>V4AHarH4|8SA8Mhz&G&b zyEyw(QECo)5RsWO`)y|D+ho6l-3|aSZya?18USFSORU(~d|`52`hrzVWCf9_ITGkY z1_Ov;w2)1Kzo>wGcXjX}fE<4x-(MC^vQe0b5Hp^_Q4(i)yZyo{OV#C-TFtK2YZv}N zO#D2^$C(%0oyn_XA(C+355kkUKj}5r4n&#+1pA zw(MS`Ih{I=)8fv~ti`9D_HMhyx3`_y%(m7yw)T#CH_0#+4_Z=&U!Ss7gL8PqPRZ(` z>?#TIX(hEJCAseSS7P|_Q!dFIif-3PW!-O{+`e8s@0ZUz6wx=bM}vi@m@kiz6d(mi zfgdVhc1^4PLq5?+0aD=qDj@d#$N9NR2j*&|mJ}cbJ}a=KFB|gwKP<2R zKa=Q+6d(oul>)5V^}8M}$(*eVi<4(9N54duCi4o7?-cB)qZo7LQQSmVhH)-Ch_1mx SBSz5ZkARYa8dBg_6?g+dSag8^ diff --git a/Battleships/.DS_Store b/Battleships/.DS_Store deleted file mode 100644 index 465823b43d5c490c9fe978ee4b32f4f0f18448af..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6148 zcmeHK%}T>S5T30?>JQk12akIf!QjDbEb-vEFQ7@p7Lsludh?K{^96hf-$K9H8A?kO z8Uz)Y3A5j3cE8=^+a;4FA~$&|6QVH@jo^%fJrti9x3hO_ppjjmi(^!DPYumzPRmYj z3;aa|c|8>!aTZb&u2j`u9`u6;C)sJ6(i@%($J^SG~rZzJLOaW8iHx)q6W*Z#{ zT4@TH0;a%90scOCIAf~V3dT=@t2?&MNID@_4YU{iq|xgB%dc zHq9n@CC#m!m*ZUP;kR%$?$-*gD5%6#jJ}+TPvFrI_gn#{imf0bF#8dRGFV{>{HOvS DBl=om diff --git a/Battleships/Lesson1.html b/Battleships/Lesson1.html deleted file mode 100644 index cb25f34..0000000 --- a/Battleships/Lesson1.html +++ /dev/null @@ -1,121 +0,0 @@ - - - - - - Lesson 1: Battleships in Python! - - - -

๐ŸŽฎ Lesson 1: Find the Hidden Ship!

- -
-

โœ… Learning Outcomes

-
    -
  • Use random to create hidden game elements
  • -
  • Get input from the player using input()
  • -
  • Use if / else to give feedback
  • -
  • Run and debug a simple Python program
  • -
-
- -
-

๐Ÿ’ก Why It Matters

-

Every video game has hidden logic โ€” secret levels, random enemies, or treasure locations. Learning to hide and reveal things with code is the first step to making your own games!

-

These same skills are used in apps, quizzes, and even smart home devices!

-
- -

โฑ๏ธ Lesson Plan (40 minutes)

- -
- 0โ€“5 min โ†’ Demo & Explain
- Show the game: โ€œThereโ€™s a secret ship! Can you find it?โ€
- Explain: Weโ€™ll write code that hides a ship and checks your guess. -
- -
- 5โ€“20 min โ†’ Code Together
- Type this starter code (or use your template): -
-import random
-
-ship_row = random.randint(0, 4)
-ship_col = random.randint(0, 4)
-
-print("Guess the ship!")
-guess_row = int(input("Row (0-4): "))
-guess_col = int(input("Col (0-4): "))
-
-if guess_row == ship_row and guess_col == ship_col:
-    print("๐ŸŽฏ HIT! You sank the ship!")
-else:
-    print("๐Ÿ’ฆ MISS!")
-
-print("The ship was at", ship_row, ship_col)
-    
-
- -
- 20โ€“35 min โ†’ Test & Improve
- โ€ข Run the program 3 times
- โ€ข Try to break it (type a letter instead of number โ€” what happens?)
- โ€ข ๐ŸŒŸ Challenge: Add a 2nd ship or limit to 3 guesses! -
- -
- 35โ€“40 min โ†’ Share & Celebrate
- Pair up! Can your partner guess the ship in 2 tries? -
- -

๐Ÿš€ You Just Learned:

-

How to create interactive programs that respond to user choices โ€” the heart of all games!

- - \ No newline at end of file diff --git a/Battleships/Lesson2.html b/Battleships/Lesson2.html deleted file mode 100644 index 13b9103..0000000 --- a/Battleships/Lesson2.html +++ /dev/null @@ -1,138 +0,0 @@ - - - - - - Lesson 2: Hunt All the Ships! - - - -

๐Ÿšข Lesson 2: Hunt All the Ships!

- -
-

โœ… Learning Outcomes

-
    -
  • Use lists to store multiple ships
  • -
  • Create a game loop with turns
  • -
  • Track game state (hits, turns)
  • -
  • Make decisions with for loops and if inside lists
  • -
-
- -
-

๐Ÿ’ก Why It Matters

-

Real games donโ€™t end after one guess! They track score, lives, and progress. Learning to manage game state is how you build Pac-Man, Minecraft, or Roblox games!

-

Lists and loops are used in every programming language โ€” from apps to robots.

-
- -

โฑ๏ธ Lesson Plan (40 minutes)

- -
- 0โ€“5 min โ†’ Review & Goal
- โ€œLast time: 1 ship. Today: 3 ships and 10 turns!โ€
- Show the enhanced game in action. -
- -
- 5โ€“20 min โ†’ Upgrade Your Code
- Edit your Lesson 1 file to this: -
-import random
-
-ships = []
-while len(ships) < 3:
-    r = random.randint(0, 4)
-    c = random.randint(0, 4)
-    if [r, c] not in ships:
-        ships.append([r, c])
-
-print("3 ships hidden! 10 turns to find them all.")
-hits = 0
-
-for turn in range(10):
-    print("\nTurn", turn + 1)
-    guess_row = int(input("Row (0-4): "))
-    guess_col = int(input("Col (0-4): "))
-    
-    if [guess_row, guess_col] in ships:
-        print("๐ŸŽฏ HIT!")
-        ships.remove([guess_row, guess_col])
-        hits += 1
-        if hits == 3:
-            print("๐Ÿ† You win!")
-            break
-    else:
-        print("๐Ÿ’ฆ MISS!")
-
-if hits < 3:
-    print("Game over! You found", hits, "ships.")
-    
-
- -
- 20โ€“35 min โ†’ Level Up!
- โ€ข Test the game (try to win!)
- โ€ข ๐ŸŒŸ Challenge 1: Let players use A, B, C for rows!
- row_letter = input("Row (A-E): ").upper()
- guess_row = ord(row_letter) - ord('A')
- โ€ข ๐ŸŒŸ Challenge 2: Show how many turns are left! -
- -
- 35โ€“40 min โ†’ Play & Reflect
- Play your friendโ€™s game! What makes it fun?
- โ€œNow YOU can make games โ€” not just play them!โ€ -
- -

๐ŸŒŸ Youโ€™re Now a Game Coder!

-

Youโ€™ve learned the core ideas behind almost every game: hidden objects, player input, feedback, and win/lose conditions.

- - \ No newline at end of file diff --git a/Battleships/battleships-137-main/.DS_Store b/Battleships/battleships-137-main/.DS_Store deleted file mode 100644 index 7f938abc0ace9c51268435c91927adabf69a0c67..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6148 zcmeHKu};G<5IsW+rCmBOFh;CMi2gyS!j9A*fHqY@YDh(aE)3cEFE;*zzkqjlE~=YY zVnTrKD*HL-yWGpGV#h?}hL8Dxs82*4G{#mJU4!vFx0>yE4<|dhM@czN=d;0RQr4o) zVG5W6zfA#tclYU(o@hxE+IWA9g;G6k)gy{B%f|C^j2T`SPTrqi&zqw1Z$vF_c(qtp zlcGIgaz_tz4@PtRrWh@CU0FxAUr;d;8Q~X=ZsZw>4*9Ztv9^Fgk(Z;`c3nr^=tqxb=Y=px`euTkBL{Oj3xW3unQUH54Tc@XJ zy(wS{m;zr4@cNLTF{U0XMOiw~$q@j^9|>X@%bo~K*a1vER*LYzoTdUb)%hca({%U~ zAD4Qp6g8ckRK|ULW#>;QPO8J7NI1Dv(Rx$B6bKdA)yqEb{}=J|f0$%frhqB%uM}{t zY?KZ0NPcgvJsj_~3ECAJ8^=|Ol7h}}$1>op_y|o5a|sWCsmDqY9+-Uyhz!=50zaz2 ECv~2POaK4? diff --git a/Battleships/battleships-137-main/.gitignore b/Battleships/battleships-137-main/.gitignore deleted file mode 100644 index 29c24da..0000000 --- a/Battleships/battleships-137-main/.gitignore +++ /dev/null @@ -1,9 +0,0 @@ -core.Microsoft* -core.mongo* -core.python* -env.py -__pycache__/ -*.py[cod] -node_modules/ -.github/ -creds.json \ No newline at end of file diff --git a/Battleships/battleships-137-main/.gitpod.dockerfile b/Battleships/battleships-137-main/.gitpod.dockerfile deleted file mode 100644 index cb70866..0000000 --- a/Battleships/battleships-137-main/.gitpod.dockerfile +++ /dev/null @@ -1,84 +0,0 @@ -FROM gitpod/workspace-base - -RUN echo "CI version from base" - -### NodeJS ### -USER gitpod -ENV NODE_VERSION=16.13.0 -ENV TRIGGER_REBUILD=1 -RUN curl -fsSL https://raw.githubusercontent.com/nvm-sh/nvm/v0.38.0/install.sh | PROFILE=/dev/null bash \ - && bash -c ". .nvm/nvm.sh \ - && nvm install $NODE_VERSION \ - && nvm use $NODE_VERSION \ - && nvm alias default $NODE_VERSION \ - && npm install -g typescript yarn node-gyp" \ - && echo ". ~/.nvm/nvm.sh" >> /home/gitpod/.bashrc.d/50-node -ENV PATH=$PATH:/home/gitpod/.nvm/versions/node/v${NODE_VERSION}/bin - -### Python ### -USER gitpod -RUN sudo install-packages python3-pip -ENV PYTHON_VERSION 3.12.2 - -ENV PATH=$HOME/.pyenv/bin:$HOME/.pyenv/shims:$PATH -RUN curl -fsSL https://github.com/pyenv/pyenv-installer/raw/master/bin/pyenv-installer | bash \ - && { echo; \ - echo 'eval "$(pyenv init -)"'; \ - echo 'eval "$(pyenv virtualenv-init -)"'; } >> /home/gitpod/.bashrc.d/60-python \ - && pyenv update \ - && pyenv install $PYTHON_VERSION \ - && pyenv global $PYTHON_VERSION \ - && python3 -m pip install --no-cache-dir --upgrade pip \ - && python3 -m pip install --no-cache-dir --upgrade \ - setuptools wheel virtualenv pipenv pylint rope flake8 \ - mypy autopep8 pep8 pylama pydocstyle bandit notebook \ - twine \ - && sudo rm -rf /tmp/*USER gitpod -ENV PYTHONUSERBASE=/workspace/.pip-modules \ - PIP_USER=yes -ENV PATH=$PYTHONUSERBASE/bin:$PATH - -# Setup Heroku CLI -RUN curl https://cli-assets.heroku.com/install.sh | sh - -RUN wget http://archive.ubuntu.com/ubuntu/pool/main/o/openssl/libssl1.1_1.1.1f-1ubuntu2_amd64.deb && sudo dpkg -i libssl1.1_1.1.1f-1ubuntu2_amd64.deb && \ - sudo rm -rf /var/cache/apt/* /var/lib/apt/lists/* /tmp/* /home/gitpod/*.deb && \ - sudo chown -R gitpod:gitpod /home/gitpod/.cache/heroku/ - -# Setup PostgreSQL - -RUN sudo sh -c 'echo "deb http://apt.postgresql.org/pub/repos/apt $(lsb_release -cs)-pgdg main" | tee /etc/apt/sources.list.d/pgdg.list' && \ - sudo apt-key adv --keyserver hkp://keyserver.ubuntu.com:80 --recv B97B0AFCAA1A47F044F244A07FCC7D46ACCC4CF8 && \ - sudo apt-get update -y && \ - sudo apt-get install -y postgresql-12 - -ENV PGDATA="/workspace/.pgsql/data" - -RUN mkdir -p ~/.pg_ctl/bin ~/.pg_ctl/sockets \ - && echo '#!/bin/bash\n[ ! -d $PGDATA ] && mkdir -p $PGDATA && initdb --auth=trust -D $PGDATA\npg_ctl -D $PGDATA -l ~/.pg_ctl/log -o "-k ~/.pg_ctl/sockets" start\n' > ~/.pg_ctl/bin/pg_start \ - && echo '#!/bin/bash\npg_ctl -D $PGDATA -l ~/.pg_ctl/log -o "-k ~/.pg_ctl/sockets" stop\n' > ~/.pg_ctl/bin/pg_stop \ - && chmod +x ~/.pg_ctl/bin/* - -# ENV DATABASE_URL="postgresql://gitpod@localhost" -# ENV PGHOSTADDR="127.0.0.1" -ENV PGDATABASE="postgres" - -ENV PATH="/usr/lib/postgresql/12/bin:/home/gitpod/.nvm/versions/node/v${NODE_VERSION}/bin:$HOME/.pg_ctl/bin:$PATH" - - -# Add aliases - -RUN echo 'alias run="python3 $GITPOD_REPO_ROOT/manage.py runserver 0.0.0.0:8000"' >> ~/.bashrc && \ - echo 'alias heroku_config=". $GITPOD_REPO_ROOT/.vscode/heroku_config.sh"' >> ~/.bashrc && \ - echo 'alias python=python3' >> ~/.bashrc && \ - echo 'alias pip=pip3' >> ~/.bashrc && \ - echo 'alias arctictern="python3 $GITPOD_REPO_ROOT/.vscode/arctictern.py"' >> ~/.bashrc && \ - echo 'alias font_fix="python3 $GITPOD_REPO_ROOT/.vscode/font_fix.py"' >> ~/.bashrc && \ - echo 'alias set_pg="export PGHOSTADDR=127.0.0.1"' >> ~/.bashrc && \ - echo 'alias make_url="python3 $GITPOD_REPO_ROOT/.vscode/make_url.py "' >> ~/.bashrc - -# Local environment variables -ENV PORT="8080" -ENV IP="0.0.0.0" - - diff --git a/Battleships/battleships-137-main/.gitpod.yml b/Battleships/battleships-137-main/.gitpod.yml deleted file mode 100644 index 39778f8..0000000 --- a/Battleships/battleships-137-main/.gitpod.yml +++ /dev/null @@ -1,14 +0,0 @@ -image: - file: .gitpod.dockerfile -tasks: - - init: . ${GITPOD_REPO_ROOT}/.vscode/init_tasks.sh - command: /home/gitpod/.pg_ctl/bin/pg_start > /dev/null - - command: . ${GITPOD_REPO_ROOT}/.vscode/uptime.sh & -vscode: - extensions: - - ms-python.python - - formulahendry.auto-close-tag - - eventyret.bootstrap-4-cdn-snippet - - hookyqr.beautify - - matt-rudge.auto-open-preview-panel - diff --git a/Battleships/battleships-137-main/.replit b/Battleships/battleships-137-main/.replit deleted file mode 100644 index 2bec17a..0000000 --- a/Battleships/battleships-137-main/.replit +++ /dev/null @@ -1,8 +0,0 @@ -modules = ["web", "nodejs-20", "python-3.12"] -run = "python3 run.py" - -[nix] -channel = "stable-24_05" - -[deployment] -run = ["sh", "-c", "python3 run.py"] diff --git a/Battleships/battleships-137-main/.vscode/arctictern.py b/Battleships/battleships-137-main/.vscode/arctictern.py deleted file mode 100644 index bd164ce..0000000 --- a/Battleships/battleships-137-main/.vscode/arctictern.py +++ /dev/null @@ -1,186 +0,0 @@ -""" -arctictern.py -A little script that does a big migration -""" - -import json -import os -import requests -import shutil -import subprocess -import sys -from os.path import exists - -COLOURS = {"red": "\033[31m", - "blue": "\033[34m", - "green": "\033[32m", - "reset": "\033[0m", - "bold": "\033[1m"} - -BASE_URL = "https://raw.githubusercontent.com/Code-Institute-Org/gitpod-full-template/main/" -CURRENT_VERSION = 1.0 -THIS_VERSION = 1.0 - - -UPGRADE_FILE_LIST = [{"filename": ".vscode/settings.json", - "url": ".vscode/settings.json" - }, - {"filename": ".vscode/launch.json", - "url": ".vscode/launch.json" - }, - {"filename": ".gitpod.yml", - "url": ".gitpod.yml" - }, - {"filename": ".gitpod.dockerfile", - "url": ".gitpod.dockerfile" - }, - {"filename": ".vscode/heroku_config.sh", - "url": ".vscode/heroku_config.sh" - }, - {"filename": ".vscode/init_tasks.sh", - "url": ".vscode/init_tasks.sh" - }, - {"filename": ".vscode/uptime.sh", - "url": ".vscode/uptime.sh" - }, - {"filename": ".vscode/make_url.py", - "url": ".vscode/make_url.py" - }, - {"filename": ".vscode/arctictern.py", - "url": ".vscode/arctictern.py" - }] - -FINAL_LINES = "\nexport POST_UPGRADE_RUN=1\nsource ~/.bashrc\n" - - -def get_versions(): - - if exists(".vscode/version.txt"): - with open(".vscode/version.txt", "r") as f: - THIS_VERSION = float(f.read().strip()) - else: - with open(".vscode/version.txt", "w") as f: - f.write(str(THIS_VERSION)) - - r = requests.get(BASE_URL + ".vscode/version.txt") - CURRENT_VERSION = float(r.content) - - return {"this_version": THIS_VERSION, - "current_version": CURRENT_VERSION} - -def needs_upgrade(): - """ - Checks the version of the current template against - this version. - Returns True if upgrade is needed, False if not. - """ - - versions = get_versions() - - print(f"Upstream version: {versions['current_version']}") - print(f"Local version: {versions['this_version']}") - - return versions["current_version"] > versions["this_version"] - - -def write_version(): - - versions = get_versions() - - with open(".vscode/version.txt", "w") as f: - f.write(str(versions["current_version"])) - - -def build_post_upgrade(): - - r = requests.get(BASE_URL + ".vscode/upgrades.json") - upgrades = json.loads(r.content.decode("utf-8")) - content = "" - - for k,v in upgrades.items(): - if float(k) > THIS_VERSION: - print(f"Adding version changes for {k} to post_upgrade.sh") - content += v - - if content: - content += FINAL_LINES - with open(".vscode/post_upgrade.sh", "w") as f: - f.writelines(content) - - print("Built post_upgrade.sh. Restart your workspace for it to take effect.") - - -def process(file, suffix): - """ - Replaces and optionally backs up the files that - need to be changed. - Arguments: file - a path and filename - suffix - the suffix to the BASE_URL - """ - - if file == ".gitpod.dockerfile" or file == ".gitpod.yml": - try: - shutil.copyfile(file, f"{file}.tmp") - except FileNotFoundError: - pass - - with open(file, "wb") as f: - r = requests.get(BASE_URL + suffix) - f.write(r.content) - - if exists(f"{file}.tmp"): - result = os.system(f"diff -q {file} {file}.tmp > /dev/null") - if result != 0: - os.remove(f"{file}.tmp") - return True - - return False - - -def start_migration(): - """ - Calls the process function and - renames the directory - """ - push_and_recreate = False - - if not os.path.isdir(".vscode"): - print("Creating .vscode directory") - os.mkdir(".vscode") - - for file in UPGRADE_FILE_LIST: - print(f"Processing: {file['filename']}") - result = process(file["filename"], file["url"]) - if result == True: - push_and_recreate = True - - if push_and_recreate: - write_version() - - if needs_upgrade() and not push_and_recreate: - build_post_upgrade() - - print("Changes saved.") - print("Please add, commit and push to GitHub.") - print("You may need to stop and restart your workspace for") - print("the changes to take effect.\n") - - if push_and_recreate: - print(f"{COLOURS['red']}{COLOURS['bold']}*** IMPORTANT INFORMATION ***{COLOURS['reset']}") - print("The files used to create this workspace have been updated") - print("Please download any files that are in .gitignore and") - print("recreate this workspace by clicking on the Gitpod button") - print("in GitHub. Then, upload your saved files again.\n") - - -if __name__ == "__main__": - - print(f"\n๐Ÿฆ {COLOURS['blue']}{COLOURS['bold']}ArcticTern version 0.3{COLOURS['reset']}") - print("CI Template Migration Utility") - print("-----------------------------") - print("Upgrades the workspace to the latest version.\n") - - if input("Start? Y/N ").lower() == "y": - start_migration() - else: - sys.exit("Migration cancelled by the user") diff --git a/Battleships/battleships-137-main/.vscode/heroku_config.sh b/Battleships/battleships-137-main/.vscode/heroku_config.sh deleted file mode 100644 index 5056d45..0000000 --- a/Battleships/battleships-137-main/.vscode/heroku_config.sh +++ /dev/null @@ -1,40 +0,0 @@ -#!/bin/bash -# Script to allow Heroku API key to be pasted -# exported as an environment variable -# -# Matt Rudge, May 2021 - -echo Heroku authentication configuration script -echo Code Institute, 2021 -echo -echo Get your Heroku API key by going to https://dashboard.heroku.com -echo Go to Account Settings and click on Reveal to view your Heroku API key -echo - -if [[ -z "${HEROKU_API_KEY}" ]]; then - echo Paste your Heroku API key here or press Enter to quit: - read apikey - if [[ -z "${apikey}" ]]; then - return 0 - fi - echo export HEROKU_API_KEY=${apikey} >> ~/.bashrc - echo Added the export. Refreshing the terminal. - . ~/.bashrc > /dev/null - echo Done! -else - echo API key is already set. - echo - echo To reset the API key please input "'reset'": - read reset_trigger - if [[ ${reset_trigger} == reset ]]; then - unset HEROKU_API_KEY - unset reset_trigger - echo - echo API key removed! - else - unset reset_trigger - echo API key unchanged. - fi - echo - echo Exiting -fi diff --git a/Battleships/battleships-137-main/.vscode/init_tasks.sh b/Battleships/battleships-137-main/.vscode/init_tasks.sh deleted file mode 100644 index c532e38..0000000 --- a/Battleships/battleships-137-main/.vscode/init_tasks.sh +++ /dev/null @@ -1,13 +0,0 @@ -#!/bin/bash - -# Gives a personalised greeting -# Adds configuration options for SQLite -# Creates run aliases -# Author: Matt Rudge - -echo "Setting the greeting" -sed -i "s/USER_NAME/$GITPOD_GIT_USER_NAME/g" ${GITPOD_REPO_ROOT}/README.md -echo "Creating .sqliterc file" -echo ".headers on" > ~/.sqliterc -echo ".mode column" >> ~/.sqliterc -echo "Your workspace is ready to use. Happy coding!" diff --git a/Battleships/battleships-137-main/.vscode/make_url.py b/Battleships/battleships-137-main/.vscode/make_url.py deleted file mode 100644 index 1a27167..0000000 --- a/Battleships/battleships-137-main/.vscode/make_url.py +++ /dev/null @@ -1,14 +0,0 @@ -# Simple utility for creating the Cloudinary URL from a -# cloudinary_python.txt file -# Matt Rudge, November 2021 - -import re - -with open("cloudinary_python.txt") as f: - content = f.readlines() - -cloud_name = re.findall(r"['](.*?)[']",content[15])[0] -api_key = re.findall(r"['](.*?)[']",content[16])[0] -api_secret = re.findall(r"['](.*?)[']",content[17])[0] - -print(f"cloudinary://{api_key}:{api_secret}@{cloud_name}") diff --git a/Battleships/battleships-137-main/.vscode/settings.json b/Battleships/battleships-137-main/.vscode/settings.json deleted file mode 100644 index c683001..0000000 --- a/Battleships/battleships-137-main/.vscode/settings.json +++ /dev/null @@ -1,17 +0,0 @@ -{ - "python.pythonPath": ".venv/bin/python", - "python.formatting.provider": "black", - "python.formatting.blackArgs": ["--line-length=79" ], - "python.formatting.autopep8Args": ["--max-line-length=79" ], - "python.linting.enabled": true, - "python.linting.flake8Enabled": true, - "python.linting.pylintEnabled": true, - "python.linting.lintOnSave": true, - "python.linting.flake8Args": [ - "--max-line-length=79" - ], - "python.linting.pylintArgs": [ - "--disable=C0111" // Disable missing docstring warnings if needed - ], - "files.autoSave": "onFocusChange" -} \ No newline at end of file diff --git a/Battleships/battleships-137-main/.vscode/uptime.sh b/Battleships/battleships-137-main/.vscode/uptime.sh deleted file mode 100644 index 25a37f8..0000000 --- a/Battleships/battleships-137-main/.vscode/uptime.sh +++ /dev/null @@ -1,23 +0,0 @@ -#!/bin/bash - -# Pings the webhook so that we can gather -# basic usage stats. No personally identifiable -# data is captured here, and it is impossible to -# identify an individual user from the captured data. -# Matt Rudge, April 2021 - -UUID=$(cat /proc/sys/kernel/random/uuid) -URL=https://1xthkmzwg3.execute-api.eu-west-1.amazonaws.com/prod/lrsapi/ -API_KEY=jceBCdeGZP9RDeUNCfM4jIQ39Cx0jtG51QgcwDwc -VERB="started" - -clear - -while true; do - - DATA="{\"activity_time\":\"$(date +%Y-%m-%dT%H:%M:%S).000Z\",\"actor\":\"${UUID}\",\"verb\":\"${VERB}\",\"activity_object\":\"Gitpod Workspace\",\"extra_data\":\"{}\"}" - curl -s -X POST -H "x-api-key: ${API_KEY}" -d "${DATA}" ${URL} 1> /dev/null - VERB="running" - sleep 300 - -done diff --git a/Battleships/battleships-137-main/Procfile b/Battleships/battleships-137-main/Procfile deleted file mode 100644 index 5ec9cc2..0000000 --- a/Battleships/battleships-137-main/Procfile +++ /dev/null @@ -1 +0,0 @@ -web: node index.js \ No newline at end of file diff --git a/Battleships/battleships-137-main/README.md b/Battleships/battleships-137-main/README.md deleted file mode 100644 index 5458730..0000000 --- a/Battleships/battleships-137-main/README.md +++ /dev/null @@ -1,284 +0,0 @@ -# [Battleship Game](https://battleships-hedgemonkey-131f157c44ae.herokuapp.com/ "Click to see deployed app") - -This is a simple command-line Battleship game written in Python, with a leader board stored in a google docs spreadsheet. - -## Contents - -
-Click here for Table of Contents - -[Screenshots](#screenshots) - -[Flow Chart Screenshots](#flow-chart-screenshots) - -[Features](#features) - -[Testing](#testing) - -[Future](#future) - -[Deployment](#deployment) - -[Credits](#credits) - -
- -## Screenshots -| Heroku Deployed App | -| :---: | -| ![Screenshot of app on Heroku](readme/screenshot.jpg) | -| This is the app showing the Welcome screenwith Leaderboard with scores sourced through Google Docs API | - -## Flow Chart Screenshots -| Flow Chart Screenshot | -| :---: | -| ![Screenshot of Flowchart](readme/flow_chart.jpg) | -| This is a rough flow chart displaying the program processes made using [Milanote](https://milanote.com/) - -[Back to top](#contents) - -## Features -* **Player vs. Computer:** Play against a challenging AI opponent. -* **Multiple Board Sizes:** Choose a board size between 5x5 and 9x9. -* **High Scores:** Track your best scores and compare them to others. -* **Colorful Interface:** Enjoy a visually enhanced gameplay experience with colored console output. -* **Leaderboard:** Top scores saved to a Google sheets leaderboard using `Google Docs API` and `gspread` - -[Back to top](#contents) - -## Testing - -### Replit -Most of this project was developed using Replit and so testing was done as I was building the project step by step. - -### Manual Testing -The following manual tests were conducted to ensure the application works as expected: - -#### Test 1: Welcome Message -**Steps:** -1. Run the application. -2. Observe the welcome message displayed in the console. - -**Expected Result:** -- The welcome message should be centered and displayed with appropriate colors. - -**Actual Result:** -- The welcome message is displayed correctly. - -**Screenshot:** -![Welcome Message](readme/welcome.jpg) - -#### Test 2: High Scores Display -**Steps:** -1. Run the application. -2. Observe the high scores displayed after the welcome message. - -**Expected Result:** -- The high scores should be displayed in a centered format with appropriate colors. - -**Actual Result:** -- The high scores are displayed correctly. - -**Screenshot:** -![High Scores](readme/welcome.jpg) - -#### Test 3: Board Size Input -**Steps:** -1. Run the application. -2. Enter a valid board size (between 5 and 9). - -**Expected Result:** -- The application should accept the input and proceed to the next step. - -**Actual Result:** -- The application accepts valid inputs and proceeds correctly. - -**Screenshot:** -![Board Size Input](readme/board_size.jpg) - -#### Test 4: Invalid Board Size Input -**Steps:** -1. Run the application. -2. Enter an invalid board size (outside the range of 5 to 9). - -**Expected Result:** -- The application should display an error message and prompt for input again. - -**Actual Result:** -- The application displays an error message and prompts for input again. - -**Screenshot:** -![Invalid Board Size Input](readme/board_size.jpg) - -#### Test 5: Player Turn -**Steps:** -1. Run the application. -2. Enter valid coordinates for the player's turn. - -**Expected Result:** -- The application should update the board and display the result (hit or miss). - -**Actual Result:** -- The application updates the board and displays the result correctly. - -**Screenshot:** -![Player Turn](readme/player_turn.jpg) - -#### Test 6: Computer Turn -**Steps:** -1. Run the application. -2. Observe the computer's turn. - -**Expected Result:** -- The application should update the board and display the result (hit or miss). - -**Actual Result:** -- The application updates the board and displays the result correctly. - -**Screenshot:** -![Computer Turn](readme/player_turn.jpg) - -#### Test 7: Game Over -**Steps:** -1. Run the application. -2. Play the game until either the player or the computer wins. - -**Expected Result:** -- The application should display the game over message and the final scores. - -**Actual Result:** -- The application displays the game over message and the final scores correctly. - -**Screenshot:** -![Game Over](readme/game_over.jpg) - -#### Test 8: Save High Score -**Steps:** -1. Run the application. -2. Win the game and choose to save the high score. -3. Enter a name when prompted. - -**Expected Result:** -The application should save the high score to the Google Sheets and display a success message. - -**Actual Result:** -The application saves the high score and displays the success message correctly. - -**Empty Username:** Players can intentionally leave the username field empty if they prefer not to submit a name. The high score will still be recorded on the leaderboard with a blank entry for the name. - -**Screenshot:** -![Save High Score](readme/save_high_score.jpg) - -[Back to top](#contents) - -### PEP 8 Compliance - -The project's Python code has been refactored to improve adherence to PEP 8 style guidelines. This enhances readability and maintainability. Specific improvements include: - -* **Reduced Branching:** Complex conditional logic, particularly in the `display_boards` function, has been simplified to reduce the number of branches, improving code clarity. -* **Modernized String Formatting:** F-strings (formatted string literals) have been adopted throughout the codebase for more concise and readable string formatting. -* **Removed Redundant Code:** Unnecessary `else` clauses following `return`, `break`, and `continue` statements have been eliminated. -* **Import Order:** Imports have been reorganized to follow PEP 8 recommendations (standard library imports first, followed by third-party and then local imports). - -These changes were guided by feedback from the `pylint` static analysis tool. - -![Pylint Output](readme/pylint_screenshot.jpg) - -[Back to top](#contents) - - -## Future -### Potential Future Features -* **Player vs. Player:** Perhaps add functionality to allow for a 2 player turn-based mode -* **Various Ship Sizes:** It would be nice to add different dized ships more akin to traditional Battleships game, with a choice of orientation -* **Number of Ships:** The added functionality to not only choose the board size but to also choose how many ships on the board would also be an attractive addition to the game -* **Choose Ship Placement:** The option to decide where you would like to place your ships on the board would also be a nice future feature to incorporate - -[Back to top](#contents) - -## Deployment -The site was deployed to Heroku. The steps to deploy are as follows: - -- Set up a [Heroku](https://dashboard.heroku.com) Account and create a new App -- In Settings add the python and nodejs buildpacks -- In `Settings > Config Vars` Add the creds.json contents under the variable `CREDS` -- Link the [GitHub repository](https://github.com/hedgemonkey/battleships) to the Heroku app. - -Heroku git URL -[https://git.heroku.com/battleships-hedgemonkey.git] - -The live link can be found [here](https://battleships-hedgemonkey-131f157c44ae.herokuapp.com/) - -[Back to top](#contents) - -### Google Docs -This project uses a `Google Sheets` spreadsheet hosted on `Google Docs` accessed by `Google Cloud API` this is to keep track of past scores. - -In order to deploy this yourself you would have to get the correct credentials to access this file or specify your own spreadsheet and provide your own Google Cloud API Credentials - -To do this you ned to save your own credentials to `creds.json` and change the line `SHEET = GSPREAD_CLIENT.open('battleship_scores').sheet1` replacing `battleship_scores` with your own spreadsheet filename - -The spreadsheet can be access [HERE](https://docs.google.com/spreadsheets/d/1cUhnYhy8DuxIEW6_BLnj0OFL38dNoRqmyVvkgnQDai8/edit?usp=sharing) - -[Back to top](#contents) - -### Local Deployment - -You can clone or fork this project to make a local copy on your system. - -[Back to top](#contents) - -#### Cloning - -You can clone the repository by following these steps: - -1. Go to the [GitHub repository](https://github.com/Hedgemonkey/battleships). -2. Locate the Code button above the list of files and click it. -3. Select if you prefer to clone using HTTPS, SSH, or GitHub CLI and click the copy button to copy the URL to your clipboard. -4. Open Git Bash or Terminal. -5. Change the current working directory to the one where you want the cloned directory. -6. In your IDE Terminal, type the following command to clone my repository: - - `git clone https://github.com/hedgemonkey/battleships.git` -7. Press Enter to create your local clone. - -[Back to top](#contents) - -#### Forking - -By forking the GitHub Repository, we make a copy of the original repository on our GitHub account to view and/or make changes without affecting the original owner's repository. -You can fork this repository by using the following steps: - -1. Log in to GitHub and locate the [GitHub repository](https://github.com/Hedgemonkey/battleships). -2. At the top of the Repository (not the top of the page) just above the "Settings" Button on the menu, locate the "Fork" Button. -3. Once clicked, you should now have a copy of the original repository in your own GitHub account. - -[Back to top](#contents) - -### Local vs Deployment - -There are no notable differences between my locally developed app and the Heroku deployed site aside from slight variances in the terminal colours. - -[Back to top](#contents) - - -## Credits - -In this section, I will reference the sources of my content and media, full disclosure of any resources used shall be detailed here. - -- Milanote used to create Flow Chart Diagram - -- Gemini Pro AI Used to help guide me when code wasn't doing as I intended - -[Back to top](#contents) - -### Content - -[Back to top](#contents) - -### Acknowledgements - -- I would like to thank the [Code Institute Slack community](https://code-institute-room.slack.com) for the moral support and general information that helps with my studies. -- I would like to also thank Gemini Pro AI for assisting me whenever I needed a bit of quick advice, although it's suggestions often lead to more complications it's explinations and tips were incredibly helpful -- YTMusic for providing me with a soundtrack to work to - -[Back to top](#contents) \ No newline at end of file diff --git a/Battleships/battleships-137-main/controllers/default.js b/Battleships/battleships-137-main/controllers/default.js deleted file mode 100644 index 96ffdd4..0000000 --- a/Battleships/battleships-137-main/controllers/default.js +++ /dev/null @@ -1,60 +0,0 @@ -const Pty = require('node-pty'); -const fs = require('fs'); - -exports.install = function () { - - ROUTE('/'); - WEBSOCKET('/', socket, ['raw']); - -}; - -function socket() { - - this.encodedecode = false; - this.autodestroy(); - - this.on('open', function (client) { - - // Spawn terminal - client.tty = Pty.spawn('python3', ['run.py'], { - name: 'xterm-color', - cols: 80, - rows: 24, - cwd: process.env.PWD, - env: process.env - }); - - client.tty.on('exit', function (code, signal) { - client.tty = null; - client.close(); - console.log("Process killed"); - }); - - client.tty.on('data', function (data) { - client.send(data); - }); - - }); - - this.on('close', function (client) { - if (client.tty) { - client.tty.kill(9); - client.tty = null; - console.log("Process killed and terminal unloaded"); - } - }); - - this.on('message', function (client, msg) { - client.tty && client.tty.write(msg); - }); -} - -if (process.env.CREDS != null) { - console.log("Creating creds.json file."); - fs.writeFile('creds.json', process.env.CREDS, 'utf8', function (err) { - if (err) { - console.log('Error writing file: ', err); - socket.emit("console_output", "Error saving credentials: " + err); - } - }); -} \ No newline at end of file diff --git a/Battleships/battleships-137-main/index.js b/Battleships/battleships-137-main/index.js deleted file mode 100644 index 2598955..0000000 --- a/Battleships/battleships-137-main/index.js +++ /dev/null @@ -1,30 +0,0 @@ -// =================================================== -// Total.js start script -// https://www.totaljs.com -// =================================================== - -const options = {}; - -// options.ip = '127.0.0.1'; -options.port = parseInt(process.env.PORT); -// options.unixsocket = require('path').join(require('os').tmpdir(), 'app_name'); -// options.config = { name: 'Total.js' }; -// options.sleep = 3000; -// options.inspector = 9229; -// options.watch = ['private']; -// options.livereload = 'https://yourhostname'; - -// Enables cluster: -// options.cluster = 'auto'; -// options.cluster_limit = 10; // max 10. threads (works only with "auto" scaling) - -// Enables threads: -// options.cluster = 'auto'; -// options.cluster_limit = 10; // max 10. threads (works only with "auto" scaling) -// options.timeout = 5000; -// options.threads = '/api/'; -// options.logs = 'isolated'; - -var type = process.argv.indexOf('--release', 1) !== -1 || process.argv.indexOf('release', 1) !== -1 ? 'release' : 'debug'; -// require('total4/' + type)(options); -require('total4').http('release', options); \ No newline at end of file diff --git a/Battleships/battleships-137-main/package-lock.json b/Battleships/battleships-137-main/package-lock.json deleted file mode 100644 index 29dfbf0..0000000 --- a/Battleships/battleships-137-main/package-lock.json +++ /dev/null @@ -1,106 +0,0 @@ -{ - "name": "terminal", - "version": "1.0.0", - "lockfileVersion": 3, - "requires": true, - "packages": { - "": { - "name": "terminal", - "version": "1.0.0", - "license": "ISC", - "dependencies": { - "node-pty": "^0.10.1", - "node-static": "^0.7.11", - "total4": "^0.0.45" - } - }, - "node_modules/colors": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/colors/-/colors-1.4.0.tgz", - "integrity": "sha512-a+UqTh4kgZg/SlGvfbzDHpgRu7AAQOmmqRHJnxhRZICKFUT91brVhNNt58CMWU9PsBbv3PDCZUHbVxuDiH2mtA==", - "license": "MIT", - "engines": { - "node": ">=0.1.90" - } - }, - "node_modules/mime": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", - "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==", - "license": "MIT", - "bin": { - "mime": "cli.js" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/minimist": { - "version": "0.0.10", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.10.tgz", - "integrity": "sha512-iotkTvxc+TwOm5Ieim8VnSNvCDjCK9S8G3scJ50ZthspSxa7jx50jkhYduuAtAjvfDUwSgOwf8+If99AlOEhyw==", - "license": "MIT" - }, - "node_modules/nan": { - "version": "2.20.0", - "resolved": "https://registry.npmjs.org/nan/-/nan-2.20.0.tgz", - "integrity": "sha512-bk3gXBZDGILuuo/6sKtr0DQmSThYHLtNCdSdXk9YkxD/jK6X2vmCyyXBBxyqZ4XcnzTyYEAThfX3DCEnLf6igw==", - "license": "MIT" - }, - "node_modules/node-pty": { - "version": "0.10.1", - "resolved": "https://registry.npmjs.org/node-pty/-/node-pty-0.10.1.tgz", - "integrity": "sha512-JTdtUS0Im/yRsWJSx7yiW9rtpfmxqxolrtnyKwPLI+6XqTAPW/O2MjS8FYL4I5TsMbH2lVgDb2VMjp+9LoQGNg==", - "hasInstallScript": true, - "license": "MIT", - "dependencies": { - "nan": "^2.14.0" - } - }, - "node_modules/node-static": { - "version": "0.7.11", - "resolved": "https://registry.npmjs.org/node-static/-/node-static-0.7.11.tgz", - "integrity": "sha512-zfWC/gICcqb74D9ndyvxZWaI1jzcoHmf4UTHWQchBNuNMxdBLJMDiUgZ1tjGLEIe/BMhj2DxKD8HOuc2062pDQ==", - "license": "MIT", - "dependencies": { - "colors": ">=0.6.0", - "mime": "^1.2.9", - "optimist": ">=0.3.4" - }, - "bin": { - "static": "bin/cli.js" - }, - "engines": { - "node": ">= 0.4.1" - } - }, - "node_modules/optimist": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/optimist/-/optimist-0.6.1.tgz", - "integrity": "sha512-snN4O4TkigujZphWLN0E//nQmm7790RYaE53DdL7ZYwee2D8DDo9/EyYiKUfN3rneWUjhJnueija3G9I2i0h3g==", - "license": "MIT/X11", - "dependencies": { - "minimist": "~0.0.1", - "wordwrap": "~0.0.2" - } - }, - "node_modules/total4": { - "version": "0.0.45", - "resolved": "https://registry.npmjs.org/total4/-/total4-0.0.45.tgz", - "integrity": "sha512-96vXqejddbAeNL6zpzbfm8ztiWL4G0fOuoUWniHDlu6oSz+DcxekHkzK0Y9X+ErlHCRTMsP2+ieMTqG6waowiA==", - "license": "MIT", - "bin": { - "total4": "bin/total4" - } - }, - "node_modules/wordwrap": { - "version": "0.0.3", - "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-0.0.3.tgz", - "integrity": "sha512-1tMA907+V4QmxV7dbRvb4/8MaRALK6q9Abid3ndMYnbyo8piisCmeONVqVSXqQA3KaP4SLt5b7ud6E2sqP8TFw==", - "license": "MIT", - "engines": { - "node": ">=0.4.0" - } - } - } -} diff --git a/Battleships/battleships-137-main/package.json b/Battleships/battleships-137-main/package.json deleted file mode 100644 index 56ca191..0000000 --- a/Battleships/battleships-137-main/package.json +++ /dev/null @@ -1,23 +0,0 @@ -{ - "name": "terminal", - "version": "1.0.0", - "main": "server.js", - "scripts": { - "test": "echo \"Error: no test specified\" && exit 1" - }, - "repository": { - "type": "git", - "url": "git+https://github.com/lechien73/terminal.git" - }, - "author": "", - "license": "ISC", - "bugs": { - "url": "https://github.com/lechien73/terminal/issues" - }, - "homepage": "https://github.com/lechien73/terminal#readme", - "dependencies": { - "node-static": "^0.7.11", - "node-pty": "^0.10.1", - "total4": "^0.0.45" - } -} \ No newline at end of file diff --git a/Battleships/battleships-137-main/readme/board_size.jpg b/Battleships/battleships-137-main/readme/board_size.jpg deleted file mode 100644 index 076b19d55a82a9844ebd1052d0677a5375c14ffe..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 58924 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