c语言小游戏编程弹珠游戏,c语言 弹弹球小游戏

#include

#include

#include

#include

#include

#pragma comment(lib, "WINMM.LIB")

#define BRICK_NUM 100

//形状类型

#define SQUARE 1

#define STAR 2

#define DIAMOND 3

/*

建立对应模型:20/80 程序:核心代码20% 非核心的代码80%

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

{

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

{

//确定每一行起始坐标

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

{

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

{

printf(" ");

}

//新坐标:

board.point.x+=2*board.dir;

//重新

setPosition(board.point);

SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),FOREGROUND_RED | FOREGROUND_INTENSITY) ;

for(index=0; index

{

printf("〓");

}

}

/*

检查小球是否碰到砖块

0

1

2

3

*/

int ballToBrick(){

int index=0;

for(index=0;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

{

//改变水平方向

ball.hdir=1;

}

else if(ball.point.x>right)

{

ball.hdir=-1;

}

//检查垂直方向

if(ball.point.y

{

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;

}

原文:https://www.cnblogs.com/ysg520/p/9310985.html

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
C语言控制台小游戏.zip 一、开启C语言游戏之门 对于许多初学者来说,C语言可能是一门既神秘又令人畏惧的语言。但其实,C语言也可以非常有趣!这次我们为您带来了一系列C语言小游戏资源,旨在让您在轻松愉快的氛围中,逐步掌握C语言的精髓。 二、资源亮点 由浅入深:我们为您提供了从入门级到进阶级的多种小游戏资源,满足您不同阶段的学习需求。 实践为王:这些资源不仅仅是理论,更有实际可运行的代码,让您亲身体验编程的乐趣。 模块化设计:每个游戏都按照功能模块进行划分,方便您学习和理解。 社区参与:我们鼓励您参与到社区中,与其他学习者分享经验,共同进步。 三、适用人群 无论您是初涉编程的新手,还是希望深入了解C语言的进阶者,这些资源都能为您提供宝贵的实践机会。 四、使用建议 边学边做:建议您在学习过程中,积极动手实践,亲自感受C语言的魅力。 不断挑战:尝试自行修改和优化游戏代码,培养独立思考和解决问题的能力。 交流与分享:加入我们的学习社群,与其他学习者交流心得,共同成长。 五、注意事项 尊重版权:请确保在使用这些资源时,遵循版权法规,尊重原创者的权益。 安全为先:在编写和运行代码时,请确保您的开发环境安全可靠,避免潜在风险。 持续学习:编程是一个不断进阶的过程,希望您能保持对知识的热情,持续深入学习。 感谢您选择我们的C语言小游戏资源系列!让我们一起在探索中成长,用代码书写属于我们的精彩故事!

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值