基于点阵的贪吃蛇游戏设计
以上全部资料打包下载:
基于点阵的贪吃蛇游戏设计.zip
(538.51 KB, 下载次数: 137)
本题目要求设计一款贪吃蛇游戏,显示器采用 8*8点阵,主控采用51单片机,如果开发板上有点阵可以直接在上面进行开发。
基本要求: 1、屏幕能够显示出一条蛇,并且能够通过按键控制其移动。 2、能够随机产生食物。 3、完成上面两个要求的前提下,实现完整的游戏功能。 提高: 1、实现难度选择功能。 2、加入关卡机制。 3、用链表或者队列这类高级数据结构来实现程序功能。
点阵: 实际元件中,点阵的封装不尽相同,因此需要测试出每个引脚的功能,以便正确连线。 注意,每个像素点的额定电压在3v左右,电压过大将会彻底损坏。 点阵的驱动方法和数码管一样,通过动态扫描来显示。驱动电路可以照搬数码管,也可以直接接在单片机的IO口上,不过显示亮度将会受到影响。
按键: 略。。
参考程序: 游戏的逻辑结构大体都差不多,主要考验大家和硬件结合的能力。
编程的过程中大家不可避免的会遇见很多困难,希望大家多多坚持,越过这道坎后相信大家的能力也会提升不少。最后祝大家编程愉快!
部分源码预览(完整版本请下载附件):
- /*************8*8点阵 贪吃蛇 ***************.****/
- /*****定义的坐标原点在左下角(0,0),右上角为(7,7)*********////
- #include <reg52.h>
- #include <stdlib.h>
- #define uchar unsigned char
- #define uint unsigned int
- sbit we = P2^1;
- sbit du = P2^0;
- sbit CS88 = P2^2;//点阵使能
- sbit up = P3^4; //上。下。左。右
- sbit down = P3^5;
- sbit right = P3^7;
- sbit left = P3^6;
- sbit k3 = P3^2; //外部中断0,k3用做暂停;
- char y_table[] = {0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80};
- char x_table[] = {0x7f,0xbf,0xdf,0xef,0xf7,0xfb,0xfd,0xfe};
- char x[21];
- char y[21]; //存放蛇身 + 食物 行、列坐标
- int addx,addy; //相对位移偏移
- uchar n; //蛇长
- void delay(uint i) //毫秒
- {
- uint j;
- for(;i>0;i--)
- for(j=110;j>0;j--);
- }
- /**************************************************************
- 判断是否碰撞,是则返回1,否则返回0
- **************************************************************/
- int knock()
- { int k=0,i;
- if(x[1]>7||y[1]>7)k=1; //撞墙
- for(i=2;i<n;i++)
- if((x[1]==x[i])&(y[1]==y[i]))k=1; //撞自己
- return k;
- }
- /**************************************************************
- 显示
- **************************************************************/
- void display(uchar n,uchar speed) //利用speed控制速度,speed越小,速度越快
- {
- int j;
- while(speed--)
- {
- for(j=0;j<n;j++)
- {
- du=1; //消去鬼影
- P0=0x00;
- du=0;
- P0=0xff;
- CS88=1;
- P0=0xff;
- CS88=0;
- P0=0x00;
- du=1;
- P0=y_table[y[j]];
- du=0;
- P0=0xff;
- CS88=1;
- P0=x_table[x[j]];
- CS88=0;
- P0=0x00;
- delay(1); //延时1毫秒
- }
- }
- }
- void pause_she() interrupt 0 //暂停,独立按键k3
- {
- int speed=100,j;
- while(speed--)
- { for(j=0;j<n;j++)
- {
- du=1; //消去鬼影
- P0=0x00;
- du=0;
- P0=0xff;
- CS88=1;
- P0=0xff;
- CS88=0;
- P0=0x00;
- du=1;
- P0=y_table[y[j]];
- du=0;
- P0=0xff;
- CS88=1;
- P0=x_table[x[j]];
- CS88=0;
- P0=0x00;
- delay(1); //延时1毫秒
- }
- }
-
- }
- void T0_time() interrupt 1 //每50ms扫描一次按键
- {
- ET0=0; //先关闭定时器0中断
- TR0=0; //关闭定时器0
- TH0=(65536-50000)/256;
- TL0=(65536-50000)%256; //重装初值 ,扫描结束后再打开定时器0
- if(!left)
- {
- addy=0;
- addx=-1;
- }
- if(!right)
- {
- addy=0;
- addx=1;
- }
- if(!up)
- {
- addx=0;
- addy=1;
- }
- if(!down)
- {
- addx=0;
- addy=-1;
- }
- ET0=1; //打开定时器0中断
- TR0=1; //启动定时器0
- }
- void main()
- {
- TMOD=0x01; //设置定时器0的工作方式1
- TH0=(65536-50000)/256;
- TL0=(65536-50000)%256; // 每50ms就申请中断一次
- EA=1;
- EX0=1; //开外部中断0
- ET0=1; //打开定时器0中断
- TR0=1; //启动定时器0
- while (1) //主循环
- {
-
- int speed=80;
- int i,again;
- du=0; //关点阵的行,即y
- we=0; //关数码管
- CS88=0; //关点阵的列,即x
-
- /*****初始化*****/
- n=4; //蛇长为n-1,开始的时候蛇长为2
- x[1]=3;
- y[1]=6; //x[1],y[1],固定放置蛇头
-
- x[2]=4;
- y[2]=6;
-
- x[3]=5;
- y[3]=6; //放置蛇尾
-
- x[0]=2;
- y[0]=2; //放置果实
-
- addx=0;addy=0;
- while(1)
- {
- display(n,speed); //显示
- if(knock())
- {
- speed=80;
- break;
- } //判断碰撞
- if((x[0]==x[1]+addx)&(y[0]==y[1]+addy)) //是否吃东西
- {
- n++;
- if(n==21)
- {
- speed=80;
- break;
- }
- do
- { x[0]=rand()%8;y[0]=rand()%8;//产生随机果实
- again=0;
- for(i=1;i<n;i++) //判断是否与蛇身重叠
- { if((x[0]==x[i])&(y[0]==y[i]))
- again=1; }
- }while(again); //若重叠则再次产生
- }
- for(i=n-1;i>1;i--)
- {
- x[i]=x[i-1];
- y[i]=y[i-1];
- }
- x[1]=x[2]+addx;y[1]=y[2]+addy; //移动
- }
- }
- }
复制代码
|