标题 Arduino中编写打砖块小游戏(完整代码)

程序中有大量的注释,希望真的能帮助到你!
(一)环境
硬件:OLED 屏幕(128*64)、摇杆模块(程序中使用的是摇杆模块的模拟量,如果你身边没有该模块,也可以使用触碰传感器【如果用触碰,需要将返回传感器的模拟值改为数字量即digitalRead(pin);】,或者是简单的小按钮,不过,这就需要更改返回传感器的数值了【改动比较少】)
接线:摇杆接A0,A1。OLED接A4,A5。
软件:Arduino1.8.2(一般需要大于1.6版本就好了)、函数库u8glib.h【链接:https://pan.baidu.com/s/15-PTb7e_7qSqozYCD66duQ
提取码:1b67 】

(二)代码部分
好了,直接上代码:

实验接线:
OLED 屏幕接A4,A5口
摇杆模块接到A0,A1
*******************************************************************************************************/
#include “U8glib.h”//引用U8G头文件
U8GLIB_SSD1306_128X64 u8g(U8G_I2C_OPT_NONE);//设置设备名称:I2C-SSD1306-128
64(OLED)
/
================
自定义摇杆和相关变量
================
/

#define Direction 14 //定义摇杆水平方向上的引脚;(控制下方的木板左右移动)
#define Direction_RMB 15 //定义摇杆垂直方向上的引脚;(向上是用来选择关卡的,向下是复位按键)
#define Data_of_left 300 //定义摇杆水平方向的数值,摇杆向左摆动时,其传感器触发的数值(可更改);
#define Data_of_right 650 //定义摇杆水平方向的数值,摇杆向右摆动时,其传感器触发的数值(可更改);
#define Data_of_up 200 //定义摇杆垂直方向的数值,摇杆向上摆动时,其传感器触发的数值(可更改);
#define Data_of_down 750 //定义摇杆垂直方向的数值,摇杆向下摆动时,其传感器触发的数值(可更改);
int muban = 1; //该变量用来判断砖块是否碰到木板;
int Atmp; //缓存
int Btmp;
byte DF = 1; //难度 1-3(即该游戏总共有三个关卡);
int WX; //木板宽度
byte WL; //木板长度
float BX, BY; //球的坐标
boolean MAP[16][8]; //砖块位置 0为空气 1为砖块
float AX, AY; //小球速度
boolean WIN; //该布尔值主要判断是否胜利;
int Data_of_sensor = 0; //定义一个存储摇杆水平方向数据的变量;
int Data_of_sensor_RMB = 0; //定义一个存储摇杆垂直方向数据的变量;

void setup() {
//串口通讯波特率设置
Serial.begin(9600); //波特率为9600;
pinMode(Direction,INPUT); //设置摇杆为输入模式;
pinMode(Direction_RMB,INPUT); //设置摇杆为输出模式;
start(); //游戏开始;
}

