x8086千行汇编项目——汇编贪吃蛇、画图、两个程序的调度
特别说明:本博客草稿创建于2018年12月5日(设为私密文章),这已经是作品提交截止日期以后,不过为了进一步避免不必要的麻烦将会在比赛彻底结束后发布为公开文章。
发布日期:2018/12/8 12:09
最近学校强制要求参加一个汇编语言程序设计大赛。然后就组了个队弄了一个程序。
好吧,用汇编写这个工程还是挺麻烦的一个事情,一开始架构考虑的不够周全后期有一点小麻烦但总归完成了。
总的来说就是写好底层函数以后不断地调函数,调函数,调函数,除了任务调度的不到一百行代码以外实在没什么意思。
另外附上架构图、函数功能和调用图,答辩ppt和报告见资源传送门——>>>传送门
一、功能
大概来讲就是将屏幕分成两份,左边跑贪吃蛇,右边跑画三角形。
贪吃蛇(snake)就是大家想象的贪吃蛇。
画三角形(tri),就是输入一个正整数a,以a为边长在屏幕中间画一个等边三角形。这一块由另一个同学全权负责。
两个按tab键切换程序,选中的程序运行,另一个暂停(我们是这么设计的)。按esc键退出整个程序。这个由yield()负责。
二、架构
协程了解一下,参考了libco的上下文切换原理,我们以协程的概念设计了如下架构:
1.snake函数和tri函数抽象成两个协程。
2.两个协程独立工作互不影响,除了处理tab和esc事件只调用了一次yield以外,其他任何逻辑不做任何改变。
3.一个协程调用yield,yield返回后,当前协程上下文没有发生任何变化,就像yield什么都没干一样(就像进程切换一个道理)。只是忙里抽闲运行了一段其他协程罢了。
4.snake和tri的架构都是一个死循环,程序的切换和结束(esc)由yield处理。
5.所有协程(其实就两个协程)共享 data segment、code segment,每个协程都有自己的stack segment。
6.由于只有两个协程,所以不设额外的调用栈、调度器以及额外的一些复杂的设施。
附上一张架构图:
再附函数调用图:
详见竞赛报告和ppt(上面有下载传送门)
三、运行效果图
运行工具:masm for Windows(dos box)
咳咳,大家都是文明人,请勿言丑
四、源代码
代码作者和校验由名字首拼、网名替代,博主是GreyBtfly
作者名单:GreyBtfly、SJY、LSY、welkin.、LSX、LKWDELAY_TIME EQU 02h ;延时时间参数
MAXBODY EQU 100
HIGHT EQU 20
WIDE EQU 30 ;0~WIDE , or wide+1
WIN_LENTH EQU 10 ;获胜长度
;HEAD_CHAR EQU '#'
BODY_CHAR EQU '*'
SNASTACKOFFSET EQU 127
TRISTACKOFFSET EQU 127
kEsc EQU 27
kTab EQU 9
FOOD EQU '+'
SCx EQU 0
SCy EQU HIGHT+1;tri
triScr_x EQU 320
triScr_w EQU 320
triScr_h EQU 350 ;设置屏幕属性,保证图形在近似中央;整体设计:GreyBtfly
DATAS SEGMENT;此处输入数据段代码 ;debugs db '12345$'stri db 'tri$'ssna db 'snack$';debug end;printIntprintInt_div DW 10000, 1000, 100, 10, 1printInt_res DB 0,0,0,0,0,"$" ;存放五位数ASCII码;end;mainspace db ' $';end;snake;全局变量HEAD_CHAR db '#'m db 0x db 0y db 0fx db 0fy db 0ta db 0blength db 2sbody_move db 0sbody db MAXBODY dup(0)pause db 'press r to reload$';局部变量win db 0de db 0gameover db 0fe db 0winMSG db 'Gameover...$'loseMSG db 'You are winner!$';end;tritribx dw 0triYd dw 173triXd dw 100triP dw 0 ;以上三个算法需要的变量triFlag db 0 ;第n次调用triHypotenusetriEx dw 0 ;记录本次画线终点横坐标triLeftX dw 0 ;记录左端点横坐标triRightX dw 0 ;记录右端点横坐标 triHengY dw 0 ;记录底边总左边 (以上三个供画横线函数使用)triLenth dw 0 ;记录边长(代码必须要覆盖AX)note db '>=2 and <=320:$';end;yieldyFunc db 0 ;0 is tristack_tri_sp dw 0stack_snake_sp dw 0;end;randrseed dw ?rcnt dw ?;end
DATAS ENDS
STACK_SNAKE segmentSStack db 128 dup(0)
STACK_SNAKE ENDS
STACK_RTI segmentTStack db 128 dup(0)
STACK_RTI ends
CODE SEGMENT
main proc ;作者、校验:GreyBtflyassume cs:code,ds:datasmov AX,DATASmov DS,AX;main_initmov al,10hmov ah,0 int 10h ;设置显示模式call sInit;yield initmov ax,offset TStackadd ax,TRISTACKOFFSETmov stack_tri_sp,axmov dx,ssmov bx,sp ;暂存mov ax,STACK_SNAKEmov ss,axmov ax,offset SStackmov sp,ax ;由于起点在tri 所以要将snake初始断点设置好add sp,SNASTACKOFFSETmov ax,snakepush ax ;先保存snake断点mov cx,8 ;加上flags一共8个寄存器mov ax,0mInitYLp:push axloop mInitYLpmov stack_snake_sp,spmov sp,bx ;还原mov ss,dx;mov ax,STACK_RTImov ss,axmov sp,stack_tri_spcall trimov AH,4chint 21h
main endpyield proc ;作者、校验:GreyBtflypushf ;先保存一下flagscmp ax,0 ;判断是否是escjne yEls1mov AH, 4CH ;esc exitint 21h yEls1:;是tab,先在它自己的栈里保存寄存器,push axpush bxpush cxpush dxpush dipush sipush bp;再切换栈,恢复另一组寄存器cmp yFunc,0 ;当前是tri?je yTrimov stack_snake_sp,spmov sp,stack_tri_sp ;当前是1:snake,要切换成trimov ax,STACK_RTImov ss,ax mov yFunc,0jmp yTriEdyTri:mov stack_tri_sp,spmov sp,stack_snake_sp ;当前是0:tri,要切换成snakemov ax,STACK_SNAKEmov ss,axmov yFunc,1;恢复寄存器yTriEd:pop bppop sipop dipop dxpop cxpop bxpop axpopfret ;切换
yield endpsnake proc ;作者、校验:GreyBtflypushfpush axpush bxpush disstart: ;死循环call sInit ;贪吃蛇初始化sBigLp: cmp gameover,0 ;for循环头部je sBigLpBkElse ;满足循环条件jmp sBigLpBk ;转换成远转移sBigLpBkElse:;循环体call sMove;判断是否撞墙cmp x,WIDE jae sIfThencmp x,1jb sIfThencmp y,HIGHTjae sIfThencmp y,1jb sIfThenjmp sIfElsesIfThen:jmp sBigLpBk ;break big loopsIfElse:;判断是否咬到自己mov bh,0mov bl,1 ;isForHd1: ;for( )cmp bl,blengthjbe sForBk1Else ;满足条件jmp sForBk1 ;转换成远转移sForBk1Else:mov al,x ;ifmov di,bxshl di,1cmp sbody[di],al;sbody[bx*2+0]jne sIfElse2mov al,yinc dicmp sbody[di],al;sbody[bx*2+1]jne sIfElse2mov gameover,1jmp sForBk1sIfElse2:;end for.循环体结束( )inc bljmp sForHd1sForBk1: ;for外部cmp gameover,1 ;gameover?je sBigLpcall kbhit ;if( kbhit() )jnz nonImputmov al,mmov ta,al ;备份mcall getch ;read in;判断特殊字符,tab,esc,r(重新开始)cmp al,kEscjne nKEscmov ax,0 ;kEsccall yield;exitnKesc:cmp al,kTabjne nKTabmov ax,1 ;kTabcall yieldjmp nonImputnKTab:cmp al,'r'jnz sNRjmp sstart ;reloadsNR:mov ah,ta;四个判断,不能倒退;m==a && ta==dcmp al,'a'jne sIfElseAmov m,alcmp ah,'d'jne sIfElseAjmp sIfYsIfElseA: ;第二个 cmp al,'d'jne sIfElseBmov m,alcmp ah,'a'jne sIfElseBjmp sIfYsIfElseB:;第三个 m==w && ta==scmp al,'w'jne sIfElseCmov m,alcmp ah,'s'jne sIfElseCjmp sIfYsIfElseC:;第四个cmp al,'s'jne sIfElseDmov m,alcmp ah,'w'jne sIfElseDjmp sIfYsIfElseD:jmp sIfNsIfY:mov m,ah ;m=tasIfN:nonImput: ;end kbhit end if ( );if(x==fx && y==fy)mov al,xmov ah,ycmp al,fxjne sIfElse3cmp ah,fyjne sIfElse3inc blength ;x==fx && y==fymov bx,offset sbodymov ah,0mov al,blengthshl ax,1add bx,axmov al,-1mov [bx],almov fe,0sIfElse3:cmp blength,WIN_LENTHjb sIfElse4mov win,1 ;blength>=20 jmp sBigLpBksIfElse4:;call sMapcmp fe,0jne sIfElse5call sFood ;fe==0 食物不存在产生食物mov fe,1sIfElse5:mov al,fy ;y 输出食物mov bl,fx ;x 输出食物call movCursormov al,FOODcall putchar;移动光标mov al,SCYmov bl,0call movCursorcmp de,1jne sIfElse6mov ax,DELAY_TIME ;de==1call sDelay jmp sIfEnd6sIfElse6:mov de,1sIfEnd6:;大 for( ; gameover==0 ; )结束jmp sBigLpsBigLpBk:cmp win,0je sIfElse7mov ax,offset loseMSGcall puts ;win==0,losejmp sIfEnd7sIfElse7:mov ax,offset winMSGcall putssIfEnd7:mov ax,offset pausecall putsspauseLp:call getchcmp al,'r'je spauseLpBkcmp al,kEscjne sifEls7mov ax,0call yield;exitsifEls7: cmp al,kTabjne sifEls8;tabmov ax,1call yieldsifEls8:jmp spauseLpspauseLpBk:jmp sstart ; 死循环pop dipop bxpop axpopfret
snake endpsFood proc ;作者、校验:GreyBtflypushfpush axpush bxsFStart:mov ax,WIDE-2 ;xcall randmov fx,almov ax,HIGHT-2 ;ycall randmov fy,al;food不能在身体或头部mov al,fx ;头部cmp x,aljne sFIfEdmov al,fycmp fy,aljne sFIfEdjmp sFStartsFIfEd:mov bh,0 ;身体mov bl,blength sFLp: mov al,fxmov di,bxshl di,1cmp sbody[di],al ;if(sbody[bx].x==fx && .y==fy)jne sFEndmov al,fyinc dicmp sbody[di],aljne sFEnd;两个条件满足了jmp sFStart ;食物在蛇体内,重新生成随机数dec bxsFEnd: pop bxpop axpopfret
sFood endp
sInit proc ;作者、校验:GreyBtfly 画线部分:作者、校验:SJYpushfpush axpush bxmov blength,2 ;如果blength大于4,则需要调整初始化逻辑,否则会有一个bugmov m,'d'mov x,10mov y,10mov bx,1shl bx,1mov ch,0mov cl,blengthsInitLp0:mov sbody[bx],10 ;mov sbody[bx*2+0],8inc bxmov sbody[bx],10;mov sbody[bx*2+1],10inc bxloop sInitLp0mov bl,blengthmov sbody_move,bl;局部变量初始化mov win,0mov de,1mov gameover,0mov fe,0;清除底部字mov al,SCYmov bl,0call movCursormov ax,offset spacecall puts;clearmov al,0sinitLp1:mov bl,0sinitLp2:call movCursorpush axmov al,' 'call putcharpop axinc blcmp bl,WIDEjbe sinitLp2 inc alcmp al,HIGHTjbe sinitLp1;画线 画线部分:作者、校验:SJYmov DX,3mov triBx,280mov CX,243 ;得到heng坐标mov bx,0baseDraw1: mov al,1111bmov ah,0chint 10h inc DXcmp DX,triBx jne baseDraw1 ;右竖线;;;;mov DX,3mov triBx,243mov CX,3 ;得到heng坐标mov bx,0baseDraw2: mov al,1111bmov ah,0chint 10h inc CXcmp CX,triBx jne baseDraw2 ;上横线;;;;mov DX,3mov triBx,280mov CX,3 ;得到heng坐标mov bx,0baseDraw3: mov al,1111bmov ah,0chint 10h inc DXcmp DX,triBx jne baseDraw3 ;左竖线;;;;mov DX,280mov triBx,243mov CX,3 ;得到heng坐标mov bx,0baseDraw4: mov al,1111bmov ah,0chint 10h inc CXcmp CX,triBx jne baseDraw4 ;下横线 pop bxpop axpopfret
sInit endpsMove proc ;作者、校验:GreyBtflypushfpush axpush bxpush dimov ah,0mov al,sbody_movemov di,ax;擦除身体最后一节shl di,1mov bl,sbody[di] ;x di*2+0inc dimov al,sbody[di] ;ycall movCursorcmp bl,-1jz SMEls0mov al,' 'call putcharSMEls0:mov ah,0mov al,sbody_movemov bx,axmov al,xmov di,bxshl di,1mov sbody[di],almov al,yinc dimov sbody[di],aldec sbody_movecmp sbody_move,0ja sMElse1 ;手动取余mov al,blengthmov sbody_move,alsMElse1:;不需要擦除头部;switch(m)cmp m,'s'je sMCs1cmp m,'a'je sMCs2cmp m,'d'je sMCs3cmp m,'w'je sMCs4;casesMCs1: inc yjmp SCsEd1sMCs2: dec xjmp SCsEd1sMCs3: inc xjmp SCsEd1sMCs4: dec yjmp SCsEd1SCsEd1: ;end of switch-casemov al,y ;重新绘制头部mov bl,xcall movCursormov al,HEAD_CHARcall putcharcmp HEAD_CHAR,'#'jne sMElse2mov HEAD_CHAR,'*'jmp sMIfEd2sMElse2:mov HEAD_CHAR,'#'sMIfEd2:;移动光标mov bl,0mov al,SCYcall movCursorpop dipop bxpop axpopfret
sMove endp;sEven proc
; pushf
; push bx
; mov bx,ax
; and al,1
; cmp al,1 ;如果al为奇数,则加一
; jne evenEnd
; inc bx
; evenEnd:mov ax,bx
; pop bx
; popf
; ret
;sEven endp
rand proc near ;作者、校验:GreyBtfly,这个函数参考了一下百度。; 利用时钟的低位反转除ax的余数作为随机数 ; 随机数在ax中带回 push diPUSH BXPUSH CXPUSH DXPUSHFmov di,axMOV AH,0INT 1AH; MOV AX,CXxor ax,rseedadd ax,rcntinc rcntmov dx,1div dimov ax,dx;div 除法: 被除数: 如果除数是8位则被除数为16位, 默认放在AX中, 如果除数是16位, 则被除数为32位, 默认高位放在DX, 低位放在AX; 结果: 如果除数是8位, 那么执行div后, 余数存放在ah, 商存放在AL中; 如果除数是16位, 那么AX保存商, DX保存余数 inc axmov rseed,axPOPFPOP DXPOP CXPOP BXpop diRET
rand endp
sDelay proc near ;作者、校验:GreyBtflypushfpush cxmov cx,axmDLp1: push cxmov cx,0ffffHmDLp2:push axpop axloop mDLp2pop cxloop mDLp1pop cxpopfret
sDelay endp
puts proc near ;作者、校验:GreyBtflypush dxmov dx,axmov ah,09hint 21hpop dxret
puts endp
putchar proc near ;作者、校验:GreyBtflypush DXmov DX,AXmov AH,02Hint 21hpop DXret
putchar endp
kbHit proc near ;作者:LKW,校验:GreyBtflykbstart:mov AH,1int 16h;jz setzero ;无键入时将zf=1改为zf=0jnz setone ;有键入将zf=0改为zf=1 setOne: sub AX,AX ;将zf置1ret setZero: add AX,0 ;将zf置0ret
kbHit endp
getch proc near ;作者、校验:GreyBtflymov AL, 0mov AH, 0int 16h ;从键盘读取数据,键入的ASCII存在AL中 ret
getch endp
getchar proc near ;作者:LKW、校验:GreyBtflymov AH, 1int 21h ;从键盘读取数据,键入的ASCII存在AL中 ret
getchar endp
putInt PROC NEAR ;作者:LSY && SJY,校验:LSY && SJY && GreyBtflypushfpush axpush bxpush cxpush dxpush dipush simov si, offset printInt_divmov di, offset printInt_res mov cx,5 sly_aa:mov dx,0 div word ptr [si] ;除法指令的被除数是隐含操作数,此处为dx:ax,商ax,余数dxadd al,30h ;商加上48即可得到相应数字的ASCII码mov byte ptr [di],al inc di add si,2 mov ax,dx loop sly_aamov cx,4 mov di, offset printInt_res lsy_bb:cmp byte ptr [di],'0' ;不输出前面的0字符 jne sly_printinc di loop lsy_bbsly_print:mov dx,di mov ah,9int 21h ;调用DOS功能,该功能为显示DS:DX地址处的字符 pop sipop dipop dxpop cxpop bxpop axpopf RET
putInt ENDP;作者:LSY ,校验:GreyBtfly
movCursor proc near ;al=y,bl=x;pushfpush dxpush axpush bx ;后期改的,还是保持一下参数比较好用mov ah,02h mov DH,AL ;设定光标到第y行x列 ;DH=行(Y坐标)DL=列(X坐标)mov DL,BLpop bxint 10h pop axpop dxpopfret
movCursor endp;作者:LSX、welkin 校验:LSX、GreyBtfly
getInt PROC near ;普通输入数字返回输入的数字ax(zf=1),,,特殊情况(esc键和tab键zf=0)esc键返回ax=0(zf=0),tab返回ax=1(zf=0);可以用jz判断是否发生了特殊情况。用ax区分发生了esc还是tabpush BX ;保护现场push DX push CX ;此处不能pushf,因为flags是返回值mov AX,0 ;初始化 mov BX,0mov CX,0mov DX,0
getInt_XUNHUAN:mov AH ,01Hint 21H ; 输入一个字符,一定存储在 AL 中cmp AL,0DH ; 判断回车符 jz getInt_RESULT ; zf=0cmp AL,08H ;判断退格符 je getInt_SUB_TO_AX cmp AL,1BH ;判断esc符 je getInt_DO_ESC cmp AL,09H ;判断tab符 je getInt_DO_TAB cmp AL,30Hjb getInt_OTHER_ERROR ; < 0cmp AL,39H ;<= 9 && > 0jbe getInt_SUM_TO_AX jmp getInt_XUNHUAN ;继续循环 getInt_SUM_TO_AX: mov AH,0 ;清除 AX 高位push AX ;保存 AXmov AX,CX ;将原先的值乘以 10 ,实质上乘起来的值放在了 CX 中 mov BX,10;如果参数是字节,将把 AL 做乘数, 结果放在 AX;如果参数是字 , 将把 AX 做乘数, 结果放在 DX:AXmul BX mov DX,0mov CX,AX pop AXsub AL,30Hadd CX,AX jmp getInt_XUNHUAN getInt_SUB_TO_AX:mov AX,CX ; 被除数默认存放在 AX 中 ; 除数是8位, 则被除数为 AX, AL 存储商,AH 储存余数; ; 除数是16位,则被除数为 DX:AX ,AX 储存商,DX 储存余数mov DX,0mov BX,10div BX mov CX,AXmov DL,20H ;输出空格mov AH,02Hint 21Hmov AL,08H mov DL,ALmov AH,02Hint 21Hjmp getInt_XUNHUAN getInt_DO_TAB:;tab置zf为1 ax=1add AX,0 ;zf=0mov CX,1jmp getInt_RESULT
getInt_DO_ESC: ;esc置zf为0add AX,0 ;mov CX,0 ;jmp getInt_RESULT;如果要处理其他错误的话,就在这里处理
getInt_OTHER_ERROR: jmp getInt_XUNHUAN
getInt_RESULT:mov ax,10;call putcharmov AX,CXpop BX ;恢复现场pop DX pop CXret
getInt ENDP
tri proc near ;作者、校验:SJYpushfpush AXpush BXpush CXpush DXtriLoop:mov al,0mov bl,35call movCursormov AX,offset notecall putsmov al,0mov bl,50call movCursormov CX,10spaceLoop:mov al,' 'call putcharloop spaceLoopmov al,0mov bl,50call movCursorcall getIntjz triEls1call yield jmp triLooptriEls1:cmp AX,triScr_wjg triLoop cmp AX,2jl triLoopcall clearcall trianglemov triFlag,0 ;调用画等边三角形的函数jmp triLooppop DXpop CXpop BXpop AXpopf ret
tri endp;作者、校验:SJY
clear proc near ;清除三角形pushfpush AXpush BXpush CXpush DXmov CX,triScr_xadd CX,triScr_w mov DX,triScr_hclrLoopOut:mov DX,triScr_h clrLoopIn: mov al,0000bmov ah,0chint 10h ;画黑色dec DXcmp DX,0jne clrLoopIndec CXcmp CX,319jne clrLoopOutpop DXpop CXpop BXpop AXpopf ret
clear endp;作者、校验:SJY
triangle proc nearpushfpush AXpush BXpush CXpush DXmov triLenth,AX ;记录AX输入的边长call triHypotenuse ;第一次call画左边call triHypotenuse ;第二次call画右边call triBase ;画横线pop DXpop CXpop BXpop AXpopf ret triHypotenuse: ;作者、校验:SJYmov AX,triLenth ;mov BL,2;div BL;mov AH,0shr AX,1mov CX,AX ;得到边长并除以二cmp triFlag,0je hypCalLeftXjne hypCalRightXhypCalLeftX: ;第一次计算得到左端点横坐标放入triEx、leftxmov AX,triScr_w shr AX,1 ;mov BL,2;div BL;mov AH,0add AX,triScr_xmov BX,AXsub BX,CXmov triEx,BXmov triLeftX,BXjmp hypInihypCalRightX:mov AX,triScr_w ;mov BL,2;div BL;mov AH,0shr AX,1add AX,triScr_xadd AX,CXmov triEx,AXmov triRightX,AX ;第二次计算得到左端点横坐标放入triEx、rightxhypIni:mov AX,triScr_w ;mov BL,2;div BL;mov AH,0shr AX,1add AX,triScr_xmov CX,AX mov AX,triScr_hsub AX,triLenth;mov BL,2;div BL;mov AH,0shr AX,1 mov DX,AX ;保证位置在近似中央mov AX,triYdadd AX,AXmov BX,triXdsub AX,BXmov triP,AX ;初始化triP变量,算法需要hypDraw:mov al,1111bmov ah,0chint 10h ;设置白色cmp triP,0 jge hypDown jl hypLorr ;判断此次向下画像素还是向左右画hypLorr:cmp triFlag,0je hypDrawLeftjne hypDrawRight ;判断向左画还是向右画hypDrawLeft: ;向左画一个像素(第一次调用xiexian时)dec CXjmp hypUpthypDrawRight: ;向右画一个像素(第二次调用xiexian时)inc CXjmp hypUpthypUpt: mov AX,triPmov BX,triYdadd BX,BXadd AX,BXmov triP,AX ;更新triP值,算法需要jmp hypFin hypDown: ;向下画一个像素inc DX mov AX,triPmov BX,triXdadd BX,BXsub AX,BXmov triP,AXjmp hypFin hypFin:mov AX,triEx cmp CX,AXjne hypDraw ;判断本条线是否画完mov triFlag,1 ;记录左边画完mov triHengY,DX ;记录底边纵坐标ret
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
triBase: ;作者、校验:SJY;mov CX,triLeftX;mov AX,triRightX;mov Bx,AX ;得到左右端点横坐标;mov triBx,AX;mov DX,triHengY ;得到纵坐标mov CX,triLeftXmov AX,triRightXmov triBx,AX ;得到左右端点横坐标mov DX,triHengY ;得到纵坐标mov bx,0;inc CXbaseDraw: mov al,1111bmov ah,0chint 10h inc CXcmp CX,triBx jne baseDraw ;循环画点 ret
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; triangle endp code endsend main
x8086千行汇编项目——汇编贪吃蛇、画图、两个程序的调度相关推荐
- 【C语言项目】贪吃蛇游戏(上)
00. 目录 文章目录 00. 目录 01. 开发背景 02. 功能介绍 03. 欢迎界面设计 3.1 常用终端控制函数 3.2 设置文本颜色函数 3.3 设置光标位置函数 3.4 绘制字符画(蛇) ...
- python 250行代码开发一个贪吃蛇
python 250行代码开发一个贪吃蛇 1. 前提工作准备 2. 全局变量的定义与包的导入 3. 游戏开始界面初始化 4. 游戏界面的设置 4.1 游戏界面,使用一个Point类进行划分 4.2 预 ...
- 计算机软件实习项目二 —— 贪吃蛇游戏 (实验准备)
目录 一.实验目的 二.编程语言和平台 三.实验难点: 四.参考资料 一.实验目的 1.实现贪吃蛇游戏基本功能,屏幕上随机出现一个"食物",称为豆子 2.上下左右控制"蛇 ...
- Java项目实战——贪吃蛇
文章目录 声明 项目演示 项目实战 1. 游戏的主启动类 2. 游戏的面板 3. 数据中心 4. 绘制静态面板 5. 绘制静态小蛇 6. 绘制动态小蛇 7. 设置游戏状态 8. 让蛇动起来 空格键获得 ...
- 8086汇编初学之贪吃蛇
前言 一直没想过要去学习汇编,觉得需要用汇编的场合无非三种: 1. 与硬件结合很紧密高级语言做不到 2. 时空效率要求甚高算法层面已不能优化到 3. 逆向破解等只能用某些途径看其汇编指令 其余情况下, ...
- 基于汇编实现的贪吃蛇游戏
一 需求分析 现在有的一些人感觉生活都是很无聊的,所以有些时候肯定会玩各种各样的游戏的,有一些大的游戏,玩起来会话掉很多的时间,而且也会花掉大量精力的 ,所以在一些闲暇的时候一些小游戏会博得很多人的喜 ...
- Pygame实战项目:用300行代码写出贪吃蛇小游戏
贪吃蛇是一款逻辑清晰.操作简单.老少咸宜.备受欢迎的休闲小游戏. 下面就给大家介绍一下贪吃蛇游戏的基本原理,以及实现贪吃蛇所需要的相关方法. 一.主要思路 我们的贪吃蛇游戏将主要包括三个核心模块,分别 ...
- java小项目之贪吃蛇项目(图解超详细)
在刷视频的时候,看到了一个讲解用java写一个贪吃蛇的项目,于是想照猫画虎的学习仿制一下. 学习视频的地址:https://www.bilibili.com/video/BV1HE41127CV 也欢 ...
- 王世琦个人项目(贪吃蛇)
学号:2017******179 姓名:王世琦 我的码云贪吃蛇项目仓库:https://gitee.com/shiqiwang/wangshiqiNO2.git 各项更改时间记录 1) 将游戏名称改为 ...
最新文章
- 谈一谈周公所理解的面试
- poj 3275 Ranking the Cows 搜索
- 恐怖如斯,阿里P9总结的这份Java八股文,已经帮近百人拿到offer了
- OSGi将Maven与Equinox结合使用
- AppleScript快速入门教程
- 如何确定VS编译器版本--_MSC_VER || #if _MSC_VER 1000 #pragma once #endif
- Sentinel 成为 Spring Cloud 官方推荐的主流熔断降级方案
- Mosquitto感知客户端上下线的方法
- npm install 本地安装与全局安装
- 谷歌浏览器文字转语音
- 用html写的意见调查表代码
- Appscan安全测试
- 苹果系统怎么连宽带连接服务器未响应,苹果电脑怎么连宽带 MAC系统怎么连接有线宽带...
- IC测试原理-存储器测试
- 学会Squid之传统代理和透明代理一篇就够了!
- 雷达信道化接收算法及论证(持续更新)
- 小程序兼容各个ios版本
- oracle查不到凭证,用友T3软件在查询凭证界面怎么查不到已经做的凭证了
- 程序猿爆笑内涵段子 上班记得捂着嘴
- hisense出现android怎么打开,hisense手机怎么刷机?hisense手机刷机教程【图文】