1、微动开关4:向右的按键,用于改变蛇的方向微动开关5:复位按键,按下后游戏复位,重新开始微动开关6:暂停/继续按键,控制游戏暂停/继续自锁开关:实现整体的电源总控制(断负)晶振、电容:用于单片机起振,单片机的最小时钟电路排针:用于连接电源正负极以及RXD和TXD电源指示灯:通电时点亮8个1K电阻:限制电流大小10个0电阻:做跳线用2. 作品功能介绍及操作说明a) 给游戏机上电1 将电源正极接在排针处标有VCC的位置2 将电源负极接在排针处标有GND的位置3 按下自锁开关完成上电b) 让贪吃蛇改变方向1 按向上键:蛇身向上2 按向下键:蛇身向下3 按向左键:蛇身向左4 按向右键:蛇身向右c) 游戏
2、暂停/继续、复位1 按暂停/继续键:游戏暂停/继续2 按复位键:游戏复位,重新开使三、 作品制作说明1. 电路原理图2. 作品原件清单元件名称型号数量(个)单片机STC12C5A60S21单片机底座40引脚 点阵屏8*82微动开关5*56晶振12MHz电容30pf电阻1K810K010自锁开关3*3排针直针4(根)LED红色杜邦线1组洞洞板单面挂锡玻纤板10CM*14CM电池盒3. PCB图a) 正面图(见附录1)b) F5图(见附录2)c) F6图(见附录3)四、 产品控制顺序/*名 称:制作人:李兆基制作时间:2016.6.28修改时间:2016.7.1 (加入吃食物蛇身变长功能) 201
3、6.7.3 (处理程序兼容细节)*/#includestdlib.hunsigned char map16; /定义一个MAP地图unsigned char line; /列unsigned char snake452; /定义蛇的大小 unsigned char game_reset; /游戏复位 unsigned char foodx,foody; /食物的位置 sbit Key_left=P32; /左sbit Key_up=P33; /上sbit Key_down=P34; /下sbit Key_right=P35; /右sbit Key_start=P37; /开始/暂停sbit K
4、ey_reset=P36; /复位/*按键所对应的位置*/void CreateFood() unsigned char i; i=0; RESET:foodx=rand()%6+1; /rand()函数随即产生食物的横坐标(16) foody=rand()%14+1; /rand()函数随即产生食物的纵坐标(114) while(!(snakei0=snakei1&snakei0=44) /找蛇尾(遍历蛇) if(snakei0=foodx&snakei1=foody) goto RESET; /如果产生的食物在蛇的节点上,则重新生成食物 i+; /*构造食物*/ void ClearMap
5、() for(i=0;ifoodx; /获取食物的横坐标 mapfoody|=i; /将其横坐标和纵坐标对应的点显示在地图上snakei0=44) mapsnakei1|=0x80snakei0; /将蛇节点全部显示在地图上/*将蛇以及食物显示在地图上*/void Move(unsigned char fx) /fx参数(0为上,1为下,2为左,3右) unsigned char i,snakewx,snakewy; snakewx=snakewy=i=0;snakei0=44)i+; snakewx=snakei-10; snakewy=snakei-11; /扫描蛇节点并且得到尾巴的位置(
6、横纵坐标) switch(fx) case 0: while(! /扫描蛇节点 得到节点数 for(i-;i0;i-) snakei0=snakei-10; snakei1=snakei-11; /后节点朝着前节点方向移动 snake00-; /移动蛇头 break; case 1: /扫描蛇节点 得到节点数 /后节点朝着前节点方向移动 snake00+; case 2: snake01-; case 3: snake01+; if(snake00=foodx&snake01=foody) /蛇吃食物(蛇头的坐标与食物坐标重合) while(! snakei0=snakewx; snakei1
7、=snakewy; snakei+10=snakei+11=44; /重新添加(定义)蛇尾 CreateFood(); /创建食物/*蛇的移动(按键的方向改变)*/void delay(unsigned int i) unsigned int j; while(i-) for(j=600;jj-);/*延时函数(接近与1毫秒) */void donghua(void)unsigned int i; if(ii); else P1=0xff; /第一块点阵屏亮 P2=(0x80(i-8); P0=0xff; delay(20); P1=P2=P0=0x00; for(i=0; P2=(0x01
8、else P1=(0x01 /第二块点阵屏亮/*开机动画*/bit IsOver() game_reset=0; for(i-; if(snake00=snakei0&snake01=snakei1) game_reset=1; /遍历蛇节点是否蛇头和蛇身重合 if(snake00=0|snake00=7|snake01=0|snake01=15) /判断蛇头是否撞墙 game_reset=1; return game_reset;判断蛇的状态(死亡条件)*/void init(void) P0M0=0xff; P0M1=0x00; /PO为强推模式 TMOD=0X01; /设定时/计数器方式
9、 EA=1; /开启中断 ET0=1; /开启定时计数器0 TH0=(65536-1000)/256; TL0=(65536-1000)%256; /设置计数初值为1毫秒 TR0=1; /开启定时/计数软开关 /初始化地图 ClearSnake(); /初始化蛇初始化函数void main(void) unsigned char fx,i,newfx; /定义方向,新方向,以及变量i unsigned char isStart; /开始/暂停变量 newfx=fx=2; /初始化方向 donghua(); delay(100); i=0; isStart=1; init(); while(1)
10、 for(i=0;20; delay(10); if(fx!=1&!Key_up&isStart) /蛇向下移动则向上按键无效 newfx=0; =0&Key_down&isStart) /蛇向上移动则向下按键无效 newfx=1;=3&Key_left&isStart) /蛇向左移动则向右按键无效 newfx=2; =2&Key_right&isStart) /蛇向右移动则向左按键无效 newfx=3; /按键改变newfx,默认向fx移动 if(!Key_start) delay(20); if(! if(isStart=1)isStart=0; else if(isStart=0)isS
11、tart=1; /暂停/继续改变isStart状态 while(!Key_start); Key_reset) game_reset=1;Key_reset); if(game_reset)return; /复位 isStart)i-; /暂停状态时所执行的死循环 if(fx=0&newfx=1|fx=2&newfx=3) newfx=fx; fx=newfx; /方向冲突时按新方向移动,避免按的太快 Move(fx); /移动 while(IsOver() /当蛇死亡只能激活复位按钮 SnakeToMap(); /将蛇显示在地图 /*主函数*/void display(void) interrupt 1 TR0=0; /关闭软开关 /计数赋值 if(lineline); /选列 else P1=0xff; P2=(0x80(line-8); /选列 /两块点阵屏的对接 P0=mapline; /送行 line+; if(line=16)line=0; /开启软开关显示函数
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1