项目: 用easyx实现消砖块
目录
- 一、最终效果展示
- 二、绘制静态的挡板
- 三、控制挡板
- 四、消砖块
- 五、鼠标交互
一、最终效果展示
效果图如下:
这个项目还是有很多的细节漏洞的。例如: 边界控制这里还是有点问题的。
二、绘制静态的挡板
代码如下:
#include<conio.h>
#include<graphics.h>#define High 480 //游戏画面尺寸
#define Width 640//全局变量
int ball_x,ball_y;//小球的坐标
int ball_vx,ball_vy;//小球的速度
int radius;//小球的半径
int bar_x,bar_y;//挡板的中心坐标
int bar_high,bar_width;//挡板的高度和宽度
int bar_left,bar_right,bar_top,bar_bottom;//挡板的左右上下位置坐标void startup()//数据的初始化
{ball_x=Width/2;ball_y=High/2;ball_vx=1;ball_vy=1;radius=20;bar_high=High/20;bar_width=Width/5;bar_x=Width/2;bar_y=High-bar_high/2;bar_left=bar_x-bar_width/2;bar_right=bar_x+bar_width/2;bar_top=bar_y-bar_high/2;bar_bottom=bar_y+bar_high/2;initgraph(Width,High);BeginBatchDraw();
}void clean()//显示画面
{setcolor(BLACK);//绘制黑线,黑色填充的圆setfillcolor(BLACK);fillcircle(ball_x,ball_y,radius);bar(bar_left,bar_top,bar_right,bar_bottom);//绘制黑色,黑色填充的挡板
}void show()//显示画面
{setcolor(YELLOW);//绘制黄线,绿色填充的圆setfillcolor(GREEN);fillcircle(ball_x,ball_y,radius);bar(bar_left,bar_top,bar_right,bar_bottom);//绘制黄色,绿色填充的挡板FlushBatchDraw();Sleep(3);
}void updateWithoutInput()//与用户输入无关的更新
{ball_x=ball_x+ball_vx;ball_y=ball_y,ball_vy;//更新小球的坐标if( (ball_x<=radius)||(ball_x>=Width-radius))ball_vx=-ball_vx;if( (ball_y<=radius)||(ball_y>=High-radius))ball_vy=-ball_vy;
}void updateWithInput()//与用户输入有关的更新
{}void gameover()
{EndBatchDraw();closegraph();
}int main()
{startup();//数据的初始化while(1){clean();//把之前绘制的内容清除updateWithoutInput();//与用户输入无关的更新updateWithInput();//与用户输入有关的更新show();//显示新画面}
}
效果图如下:
三、控制挡板
代码如下:
#include<conio.h>
#include<graphics.h>#define High 480 //游戏画面尺寸
#define Width 640//全局变量
int ball_x,ball_y;//小球的坐标
int ball_vx,ball_vy;//小球的速度
int radius;//小球的半径
int bar_x,bar_y;//挡板的中心坐标
int bar_high,bar_width;//挡板的高度和宽度
int bar_left,bar_right,bar_top,bar_bottom;//挡板的左右上下位置坐标void startup()//数据的初始化
{ball_x=Width/2;ball_y=High/2;ball_vx=1;ball_vy=1;radius=20;bar_high=High/20;bar_width=Width/5;bar_x=Width/2;bar_y=High-bar_high/2;bar_left=bar_x-bar_width/2;bar_right=bar_x+bar_width/2;bar_top=bar_y-bar_high/2;bar_bottom=bar_y+bar_high/2;initgraph(Width,High);BeginBatchDraw();
}void clean()//显示画面
{setcolor(BLACK);//绘制黑线,黑色填充的圆setfillcolor(BLACK);fillcircle(ball_x,ball_y,radius);bar(bar_left,bar_top,bar_right,bar_bottom);//绘制黑色,黑色填充的挡板
}void show()//显示画面
{setcolor(YELLOW);//绘制黄线,绿色填充的圆setfillcolor(GREEN);fillcircle(ball_x,ball_y,radius);bar(bar_left,bar_top,bar_right,bar_bottom);//绘制黄色,绿色填充的挡板FlushBatchDraw();Sleep(3);
}void updateWithoutInput()//与用户输入无关的更新
{//挡板和小球碰撞,小球反弹if(((ball_y+radius>=bar_top)&&(ball_y+radius<bar_bottom-bar_high/3))||((ball_y-radius<=bar_bottom)&&(ball_y-radius>bar_top-bar_high/3)))if((ball_x>=bar_left)&&(ball_x<=bar_right))ball_vy=-ball_vy;ball_x=ball_x+ball_vx;ball_y=ball_y,ball_vy;//更新小球的坐标if( (ball_x<=radius)||(ball_x>=Width-radius))ball_vx=-ball_vx;if( (ball_y<=radius)||(ball_y>=High-radius))ball_vy=-ball_vy;
}void updateWithInput()//与用户输入有关的更新
{char input;if(kbhit()){input=getch();if(input=='a'&&bar_left>0){bar_x=bar_x-15;//位置左移bar_left=bar_x-bar_width/2;bar_right=bar_x+bar_width/2;}if(input=='d'&&bar_right<Width){bar_x=bar_x+15;//位置左移bar_left=bar_x-bar_width/2;bar_right=bar_x+bar_width/2;}if(input=='w'&&bar_top>0){bar_y=bar_y-15;//位置左移bar_top=bar_y-bar_high/2;bar_bottom=bar_y+bar_high/2;}if(input=='s'&&bar_bottom<High){bar_y=bar_y+15;//位置右移bar_top=bar_y-bar_high/2;bar_bottom=bar_y+bar_high/2;}}
}void gameover()
{EndBatchDraw();closegraph();
}int main()
{startup();//数据的初始化while(1){clean();//把之前绘制的内容清除updateWithoutInput();//与用户输入无关的更新updateWithInput();//与用户输入有关的更新show();//显示新画面}
}
效果图如下:
四、消砖块
代码如下:
#include<conio.h>
#include<graphics.h>#define High 480 //游戏画面尺寸
#define Width 640
#define Brick_num 10//全局变量
int ball_x,ball_y;//小球的坐标
int ball_vx,ball_vy;//小球的速度
int radius;//小球的半径
int bar_x,bar_y;//挡板的中心坐标
int bar_high,bar_width;//挡板的高度和宽度
int bar_left,bar_right,bar_top,bar_bottom;//挡板的左右上下位置坐标int isBrickExisted[Brick_num];//每个砖块是否存在,1为存在,0为没有了
int brick_high,brick_width;//每个砖块的高度和宽度void startup()//数据的初始化
{ball_x=Width/2;ball_y=High/2;ball_vx=1;ball_vy=1;radius=20;bar_high=High/20;bar_width=Width/5;bar_x=Width/2;bar_y=High-bar_high/2;bar_left=bar_x-bar_width/2;bar_right=bar_x+bar_width/2;bar_top=bar_y-bar_high/2;bar_bottom=bar_y+bar_high/2;brick_width=Width/Brick_num;brick_high=High/Brick_num;int i;for(i=0;i<Brick_num;i++)isBrickExisted[i]=1;initgraph(Width,High);BeginBatchDraw();
}void clean()//显示画面
{setcolor(BLACK);//绘制黑线,黑色填充的圆setfillcolor(BLACK);fillcircle(ball_x,ball_y,radius);bar(bar_left,bar_top,bar_right,bar_bottom);//绘制黑色,黑色填充的挡板int i,brick_left,brick_right,brick_top,brick_bottom;for(i=0;i<Brick_num;i++){brick_left=i*brick_width;brick_right=brick_left+brick_width;brick_top=0;brick_bottom=brick_high;if(!isBrickExisted[i])//砖块没有了,绘制黑色fillrectangle(brick_left,brick_top,brick_right,brick_bottom);}
}void show()//显示画面
{setcolor(YELLOW);//绘制黄线,绿色填充的圆setfillcolor(GREEN);fillcircle(ball_x,ball_y,radius);bar(bar_left,bar_top,bar_right,bar_bottom);//绘制黄色,绿色填充的挡板int i,brick_left,brick_right,brick_top,brick_bottom;for(i=0;i<Brick_num;i++){brick_left=i*brick_width;brick_right=brick_left+brick_width;brick_top=0;brick_bottom=brick_high;if(isBrickExisted[i])//砖块存在,绘制砖块{setcolor(WHITE);setfillcolor(RED);fillrectangle(brick_left,brick_top,brick_right,brick_bottom);//绘制砖块}}FlushBatchDraw();Sleep(3);
}void updateWithoutInput()//与用户输入无关的更新
{//挡板和小球碰撞,小球反弹if(((ball_y+radius>=bar_top)&&(ball_y+radius<bar_bottom-bar_high/3))||((ball_y-radius<=bar_bottom)&&(ball_y-radius>bar_top-bar_high/3)))if((ball_x>=bar_left)&&(ball_x<=bar_right))ball_vy=-ball_vy;ball_x=ball_x+ball_vx;ball_y=ball_y+ball_vy;//更新小球的坐标//小球和边界碰撞if( (ball_x<=radius)||(ball_x>=Width-radius))ball_vx=-ball_vx;if( (ball_y<=radius)||(ball_y>=High-radius))ball_vy=-ball_vy;//判断小球是否和某个砖块碰撞int i,brick_left,brick_right,brick_top,brick_bottom;for(i=0;i<Brick_num;i++){if(isBrickExisted[i])//砖块存在才判断{brick_left=i*brick_width;brick_right=brick_left+brick_width;brick_bottom=brick_high;if((ball_y==brick_bottom+radius)&&(ball_x>=brick_left)&&(ball_x<=brick_right)){isBrickExisted[i]=0;ball_vy=-ball_vy;}}}
}void updateWithInput()//与用户输入有关的更新
{char input;if(kbhit()){input=getch();if(input=='a'&&bar_left>0){bar_x=bar_x-15;//位置左移bar_left=bar_x-bar_width/2;bar_right=bar_x+bar_width/2;}if(input=='d'&&bar_right<Width){bar_x=bar_x+15;//位置左移bar_left=bar_x-bar_width/2;bar_right=bar_x+bar_width/2;}}
}void gameover()
{EndBatchDraw();closegraph();
}int main()
{startup();//数据的初始化while(1){clean();//把之前绘制的内容清除updateWithoutInput();//与用户输入无关的更新updateWithInput();//与用户输入有关的更新show();//显示新画面}
}
效果图如下:
五、鼠标交互
先看一个关于鼠标交互的实例
#include<graphics.h>
#include<conio.h>
int main(void)
{initgraph(640,480);//初始化图形窗口MOUSEMSG m;//定义鼠标消息while(1){m=GetMouseMsg();//获取一条鼠标消息if(m.uMsg==WM_MOUSEMOVE){putpixel(m.x,m.y,WHITE);//鼠标移动的时候画小白点}else if(m.uMsg==WM_LBUTTONDOWN){rectangle(m.x-5,m.y-5,m.x+5,m.y+5);//鼠标左键按下时在鼠标位置画一个方块}else if(m.uMsg==WM_RBUTTONUP){circle(m.x,m.y,10);//鼠标右键按下时在鼠标位置画一个圆}}return 0;
}
用鼠标控制挡板移动,按鼠标左键初始化小球位置
代码如下:
#include<conio.h>
#include<graphics.h>#define High 480 //游戏画面尺寸
#define Width 640
#define Brick_num 10//全局变量
int ball_x,ball_y;//小球的坐标
int ball_vx,ball_vy;//小球的速度
int radius;//小球的半径
int bar_x,bar_y;//挡板的中心坐标
int bar_high,bar_width;//挡板的高度和宽度
int bar_left,bar_right,bar_top,bar_bottom;//挡板的左右上下位置坐标int isBrickExisted[Brick_num];//每个砖块是否存在,1为存在,0为没有了
int brick_high,brick_width;//每个砖块的高度和宽度void startup()//数据的初始化
{ball_x=Width/2;ball_y=High/2;ball_vx=1;ball_vy=1;radius=20;bar_high=High/20;bar_width=Width/5;bar_x=Width/2;bar_y=High-bar_high/2;bar_left=bar_x-bar_width/2;bar_right=bar_x+bar_width/2;bar_top=bar_y-bar_high/2;bar_bottom=bar_y+bar_high/2;brick_width=Width/Brick_num;brick_high=High/Brick_num;int i;for(i=0;i<Brick_num;i++)isBrickExisted[i]=1;initgraph(Width,High);BeginBatchDraw();
}void clean()//显示画面
{setcolor(BLACK);//绘制黑线,黑色填充的圆setfillcolor(BLACK);fillcircle(ball_x,ball_y,radius);bar(bar_left,bar_top,bar_right,bar_bottom);//绘制黑色,黑色填充的挡板int i,brick_left,brick_right,brick_top,brick_bottom;for(i=0;i<Brick_num;i++){brick_left=i*brick_width;brick_right=brick_left+brick_width;brick_top=0;brick_bottom=brick_high;if(!isBrickExisted[i])//砖块没有了,绘制黑色fillrectangle(brick_left,brick_top,brick_right,brick_bottom);}
}void show()//显示画面
{setcolor(YELLOW);//绘制黄线,绿色填充的圆setfillcolor(GREEN);fillcircle(ball_x,ball_y,radius);bar(bar_left,bar_top,bar_right,bar_bottom);//绘制黄色,绿色填充的挡板int i,brick_left,brick_right,brick_top,brick_bottom;for(i=0;i<Brick_num;i++){brick_left=i*brick_width;brick_right=brick_left+brick_width;brick_top=0;brick_bottom=brick_high;if(isBrickExisted[i])//砖块存在,绘制砖块{setcolor(WHITE);setfillcolor(RED);fillrectangle(brick_left,brick_top,brick_right,brick_bottom);//绘制砖块}}FlushBatchDraw();Sleep(3);
}void updateWithoutInput()//与用户输入无关的更新
{//挡板和小球碰撞,小球反弹if(((ball_y+radius>=bar_top)&&(ball_y+radius<bar_bottom-bar_high/3))||((ball_y-radius<=bar_bottom)&&(ball_y-radius>bar_top-bar_high/3)))if((ball_x>=bar_left)&&(ball_x<=bar_right))ball_vy=-ball_vy;ball_x=ball_x+ball_vx;ball_y=ball_y+ball_vy;//更新小球的坐标//小球和边界碰撞if( (ball_x<=radius)||(ball_x>=Width-radius))ball_vx=-ball_vx;if( (ball_y<=radius)||(ball_y>=High-radius))ball_vy=-ball_vy;//判断小球是否和某个砖块碰撞int i,brick_left,brick_right,brick_top,brick_bottom;for(i=0;i<Brick_num;i++){if(isBrickExisted[i])//砖块存在才判断{brick_left=i*brick_width;brick_right=brick_left+brick_width;brick_bottom=brick_high;if((ball_y==brick_bottom+radius)&&(ball_x>=brick_left)&&(ball_x<=brick_right)){isBrickExisted[i]=0;ball_vy=-ball_vy;}}}
}void updateWithInput()//与用户输入有关的更新
{/*char input;if(kbhit()){input=getch();if(input=='a'&&bar_left>0){bar_x=bar_x-15;//位置左移bar_left=bar_x-bar_width/2;bar_right=bar_x+bar_width/2;}if(input=='d'&&bar_right<Width){bar_x=bar_x+15;//位置左移bar_left=bar_x-bar_width/2;bar_right=bar_x+bar_width/2;}}*/MOUSEMSG m;//定义鼠标信息if(MouseHit())//这个函数用于检测当前是否有鼠标消息{m=GetMouseMsg();//获取一条鼠标消息if(m.uMsg==WM_MOUSEMOVE){//挡板的位置等于鼠标所在的位置bar_x=m.x;bar_y=m.y;bar_left=bar_x-bar_width/2;bar_right=bar_x+bar_width/2;bar_top=bar_y-bar_high/2;bar_bottom=bar_y+bar_high/2;}else if(m.uMsg==WM_LBUTTONDOWN){ball_x=bar_x;//初始化小球的位置为挡板上面中心ball_y=bar_top-radius-3;}}
}void gameover()
{EndBatchDraw();closegraph();
}int main()
{startup();//数据的初始化while(1){clean();//把之前绘制的内容清除updateWithoutInput();//与用户输入无关的更新updateWithInput();//与用户输入有关的更新show();//显示新画面}
}
效果图如下:
项目: 用easyx实现消砖块相关推荐
- 项目: 用数组实现反弹球消砖块
项目:用数组实现反弹球消砖块 一.效果展示: 二.代码如下: 一.效果展示: 二.代码如下: #include<stdio.h> #include<string.h> #inc ...
- 开维控制精灵 Ctrl js 快手小游戏 - 自动消砖块
开维控制精灵 Ctrl.js 快手小游戏 - 自动消砖块 Ctrl.js是基于js语法规则的控制类脚本语言,用于自动化软件测试. Ctrl.js 需要在手机上下载"开维控制精灵", ...
- C语言实现【小游戏——反弹球消砖块】
目录: 1.目标要求: 2.C语言代码: 3.运行结果: 1.目标要求: 1.击中上方方块'H',分数加1 2.下方控制线没有接到小球时,游戏结束 2.C语言代码: #include<stdio ...
- 【C语言】数组反弹球消砖块
数组反弹球消砖块 一.模板 二.反弹球 三.增加挡板 四.消砖块和计数功能 五.最终成果 一.模板 简单的模板,目前由头文件,全局变量,清屏函数,初始化数据,显示画面,与用户有关的更新,与用户无关的更 ...
- VUE+Canvas 实现桌面弹球消砖块小游戏
大家都玩过弹球消砖块游戏,左右键控制最底端的一个小木板平移,接住掉落的小球,将球弹起后消除画面上方的一堆砖块. 那么用VUE+Canvas如何来实现呢?实现思路很简单,首先来拆分一下要画在画布上的内容 ...
- 项目: 用函数实现反弹球消砖块
目录 一.项目描述和最终的成果展示 二.封装后的弹跳小球 三.显示移动挡板 四.反弹小球 五.添加砖块并实现打砖块操作 一.项目描述和最终的成果展示 这是在上一次弹跳小项目上进行了一系列的优化和封装. ...
- C语言之五子棋项目 基于EasyX图形库
C语言之五子棋 前言 一.EasyX图形库下载与安装 1.EasyX图形库下载 2.VS2019设置EasyX图形库 二.五子棋中用到的图形库知识 1.初始化页面 2.文字显示 3.鼠标操作 4.棋盘 ...
- C语言——反弹球消砖块
目录 前言 一.小球代码的重构 函数 二. 实现游戏的边框 三.显示移动挡板 四.反弹小球 五.消除砖块 六.玩家输入 getchar() kbhit() 七.结尾--最后实现的代码 #define ...
- 项目: 用Easyx绘制围棋和象棋的棋盘
目录 一.绘制围棋棋盘 代码如下: 效果图如下: 二.绘制象棋棋盘 代码如下: 效果图如下: 一.绘制围棋棋盘 代码如下: #include<graphics.h> #include< ...
最新文章
- RHEL/Fedora/CentOs的系统服务优化
- js实现kmp算法_「leetcode」459.重复的子字符串:KMP算法还能干这个!
- HTML5火焰文字特效DEMO演示---转载
- 【转】执行Import-SPWeb报错Import-SPWeb : Requested value 'PublishingPages' was not found
- linux搜索pdf文件,桌面应用|如何使用 pdfgrep 从终端搜索 PDF 文件
- 防水耐脏,超大容量双肩包,限时拼团仅需49元
- java canvas旋转_在HTML5 Canvas上将图像旋转90度
- 【Algorithm】冒泡排序
- CCF 2016-4-4游戏
- php面向对象封装mysql_PHP mysqli 扩展库(面向对象/数据库操作封装/事务控制/预编译)...
- 转: android编译过程(流程图)
- Intellij Idea打包jar
- 宝塔面板FTP连接方法
- c语言string函数的用法_C语言基础| 指针和函数
- JavaSE总结(适合Java期末考试复习,JavaSE部分知识回顾)
- 【R语言】结巴分词与词性提取(以“提取知乎问题标题的频繁词前100个形容词”实战为例)(3月25日学习笔记)
- 15款超好用的短链接在线生成器(新浪t.cn、腾讯url.cn)
- Java IO流中偏移量是什么意思
- 微信小程序 + 腾讯位置服务获取全国城市列表
- 视觉目标检测-05:使用目标区域的提取方法(手机iVcam与电脑iVcam之间相机的链接)