【C语言】之实现方块碰撞游戏

使用介绍:

总共有三个文件 main.c、block.c 和 block.h,需要一起编译


main.c

/*****************************
 * 项目名称: 方块碰撞
 * 功能描述: 实现简易的方块碰撞功能
 * 编辑人:王廷云
 * 编辑日期:2017-12-20
*****************************/

#include <unistd.h>
#include "block.h"

/*
 * 原理:
 *   根据数组的不同数据打印出不同的颜色;
 *   通过延时达到移动的效果
*/
int main(void)
{
    int i;

    /* 背景数据 */
    int bg[ROW][COL];

    /* 方块结构体:三个方块 */
    Block_t bl[NR] = {
         {4,2,10,5,  1,-1,Red  },
         {4,2,20,5, -1,-1,Grean},
         {4,2,10,10,-1, 1,Blue },
    };

    /* 初始化界面 */
    initBg(bg);

    /* 进入游戏 */

    while (1)
    {
        /* 画方块 */
    	for (i = 0; i < NR; i++ )
    	{
            drawBlock(bg,&bl[i]);
    	}

        /* 显示界面 */
        showBg(bg);

        /* 清除方块:只是清除数据而已不影响显示 */
    	for (i = 0; i < NR; i++)
    	{
    	    cleanBlock(bg,&bl[i]);
    	}

    	/* 延时一段时间 */
    	usleep(100000);

    	/* 边界判断 */
    	for (i = 0; i < NR; i++)
    	{
            /* 水平方向 */
            if (bl[i].x == 1 || bl[i].x+bl[i].width == COL-1)
    		{
                bl[i].vx = -bl[i].vx;
            }
            /* 垂直方向 */
            if (bl[i].y == 1 || bl[i].y+bl[i].height == ROW-1)
    		{
                bl[i].vy = -bl[i].vy;
            }
    	}

    	/* 移动方块 */
    	for (i = 0; i < NR; i++)
    	{
    	    bl[i].x+= bl[i].vx;
    	    bl[i].y += bl[i].vy;
    	}
    }

    return 0;
}


block.h

/***********************************************
 * 文件名: block.h
 * 功能描述: 方块碰撞项目的头文件,这里包括了:
 *           项目所用到的宏定义,方法函数的定义,
 *           枚举,以及结构体定义;
 * 编写人: 王廷云
 * 编写日期: 2017-10-14
************************************************/

#ifndef  _BLOCK_H_
#define  _BLOCK_H_

/* 宏定义 */
#define   ROW    15  // 界面行数
#define   COL    30  // 界面列数
#define   NR     3   // 方块个数

/* 颜色枚举 */
enum e_color {
    Bg,              // 背景色
    Frame,           // 边框色
    Red,             // 红
    Grean,           // 绿
    Blue,            // 蓝
};

/* 方块结构体封装 */
typedef struct Block {
    int width, height; // 方块的宽高
    int x, y;          // 方块的坐标
    int vx, vy;        // 方块的移动方向
    int color;         // 方块的颜色
}Block_t;

/* 初始化背景接口函数 */
void initBg(int bg[ROW][COL]);

/* 显示背景接口函数 */
void showBg(int bg[ROW][COL]);

/* 绘画方块接口函数 */
void drawBlock(int bg[ROW][COL], Block_t *bl);

/* 清除方块接口函数 */
void cleanBlock(int bg[ROW][COL], Block_t *bl);

#endif  // _BLOCK_H_ 


block.c

/*************************************
 * 文件名: block.c
 * 文件描述: 所有方块碰撞用到的方法函数的实现
 * 编辑人:王廷云
 * 编辑日期:2017-12-12
**************************************/

#include <stdio.h>
#include "block.h"

/*
 * 函数名: initBg()
 * 功能: 初始化所有数据
 * 参数: 需要初始化的背景数组数据
 * 返回值: 无
*/
void initBg(int bg[ROW][COL])
{
    int i, j;

    /* 清屏 */
    fprintf(stdout, "\033[2J");

    /* 初始化数据 */
    for (i = 0; i < ROW; i++)
    {
        for (j = 0; j < COL; j++)
    	{
    	    if (i == 0 || i == ROW-1)      // 上下两行
    	    {
    	        bg[i][j] = Frame;
    	    }
    	    else if (j == 0 || j == COL-1) // 左右两列
    	    {
    	        bg[i][j] = Frame;
    	    }
    	    else                           // 中间空白数据
    	    {
    	        bg[i][j] = Bg;
    	    }
    	}
    }
}

/*
 * 函数名: drawBlock()
 * 功能: 在游戏界面内绘画一个方块
 * 参数: 1.界面数组数据 2.需要绘画的方块
 * 返回值:无
*/
void drawBlock(int bg[ROW][COL], Block_t *bl)
{
    int i, j;

    /* 填充方块对应的颜色数据 */
    for (i = 0; i < bl->height; i++)
    {
       for (j = 0; j < bl->width; j++)
       {
	       bg[bl->y+i][bl->x+j] = bl->color;
       }
    }
}

/*
 * 函数名: cleanBlock()
 * 功能: 在游戏界面内绘画一个方块
 * 参数: 1.界面数组数据 2.方块x坐标 3.方块y坐标
 *       4.方块宽度 5.方块高度
 * 返回值:无
*/
void cleanBlock(int bg[ROW][COL], Block_t *bl)
{
    int i, j;

    /* 清除方块对应的数据 */
    for (i = 0; i < bl->height; i++)
    {
       for (j = 0; j < bl->width; j++)
       {
           bg[bl->y+i][bl->x+j] = Bg;
       }
    }
}

/*
 * 函数名: showBg()
 * 功能: 显示游戏背景
 * 参数: 需要显示的背景数组数据
 * 返回值: 无
*/
void showBg(int bg[ROW][COL])
{
    int i, j;

    /* 定位到第一行第一列 */
    fprintf(stdout, "\033[1;1H");
    fflush(stdout);

    /* 打印所有数据 */
    for (i = 0; i < ROW; i++)
    {
        for (j = 0; j < COL; j++)
    	{
            switch (bg[i][j])   // 不同数据打印不同颜色
    	    {
                case Frame:
    		         fprintf(stdout, "\033[43m \033[0m"); break;
                case Bg:
    		         fprintf(stdout, " "); break;
                case Red:
    		         fprintf(stdout, "\033[1;41m \033[0m"); break;
                case Grean:
    		         fprintf(stdout, "\033[1;42m \033[0m"); break;
                case Blue:
                     fprintf(stdout, "\033[1;44m \033[0m"); break;
    	    }
    	}
	    putchar('\n');
    }
}

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值