这个只要安装了easyx图形库就可以直接复制运行。
easyx的安装可以参考这个:
easyx的安装与基于easyx的C语言扫雷小游戏_makabaka12138的博客-CSDN博客
这个游戏也比较粗糙,只做了个大概,有感兴趣的可以自己改进一下。
喜欢的点个赞吧。
展示:
#include <stdio.h>
#include <stdbool.h>
#include <graphics.h> //easyX 库
#include <conio.h>
//砖块宽
#define ZK_WIDTH 120
//砖块高
#define ZK_HEIGHT 40
//行数
#define ZK_ROWS 4
//列数
#define ZK_COLS 5
//宽 60 高 20
//窗口高
#define WINDOW_HEIGHT 600
//窗口宽
#define WINDOW_WIDTH (ZK_WIDTH*ZK_COLS)
//球的半径
#define RADIUS 10
//板子宽
#define BZ_WIDTH 300
//板子高
#define BZ_HEIGHT 20
//全局变量 0 false 存在 1 true 不存在
bool zk[ZK_ROWS][ZK_COLS] = { 0 };
//球的圆心坐标
int ball_x, ball_y;
//板子左上角那个点的坐标
int bz_x, bz_y;
//球的方向向量 3 右 -3 左 -3上 3下
int ball_xfx=3, ball_yfx=-3;
//游戏是否继续
bool isContinue = true;
//画板子
void drawBZ();
//画球
void drawBall();
//打印一块砖
// x y 下标
void drawZK(int x, int y);
//显示所有的砖
void drawAllZK();
//游戏的所有显示
void drawGame();
//球移动
void ballMove();
//碰撞检测
void check();
//控制 是否按键 根据按键来处理
void ctolGame();
int main(){
initgraph(WINDOW_WIDTH, WINDOW_HEIGHT);
//板子的初始坐标
bz_x = (WINDOW_WIDTH - BZ_WIDTH) / 2;
bz_y = WINDOW_HEIGHT - BZ_HEIGHT;
//球心初始坐标
ball_x = WINDOW_WIDTH / 2;
ball_y = WINDOW_HEIGHT - BZ_HEIGHT - RADIUS;
while (isContinue){
drawGame();
ballMove();
ctolGame();
Sleep(10);//帧率100 1秒钟图片切换张数 16以上 100以下
}
settextcolor(RED);
LOGFONT font = { 0 };
font.lfHeight = 40;
font.lfWidth = 20;
settextstyle(&font);
outtextxy(WINDOW_WIDTH / 2 - 100, WINDOW_HEIGHT / 2,
L"Game Over!!!");
/*
Sleep(2000);
cleardevice();//清屏
zk[1][1] = zk[2][2] = 1;
drawAllZK();
*/
while (1);
return 0;
}
//球移动
void ballMove(){
ball_x += ball_xfx;
ball_y += ball_yfx;
}
//碰撞检测
void check(){
//检测球是否撞上右边沿
if ((ball_xfx > 0) && //球往右边走
(ball_x >= (WINDOW_WIDTH - RADIUS))){//撞上了右边沿
ball_xfx = -3;
}
//检测球是否撞上左边沿
if ((ball_xfx < 0) && //球往左边走
(ball_x <= RADIUS)){//撞上了左边沿
ball_xfx = 3;
}
//检测球是否撞上上边沿
if ((ball_yfx < 0) && //球往上边走
(ball_y <= RADIUS)){//撞上了上边沿
ball_yfx = 3;
}
//检测球是否撞上下边沿
if ((ball_yfx > 0) && //球往下边走
(ball_y >= (WINDOW_HEIGHT-RADIUS) )){//撞上了下边沿
//ball_yfx = -3;
isContinue = false;
}
//检测球是否撞上板子
if ((ball_yfx > 0) &&
(ball_y >= (bz_y - RADIUS)) &&//球y坐标
(ball_x >= bz_x) &&
(ball_x <= (bz_x + BZ_WIDTH))){
ball_yfx = -3;
}
//检测撞砖块
for (int i = 0; i < ZK_ROWS; i++){
for (int j = 0; j < ZK_COLS; j++){
// zk[i][j] x:j*ZK_WIDTH y:i*ZK_HEIGHT
//左上角坐标 (j*ZK_WIDTH,i*ZK_HEIGHT)
//右下角坐标(j*ZK_WIDTH+ZK_WIDTH,i*ZK_HEIGHT+ZK_HEIGHT)
if (3 == ball_xfx){//检测从左往右撞
/*
if ((false == zk[i][j]) //砖块存在
&& (ball_x > (j*ZK_WIDTH-RADIUS) ) //左边边界
&& (ball_y>i*ZK_HEIGHT)//上边边界
&& (ball_y < (i*ZK_HEIGHT + ZK_HEIGHT))//下边边界
){
zk[i][j] = true;//把砖块打掉
ball_xfx = -3;
}
*/
}
if (-3 == ball_xfx){//检测从右往左撞
/*
if ((false == zk[i][j]) //砖块存在
&& (ball_x <(j*ZK_WIDTH + ZK_WIDTH + RADIUS)) //右边边界
&& (ball_y>i*ZK_HEIGHT)//上边边界
&& (ball_y < (i*ZK_HEIGHT + ZK_HEIGHT))//下边边界
){
zk[i][j] = true;//把砖块打掉
ball_xfx = 3;
}
*/
}
if (-3 == ball_yfx){//检测从下往上撞
if ((false == zk[i][j]) //砖块存在
&& (ball_x > j*ZK_WIDTH) //左边边界
&& (ball_x < (j*ZK_WIDTH + ZK_WIDTH))//右边边界
&& (ball_y < (i*ZK_HEIGHT + ZK_HEIGHT + RADIUS))//上边边界
){
zk[i][j] = true;//把砖块打掉
ball_yfx = 3;
}
}
if (3 == ball_yfx){//检测从上往下撞
/*
if ((false == zk[i][j]) //砖块存在
&& (ball_x > j*ZK_WIDTH) //左边边界
&& (ball_x < (j*ZK_WIDTH + ZK_WIDTH))//右边边界
&& (ball_y > (i*ZK_HEIGHT - RADIUS))//上边边界
){
zk[i][j] = true;//把砖块打掉
ball_yfx = -3;
}
*/
}
}
}
}
//控制 是否按键 根据按键来处理
void ctolGame(){
check();//不管有没有按键,都要碰撞检测
int ch;
if (true == _kbhit()){//检测是否有按键
ch = _getch();//获取按键的值
printf("ch:%d\n", ch);
switch (ch){
case 'a':
case 'A':
case 75:
bz_x -= 5;
break;
case 'd':
case 'D':
case 77:
bz_x += 5;
break;
}
}
}
//游戏的所有显示
void drawGame(){
BeginBatchDraw();//绘图前 防闪
//清屏
cleardevice();
drawAllZK();
drawBZ();
drawBall();
EndBatchDraw();//绘图后 防闪
}
//打印一块砖
// x y 下标
void drawZK(int x, int y){
if (0 == zk[y][x]){
setlinecolor(RED);
setfillcolor(GREEN);
fillrectangle(x * ZK_WIDTH, y * ZK_HEIGHT,
x * ZK_WIDTH + ZK_WIDTH, y * ZK_HEIGHT + ZK_HEIGHT);
}
/*
if(1 == zk[y][x]) return;
setlinecolor(RED);
setfillcolor(GREEN);
fillrectangle(x * ZK_WIDTH, y * ZK_HEIGHT,
x * ZK_WIDTH + ZK_WIDTH, y * ZK_HEIGHT + ZK_HEIGHT);
*/
}
//显示所有的砖
void drawAllZK(){
for (int i = 0; i < ZK_ROWS; i++){//5行
for (int j = 0; j < ZK_COLS; j++){//30列
//if (0 == zk[i][j])
drawZK(j, i);
}
}
}
//画板子
void drawBZ(){
setlinecolor(YELLOW);
setfillcolor(YELLOW);
fillrectangle(bz_x, bz_y, bz_x + BZ_WIDTH, bz_y + BZ_HEIGHT);
}
//画球
void drawBall(){
setlinecolor(BLUE);
setfillcolor(RED);
fillcircle(ball_x, ball_y, RADIUS);
}