绘制51单片机实现打砖块游戏的程序流程代码
时间: 2023-08-24 13:18:18 浏览: 149
游戏,经典打石块单机版,C#实现完整源代码,界面大气美观,可以选择弹珠速度,有背景音乐,方向键控制砖块左右移动,结束会计算得分
以下是基于51单片机实现打砖块游戏的程序流程代码,代码中使用了Keil C编译器和SDCC编译器,具体实现细节可能会有所不同:
```c
#include <reg52.h>
#include <lcd.h>
#include <key.h>
#include <sound.h>
// 定义挡板和球的初始位置
#define PADDLE_X 60
#define PADDLE_Y 55
#define BALL_X 64
#define BALL_Y 45
// 定义挡板和球的大小
#define PADDLE_WIDTH 40
#define PADDLE_HEIGHT 5
#define BALL_RADIUS 3
// 定义砖块的行数和列数
#define ROWS 3
#define COLS 8
// 定义砖块的大小和间隔
#define BRICK_WIDTH 16
#define BRICK_HEIGHT 8
#define BRICK_GAP_X 2
#define BRICK_GAP_Y 2
// 定义游戏状态
#define STATE_INIT 0
#define STATE_PLAYING 1
#define STATE_GAME_OVER 2
// 定义按键状态
#define KEY_NONE 0
#define KEY_LEFT 1
#define KEY_RIGHT 2
// 定义挡板和球的移动速度
#define PADDLE_SPEED 3
#define BALL_SPEED 2
// 存放砖块的状态
unsigned char bricks[ROWS][COLS];
// 存放游戏状态
unsigned char state;
// 存放按键状态
unsigned char key_state;
// 存放挡板和球的位置
unsigned char paddle_x, paddle_y, ball_x, ball_y;
// 存放挡板和球的速度
char ball_vx, ball_vy;
// 存放得分和剩余生命数
unsigned char score, lives;
// 初始化游戏
void init_game() {
unsigned char i, j;
// 初始化挡板和球的位置
paddle_x = PADDLE_X;
paddle_y = PADDLE_Y;
ball_x = BALL_X;
ball_y = BALL_Y;
// 初始化挡板和球的速度
ball_vx = BALL_SPEED;
ball_vy = BALL_SPEED;
// 初始化得分和剩余生命数
score = 0;
lives = 3;
// 初始化砖块的状态
for (i = 0; i < ROWS; i++) {
for (j = 0; j < COLS; j++) {
bricks[i][j] = 1;
}
}
// 设置游戏状态为初始化完成
state = STATE_INIT;
}
// 绘制游戏界面
void draw_game() {
unsigned char i, j;
// 清屏
lcd_clear();
// 绘制挡板
lcd_fill_rect(paddle_x, paddle_y, PADDLE_WIDTH, PADDLE_HEIGHT, 1);
// 绘制球
lcd_fill_circle(ball_x, ball_y, BALL_RADIUS, 1);
// 绘制砖块
for (i = 0; i < ROWS; i++) {
for (j = 0; j < COLS; j++) {
if (bricks[i][j]) {
lcd_fill_rect(j * (BRICK_WIDTH + BRICK_GAP_X), i * (BRICK_HEIGHT + BRICK_GAP_Y), BRICK_WIDTH, BRICK_HEIGHT, 1);
}
}
}
// 绘制得分和剩余生命数
lcd_gotoxy(0, 0);
lcd_printf("SCORE:%d LIVES:%d", score, lives);
}
// 检测按键输入
void check_key() {
unsigned char key = get_key();
if (key == KEY_LEFT) {
key_state = KEY_LEFT;
} else if (key == KEY_RIGHT) {
key_state = KEY_RIGHT;
} else {
key_state = KEY_NONE;
}
}
// 移动挡板
void move_paddle() {
if (key_state == KEY_LEFT && paddle_x > 0) {
paddle_x -= PADDLE_SPEED;
} else if (key_state == KEY_RIGHT && paddle_x + PADDLE_WIDTH < LCD_WIDTH) {
paddle_x += PADDLE_SPEED;
}
}
// 移动球
void move_ball() {
// 移动球的位置
ball_x += ball_vx;
ball_y += ball_vy;
// 检测球是否碰到了左右墙壁
if (ball_x - BALL_RADIUS < 0 || ball_x + BALL_RADIUS > LCD_WIDTH) {
ball_vx = -ball_vx;
play_sound();
}
// 检测球是否碰到了上墙壁
if (ball_y - BALL_RADIUS < 0) {
ball_vy = -ball_vy;
play_sound();
}
// 检测球是否碰到了挡板
if (ball_y + BALL_RADIUS >= paddle_y && ball_x >= paddle_x && ball_x <= paddle_x + PADDLE_WIDTH) {
ball_vy = -ball_vy;
play_sound();
}
// 检测球是否碰到了砖块
unsigned char i, j;
for (i = 0; i < ROWS; i++) {
for (j = 0; j < COLS; j++) {
if (bricks[i][j] && ball_x >= j * (BRICK_WIDTH + BRICK_GAP_X) && ball_x <= j * (BRICK_WIDTH + BRICK_GAP_X) + BRICK_WIDTH && ball_y >= i * (BRICK_HEIGHT + BRICK_GAP_Y) && ball_y <= i * (BRICK_HEIGHT + BRICK_GAP_Y) + BRICK_HEIGHT) {
bricks[i][j] = 0;
ball_vy = -ball_vy;
score++;
play_sound();
}
}
}
// 检测球是否碰到了底部墙壁
if (ball_y + BALL_RADIUS >= LCD_HEIGHT) {
lives--;
if (lives == 0) {
state = STATE_GAME_OVER;
} else {
ball_x = BALL_X;
ball_y = BALL_Y;
}
}
}
// 检测游戏状态
void check_state() {
if (state == STATE_INIT) {
state = STATE_PLAYING;
} else if (state == STATE_PLAYING) {
move_paddle();
move_ball();
draw_game();
} else if (state == STATE_GAME_OVER) {
lcd_clear();
lcd_gotoxy(0, 0);
lcd_printf("GAME OVER SCORE:%d", score);
while (1);
}
}
// 主函数
void main() {
// 初始化游戏
init_game();
// 初始化LCD、按键和蜂鸣器
lcd_init();
key_init();
sound_init();
// 不断循环,检测游戏状态
while (1) {
check_key();
check_state();
}
}
```
以上代码仅供参考,具体实现还需要结合具体硬件和软件平台进行调整和优化。
阅读全文