STC大作业——打地鼠游戏
选题名称
打地鼠游戏
学习板型号
STC15F2K60S2
设计原理思路
- 通过动态扫描和人的视觉残留实现显示功能,P0(8位)和P2.3需要设置成推挽输出,以驱动电路正常发光。
- 通过中断控制获得种子,以获得随机数控制地鼠的出现。
- 通过P2.3控制LED和数码管的切换输出以实现计时显示。
- 对于三种不同情况的地鼠显示,判定按键按下时显示的情况,对分数进行不同的加减操作,并控制显示于数码管。
- 在主循环中嵌套游戏循环以控制多次游戏
实现功能
初始显示分数,按下Key1后开始游戏。在后三位数码管上显示“_”,每一段时间随机选取一位变化为“口”(表示需要打的坏地鼠),或者变化为“二”(表示不可以打的好地鼠),或者不变化(表示地鼠未出现),通过三位按键对应打相应位置的地鼠,LED灯从右至左每一段时间点亮一位以计时,左边三位数码管显示分数,打坏地鼠加3分,打好地鼠扣2分,没有打中扣1分。
实现中的难点
- 数码管稳定显示
- 随机产生地鼠
- 地鼠出现频率
- 按键判定次数不随按下时间增加
- LED计时
- 游戏结束后保留得分
解决方法
数码管稳定显示
一开始代码的实际显示很奇怪,右边数码管的第一位有淡淡的0显示,我猜测是因为没有设置延时,导致后面的数码管显示时段选信号没有来得及完全变化
于是我在每个显示后面加上延时,显示效果正常
随机产生地鼠
我采用C的头文件stdlib.h
中的rand
函数随机生成一个数字,然后通过rand()%9
控制地鼠的情况。
我这里采用
rand()%9
而不是rand()%3
,后者的话就是通过一次取随机数而获得地鼠的种类,那么获取地鼠的出现位置还需要进行一次取随机数,这样性能较差,而我使用rand()%9
可以同时取得随机的位置和地鼠种类。即(rand()%9)/3
为位置,在[0,1,2]中随机,而(rand()%9)%3
为种类,在[0,1,2]中随机。当然两者交换效果相同。
但由于每次复位后机器都是相同的,导致rand
所求得随机数也是相同的,即“伪随机”。如果要真正实现随机数,一种方法就是通过中断程序,在中断程序中设置一个计数,在取随机数时就采用这个数作为种子。因为人与机器是毫无相关的,这样所取得的种子也就具有一定随机性。
在初始化中增加以下语句
然后设置中断函数
在每次获得随机数前获得种子
最后下载测试能够实现每次都不相同的随机出现了
地鼠出现频率
我采用一个全局计数变量count
,在main函数的主循环中每循环一次count
加一,当count
加到50时控制地鼠随机出现,同时将count
清零,但是实际效果地鼠出现得非常错乱且频繁。
这作为STC学习板上的游戏似乎难度有点高,而且缺少了一点美观,与我预想也有点差距
究其原因,发现是我光让地鼠出现了,忘记让地鼠钻回地洞,导致出现地鼠长时间停留和被新地鼠顶替的情况
于是我加入了地鼠逃走的操作,即将地鼠数组复位为0,于是地鼠出现逻辑更新如下:
- 计数为0
- 计数随主循环累加到50时控制地鼠随机出现
- 计数随主循环累加到100时控制地鼠逃走,同时更新count为0,回到第一步
下载测试和我预想效果相类似,但是跳动频率似乎快了些,在我反复调节测试后感觉80时出现,150时逃走最适合。
按键判定次数不随按下时间增加
在按键未按下时给一个判定变量isK1
置1,然后在按下时,若isK1
为1,进行按下的操作,同时将isK1
置0。这样在后面的按下判定时,虽然sbtKey
仍为低电平,但是isK1
为0,不进行操作,直到按键不再按下isK1
重新置1。
LED计时
定义一个全局变量timer
,每次地鼠逃跑时加一,当有40只地鼠逃跑时结束游戏。为什么是35呢?因为我还要采用数码管显示计时,类似案例“看谁手速快”,从初始led为0x01到0x80一共有7种变化状态,每5只变化一次,最后一个LED灯亮时再计数5只地鼠,因此一共40只。
通过sbtLedSel
来控制数码管和LED灯的切换,0为数码管,1为LED,所以我设置显示如下
当需要显示数码管时sbtLedSel
为0,需要显示LED时显示sbtLedSel
为1
游戏结束后保留得分
我将之前的程序包装到另一个while循环中,放于main函数的主循环内,在循环前通过判断是否按下key1来启动游戏,同时在未启动游戏前设置显示为上一局的得分,初始为000
最后提供hex文件,有兴趣的可以放到STC学习板中玩玩
/**********************
打地鼠
型号:STC15F2K60S2 主频:11.0592MHz
************************/
#include <STC15F2K60S2.H>
#include <intrins.h>
#include <stdlib.h>
#define uint unsigned int
#define uchar unsigned char/*---------引脚别名定义---------*/
sbit sbtLedSel = P2 ^ 3; /*数码管发光二极管选择位*/
sbit key1 = P3 ^ 2;
sbit key2 = P3 ^ 3;
sbit key3 = P1 ^ 7;/*---------变量定义---------*/
uint dig; /*位选标志*/
//-, 二, 口
uchar arrSusState[] = {0x08, 0x48, 0x5c, 0x00};
//0123456789
uchar arrScoreSelect[] = {0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};
//surprise
uchar arrSurpriseSelect[] = {0x38, 0x77, 0x73};
//选择哪一位数码管
uchar arrDigSelect[] = {0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07};
//LED
uchar led;
//计分
uint score;
//随机地鼠
uint susliks;
uint arrSusliks[] = {0, 0, 0};
//控制随机产生数秒
uint count;
//计时器
uint timer;
//按键辅助判断, 按下只判定一次
uint isK1, isK2, isK3;
//随机数辅助计数
uint seed;/*---------初始化函数--------*/
void Init()
{P0M1 = 0x00;//推挽输出P0M0 = 0xff;P2M1 = 0x00;P2M0 = 0xff;TMOD = 0x02;//定时器0为工作方式2TH0 = 7;//高4位装初值TL0 = 7;//低4位装初值EA = 1;//打开总中断ET0 = 1;//打开定时器0中断TR0 = 1;//启动定时0EX0 = 1;//打开外部中断0IT0 = 1;//下降沿触发score = 0;//计分为0susliks = 0;//初始地鼠状态count = 0;//控制地鼠出现与否的计数器dig = 0;//位选信号初始为0timer = 0;//LED控制计时led = 0x01;//LED灯最右边开始亮起//初始化按键辅助判断isK1 = 0;isK2 = 0;isK3 = 0;//初始化种子seed = 0;
}
/*---------计算函数---------*/
uint myPow(uint x, uint n){uint result = 1;while(n>0){result*=x;n--;}return result;
}/*---------延时函数--------*/
void Delay(int n)
{while(n--);
}/*---------击打函数---------*/
void Hit(int pos){switch(arrSusliks[pos]){case 0:{if(score > 0){score --;}else{score = 0;}break;}case 1:{if(score > 1){score -= 2;}else{score = 0;}count = 50;break;}case 2:{score += 3;count = 50;break;}default:{break;}}
}/*---------地鼠逃走函数--------*/
void SusliksEscape(){arrSusliks[0] = 0;arrSusliks[1] = 0;arrSusliks[2] = 0;
}/*---------中断函数---------*/
void getSeed() interrupt 1{seed++;if(seed == 0xffffff) seed = 0;
}/*---------主函数--------*/
void main()
{Init();while( 1 ){ while( 1 ){//显示上一局的得分sbtLedSel = 0;for(dig = 0x00; dig < 0x03; dig ++){P0 = 0x00;P2 = arrDigSelect[dig]; //显示位P0 = arrScoreSelect[score%myPow(10,3-dig)/myPow(10,2-dig)]; //显示数字Delay(2000);}if(score > 50){for(dig = 0x05; dig < 0x08; dig ++){P0 = 0x00;P2 = arrDigSelect[dig]; //显示位P0 = arrSurpriseSelect[dig-0x05]; Delay(2000);}}if(key1 == 0) break;//开始游戏}led = 0x01;//LED灯最右边开始亮起score = 0;//计分为0susliks = 0;//初始地鼠状态count = 0;//控制地鼠出现与否的计数器timer = 0;//LED控制计时//初始化按键辅助判断isK1 = 0;isK2 = 0;isK3 = 0;while( 1 ){sbtLedSel = 0;for(dig = 0x00; dig < 0x03; dig ++){P0 = 0x00;P2 = arrDigSelect[dig]; //显示位P0 = arrScoreSelect[score%myPow(10,3-dig)/myPow(10,2-dig)]; //显示数字Delay(2000);}for(dig = 0x05; dig < 0x08; dig++){P0 = 0x00;P2 = arrDigSelect[dig]; //显示位P0 = arrSusState[arrSusliks[dig-5]]; //显示地鼠情况Delay(2000);}//计时LEDsbtLedSel = 1;P0 = led;led = led|0x01<<(timer/5);Delay(2000);count++;//地鼠出现if(count == 25){srand(seed);susliks = rand()%9;arrSusliks[susliks/3] = susliks%3;}//击打地鼠if(key1 == 0){if(isK1 == 1){Hit(2);isK1 = 0;}}else isK1 = 1;if(key2 == 0){if(isK2 == 1){Hit(1);isK2 = 0;}}else isK2 = 1;if(key3 == 0){if(isK3 == 1){Hit(0);isK3 = 0;}}else isK3 = 1;//地鼠逃走if(count == 50) {SusliksEscape();count = 0;timer++;//计时加一}Delay(2000);//结束一轮游戏if(timer > 39) break;}}
}
STC大作业——打地鼠游戏相关推荐
- HTML5期末大作业:游戏网页网站设计——CCG-游戏网页介绍(6页)高质量 HTML+CSS+JavaScript
HTML5期末大作业:游戏网页网站设计--CCG-游戏网页介绍(6页)高质量 HTML+CSS+JavaScript 常见网页设计作业题材有 个人. 美食. 公司. 学校. 旅游. 电商. 宠物. 电 ...
- HTML5期末大作业:游戏网站——网络游戏官网(悦世界) 6个页面 HTML+CSS+JavaScript ~ ~ 学生HTML个人网页作业作品下载...
HTML5期末大作业:游戏网站--网络游戏官网(悦世界) 6个页面 HTML+CSS+JavaScript ~ ~ 学生HTML个人网页作业作品下载 临近期末, 你还在为HTML网页设计结课作业,老师 ...
- HTML5期末大作业:游戏网页设计——穿越火线6页(代码质量好) 学生DW网页设计作业源码 web课程设计网页规划与设计
HTML5期末大作业:游戏网页设计--穿越火线6页(代码质量好) 学生DW网页设计作业源码 web课程设计网页规划与设计 HTML+CSS+JavaScript(毕业设计) 常见网页设计作业题材有 个 ...
- HTML5期末大作业:游戏网站网站设计——仙灵游戏网站首页(1页) HTML+CSS+JavaScript 学生DW网页设计作业成品
HTML5期末大作业:游戏网站网站设计--仙灵游戏网站首页(1页) HTML+CSS+JavaScript 学生DW网页设计作业成品 常见网页设计作业题材有 个人. 美食. 公司. 学校. 旅游. 电 ...
- HTML5期末大作业:游戏网页设计——游戏大全6页(代码质量好) 学生DW网页设计作业源码 web课程设计网页规划与设计
HTML5期末大作业:游戏网页设计--游戏大全6页(代码质量好) 学生DW网页设计作业源码 web课程设计网页规划与设计 HTML+CSS+JavaScript(毕业设计) 常见网页设计作业题材有 个 ...
- HTML5期末大作业:游戏网站设计——腾讯游戏(页)学生HTML个人网页作业作品下载 个人网页设计制作 大学生个人网站作业模板 简单个人网页制作
HTML5期末大作业:游戏网站设计--腾讯游戏(页)学生HTML个人网页作业作品下载 个人网页设计制作 大学生个人网站作业模板 简单个人网页制作 常见网页设计作业题材有 个人. 美食. 公司. 学校. ...
- HTML5期末大作业:游戏网站——网络游戏官网(悦世界) 6个页面 HTML+CSS+JavaScript ~ ~ 学生HTML个人网页作业作品下载
HTML5期末大作业:游戏网站--网络游戏官网(悦世界) 6个页面 HTML+CSS+JavaScript ~ ~ 学生HTML个人网页作业作品下载 临近期末, 你还在为HTML网页设计结课作业,老师 ...
- HTML5期末大作业:游戏网页设计——英雄联盟6页(代码质量好) 学生DW网页设计作业源码 web课程设计网页规划与设计
HTML5期末大作业:游戏网页设计--英雄联盟6页(代码质量好) 学生DW网页设计作业源码 web课程设计网页规划与设计 HTML+CSS+JavaScript(毕业设计) 常见网页设计作业题材有 个 ...
- HTML5期末大作业:游戏网页网站设计——卡通的萌王游戏网页(13页) HTML+CSS+JavaScript
HTML5期末大作业:游戏网页网站设计--卡通的萌王游戏网页(13页) HTML+CSS+JavaScript 常见网页设计作业题材有 个人. 美食. 公司. 学校. 旅游. 电商. 宠物. 电器. ...
最新文章
- 隆重介绍!一款新型基于姿势的人像实例分割框架
- 空间数据引擎oracle_GIS 与Oracle 数据库空间数据格式的转换
- 开关电源磁性元件理论及设计pdf_邵革良首席科学家丨高性价比PFC电源设计及其电感技术...
- Simple Web Server
- 浙大慕课c语言答案,程序设计入门——C语言
- 分析技术在PMP中的应用
- jQuery基础教程摘录- Hello world
- CSUST-2018区域赛选拔个人赛-1019 看直播(二分+DP)
- 如何看到并删除电脑的操作记录
- python爬虫爬取豆瓣电影为啥内容有缺失-Python爬虫之抓取豆瓣影评数据
- 什么是商业数据分析师?
- 自动生成Makefile的全过程详解2
- JAVA书签方式导出Word
- 关闭惠普计算机通电启动注册表,惠普电脑自动重启的解决方法
- Linux下查看icc安装目录,[转载][Linux] icc与ifort编译器
- 非常实用的织梦dede所有标签调用方法大全 .
- let 92. Reverse Linked List II
- Python配置处理ini文件-configparser
- 大唐杯知识点汇总大全(一)
- Java命令行形式将程序打包成jar包
热门文章
- 用友t3服务器怎么修改,用友t3修改服务器地址
- Openstack私有云简介之Nova
- 2.树莓派3安装archlinux配置web、samba和aria2
- <Javascript技巧: Javascript 是个难泡的妞,学点技巧征服 “ 她 ” >
- MPU6050的使用
- 三种快速排序以及快速排序的优化
- 近期工作中Oracle常用的sql
- Could not set property ‘id‘ of ‘‘ with value Cause: IllegalArgumentException: argument type mismatch
- 微信小程序之wxs页面使用正则表达式
- 高焕堂《嵌入式UML设计》读书笔记_第三章