//不停循环
void loop() {
muban = 1;
Data_of_sensor = analogRead(Direction); //读取摇杆水平方向的数据;
Data_of_sensor_RMB = analogRead(Direction_RMB); //读取摇杆垂直方向的数据;
if( Data_of_sensor <= Data_of_left) { WX -= 5; } //如果摇杆向左摆动,OLED 屏幕里的木板向左移动(速度是一次向左移动5个像素);
if( Data_of_sensor >= Data_of_right) { WX += 5; } //如果摇杆向右摆动,OLED 屏幕里的木板向右移动(速度是一次向右移动5个像素);
if( Data_of_sensor_RMB <= Data_of_up) { win(); } //如果摇杆向上摆动时,自动选择下一关;
if( Data_of_sensor_RMB >= Data_of_down) { Reset(); } //如果摇杆向下摆动时,程序复位(即游戏重新开始);
else { delay(1); } //这里的否则也就是不对摇杆进行操作;

//计算
if (WIN == true) win();
if (WX < -(WL / 2)) WX = -(WL / 2); //防止溢出
if (WX > 128 - (WL / 2)) WX = 128 - (WL / 2); //防止溢出
//小球位移
BX += AX;
BY += AY;

//砖块边缘反弹
if (BX > 125) {
BX = 125;
AX = -AX;
}
if (BX < 0) {
BX = 0;
AX = -AX;
}
if (BY >= 61) { //如果砖块没有被木板接住,muban=0,说明失败了;
BY = 61;
muban = 0;
draw();
AY = -AY;
}
if (BY < 0) {
BY = 0;
AY = -AY;
}

//砖块与木板
if (BX >= WX && BX <= WX + WL) {
if (BY >= 56 - 3 && BY <= 57 - 3) {
//接触到木板上下部分
AX = -(((WX + (WL / 2)) - BX) / (WL / 2));
AX *= 1.8;
AY = -AY;
}
}

//砖块与墙
if (int(BX / 8) + 1 <= 16 && int(BY / 4) + 1 <= 8) {
Atmp = BX / 8;
Btmp = BY / 4;
if (MAP[Atmp][Btmp] == 1) {
//碰到砖头
MAP[Atmp][Btmp] = 0;
//反弹代码 分类讨论 分为上下和左右
if (BY - 2 <= Btmp * 4 || BY >= Btmp * 4 + 4) {
//上和下边缘
AY = -AY;
} else
{
AX = -AX;
}
}
}

//显示
u8g.firstPage();
do {
draw();
} while ( u8g.nextPage() );
}

//初始化游戏
void start() {
WL = 32;
for (byte i = 1; i < DF; i++) {
WL = WL / 2; //递进计算木板长度(这里的for语句就是玩家完成一个难度时,跳入下一个难度的部分)
}
WX = 64 - (WL / 2); //计算木板初始所在的中间线横坐标
for (byte x = 0; x < 16; x++) {
for (byte y = 0; y < 8; y++) {
MAP[x][y] = 1; //该for语句主要和后面的void draw()函数呼应,告诉void draw()这个函数相应的位置是存在墙的;
} //也就是告诉后面的void draw()函数,各个位置可以添加墙。
}
BX = 64;
BY = 52; //定义初始的小砖块所在的位置;即在OLED 屏幕的(64,52);
AX = 2; //初始小球加速度
AY = -2;
loop(); //虽然程序会先执行void setup(),再执行void loop();但对于比较冗长的程序,为了保险起见,再次调用loop();
}

//渲染游戏画面
void draw() {
if(muban == 0)
{
fail(); //如果砖块碰到木板,程序进入fail();(即如果砖块下降过程时,最终木板没有接住砖块,则失败;
}

if (muban == 1)
{
no_fail(); //如果砖块最终被木板接住,砖块继续被木板反弹;
}
}

// 失败
void fail()
{
for(int i=0;i<3;i++) //这里的for语句在OLED 屏幕上显示的效果为:先显示“Game Over”,延时500毫秒后,接着“Game Over”不显示(即
{ //先前显示的“Game Over”消失,延时500毫秒,将这一套动作看做为一个动作,则,这个动作执行3次;
u8g.firstPage(); //开始加载OLED 屏幕的界面
do {
no_fail();
u8g.setFont(u8g_font_courB12); //接下来要显示的字体的字号为u8g_font_courB12号;
u8g.setColorIndex(0); //不显示,透明
u8g.drawBox(20, 12, 88, 40); //画一个空心矩形,该矩形从(20,12)这个点开始(也就是矩形左上角的坐标),矩形的宽为88个像素,高为40个像素。
//由于该句之前显示的样式为透明&&不显示,所以这里的矩形是透明的(在OLED 屏幕上这个矩形区域是黑的);
u8g.setColorIndex(1); //显示,不透明;
u8g.setPrintPos(20, 30); //设置该句之后的print();要显示内容的位置;
u8g.print(“Game Over”); //在(20,30)这个位置显示 Game Over;
} while ( u8g.nextPage() ); //关闭OLED 屏幕界面
delay(500);

u8g.firstPage();
do {
no_fail();
u8g.setFont(u8g_font_courB12); //接下来要显示的字体的字号为u8g_font_courB12号;
u8g.setColorIndex(0); //不显示,透明
u8g.drawBox(20, 12, 88, 40); //画一个空心矩形,该矩形从(3,12)这个点开始(也就是矩形左上角的坐标),矩形的宽为88个像素,高为40个像素。
//由于该句之前显示的样式为透明&&不显示,所以这里的矩形是透明的(在OLED 屏幕上这个矩形区域是黑的);
u8g.setColorIndex(1); //显示,不透明;
u8g.setPrintPos(20, 30); //设置该句之后的print();要显示内容的位置;
u8g.print(""); //在(30,30)这个位置什么都不显示;
} while ( u8g.nextPage() );
delay(500);

}
start();
}

