print-bench

sushi-battleship

Battleship played with real sushi.

Overview

Product shot: the assembled board in charcoal PLA, D1 shutter opened

Product Hero Studio render 1 / 10

Product shot: the assembled board in charcoal PLA, D1 shutter opened

NOTE

Archived at v0.1 (2026-08-07) — frozen, not actively maintained. This design is retired from active CI to save render cycles. To improve it, fork the repo, update it against current CI, and contribute it back as a derivative per the repo's lineage tracking (see also CLAUDE.md → "Archived designs").

Battleship, played with real sushi. A two-part printable game board: a tray holds a 4×4 grid of cut roll pieces, and a lid on top carries one print-in-place sliding shutter per cell (A1–D4). Call a shot; on a "hit" your opponent slides the shutter ~6.7 mm until it stops, lifts it out, and you eat the piece underneath. Closed shutters are locked and cannot be lifted, so nobody peeks. No supports, no hardware, no assembly — the shutters print captive in the lid and free up with one firm push each.

What you get

Three printable parts, selected with the part parameter (the default part = "assembled" is a preview only) or via the tiny per-part wrapper files:

  • bottom (sushi-battleship-bottom.scad) — the tray, ~254 × 254 × 44 mm at defaults: 4×4 cells sized for a ~40 mm cut roll piece, low dividers, cell coordinates engraved in each floor so ships can be placed by call-out, tall outer walls, and a rebated rim the lid drops into.
  • top (sushi-battleship-top.scad) — the lid, 250 × 250 mm: sixteen print-in-place shutters, each engraved with its coordinate and a slide-direction arrow, plus a raised grip bar for pushing/pulling.
  • door (sushi-battleship-door.scad) — a single spare shutter. The door_fit tuning knob changes only the door, never the lid or tray, so a re-tuned door drops straight into an already-printed board.

Plus a test coupon, sushi-battleship-coupon.scad — see below.

