--- title: "Duck Shoot" id: 72355 type: "computer_media" slug: "duck-shoot" url: "http://localhost/computer_media/duck-shoot/" markdown_url: "http://localhost/computer_media/duck-shoot.md" published_at: "2026-10-23T07:47:14+00:00" modified_at: "2026-10-23T07:47:14+00:00" author: "David Anderson" featured_image: url: "http://localhost/wp-content/uploads/2026/10/duckshoot-2.png" excerpt: "Shooting-gallery game in which a row of ten UDG ducks scrolls across the top of the screen and you have fifteen bullets to pick them all off." post_tag: - name: "Downloadable" slug: "downloadable" taxonomy: "post_tag" url: "http://localhost/tag/downloadable/" - name: "TS 2068" slug: "ts2068" taxonomy: "post_tag" url: "http://localhost/tag/ts2068/" model: - name: "Timex/Sinclair 2068" slug: "ts-2068" taxonomy: "model" url: "http://localhost/model/ts-2068/" indiv: - name: "M. Savin" slug: "m-savin" taxonomy: "indiv" url: "http://localhost/indiv/m-savin/" genre: - name: "Arcade" slug: "arcade" taxonomy: "genre" url: "http://localhost/type/arcade/" media_type: "Program" programmers: - name: "M. Savin" slug: "m-savin" taxonomy: "indiv" url: "http://localhost/indiv/m-savin/" download_url: "https://archive.org/download/timex-sinclair-software-archive/Duck%20Shoot%20%281982%29%28Savin%2C%20M.%29%28TS2068%29%28US%29%28Program%29.zip" tsrun_member: "Duck Shoot (1982)(Savin, M.)(TS2068)(US)(Program)/Duck Shoot (1982)(Savin, M.)(TS2068)(US)(Program).tap" mediadate: "1982" images: - url: "http://localhost/wp-content/uploads/2026/10/duckshoot-2.png" - url: "http://localhost/wp-content/uploads/2026/10/duckshoot-1.png" media_type_tags: "Arcade" license: false --- # Duck Shoot A shooting gallery in which ten ducks march across the top line of the screen while you move a gun along the row below with 5 and 8 and fire with 7. Each shot sends a dot up the screen with a rising beep, and a duck sitting in the gun’s column when the bullet arrives is knocked out of the row. You have ten ducks and fifteen bullets. Running out of bullets or hitting every duck ends the round with your score, and ten hits earns a fanfare and the message that you are the fastest gun in the North-West. The title screen reads “***DUCK SHOOT***” and “© M.Savin 1982”. It is written in plain Sinclair BASIC with two UDGs and runs unchanged on the TS2068. ## Program Analysis ### Structure - Lines 390–530: setup. The UDGs are POKEd from DATA, the variables set and the instructions shown. - Lines 20–110: the main loop. It rotates and prints the duck string, draws the gun and reads the keys. - Lines 160–310: a shot. The bullet climbs nine rows, then the program checks for a hit. - Lines 320–380: the score screen and the play-again prompt. ### Ducks and Bullets The ducks are a single 30-character string, `q$`, holding UDG a followed by two spaces, ten times over. Each pass of the main loop prints it at the top of the screen and rotates it one place with `q$(2 TO )+q$(1)`, so the row scrolls left and wraps round. A hit blanks the character above the gun with `LET q$(e+2)=" "`, and the round ends when `q$` is all spaces. Bullets are counted through `l`, which goes up by one for each of the nine animation steps of a shot. The game stops when it reaches 138, which allows fifteen full shots. ## Notable Techniques - The UDG DATA in line 400 uses the variable `A` as an item: because it is read into `a`, each `A` repeats the value read before it, which shortens the DATA line. - Line 430 sets `e` from `C`, the same variable as `c`, since Sinclair BASIC variable names ignore case. - Line 510 uses `AT 20,PI` as a column, which rounds to 3. ## Potential Issues - The gun’s column is never range-checked. Holding 5 at the left edge takes `e` to −1 and the program stops with an error at line 70. Moving far enough right fails the same way at column 32. - Firing from the last columns on the right indexes past the end of `q$` in line 280 and appears to stop with a subscript error. - Lines 120–150 are never reached. - On the score screen after ten hits, any key other than y or n replays the fanfare (line 380). This program came from an Oliger (JLO SAFE) disk in the SNUG library set and was converted to load from tape: the Oliger slash was removed from `SAVE /` in line 540. It was tested in ZEsarUX on a stock TS2068 through the instructions, the moving ducks and gun, and firing. ## Source Code ``` 10 GO SUB 390 20 BORDER 0: PAPER 0: INK 6 30 FOR q=1 TO 9 40 PRINT INK 2;AT 0,0;q$, 50 LET q$=q$(2 TO )+q$(1) 60 BEEP .01,-20 70 PRINT INK 5;AT c,e;" b " 80 IF INKEY$="7" THEN GO TO 160 90 IF INKEY$="5" THEN LET e=e-1: BEEP .005,45 100 IF INKEY$="8" THEN LET e=e+1: BEEP .005,45 110 GO TO 40 120 PAUSE 0 130 IF INKEY$="n" THEN STOP 140 IF INKEY$="y" THEN RUN 150 IF INKEY$="" THEN GO TO 120 160 LET c$="." 170 LET e=e+1 180 PRINT INK 2;AT 0,0;q$, 190 IF q$=" " THEN GO TO 320 200 FOR q=40 TO 48 210 LET l=l+1: IF l=138 THEN PRINT AT 10,7;"OUT OF BULLETS!!!": BEEP 3,-18: GO TO 320 220 PRINT AT f,e;c$: FOR k=1 TO 8: NEXT k: PRINT AT f,e;" " 230 LET f=f-1 240 BEEP .005,q 250 NEXT q 260 LET f=9 270 LET e=e-1 280 IF q$(e+2)<>" " THEN LET q$(e+2)=" ": LET s=s+1 290 IF s=10 THEN GO TO 320 300 IF INKEY$="7" THEN GO TO 160 310 GO TO 40 320 CLS : INK 6: PRINT AT 10,10;"SCORE= ";s 330 PRINT AT 13,0;"'y' to play again or 'n' to stop" 340 IF s>=10 THEN PRINT AT 11,0;"You have the fastest gun in the North-West!": FOR i=50 TO 20 STEP -1: BEEP .1,i: NEXT i 350 PAUSE 0 360 IF INKEY$="n" THEN STOP 370 IF INKEY$="y" THEN RUN 380 GO TO 340 390 INK 0: PAPER 5: BORDER 5: CLS 400 DATA 0,A,96,225,62,30,0,A,24,A,A,A,A,A,255,A 410 RESTORE : FOR z=USR "a" TO USR "b"+7: READ a: POKE z,a: NEXT z 420 LET a=0 430 LET c=10: LET e=C: LET f=9 440 LET s=a: LET l=a: LET b=a 450 PRINT AT 1,8;"***DUCK SHOOT***" 460 PRINT AT 2,6;"**** M.Savin 1982***" 470 INK 1 480 PRINT ''" Use <5 to move to the left and 8> to move right and 7 to FIRE!! (you have ten ducks to shoot at and 15 bullets) ";AT 10,10;"GOOD LUCK!!" 490 LET q$="a a a a a a a a a a " 500 BORDER 0: PAPER 0: INK 6 510 PRINT AT 20,PI;"Press any key to continue" 520 PAUSE 0 530 CLS : RETURN 540 SAVE /"DUCK SHOOT" LINE 10 ```