void no_fail()
{
WIN = true;
u8g.drawBox(WX, 56, WL, 3); //显示底下木板
u8g.drawBox(int(BX), int(BY), 3, 3); //显示砖块(砖块的初始位置在OLED 屏幕的(64,52),且砖块的宽为3,高为3;
for (byte x = 0; x < 16; x++) {
for (byte y = 0; y < 8; y++) {
if (MAP[x][y] == 1) {
WIN = false;
//存在墙
u8g.drawBox(x * 8, y * 4, 7, 3); //按照下面说明的“砖块的实心矩形的样式”来一个一个显示墙
}
}
}
}

// 通关
void win() {
u8g.firstPage();
do {
draw();
u8g.setFont(u8g_font_courB12); //接下来要显示的字体的字号为u8g_font_courB12号;
u8g.setColorIndex(0); //不显示,透明
u8g.drawBox(20, 12, 88, 40); //画一个空心矩形,该矩形从(3,12)这个点开始(也就是矩形左上角的坐标),矩形的宽为88个像素,高为40个像素。
//由于该句之前显示的样式为透明&&不显示,所以这里的矩形是透明的(在OLED 屏幕上这个矩形区域是黑的);
u8g.setColorIndex(1); //显示,不透明;
u8g.setPrintPos(30, 30); //设置该句之后的print();要显示内容的位置;
u8g.print(“You Win”); //在(30,30)这个位置显示 You Win;
} while ( u8g.nextPage() );
delay (2000);
if (DF < 3) { //该for语句就是当玩家通过一个简单的模式时,
DF++; //会自动进入下一个难度(即木板会变短),
} else { //该游戏主要有三个难度等级,如果三个难度
DF = 1; //等级都通过后,游戏会重新开始;
}
start(); //完成一个难度等级后,游戏自动开始,进入下一个等级;
}

//复位
void Reset() { //游戏复位键;
u8g.firstPage();
do {
u8g.setFont(u8g_font_courB12); //接下来要显示的字体的字号为u8g_font_courB12号;
u8g.setColorIndex(1); //显示,不透明;
u8g.setPrintPos(40, 30); //设置该句之后的print();要显示内容的位置;
u8g.print(“Reset”); //在(40,30)这个位置显示 You Win;
} while ( u8g.nextPage() );
delay (1500);
start(); //游戏重新开始;
}

