From 43aa9250b13f170af7cc9e65827da83752032913 Mon Sep 17 00:00:00 2001 From: fumiama Date: Tue, 13 Apr 2021 23:29:01 +0800 Subject: [PATCH] =?UTF-8?q?=E5=BE=88=E5=A4=9A=E6=94=B9=E8=BF=9B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- addfood.asm | 9 +-- head.asm | 2 +- hint.asm | 2 +- judge.asm | 150 ++++++++++++++----------------------------------- main.asm | 15 +++-- printfield.asm | 21 ++++--- snake.prg | Bin 1063 -> 1469 bytes 7 files changed, 71 insertions(+), 128 deletions(-) diff --git a/addfood.asm b/addfood.asm index 89f26af..84e66b1 100644 --- a/addfood.asm +++ b/addfood.asm @@ -48,14 +48,9 @@ addfood: tay * lda (_ptr), y iny - cmp #csnk - beq - - cmp #cblk - beq - - cmp #crnd - beq - + cmp #csps + bne - lda #crnd - dey sta (_ptr), y rts .scend diff --git a/head.asm b/head.asm index 9c59492..f8aaf74 100644 --- a/head.asm +++ b/head.asm @@ -16,7 +16,7 @@ .data zp .space d 1 ; 方向 值定义如上 -.space c 1 ; 🐍长度 最大255 最小0 +.space prev_d 1 ; 前一个方向 .space s 2 ; 得分 小端序 .space _ptr 2 ; 通用指针 .space eat 1 ; 吃到食物标记 diff --git a/hint.asm b/hint.asm index 24e270a..158527b 100644 --- a/hint.asm +++ b/hint.asm @@ -13,7 +13,7 @@ printfail: `print failhint rts erasehint: - ldy #25 + ldy #22 lda #csps * sta [title+20*40+8-1], y dey diff --git a/judge.asm b/judge.asm index dd69529..70be0ff 100644 --- a/judge.asm +++ b/judge.asm @@ -24,75 +24,13 @@ ;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; judgeout: -.scope - lda d - ;;方向向上 - cmp #go_u - beq _gup - ;;方向向下 - cmp #go_d - beq _gdown - ;;方向向左 - cmp #go_l - beq _gleft - ;;方向向右 - cmp #go_r - beq _gright - jmp _End1 ;什么都没有撞 + `judgeof cblk + bcs + + cmp #csnk + bne + + sec +* rts -;是否撞墙;是否考虑溢出情况;撞墙撞自己要不要分开写? -_gup: ;地址-40?实现:/减法/地址跳跃 - lda shead - sec - sbc #40 - sta _ptr - lda shead+1 - sbc #0 - sta _ptr+1 - ldy #0 - lda (_ptr),y - - cmp #cblk - beq _End2 - jmp _selfx - -_gdown: ldy #40 ;地址+40,好像有问题,这个(shead)是蛇头地址的地址了 拟修改:lda (取低位用啥来着)(shead),sec, adc #40, - lda (shead),y - cmp #cblk - beq _End2 - jmp _selfx - -_gleft: - lda shead - sec - sbc #1 - sta _ptr - lda shead+1 - sbc #0 - sta _ptr+1 - ldy #0 - lda (_ptr),y - - cmp #cblk - beq _End2 - jmp _selfx - -_gright:ldy #1 ;地址+1,好像有问题,这个(shead) 拟修改:lda (取低位用啥来着)(shead),sec,adc # - lda (shead),y - cmp #cblk - beq _End2 - -_selfx: cmp #csnk - beq _End2 - -;蛇没死 -_End1: clc - rts -;蛇死了 -_End2: sec - rts - -.scend ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ; judgefood 判断是否吃到食物 ; 是->sec 即进位标志置1 @@ -104,8 +42,17 @@ _End2: sec ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; judgefood: -.scope + `judgeof crnd + rts + +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +; judgeof 两个判断的宏 +; 是->sec 即进位标志置1 +; 否->clc 即进位标志置0 +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +.macro judgeof lda d + ldy #0 ;;方向向上 cmp #go_u beq _gup @@ -121,54 +68,43 @@ judgefood: jmp _End1 ;输入了一个无效字符,,,,,? ;是否撞墙;是否考虑溢出情况-不用;撞墙撞自己要不要分开写? -_gup: - lda shead - sec - sbc #40 - sta _ptr - lda shead+1 - sbc #0 - sta _ptr+1 - ldy #0 +_gup: + `_m_ptr_minus 40 lda (_ptr),y + jmp _compare - cmp #crnd - beq _End2 - bne _End1 - -_gdown: ldy #40 ;地址+40 +_gdown: + ldy #40 ;地址+40 lda (shead),y - cmp #crnd - beq _End2 - bne _End1 + jmp _compare -_gleft: - - lda shead - sec - sbc #1 - sta _ptr - lda shead+1 - sbc #0 - sta _ptr+1 - ldy #0 +_gleft: + `_m_ptr_minus 1 lda (_ptr),y + jmp _compare - cmp #crnd - beq _End2 - bne _End1 - -_gright:ldy #1 ;地址+1 +_gright: + ldy #1 ;地址+1 lda (shead),y - cmp #crnd + +_compare: + cmp #_1 beq _End2 -;没吃到 +;没吃到 默认情况 _End1: clc - rts + jmp _end ;吃到了 _End2: sec - rts +_end: +.macend - -.scend \ No newline at end of file +.macro _m_ptr_minus + lda shead + sec + sbc #_1 + sta _ptr + lda shead+1 + sbc #0 + sta _ptr+1 +.macend \ No newline at end of file diff --git a/main.asm b/main.asm index ee018d1..9444962 100644 --- a/main.asm +++ b/main.asm @@ -19,20 +19,27 @@ main: sta eat jsr judgefood ; 判断是否吃到食物 bcc + - inc c ; 蛇长加一 lda #1 sta eat jsr addfood * jsr move ; 蛇移动一格 jsr calcscore ; 计算得分 jsr printscore ; 打印分数 + lda d + sta prev_d ; 备份前一个按键 lda #32 jsr delay ; 延时期间最后一个按键位于d lda d cmp #ed_g - bne + + beq _end + cmp #st_g + bne --- + jsr getchar + lda prev_d + sta d ; 恢复按键 + jmp --- +_end: rts -* jmp ---- .scend ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; @@ -47,8 +54,6 @@ main: sta s + 1 ; 初始化分数为0 jsr printscore ; 打印分数 jsr move_init - lda #2 - sta c ; 初始化蛇长为1 jsr printfield ; 打印蛇,包括边框 jsr printhint ; 打印开始提示 lda #go_d ; 初始化方向为下 diff --git a/printfield.asm b/printfield.asm index 5e2b8a8..7a065e4 100644 --- a/printfield.asm +++ b/printfield.asm @@ -5,10 +5,13 @@ printfield: .scope ldx #23 ; i代表行数,不含边框 lda #field ; 取地址高8位 sta _ptr + 1 - ldy #0 + jsr _print_blk_line + ;ldy #0 ; 此时y一定为0 * lda #cblk sta (_ptr), y ; 打印左边框 lda #39 @@ -19,12 +22,7 @@ printfield: jsr _addptr dex bne - - lda #cblk - ldy #40 - dec _ptr -* sta (_ptr), y ; 打印底边 - dey - bne - + jsr _print_blk_line rts _addptr: @@ -34,4 +32,13 @@ _addptr: inc _ptr + 1 * sta _ptr rts + +_print_blk_line: + lda #cblk + ldy #40 + dec _ptr +* sta (_ptr), y ; 打印底边 + dey + bne - + rts .scend diff --git a/snake.prg b/snake.prg index d4c7059d195bf24865a9a297a698bf5ebab0eec5..35d4b29f1f9f69ec3b34608f2dd75b87862fb606 100644 GIT binary patch delta 674 zcmZvZF^CgE6oxaK?Cj2D_e9X!4V>^g7X&*Yr3WXZh-gTWgKMTSPZSr>4-zAdjinQPs z*WHln%Wz{M2#R;vH{`;vr5_oply>rSX*<7^Zsw3~c7K+=fMO45pHv*V~BW_T0@ z9QE%4iCNmsD}GZr^@*9PjMT+{V_%$!9rqWx<1@KqM-{oPB6sRwpq(`|s8Zba8>QhnOpmJU9Ccf^QK#f3gaKLxg>*? zr?Y&vBtonG6LbI6)Tc+LWCN~G@bm^guF8`hE~`*XGE`hdwEnp!>BLAZf!~OlO)eS< T7Cih=Um~T_i!AAn)+)8%cNFy| delta 309 zcmdnXy_{o0MEwSil?!@5v#w-pWmXX7Qt;tg8QjXG@R(a+JD0*nE`B8CMF3LpNj zOk2dSaOwZ43%@*Oc&xm=fI~r)Cu2p1!b1*__{4kGT#=j#S)2;fITfx=R%SG166Kj3 z#dtiim2D+UEBgY5m1z^%R;nvFae*0(K*p&HuUDom&^X36k*(vx?*xfdwh2tn*jw2W zBo>JPjsNf;WKr`1E{H`aqO;(l3nVvpF-0))E%@;BWZH+XCj&oxTp8Fg`8l(;bV5SH cGnNZX&sY;$*;;@u*vR&Q4d{at7rrF`070~LH2?qr