Merge pull request 'Implemented Library Class' (#8) from kyler/library into master

Reviewed-on: #8
This commit is contained in:
Kyler Olsen 2025-04-14 13:03:54 -06:00
commit a79ba39ff6
7 changed files with 220326 additions and 0 deletions

34567
data/eng.book-of-mormon.json Normal file

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

41540
data/eng.new-testament.json Normal file

File diff suppressed because it is too large Load Diff

121583
data/eng.old-testament.json Normal file

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because one or more lines are too long

83
library.py Normal file
View File

@ -0,0 +1,83 @@
# Kyler Olsen
# CS 2450 Final Project
# Apr 2025
from __future__ import annotations
from typing import TYPE_CHECKING
import json
import random
if TYPE_CHECKING:
from game import Game
class Library:
__verses: dict
__games: list[Game]
def __init__(self):
with open("data/scripture-frequencies.json", encoding='utf-8') as file:
self.__verses = json.load(file)
self.__games = []
def join_game(self, name: str, game_num: int = -1):
if game_num == -1:
for i, game in enumerate(self.__games):
if not game.active:
game_num = i
break
else:
self.__games.append(Game())
game_num = len(self.__games) - 1
self.__games[game_num].add_player(name)
def get_verse(self, difficulty: int):
url = self.__select_verse(difficulty)
text = self.__get_verse_text(url)
print(text, end='\n\n')
def __select_verse(self, difficulty: int) -> str:
difficulty_verses = self.__get_verses_by_difficulty(difficulty)
return difficulty_verses[random.randint(0,len(difficulty_verses)-1)]
def __get_verse_text(self, url: str) -> str:
lang = 'eng'
volume, book_url, chapter_url, verse_url = url[1:].split('/')
if volume == 'ot': filename = f"data/{lang}.old-testament.json"
elif volume == 'nt': filename = f"data/{lang}.new-testament.json"
elif volume == 'bofm': filename = f"data/{lang}.book-of-mormon.json"
elif volume == 'dc-testament': filename = f"data/{lang}.doctrine-and-covenants.json"
elif volume == 'pgp': filename = f"data/{lang}.pearl-of-great-price.json"
with open(filename, encoding='utf-8') as file:
data = json.load(file)
for book in data['books']:
if book['lds_slug'] == book_url:
for chapter in book['chapters']:
if chapter['chapter'] == int(chapter_url):
for verse in chapter['verses']:
if verse['verse'] == int(verse_url):
return verse['text']
raise ValueError(f'ERROR: VERSE NOT FOUND ({url})')
def __get_verses_by_difficulty(self, difficulty: int) -> list[str]:
real_difficulty_upper = pow((10-difficulty)/9, 2) * 500
real_difficulty_lower = pow((9-difficulty)/9.55, 3) * 500
difficulty_verses = []
for key, value in self.__verses.items():
for i, diff in enumerate(value):
if real_difficulty_lower <= diff <= real_difficulty_upper:
difficulty_verses.append(f"{key}/{i+1}")
return difficulty_verses
if __name__ == '__main__':
lib = Library()
for i in range(11): lib.get_verse(i)