C++ 一款纯C实现的打砖块小游戏

公众号:编程驿站

#include <stdio.h>
#include <stdlib.h>
#include <windows.h>
#include <time.h>
#include<mmsystem.h>
#pragma comment(lib, "WINMM.LIB")

#define BRICK_NUM 100
//形状类型
#define SQUARE  1
#define STAR 2
#define DIAMOND 3

/*
1、砖块:描述砖块
2、球
3、条形木块
*/
typedef struct Point
{
    int x;
    int y;
} Point;

//球数据模型
typedef struct Ball
{
    //坐标
    Point point;
    //形状,普通 火球 激光
    int shape;
    //水平方向  r:1 l:-1 :  'l' 'r'
    int hdir;
    //垂直方向  u :1 d:-1
    int vdir;
    //速度
    int speed;
} Ball;

//木板
typedef struct Board
{
    //坐标
    Point point;
    //长度
    int length;
    //方向 左(-1)  右(1)
    int dir;
    //速度
    int speed;
} Board;

//构建类型,摸拟砖块
typedef struct Brick
{
    //坐标
    Point point;
    //形状 :1:正方形(普通砖块 10)  2(圆形 20)   3:
    int shape;
} Brick;


//砖块
Brick bricks[BRICK_NUM];

//构建一个球
Ball ball;
//构建一个木板
Board board;

//计数器,
int count=0;
//总分值
int totalScore=0;

void init()
{
    srand(time(0));
    //初始化球
    ball.point.x=36;
    ball.point.y=22;
    ball.shape=1;
    ball.speed=200;
    ball.vdir=1;//向上 u   向下 d 向左 l 向右 r
    ball.hdir=-1;
    //初始化木板
    board.point.x=32;
    board.point.y=23;
    board.length=5;
    board.speed=300;
    board.dir=-1;
    //初始化砖块
    initBrick();
}

/*
功能:定位光标(输出)位置
*/
void setPosition(Point point)
{
    //用户坐标信息转换成内部坐标信息
    COORD coord= {point.x,point.y};
    SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE),coord);
}

/*
可视化显示木板,球
*/
void showBall()
{
    setPosition(ball.point);
    //颜色:r g b
    SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),FOREGROUND_GREEN | FOREGROUND_RED | FOREGROUND_INTENSITY) ;
    printf("◎");
}

/*
*可视化显示木板 (重构)--》进化--》
*/
void showBorad()
{
    int index=0;
    setPosition(board.point);
    SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),FOREGROUND_RED | FOREGROUND_INTENSITY) ;
    for(index=0; index<board.length; index++)
    {
        printf("〓");
    }
}

/*
随机数字
*/
int createRan()
{
    return rand()%3+1;// 0  12
}

/*
初始化砖块信息
*/
void initBrick()
{
    //确定第一个砖块位置 x ,y 程序逻辑会引起修改
    int x=10;
    int y=2;
    int i=0;
    //保存最初坐标
    int index=0;
    //100=25*4
    for(index=0; index<BRICK_NUM; index++)
    {
        //确定每一行起始坐标
        if(index!=0 && index%25==0) //25  50  75
        {
            //换行
            x=bricks[i*25].point.x;
            y=bricks[i*25].point.y+1;
            i++;
        }
        //具体化
        bricks[index].point.x=x;
        bricks[index].point.y=y;
        //形状
        bricks[index].shape=createRan();
        x=x+2;
    }
}

/*
*图形化砖块
*/
void showBrick()
{
    int index=0;
    for(index=0; index<BRICK_NUM; index++)
    {
        setPosition(bricks[index].point);
        switch(bricks[index].shape)
        {
        case SQUARE:
            SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), FOREGROUND_RED | FOREGROUND_INTENSITY);
            printf("■");
            break;
        case STAR:
            SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),
                                    FOREGROUND_GREEN | FOREGROUND_INTENSITY);

            printf("★");
            break;
        case DIAMOND:
            SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), FOREGROUND_BLUE | FOREGROUND_INTENSITY);
            printf("◆");
            break;
        }
    }
}