Arduino中编写打砖块小游戏(完整代码)相关推荐

  1. java代码实现打气球游戏_javascript+css3开发打气球小游戏完整代码

    效果知识点: css3画气球, 自定义属性运用,随机阵列, DOM元素操作,高级回调函数与参数复传,动态布局,鼠标事件,定时器运用,CSS3新增样式等. css代码如下: {margin:0;padd ...

  2. C++ 简化 推箱子 小游戏 完整代码 参考网络资料 命令行运行 仅供初学者参考交流

    C++ 简化 推箱子 小游戏 完整代码 参考网络资料 命令行运行 仅供初学者参考交流 说明:学做了4关推箱子, 仅供初学者参考可用g++ 编译,可以将内容复制到TXT文件,将后缀改为".cp ...

  3. 【Java】Java基础飞机大战小游戏完整代码

    Java基础飞机大战小游戏完整代码 先来展示一下代码实现结果图 主函数ShootGame 初始化游戏原始背景图片,游戏人物图片,游戏开始结束图片:构建产生敌人算法:产生英雄机算法:发射子弹算法:判断是 ...

  4. Friends小游戏完整代码

    Friends小游戏完整代码 Mover[] movers = new Mover[10]; Attractor a; int num = 50; int maxnum = 10001; int r ...

  5. 打砖块小游戏php程序,利用原生js实现html5打砖块小游戏(代码示例)

    本篇文章给大家通过代码示例介绍一下利用原生js实现html5打砖块小游戏的方法.有一定的参考价值,有需要的朋友可以参考一下,希望对大家有所帮助. 前言 PS:本次项目中使用了大量 es6 语法,故对于 ...

  6. python 贴吧盖楼_ es6 + canvas 开源 盖楼小游戏 完整代码注释 从零教你做游戏(一)...

    盖楼游戏 一个基于 Canvas 的盖楼游戏 Demo 预览 手机设备可以扫描下方二维码 github Game Rule 游戏规则 以下为默认游戏规则,也可参照下节自定义游戏参数 每局游戏生命值为3 ...

  7. 抖音很火的召唤神龙的小游戏完整代码-召唤神龙

    抖音很火的解压小游戏,完整代码分享.有兴趣的可以试着写一下. 1.  index <!DOCTYPE html> <html> <head><meta cha ...

  8. python进阶应用:飞机大作战小游戏完整代码实现(初级)

    飞机大作战(初级) 完整代码如下: 注意,需要在对应同一个文件中放入相应的游戏需要用的图片及音效.否则可能报错 # 导入pygame库 import pygame import random# 设置常 ...

  9. Python中编写反恐精英cs小游戏

    1.定义Person类,里面有好人和坏人的属性,以及相关方法. 2.定义Clip,里面有增加子弹和出子弹 3.定义Bullet类,里面有子弹的伤害力 4.定义Gun类,里面有装弹夹,以及枪的射击 5. ...

最新文章

  1. 088_html5表单属性
  2. Redis专题-集群模式
  3. 在Virtualbox中的Ubuntu虚拟机中,安装Guest Additions客户端增强包时出错:分配介质 虚拟光盘 xxx\VBoxsGuestAdditions.iso 到虚拟电脑
  4. Qt (5.10.0)for android
  5. mysql mycat one_Mycat 整合 MySQL 8.x 踩坑实践
  6. Spring学习大杂烩(待续)
  7. 微信小程序继续入坑指南
  8. 包云岗:伯克利科研模式的启发
  9. js进阶 13 jquery动画函数有哪些
  10. Backup Exec 2012下载地址
  11. 小评几种O/R Mapping工具
  12. 拼多多“官宣”iPhone 12:来得刚刚好 下周见!
  13. CheckBox控件和数据库的关联
  14. VMwear安装Centos7超详细过程
  15. 签名相关文件是公司机密,在专机上由专人进行操作
  16. NAT(地址转换技术)详解
  17. 1那智机器人主电连接
  18. 微信开发getPhoneNumber报错“errcode“:41001,“errmsg“:“access_token missing rid
  19. 单身程序员上班路上二三事(一)
  20. 3999 元起,小米 13 正式发布:骁龙 8 Gen 2、IP68、超窄边框直屏、徕卡三摄

热门文章

  1. LeetCode 96之卡特兰数
  2. 第三方库下载教程(三种方法)
  3. poi word转html 根号,2010职称计算机考试模块综合(word、excel、powerpoi
  4. 用keytool创建Keystore和Trustsotre文件
  5. 构架中为什么要域控服务器,AD域控升级和迁移
  6. Android使用笔记--艰难的减肥过程
  7. vb.net中栈、队列、数组、列表、链表的使用。
  8. U盘被写保护如何解除 (转)
  9. 华为交换机路由器防火墙密码忘记恢复方法
  10. 多功能数字钟软件C语言,多功能数字时钟