消砖块

//消砖块
#include <conio.h>
#include <graphics.h>
#include <stdio.h>
#include <stdlib.h>

#define high 480 //游戏画面尺寸
#define width 640
#define brick_num 10 //砖块的个数

//全局变量
int ball_x,ball_y; //小球的坐标
int ball_vx,ball_vy; //小球的速度
int bar_x,bar_y; //挡板的中心坐标
int bar_high,bar_width; //挡板的高度和宽度
int bar_left,bar_right,bar_top,bar_bottom; //挡板的上下左右的坐标
int radius; //小球的半径
int isbrickexist[brick_num]; //每个砖块是否存在,1为存在,0为没有了
int brick_high,brick_width; //每个砖块的高度和宽度

void startup() //数据的初始化
{
    ball_x=width/2;
    ball_y=high/2;
    ball_vx=1;
    ball_vy=1;
    radius=20;
    
    bar_high=high/20;
    bar_width=width/5;
    bar_x=width/2;
    bar_y=high-bar_high/2;
    bar_left=bar_x-bar_width/2;
    bar_right=bar_x+bar_width/2;
    bar_top=bar_y-bar_high/2;
    bar_bottom=bar_y+bar_high/2;
    brick_high=high/brick_num;
    brick_width=width/brick_num;
    int i;
    for(i=0;i<brick_num;i++)
    {
        isbrickexist[i]=1;
    }
    
    initgraph(width,high);
    BeginBatchDraw();
}

void clean() //消除画面
{
    setcolor(BLACK);
    setfillcolor(BLACK);
    fillcircle(ball_x,ball_y,radius); //绘制黑线、黑色填充的圆
    bar(bar_left,bar_top,bar_right,bar_bottom); //绘制黑线、黑色填充的挡板
    
    int i,brick_left,brick_right,brick_top,brick_bottom;
    for(i=0;i<brick_num;i++)
    {
        brick_left=i*brick_width;
        brick_right=brick_left+brick_width;
        brick_top=0;
        brick_bottom=brick_high;
        if(!isbrickexist[i]) //砖块没有了,绘制黑色
            fillrectangle(brick_left,brick_top,brick_right,brick_bottom);
    }
}

void show() //显示画面
{
    setcolor(YELLOW);
    setfillcolor(GREEN);
    fillcircle(ball_x,ball_y,radius); //绘制黄线、绿色填充的圆
    bar(bar_left,bar_top,bar_top,bar_bottom); //绘制黄线、绿色填充的挡板
    int i,brick_left,brick_right,brick_top,brick_bottom;
    for(i=0;i<brick_num;i++)
    {
        brick_left=i*brick_width;
        brick_right=brick_left+brick_width;
        brick_top=0;
        brick_bottom=brick_high;
        if(isbrickexist[i]) //砖块存在,绘制砖块
        {
            setcolor(WHITE);
            setfillcolor(RED);
            fillrectangle(brick_left,brick_top,brick_right,brick_bottom); //绘制砖块
        }
    }
    FlushBatchDraw();
    sleep(3);
}

void updatewithoutinput() //与用户输入无关的更新
{
 
    //挡板和小球碰撞,小球反弹
    if(((ball_y+radius)>=bar_top)&&(ball_y+radius<bar_bottom-bar_high/3))||((ball_y-radius<=bar_bottom)&&(ball_y-radius>bar_top-bar_high/3)))
        if((ball_x>=bar_left)&&(ball_x<=bar_right))
            ball_vy=-ball_vy;
    //更新小球的坐标
    ball_x=ball_x+ball_vx;
    ball_y=ball_y+ball_vy;
    //小球和边界碰撞
    if((ball_x<=radius)||(ball_x>=width-radius))
        ball_vx=-ball_vx;
    if((ball_y<=radius)||(ball_y>=high-radius))
        ball_vy=-ball_vy;
    //判断小球是否和某个砖块碰撞
    int i,brick_left,brick_right,brick_bottom;
    for(i=0;i<brick_num;i++)
    {
        if(isbrickexist[i]) //砖块存在才判断
        {
            brick_left=i*brick_width;
            brick_right=brick_left+brick_width;
            brick_bottom=brick_high;
            if((ball_y==brick_bottom+radius)&&(ball_x>=brick_left)&&(ball_x<=brick_right))
            {
                isbrickexist[i]=0;
                ball_vy=-ball_vy;
            }
        }
    }
}

void updatewithinput() //与用户无关的更新
{
    char input;
    if(kbhit())
    {
        input=getch();
        if(input=='a'&&bar_left>0) //左移
        {
            bar_x=bar_x-15;
            bar_left=bar_x-bar_width/2;
            bar_right=bar_x+bar_width/2;
        }
        if(input=='d'&&bar_right<width) //右移
        {
            bar_x=bar_x+15;
            bar_left=bar_x-bar_width/2;
            bar_right=bar_x+bar_width/2;
        }
        if(input=='w'&&bar_top>0) //上移
        {
            bar_y=bar_y-15;
            bar_top=bar_y-bar_high/2;
            bar_bottom=bar_y+bar_high/2;
        }
        if(input=='s'&&bar_bottom<high) //下移
        {
            bar_y=bar_y+15;
            bar_top=bar_y-bar_high/2;
            bar_bottom=bar_y+bar_high/2;
        }
    }
    
}

void gameover()
{
    EndBatchDraw();
    closegraph();
}

int main()
{
    startup(); //数据的初始化
    while(1)
    {
        clean(); //把之前绘制的内容取消
        updatewithoutinput(); //与用户输入无关的更新
        updatewithinput(); //与用户输入有关的更新
        show();
    }
    gameover();
    return 0;
}

猜你喜欢

转载自blog.csdn.net/qq_40501731/article/details/86746854