/*
检查小球是否碰到了木板
1 碰
0 没有碰到
*/
int ballToBoard()
{
    //木板的启始x值
    int bxs=board.point.x;
    int bxe=board.point.x+board.length*2;
    if( (ball.point.x>=bxs && ball.point.x<=bxe) && ball.point.y==board.point.y-1 )
    {
        return 1;
    }
    return 0;
}


void selDir(){
   //函数:异步
   if(GetAsyncKeyState(VK_LEFT)){
     board.dir=-1;
   }else if(GetAsyncKeyState(VK_RIGHT)){
     board.dir=1;
   }
}

/*
移动木板
*/
void moveBoard()
{
    int index=0;
    setPosition(board.point);
    //清除
    for(index=0; index<board.length; index++)
    {
        printf("  ");
    }
    //新坐标:
    board.point.x+=2*board.dir;
    //重新
    setPosition(board.point);
    SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),FOREGROUND_RED | FOREGROUND_INTENSITY) ;
    for(index=0; index<board.length; index++)
    {
        printf("〓");
    }
}

/*
检查小球是否碰到砖块
0
1
2
3
*/
int ballToBrick(){
    int index=0;
    for(index=0;index<BRICK_NUM;index++){
        if(bricks[index].point.x==ball.point.x && bricks[index].point.y==ball.point.y){
            return  bricks[index].shape;;
        }
    }
    return 0;
}

/*
移动小球
*/
void moveBall()
{
    int left=4;
    int right=64;
    int top=2;
    int bottom=24;
//水平、垂直增量
    int stepx=2;
    int stepy=1;
    int shape=0;
    Point p={76,10};
    //得到小球原来位置
    Point oldPoint=ball.point;
    srand(time(0));
    //原来位置图形清除
    setPosition(oldPoint);
    printf("  ");

    //检查水平方向
    if(ball.point.x<left)
    {
        //改变水平方向
        ball.hdir=1;
    }
    else if(ball.point.x>right)
    {
        ball.hdir=-1;
    }

    //检查垂直方向
    if(ball.point.y<top)
    {
        ball.vdir=-1;
    }
    else if(ball.point.y>bottom)
    {
        ball.vdir=1;
    }
    else if(ballToBoard()==1)
    {
        ball.vdir=1;
    }

    //确定小球的新的位置
    ball.point.x=oldPoint.x+stepx*ball.hdir;
    ball.point.y=oldPoint.y-stepy*ball.vdir;

    //判断是否碰到砖块 0 1 2 3
    shape=ballToBrick();
    //计算碰了多少块砖块
    count+=shape>0?1:0;
    setPosition(p);
    totalScore+=shape*10;
    printf("小球碰了%d砖块,计分:%d",count,totalScore);
    //重新绘制
    setPosition(ball.point);
    SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),FOREGROUND_GREEN | FOREGROUND_RED | FOREGROUND_INTENSITY) ;
    printf("◎");
}

/*
功能模块:绘制围墙 1B=8bit A:1B 中文:2B
*/
void paintWall()
{
    int index=0;
    Point point;
    SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),11);
    //上边。下边
    for(index=0; index<70; index=index+2)
    {
        point.x=index;
        point.y=0;
        setPosition(point);
        printf("■");
        point.y=26;
        setPosition(point);
        printf("■");
    }
    //左边、右边akes[0].x=oldX+2;
    for(index=1; index<=26; index++)
    {
        point.x=0;
        point.y=index;
        setPosition(point);
        printf("■");
        point.x=68;
        setPosition(point);
        printf("■");
    }
}

void show()
{
    paintWall();
    showBrick();
    showBall();
    showBorad();
}

int main()
{
    init();
    show();
    while(1)
    {
        moveBall();
        selDir();
        moveBoard();
        //速度
        Sleep(ball.speed);
    }
    return 0;
}```

  • 4
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

一枚大果壳

码文不易,晚上熬夜需要点咖啡钱

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值