OhMyGame
OhMyGame은 AI로 게임을 만들 수 있는 오픈소스 스튜디오로, 디자인·구축·플레이테스트·출판을 하나의 앱에서 모델 키와 함께 수행합니다
아직 감지된 업데이트가 없습니다. GitHub 릴리스가 나오면 여기에 보입니다.
개인 계정의 공개 저장소 소유자는 GitHub로 로그인해 운영자를 확인하고 소개를 직접 관리할 수 있습니다. 관리자 승인은 필요하지 않습니다.
로그인한 뒤 확인 파일을 만들어 이 저장소의 기본 브랜치에 30분 안에 커밋해 주세요. 다른 브랜치나 포크의 파일은 인정하지 않습니다. 파일을 올린 뒤 아래에서 확인하면 관리자 승인 없이 관리할 수 있습니다. 자격을 유지하려면 파일을 남겨 두세요.
로그인이 필요하면 로그인 화면으로 이동합니다. 로그인 후 이곳으로 돌아와 원하는 확인 버튼을 다시 눌러 주세요.
프로젝트 폴더에서 /nomorevibe verify를 실행하면 소유권을 확인하고 소개를 직접 관리할 수 있습니다.
1분 만에 확인하기simple offline hangman game
저장소 README에서 가져옴
README 전체를 불러오는 중입니다.
README 전문 보기 ↗A collection of chalkboard games for kids that plays like an app on phones and tablets. It installs to the home screen, works offline, and needs no account or server. Plain HTML, CSS and JavaScript with no build step.
jimmys-arcade), so index.html sits at the repository root.main and the / (root) folder, then Save.https://<your-username>.github.io/jimmys-arcade/.Any static host works the same way. It needs HTTPS for the offline mode and install to work. All paths are relative, so it also runs from a sub-folder. Free GitHub accounts can only use Pages on public repositories.
Don't put these files in a repository that sends
*.woff2or*.pngthrough Git LFS: GitHub Pages serves LFS pointer files instead of the real fonts and icons.
Open the arcade's web address once while online so it can save itself for offline play.
iPhone / iPad (Safari)
Android (Chrome)
It now opens full-screen from its icon, and it keeps working with airplane mode on.
Service workers need http://, so serve the folder with any static server, for example:
python -m http.server 8000
Then open http://localhost:8000.
The service worker serves everything from its cache. After changing any file, bump the version in sw.js:
const CACHE = "jimmys-arcade-v4"; // was jimmys-arcade-v3
Installed copies pick up the new version the next time they're opened online (close and reopen once more to see it).
Game files are cached automatically from games/index.js. If you add a file to the shell (shell/ or icons/), also add it to SHELL_FILES in sw.js.
| Path | What it is |
|---|---|
index.html | The shell's screens: home, players, settings, who's playing, pass the phone |
shell/shell.js | Home screen, players, settings, sound, dialogs, pass screen, player picker, game loading |
shell/storage.js | Saved data under the jimmys-arcade: prefix, plus the one-time move of old Hangman data |
shell/avatars.js | The 12 chalk player avatars |
shell/themes/*.js | Picture themes, one file each, plus registry.js |
shell/style.css | Chalkboard look and shared components |
games/index.js | The list of games, one line each |
games/hangman/ | Hangman: rules (engine.js), word lists, screens (game.js) and styles |
games/silly-stories/ | Silly Stories: screens (game.js), story templates (stories.json), word types and ideas (words.js) |
games/connect-four/ | Connect Four: rules and computer players (ai.js), screens (game.js) |
games/tic-tac-toe/ | Tic-Tac-Toe: rules and computer players (ai.js), screens (game.js) |
games/dots-and-boxes/ | Dots and Boxes: rules, chain analysis and computer players (engine.js), screens (game.js) |
shell/action.js, shell/action.css | Shared kit for the action games: canvas loop, pause, countdown, swipes, high scores, daily twist |
games/chalk-snake/ | Chalk Snake |
games/pong-party/ | Pong Party |
games/brick-bash/ | Brick Bash (levels.js holds the 30 campaign levels) |
games/critter-crossing/ | Critter Crossing (missions.js holds the 15 rescue missions) |
Everything is saved in the browser's localStorage under keys starting with jimmys-arcade::
settings, players, lastPlayer, lastThemehangman:stats: per-player wins and streakshangman:mp: a multiplayer game in progresshangman:lastWords and hangman:lastSetupsilly-stories:favorites: up to 50 saved storiessilly-stories:stats: stories made per playersilly-stories:recent and silly-stories:lastSetupconnect-four:stats: for each player, wins, losses and ties against each computer level and against each other playerconnect-four:lastSetuptic-tac-toe:stats: same shape as Connect Four'stic-tac-toe:prefs: X or O and match lengthtic-tac-toe:lastSetupdots-and-boxes:game: the game in progress, saved after every linedots-and-boxes:stats: for each player, wins, losses and ties against each level on each board size, pass-and-play wins, and most boxes in one game per board sizedots-and-boxes:prefs, dots-and-boxes:rotation (who starts next) and dots-and-boxes:lastSetupaction:best: action-game personal bests (game → level → player)action:top: each action game's household top 5 for each levelaction:daily: today's daily-twist top 5 (older days are dropped)chalk-snake:battle: battle wins per playerchalk-snake:prefs: arrow pad on or off for each level, plus the last battle settingschalk-snake:lastSetuppong-party:record: wins and losses against each computer level, per playerpong-party:wins: 2- and 4-player match wins per playerpong-party:lastSetup2 and pong-party:lastSetup4brick-bash:progress: the furthest campaign level each player has unlockedbrick-bash:prefs: each player's last difficultybrick-bash:levels: up to 50 household levels from the editor, each with its maker and best scorecritter-crossing:missions: stars (0–3) for each rescue mission, per playerThe first time the arcade opens on a device that had the old stand-alone Hangman, it moves that app's hm.* data over:
Create games/<name>/ with a game.js that calls Arcade.registerGame({...}):
Arcade.registerGame({
id: "my-game", name: "My Game", accent: "#9fd3e8",
icon: `<circle cx="24" cy="24" r="14"/>`, // chalk drawing in a 48×48 box; class="acc" uses the accent
open() { /* show the game's menu (build screens into #game-root with class "screen") */ },
tileStat(playerId) { return "Wins: 3"; }, // optional: text on the home tile
resetStats() {}, forgetPlayer(id) {}, autoResume() { return false; } // optional
});
Add one line for it to games/index.js, listing its files in load order.
Games use the shell through Arcade.*:
| Helper | What it does |
|---|---|
store | Saved data |
settings | Sound, vibration, read-aloud and theme settings |
whoIsPlaying() | Asks who's playing a single-player game |
playerPicker() | The multiplayer setup's player list |
pass() | The "Pass the phone to…" screen |
confirm(), toast() | In-app "Are you sure?" dialog and short messages |
sfx, buzz() | Sound effects and vibration |
themeView(), themeSvg(), buildThemePicker() | Picture themes |
Give every game screen a Home button in the top-left corner (<button class="icon-btn" data-home aria-label="Home"></button>). Scope the game's CSS under its own class, the way .hm does for Hangman.
Copy one of the files in shell/themes/ and change it. A theme is one object:
Arcade.registerTheme({
id: "dragon", // unique id
name: "Dragon", // shown in the picker
accent: "#c9a0ff", // tints the board, keys and buttons
optional: [2, 5], // the 2 of its 8 stages that are small optional details
render(view, outcome) { // SVG markup for a 240×220 picture
// view.has(n): stage n (1..8) has happened; view.last: the stage this miss added;
// view.core: non-optional stages so far (0..6). outcome is null, "win" or "lose".
return `<circle class="c" cx="120" cy="110" r="${20 + view.core * 10}"/>`;
},
css: `/* optional keyframes; prefix class names with the theme id */`
});
Every theme has 8 stages, and each wrong guess adds exactly one:
optional stages.Either way, the last allowed miss lands on the final stage, and the picture starts with nothing added.
Then add a <script src="shell/themes/dragon.js"> tag in index.html (before shell/shell.js) and the path to SHELL_FILES in sw.js.
Drawing tips:
c is a chalk line, d a dim line and a an accent line; thin makes any of them thinner.fc, fa and fb fill with chalk, accent or board color.t is chalk text.Add an object to games/silly-stories/stories.json:
{
"id": "museum",
"title": "A Night at the Museum",
"text": "Our class visited a museum full of {plural noun}. A {adjective} statue of {name of a person in the room|guide} waved at us..."
}
{type} is a blank. The type must be one of the types in words.js, which hold each type's explanation and "Give me an idea" suggestions.{type|key} reuses one answer everywhere the same key appears, like a hero's name used three times.CACHE in sw.js so installed copies get the new story.| Level | How it plays |
|---|---|
| Easy | Random moves, but blocks an immediate win about half the time |
| Medium | Takes a win, blocks your win, otherwise plays near the center without handing you a win |
| Hard | Searches 5 moves ahead |
| Impossible | Searches as deep as it can in 0.5 seconds (usually 12–17 moves) |
How Impossible gets its strength:
With the short pause before it moves, the computer always answers in under a second.
| Level | How it plays |
|---|---|
| Easy | Random moves |
| Medium | Wins or blocks when it can, otherwise random |
| Hard | Perfect play 70% of the time, random otherwise |
| Impossible | Perfect play (full minimax), so it never loses. Tested against every possible game. |
Undo against the computer is unlimited on Easy, 3 per game on Medium, and off on Hard and Impossible. It goes back to before your last line.
| Level | How it plays |
|---|---|
| Easy | Random lines, and takes a free box only about half the time. "Show safe moves" can mark the lines that don't give a box away. |
| Medium | Always takes free boxes; otherwise avoids drawing a box's third side when it can |
| Hard | Medium, plus when no safe lines are left it opens the smallest chain or loop |
| Impossible | Hard, plus chain control (details below). Stays within 350 ms per line. |
Impossible's chain control:
shell/action.js gives every action game the same building blocks through Arcade.Action:
createScreen({ id, cls, onRestart, onQuit, onResize }): the play screen.
start(update, render) shows a 3-2-1 countdown, then runs update(dt) exactly 60 times per second of game time (the same speed on every device) and render(alpha) every frame.message(), burst("New best!") and showPanel(). A panel's split option rotates the top half to face a player across the table.swipes(element, { onSwipe, onTap }): swipe directions, re-armed during a long drag.scores: personal bests per player, game and level, plus a household top 5 per game and level and a separate top 5 for today's daily twist. Guests aren't saved.daily(): today's daily twist, worked out from the date so every device agrees. Only built action games take part: a game joins by listing twists when it registers. Its home tile shows a "Daily twist" badge through the optional badge() hook.chalkLine(), dust(): light chalk drawing and dust particles.| Level | Speed | Walls | Lives | Round |
|---|---|---|---|---|
| Easy | Slow | Wrap around | 3 | 2 minutes |
| Medium | Normal | Solid | 2 | 2 minutes |
| Hard | Fast | Solid | 1 | Until you crash |
| Impossible | Faster, speeding up as you grow | Solid | 1 | Until you crash |
| Food | Effect |
|---|---|
| Golden apple | +5 points and a 5-second slowdown |
| Chili pepper | 5-second speed burst with double points |
| Ghost pepper | Pass through your own tail for 5 seconds |
| Scissors | Tail 3 shorter |
| Level | How it plays |
|---|---|
| Easy | Slow ball, slow computer that misses about half its shots, and your paddle is longer |
| Medium | A fair match: the computer misses about 1 in 5 |
| Hard | Quick ball, sharper computer |
| Impossible | Very fast and very good, but it still misses now and then |
| Level | Ball | Paddle | Lives |
|---|---|---|---|
| Easy | Slow | Big, with extra reach at the ends | 5 |
| Medium | Normal | Medium | 3 |
| Hard | Fast | Small | 3 |
| Impossible | Very fast | Tiny | 2 |
| Level | Traffic | Bumps | Lives |
|---|---|---|---|
| Easy | Slow, with wide gaps | Small bump box, longer logs | 3 |
| Medium | Normal | Normal | 2 |
| Hard | Busy | Normal | 1 |
| Impossible | Rush hour | Big bump box | 1 |
Bandit the raccoon (a prankster, never mean) swiped the kids' toys and hauled them to the top of his hideouts. Climb up, dodge the toys he rolls down, and catch him: he looks sheepish, hands that level's toy back, and scampers up to the next hideout. Done so far: the hero's movement, power-ups, The Garage, The Toy Store and The Backyard. Still to come: The Box Fort, the Treehouse showdown, and the level editor.
| Level | Hearts | Toys | Checkpoints |
|---|---|---|---|
| Easy | 3 | Slow, thrown less often | Yes |
| Medium | 3 | Normal | Yes |
| Hard | 2 | Quicker and more often | Yes |
| Impossible | 1 | Fast and often | No |
Stars: each level has 3: catch Bandit, find the hidden star, and beat the target time. The level select shows them, and finishing a level unlocks the next.
Score: coins, toys jumped over or popped, catching Bandit, the hidden star, and a bonus for each second under the target time. The high score (and the household top 5 for each level of difficulty) is the total of each player's best score on every level, so replaying a level to do better counts.
Toy Shelf: the 12 stolen toys (comic book, video game, crayons, movie, trading cards, toy robot, stuffed bear, kite, soccer ball, skateboard, puzzle, race-car set), with silhouettes for the ones still missing.
Practice: the original test level, with no Bandit, for trying out moves.
Level files: one JSON file per hideout (games/toy-tower/garage.json, store.json, backyard.json). Each level's rows are text, one character per tile: . empty, = flat girder, > and < girders sloping down to the right and left (a run of them is one ramp), # solid block, H ladder, V vine, R rope, c coin, * hidden star, F checkpoint, T toy box, S start, B Bandit, } and { conveyor belts moving right and left, the power-ups w bubble wand, n super sneakers, h shield, j double jump, and k key, X toy chest, Z springboard, Y yo-yo. A level also sets its toy, target time, which toys Bandit throws, his pace, its lifts (column, width, the two floor heights it stops at, speed, and pause), and its tire swings (the branch's position, rope length, how far it swings, and how long a swing takes).
Controls: a strip under the tower, so thumbs never cover the action.
Moves:
games/galaxy-defenders/ | Galaxy Defenders |
games/toy-tower/ | Toy Tower (config.js holds every movement number, garage.json, store.json and backyard.json the hideouts' levels, test-level.json the practice level) |
sw.js, manifest.json, icons/ | Offline support and home-screen install |
fonts/ | Gochi Hand and Patrick Hand (SIL Open Font License, see the OFL-*.txt files) |
critter-crossing:prefsgalaxy-defenders:sectors: the furthest sector each player has reached on each level (team runs count too)galaxy-defenders:lastSetup and galaxy-defenders:coopLevel: the last team and level for 2 playerstoy-tower:progress: for each player, the levels unlocked, each level's stars, best time and best score on each difficulty, and the toys on their Toy Shelftoy-tower:prefs: each player's last difficultytoy-tower:tune: movement numbers changed in the tune panel (only used with ?tune)The practice level (games/toy-tower/test-level.json): girders, ladders, a vine, a rope, a two-wall chimney for wall jumps, a ledge to pull up onto, a high drop of more than 20 rows, and two stars.
Tuning: every movement number is in games/toy-tower/config.js, with a comment on what it does. Open the arcade with ?tune at the end of its address (for example https://<your-username>.github.io/jimmys-arcade/?tune) to get a Tune button with a slider for each number. Changes apply instantly and are kept on that device. Copy puts all the numbers on the clipboard, and Reset goes back to the file's numbers.