您的位置:首页 > 运维架构 > Linux

linux下使用C语言实现方块碰撞游戏

2018-03-21 12:03 1006 查看
总共有三个文件 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++)
b48c

{
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');
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息