The coupon is the full production lid at grid 1×1 — one complete shutter with its rails, lips, end stops, and membrane, generated by the exact code that builds the full board. It prints in ~30–45 minutes versus hours for the top. Before committing to the full board:

  1. Print the coupon with the settings below.
  2. Exercise it: free the door with one firm push toward the arrow, punch out the membrane, slide + lift the door out, drop it back in at the open position, slide forward to re-lock.
  3. Door welded or sticky? Reprint with door_fit = 0.1, then 0.2, … (ceiling 0.5). Too rattly? Go −0.1 (floor −0.2).
  4. Print the full top with your tuned door_fit.
  • Supports: OFF — hard requirement. Any support material inside the windows or under the doors fuses the mechanism.
  • Orientation: both parts flat side down, exactly as modeled.
  • Nozzle: 0.4 mm (a 0.6 mm nozzle eats most of the mechanism's 0.5 / 0.4 mm clearances — not recommended).
  • Layer height: 0.12–0.30 mm all safe — every common preset keeps ≥ 2 air layers under the doors.
  • Material: PLA for the top (sixteen 46 mm free-air bridges in PETG is a sag lottery on a first print; if you must, start at door_fit = +0.1 and max out bridge cooling). The tray can be any material.
  • Infill: your slicer's default is fine for both parts — nothing here is load-bearing. The doors slice solid; the 3 mm plates and ~4 mm tray walls get a sparse core with default profiles, which is fine.
  • Brim/skirt: none. The board leaves ~1 mm of bed margin per side on 256-class beds — turn off Bambu Studio's Auto brim and OrcaSlicer's default skirt.
  • Bridge direction: pin to 90° (Bambu/Orca "Bridge direction", PrusaSlicer "Bridging angle") so the door bridges run along the slide axis; auto can legitimately pick a weaker direction.
  • Seam: "Back" (or scarf seam), so door seams land on the deep rear chamfer instead of mating edges.
  • If doors still weld on the coupon: check "slice gap closing radius" (keep it at the ~0.049 mm default), then step door_fit up by +0.1.

Bed fit — the 4×4 board (250 mm lid, ~254 mm tray) targets a 256 mm-class bed, and stock profiles matter:

Printer (stock profile)4×4 boardIf not
Bambu P2S, Bambu H2 class, 300-class and largerfits
Bambu X1 / P1 seriesdoes not fit centred — the stock profile's 18 × 28 mm front-left exclusion zone clips even the 250 mm lidprint 3×3 (192 mm), or knowingly edit the printable area
Prusa CORE One (250 × 220)does not fit3×3 (192 mm)
Generic 220-class (Ender 3 etc.)does not fit3×3 (192 mm)

Shrinking roll_d is not a bed-fit escape hatch: the lid is still too big long before the shutter mechanism's margins run out, and an assert stops you at the floor (margin math in NOTES.md). Drop grid_x/grid_y instead.

Parameters

The ones you're most likely to touch, with defaults:

ParameterDefaultWhat it does
part"assembled"preview only — set bottom / top / door to export printable parts
grid_x, grid_y4, 4board size; 3×3 gives a 192 mm board for smaller beds
roll_d40 mmdiameter of a cut sushi-roll piece; sets cell and window size
roll_h30 mmpiece height; sets tray depth
door_fit0 mmdoor-only fit knob: + looser, − tighter; safe range −0.2…+0.5; tune on the coupon
membrane0.2 mmone-layer sacrificial skin under each window, punched out after printing; set 0 to omit if your bridging is well tuned
clr_h, clr_v0.5, 0.4 mmprint-in-place horizontal / vertical clearances

All parameters are at the top of sushi-battleship.scad, grouped in Customizer sections; override on the command line with -D 'door_fit=0.1'.

Exporting STLs

./scripts/render.sh sushi-battleship renders the assembled preview. For printable STLs, export each part from its wrapper file:

mkdir -p build
xvfb-run -a openscad -o build/sushi-battleship-top.stl    designs/sushi-battleship/sushi-battleship-top.scad
xvfb-run -a openscad -o build/sushi-battleship-bottom.stl designs/sushi-battleship/sushi-battleship-bottom.scad
xvfb-run -a openscad -o build/sushi-battleship-door.stl   designs/sushi-battleship/sushi-battleship-door.scad

(or use -D 'part="top"' etc. on the main file). One sanity check before slicing: the top must export with 18 CGAL volumes (outer space + lid + 16 doors) — that's the proof that every door is a separate, free body. Fewer volumes means doors fused in the render; re-render before slicing.

Assembly & use

After printing the top: free each door with one firm push toward its engraved arrow, then punch each window's membrane out with a fingertip or knife — it's exactly one layer thick, about a minute for the whole board. The lid drops into the tray's rebated rim; thumb notches on the left and right expose the lid edge for lifting it back out.

To play: load the cells (suggested 4×4 "fleet": one 3-piece roll, two 2-piece rolls, two single nigiri — coordinates are engraved in the cell floors), drop the lid on, and call shots. On a hit, slide the shutter toward the high row numbers until it stops on the end-stop ridge, then lift it straight out — the removed tile doubles as a hit marker. Doors drop back in at the open position and slide forward to re-lock.

If a fit is off, reprint only what's needed: the coupon (or a spare door via sushi-battleship-door.scad) with a new door_fit — the lid and tray never change.

Food contact: FDM prints are not dishwasher-safe or truly food-safe. Serve pieces on nori or parchment squares or in silicone cups, or seal the tray with a food-safe epoxy if it will touch food directly.

Design rationale, margin math, and the full per-decision engineering log live in NOTES.md.

Workbench

View in 3D

Inspect the real geometry — drag to rotate, scroll to zoom. The model is rendered from this design's own source at its default settings, right in your browser; nothing is uploaded.

Make it fit

This design has 28 tunable parameters. Change them and render your own STL — OpenSCAD runs in your browser, so nothing is uploaded and nothing is installed.

An STL you configure here is ungated. The files this project ships have each passed a printability check and a PrusaSlicer test-slice; your variant has not. Treat it as a starting point, and print the fit coupon first if the design has one.