选题名称

打地鼠游戏

学习板型号

STC15F2K60S2

设计原理思路

  • 通过动态扫描和人的视觉残留实现显示功能,P0(8位)和P2.3需要设置成推挽输出,以驱动电路正常发光。
  • 通过中断控制获得种子,以获得随机数控制地鼠的出现。
  • 通过P2.3控制LED和数码管的切换输出以实现计时显示。
  • 对于三种不同情况的地鼠显示,判定按键按下时显示的情况,对分数进行不同的加减操作,并控制显示于数码管。
  • 在主循环中嵌套游戏循环以控制多次游戏

实现功能

初始显示分数,按下Key1后开始游戏。在后三位数码管上显示“_”,每一段时间随机选取一位变化为“口”(表示需要打的坏地鼠),或者变化为“二”(表示不可以打的好地鼠),或者不变化(表示地鼠未出现),通过三位按键对应打相应位置的地鼠,LED灯从右至左每一段时间点亮一位以计时,左边三位数码管显示分数,打坏地鼠加3分,打好地鼠扣2分,没有打中扣1分。

实现中的难点

  1. 数码管稳定显示
  2. 随机产生地鼠
  3. 地鼠出现频率
  4. 按键判定次数不随按下时间增加
  5. LED计时
  6. 游戏结束后保留得分

解决方法

数码管稳定显示

一开始代码的实际显示很奇怪,右边数码管的第一位有淡淡的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,于是地鼠出现逻辑更新如下:

  1. 计数为0
  2. 计数随主循环累加到50时控制地鼠随机出现
  3. 计数随主循环累加到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大作业——打地鼠游戏相关推荐

  1. HTML5期末大作业:游戏网页网站设计——CCG-游戏网页介绍(6页)高质量 HTML+CSS+JavaScript

    HTML5期末大作业:游戏网页网站设计--CCG-游戏网页介绍(6页)高质量 HTML+CSS+JavaScript 常见网页设计作业题材有 个人. 美食. 公司. 学校. 旅游. 电商. 宠物. 电 ...

  2. HTML5期末大作业:游戏网站——网络游戏官网(悦世界) 6个页面 HTML+CSS+JavaScript ~ ~ 学生HTML个人网页作业作品下载...

    HTML5期末大作业:游戏网站--网络游戏官网(悦世界) 6个页面 HTML+CSS+JavaScript ~ ~ 学生HTML个人网页作业作品下载 临近期末, 你还在为HTML网页设计结课作业,老师 ...

  3. HTML5期末大作业:游戏网页设计——穿越火线6页(代码质量好) 学生DW网页设计作业源码 web课程设计网页规划与设计

    HTML5期末大作业:游戏网页设计--穿越火线6页(代码质量好) 学生DW网页设计作业源码 web课程设计网页规划与设计 HTML+CSS+JavaScript(毕业设计) 常见网页设计作业题材有 个 ...

  4. HTML5期末大作业:游戏网站网站设计——仙灵游戏网站首页(1页) HTML+CSS+JavaScript 学生DW网页设计作业成品

    HTML5期末大作业:游戏网站网站设计--仙灵游戏网站首页(1页) HTML+CSS+JavaScript 学生DW网页设计作业成品 常见网页设计作业题材有 个人. 美食. 公司. 学校. 旅游. 电 ...

  5. HTML5期末大作业:游戏网页设计——游戏大全6页(代码质量好) 学生DW网页设计作业源码 web课程设计网页规划与设计

    HTML5期末大作业:游戏网页设计--游戏大全6页(代码质量好) 学生DW网页设计作业源码 web课程设计网页规划与设计 HTML+CSS+JavaScript(毕业设计) 常见网页设计作业题材有 个 ...

  6. HTML5期末大作业:游戏网站设计——腾讯游戏(页)学生HTML个人网页作业作品下载 个人网页设计制作 大学生个人网站作业模板 简单个人网页制作

    HTML5期末大作业:游戏网站设计--腾讯游戏(页)学生HTML个人网页作业作品下载 个人网页设计制作 大学生个人网站作业模板 简单个人网页制作 常见网页设计作业题材有 个人. 美食. 公司. 学校. ...

  7. HTML5期末大作业:游戏网站——网络游戏官网(悦世界) 6个页面 HTML+CSS+JavaScript ~ ~ 学生HTML个人网页作业作品下载

    HTML5期末大作业:游戏网站--网络游戏官网(悦世界) 6个页面 HTML+CSS+JavaScript ~ ~ 学生HTML个人网页作业作品下载 临近期末, 你还在为HTML网页设计结课作业,老师 ...

  8. HTML5期末大作业:游戏网页设计——英雄联盟6页(代码质量好) 学生DW网页设计作业源码 web课程设计网页规划与设计

    HTML5期末大作业:游戏网页设计--英雄联盟6页(代码质量好) 学生DW网页设计作业源码 web课程设计网页规划与设计 HTML+CSS+JavaScript(毕业设计) 常见网页设计作业题材有 个 ...

  9. HTML5期末大作业:游戏网页网站设计——卡通的萌王游戏网页(13页) HTML+CSS+JavaScript

    HTML5期末大作业:游戏网页网站设计--卡通的萌王游戏网页(13页) HTML+CSS+JavaScript 常见网页设计作业题材有 个人. 美食. 公司. 学校. 旅游. 电商. 宠物. 电器. ...

最新文章

  1. 隆重介绍!一款新型基于姿势的人像实例分割框架
  2. 空间数据引擎oracle_GIS 与Oracle 数据库空间数据格式的转换
  3. 开关电源磁性元件理论及设计pdf_邵革良首席科学家丨高性价比PFC电源设计及其电感技术...
  4. Simple Web Server
  5. 浙大慕课c语言答案,程序设计入门——C语言
  6. 分析技术在PMP中的应用
  7. jQuery基础教程摘录- Hello world
  8. CSUST-2018区域赛选拔个人赛-1019 看直播(二分+DP)
  9. 如何看到并删除电脑的操作记录
  10. python爬虫爬取豆瓣电影为啥内容有缺失-Python爬虫之抓取豆瓣影评数据
  11. 什么是商业数据分析师?
  12. 自动生成Makefile的全过程详解2
  13. JAVA书签方式导出Word
  14. 关闭惠普计算机通电启动注册表,惠普电脑自动重启的解决方法
  15. Linux下查看icc安装目录,[转载][Linux] icc与ifort编译器
  16. 非常实用的织梦dede所有标签调用方法大全 .
  17. let 92. Reverse Linked List II
  18. Python配置处理ini文件-configparser
  19. 大唐杯知识点汇总大全(一)
  20. Java命令行形式将程序打包成jar包

热门文章

  1. 用友t3服务器怎么修改,用友t3修改服务器地址
  2. Openstack私有云简介之Nova
  3. 2.树莓派3安装archlinux配置web、samba和aria2
  4. <Javascript技巧: Javascript 是个难泡的妞,学点技巧征服 “ 她 ” >
  5. MPU6050的使用
  6. 三种快速排序以及快速排序的优化
  7. 近期工作中Oracle常用的sql
  8. Could not set property ‘id‘ of ‘‘ with value Cause: IllegalArgumentException: argument type mismatch
  9. 微信小程序之wxs页面使用正则表达式
  10. 高焕堂《嵌入式UML设计》读书笔记_第三章