C++课程设计:打砖块游戏

合集下载

打砖块游戏设计报告(共五则)

打砖块游戏设计报告(共五则)

打砖块游戏设计报告(共五则)第一篇:打砖块游戏设计报告*************面向对象方法及程序设计课程设计报告打砖块游戏的设计与开发分组:第九组组员姓名:******************** 班级:*********** 指导教师: ****完成日期:2014年 06月21日面向对象方法及程序设计课程设计题目:打砖块游戏的开发与设计为了加强计算机科学与技术专业学生的学科实践能力,巩固和强化所学专业知识,提高学生的学习兴趣,本课程设计实践周特别强调理论与实践相结合,利用所学专业知识,进行实践项目的开发,提高学生的实践编程能力和技术文档的写作能力,提高学生的学习兴趣,为后期的学习奠定一定的实践基础。

目录第一章课程设计的目的与要求.............................................................................................3 1.1课程设计目的................................................................................................................3 1.2 课程设计的实验环境...................................................................................................3 1.3 课程设计的预备知识 (3)1.4课程设计要求 (3)1.4.1人员分配,形成课程设计小组............................................................................3 1.4.2 分析课程设计的题目要求.................................................................................3 1.4.3写出详细的设计说明............................................................................................3 第二章课程设计内容.............................................................................................................3 2.1设计思路 (3)2.2功能介绍 (4)2.3相关素材 (4)2.4程序整体设计说明........................................................................................................4 2.5程序部分源代码及注释................................................................................................4 2.6程序结构流程图 (6)2.7程序代码 (6)2.8运行程序 (17)第三章课程设计总结 (17)/ 19 面向对象方法及程序设计课程设计第一章课程设计的目的与要求1.1课程设计目的本次课程设计是计算机科学与技术专业最重要的实践环节之一。

打砖块代码课程设计

打砖块代码课程设计

打砖块代码课程设计一、课程目标知识目标:1. 让学生掌握编程语言的基本语法和结构,理解打砖块游戏的逻辑和规则。

2. 学习运用循环、条件语句和函数等编程概念,实现打砖块游戏的基本功能。

3. 了解游戏开发中的坐标系和碰撞检测原理。

技能目标:1. 培养学生独立编写代码、调试程序和解决问题的能力。

2. 提高学生在团队协作中沟通、分享和共同解决问题的能力。

3. 培养学生的创新思维和审美意识,能够设计美观、有趣的游戏界面。

情感态度价值观目标:1. 激发学生对编程和计算机科学的兴趣,树立学习自信心。

2. 培养学生面对困难和挑战时,保持积极、主动、坚持的态度。

3. 培养学生的团队精神和责任感,学会尊重和欣赏他人的成果。

课程性质:本课程为实践性强的编程课程,结合具体案例,让学生在动手实践中掌握编程知识和技能。

学生特点:学生处于好奇心强、求知欲旺盛的年级,喜欢探索新事物,有一定的逻辑思维能力。

教学要求:注重理论与实践相结合,关注学生个体差异,提供个性化指导,鼓励学生发挥创意,培养解决问题和团队协作能力。

通过本课程的学习,使学生达到预定的学习成果。

二、教学内容1. 编程语言基础:回顾变量、数据类型、运算符等基本概念,确保学生能够熟练运用。

2. 控制结构:讲解循环结构(for、while)、条件语句(if-else)的使用,为游戏逻辑提供支持。

3. 函数与模块:介绍函数的定义、调用和返回值,使学生能够模块化编程,提高代码可读性。

4. 游戏设计原理:学习坐标系、运动和碰撞检测等游戏开发基本原理。

5. 打砖块游戏实现:根据教材相关章节,分解游戏开发步骤,包括:- 游戏界面的设计和绘制- 砖块和球拍对象的创建与控制- 球的运动和碰撞处理- 游戏逻辑和得分系统6. 调试与优化:教授学生如何调试程序、查找和修复错误,以及优化代码性能。

7. 项目实践:安排课时让学生团队协作,完成打砖块游戏的开发,鼓励创新和美化界面。

教学进度安排:- 第一周:复习编程语言基础,讲解控制结构。

C语言小游戏源代码《打砖块》

C语言小游戏源代码《打砖块》

C语言小游戏源代码《打砖块》#include "graphics.h"#include "stdio.h"#include "conio.h" /*所需的头文件*/int on; /*声明具有开关作用的全局变量*/static int score; /*声明静态的记分器变量*//* 定义开始界面函数*/int open(){setviewport(100,100,500,380,1); /*设置图形窗口区域*/ setcolor(4); /*设置作图色*/rectangle(0,0,399,279); /*以矩形填充所设的图形窗口区域*/ setfillstyle(SOLID_FILL,7); /*设置填充方式*/floodfill(50,50,4); /*设置填充范围*/setcolor(8);settextstyle(0,0,9); /*文本字体设置*/outtextxy(90,80,"BALL"); /*输出文本内容*/ settextstyle(0,0,1);outtextxy(110,180,"version 1.0");outtextxy(110,190,"made by ddt");setcolor(128);settextstyle(0,0,1);outtextxy(120,240,"Press any key to continue......");}/*定义退出界面函数*/int quitwindow(){char s[100]; /*声明用于存放字符串的数组*/setviewport(100,150,540,420,1);setcolor(YELLOW);rectangle(0,0,439,279);setfillstyle(SOLID_FILL,7);floodfill(50,50,14);setcolor(12);settextstyle(0,0,8);outtextxy(120,80,"End");settextstyle(0,0,2);outtextxy(120,200,"quit? Y/N");sprintf(s,"Your score is:%d",score);/*格式化输出记分器的值*/ outtextxy(120,180,s);on=1; /*初始化开关变量*/}/*主函数*/main(){int gdriver,gmode;gdriver=DETECT; /*设置图形适配器*/gmode=VGA; /*设置图形模式*/registerbgidriver(EGAVGA_driver); /*建立独立图形运行程序*/ initgraph(&gdriver,&gmode,""); /*图形系统初试化*/ setbkcolor(14);open(); /*调用开始界面函数*/getch(); /*暂停*/while(1) /*此大循环体控制游戏的反复重新进行*/{intdriver,mode,l=320,t=400,r,a,b,dl=5,n,x=200,y=400,r1=10,dx=-2,dy=-2;/*初始化小球相关参数*/intleft[100],top[100],right[100],bottom[100],i,j,k,off=1,m,num[100][ 100];/*方砖阵列相关参数*/static int pp;static int phrase; /*一系列起开关作用的变量*/int oop=15;pp=1;score=0;driver=DETECT;mode=VGA;registerbgidriver(EGAVGA_driver);initgraph(&driver,&mode,"");setbkcolor(10);cleardevice(); /*图形状态下清屏*/clearviewport(); /*清除现行图形窗口内容*/b=t+6;r=l+60;setcolor(1);rectangle(0,0,639,479);setcolor(4);rectangle(l,t,r,b);setfillstyle(SOLID_FILL,1);floodfill(l+2,t+2,4);for(i=0,k=0;i<=6;i++) /*此循环绘制方砖阵列*/ {top[i]=k;bottom[i]=top[i]+20;k=k+21;oop--;for(j=0,m=0;j<=7;j++){left[j]=m;right[j]=left[j]+80;m=m+81;setcolor(4);rectangle(left[j],top[i],right[j],bottom[i]); setfillstyle(SOLID_FILL,j+oop);floodfill(left[j]+1,top[i]+1,4);num[i][j]=pp++;}}while(1) /*此循环控制整个动画*/{while(!kbhit()){x=x+dx; /*小球运动的圆心变量控制*/y=y+dy;if(x+r1>r||x+r1<r){ phrase=0;}if((x-r1<=r||x+r1<=r)&&x+r1>=l){if(y<t)phrase=1;if(y+r1>=t&&phrase==1){dy=-dy;y=t-1-r1;}}if(off==0)continue;for(i=0;i<=6;i++) /*此循环用于判断、控制方砖阵列的撞击、擦除*/for(j=0;j<=7;j++){if((x+r1<=right[j]&&x+r1>=left[j])||(x-r1<=right[j]&&x-r1>=left[j])){if(( y-r1>top[i]&&y-r1<=bottom[i])||(y+r1>=top[i]&&y+r1<=bottom[i] )) {if(num[i][j]==0){continue; }setcolor(10);rectangle(left[j],top[i],right[j],bottom[i]);setfillstyle(SOLID_FILL,10);floodfill(left[j]+1,top[i]+1,10);dy=-dy;num[i][j]=0;score=score+10;printf("%d\b\b\b",score);}}if((y+r1>=top[i]&&y+r1<=bottom[i])||(y-r1>=top[i]&&y-r1<=bottom[i])){if((x+r1>=left[j]&&x+r1<right[j])||(x-r1<=right[j]&&x-r1>left[j])){if(num[i][j]==0){ continue;}setcolor(10);rectangle(left[j],top[i],right[j],bottom[i]);setfillstyle(SOLID_FILL,10);floodfill(left[j]+1,top[i]+1,10);dx=-dx;num[i][j]=0;score=score+10;printf("%d\b\b\b",score);}}}if(x+r1>639) /*控制小球的弹射范围*/{dx=-dx;x=638-r1;}if(x<=r1){dx=-dx;x=r1+1;}if(y+r1>=479){off=0;quitwindow();break;}if(y<=r1){dy=-dy;y=r1+1;}if(score==560){off=0;quitwindow();break;}setcolor(6);circle(x,y,r1);setfillstyle(SOLID_FILL,14);floodfill(x,y,6);delay(1000);setcolor(10);circle(x,y,r1);setfillstyle(SOLID_FILL,10);floodfill(x,y,10);}a=getch();setcolor(10);rectangle(l,t,r,b);setfillstyle(SOLID_FILL,10);floodfill(l+2,t+2,10);if(a==77&&l<=565) /*键盘控制设定*/ {dl=20;l=l+dl;}if(a==75&&l>=15){dl=-20;l=l+dl;}if(a=='y'&&on==1)break;if(a=='n'&&on==1)br</right[j])||(x-r1<=right[j]&&x-r1></t) </r)eak;if(a==27){quitwindow();off=0;}r=l+60;setcolor(4);rectangle(l,t,r,b);setfillstyle(SOLID_FILL,1);floodfill(l+5,t+5,4);delay(100);}if(a=='y'&&on==1) /*是否退出游戏*/ {break;}if(a=='n'&&on==1){ continue;}}closegraph();}。

课程设计基于c打砖块游戏

课程设计基于c打砖块游戏

课程设计基于c 打砖块游戏一、教学目标本次课程的教学目标是让学生通过学习C语言编程,掌握使用C语言开发一个简单的“打砖块”游戏。

具体目标如下:1.理解C语言的基本语法和数据结构。

2.掌握C语言的函数定义和调用。

3.学习C语言的图形库,了解如何绘制图形和处理图形事件。

4.能够使用C语言编写简单的程序。

5.能够使用C语言的图形库开发图形界面。

6.能够独立完成一个简单的“打砖块”游戏的设计和开发。

情感态度价值观目标:1.培养学生对编程的兴趣和热情。

2.培养学生解决问题的能力和创新精神。

3.培养学生团队合作和分享的意识。

二、教学内容本次课程的教学内容主要包括C语言的基本语法、数据结构、函数定义和调用,以及C语言的图形库。

具体安排如下:1.C语言的基本语法和数据结构(2课时)2.C语言的函数定义和调用(2课时)3.C语言的图形库和图形界面设计(2课时)4.“打砖块”游戏的设计和开发(4课时)三、教学方法为了激发学生的学习兴趣和主动性,本次课程将采用多种教学方法,包括讲授法、讨论法、案例分析法和实验法。

1.讲授法:用于讲解C语言的基本语法、数据结构和函数定义和调用。

2.讨论法:用于讨论“打砖块”游戏的设计思路和解决方案。

3.案例分析法:通过分析已有的“打砖块”游戏案例,帮助学生理解游戏开发的流程和技巧。

4.实验法:让学生通过实际编写代码和调试程序,掌握C语言编程和游戏开发的方法。

四、教学资源为了支持教学内容和教学方法的实施,丰富学生的学习体验,我们将准备以下教学资源:1.教材:《C程序设计语言》2.参考书:《C语言编程实例教程》3.多媒体资料:教学PPT、视频教程4.实验设备:计算机、编程软件以上教学资源将帮助学生更好地学习和掌握C语言编程和“打砖块”游戏开发的知识和技能。

五、教学评估本次课程的评估方式包括平时表现、作业和考试三个方面,以全面客观地评价学生的学习成果。

1.平时表现(30%):通过学生在课堂上的参与度、提问回答、小组讨论等表现来评估。

我爱打砖块小游戏教案设计

我爱打砖块小游戏教案设计

我爱打砖块小游戏教案设计教案名称:我爱打砖块小游戏教案设计教学目标:1. 学习基础的编程概念,如变量、条件语句和循环语句。

2. 掌握使用Scratch编程语言设计简单的游戏。

3. 培养学生的逻辑思维和问题解决能力。

教学重点:1. 理解并运用Scratch编程语言的基本概念及其对游戏设计的意义。

2. 学习如何设计和实现一个简单的打砖块小游戏。

3. 培养学生的创造力和团队合作能力。

教学准备:1. 电脑或平板设备,安装了Scratch编辑器的设备。

2. 打砖块小游戏的素材,例如精灵、背景等。

3. PPT或白板、标记笔等。

教学步骤:引入活动:1. 使用PPT展示一些砖块游戏的图片或视频,引起学生对小游戏的兴趣。

导入概念:2. 简要介绍游戏设计的基本概念,如游戏规则、背景等。

教学主体:3. 解释Scratch编辑器的界面和基本功能,包括精灵、舞台、块等。

4. 演示如何使用Scratch创建一个简单的打砖块游戏,涉及到的编程概念如下:a. 创建精灵和背景:学生可以选择自己喜欢的角色作为游戏角色,并设置一个吸引人的背景。

b. 控制角色移动:使用键盘或鼠标控制角色的左右移动。

c. 砖块的生成:使用循环语句生成一定数量的砖块。

d. 碰撞检测:通过判断角色和砖块是否碰撞来判断是否得分。

e. 计分和游戏结束:设计计分系统,并在满足一定条件时结束游戏。

练习与巩固:5. 学生分组或个人进行实践,设计和创建自己的打砖块小游戏。

6. 学生可以分享自己的游戏,展示给其他同学,并互相交流和提供建议。

总结评价:7. 总结游戏设计的基本要点和Scratch的使用技巧。

8. 鼓励学生在未来的学习中尝试设计更复杂的游戏或其他创作。

拓展延伸:9. 学生可以根据自己的兴趣,继续学习更高级的编程语言,如Python或JavaScript,进一步开发更复杂的游戏或应用程序。

教学反思:在教学过程中,要充分考虑学生的编程基础和理解能力。

如果学生对Scratch的使用还不熟悉,可以提供一些Scratch的入门练习,如移动精灵、改变背景颜色等。

c课程设计打砖块

c课程设计打砖块

c 课程设计打砖块一、教学目标本课程的教学目标是使学生掌握C语言的基本语法和编程技巧,学会使用C语言进行程序设计,培养学生的逻辑思维能力和创新能力。

具体分解为以下三个方面的目标:1.知识目标:使学生了解C语言的基本概念、语法规则和编程方法,掌握常用的数据类型、运算符、控制结构、函数等编程基础,理解面向对象编程的基本思想。

2.技能目标:培养学生使用C语言进行程序设计的能力,学会调试和优化程序,能够独立完成中等难度的编程任务。

3.情感态度价值观目标:培养学生对计算机科学的兴趣和热情,增强学生的自信心和自主学习能力,培养学生在面对困难时勇于挑战、积极解决问题的精神。

二、教学内容根据教学目标,本课程的教学内容主要包括以下几个部分:1.C语言的基本概念:变量、数据类型、运算符、表达式等。

2.控制结构:顺序结构、选择结构、循环结构等。

3.函数:函数的定义、声明、调用、返回值等。

4.数组和字符串:一维数组、多维数组、字符串的基本操作等。

5.指针:指针的基本概念、指针与数组、指针与函数等。

6.面向对象编程:类和对象、构造函数、析构函数、继承和多态等。

7.编程实践:使用C语言编写简单的程序,学会调试和优化程序。

三、教学方法为了实现教学目标,本课程将采用以下几种教学方法:1.讲授法:教师讲解C语言的基本概念、语法规则和编程方法,引导学生掌握编程基础。

2.案例分析法:通过分析典型的编程案例,使学生理解编程思想,培养学生的实际编程能力。

3.实验法:安排上机实验,让学生亲自动手编写程序,巩固所学知识,提高编程技巧。

4.讨论法:学生进行小组讨论,分享学习心得和经验,互相促进,共同提高。

四、教学资源为了支持教学内容和教学方法的实施,本课程将采用以下教学资源:1.教材:《C程序设计语言》(K&R著)或《C Primer Plus》(Stephen Prata著)。

2.参考书:《C语言程序设计教程》(谭浩强著)、《C++ Primer》(Stanley B. Lippman著)。

C打砖块源代码

C打砖块源代码

C打砖块源代码1.课程设计的具体工作内容:1) 弹球区域下方为横板接球,上方为砖块。

2) 通过键盘的左、右光标键控制接球横版的移动。

3) 小球落到横板水平线,横板未接注小球,本局结束。

4) 小球弹起碰到的砖块自动打碎、消失。

5) 每隔一定时间(例如5s,可适当调整),砖块上方增加一行,原有砖块下移,砖块增加到横板水平线本局结束结束。

6) 小球与横板为完全弹性碰撞,不考虑能量损耗。

7) 每次游戏开始后有三局(或更多,可适当调整),三局都结束游戏重新开始。

2. 打砖块小游戏C语言源代码:#include#include#include#include#define R 4 /*球半径*/struct box{ int x;int y;int color;}a[6][14];int Keystate;int MouseExist;int MouseButton;int MouseX;int MouseY=400;int dx=1,dy=1; /*计算球的反弹*/int sizex=18,sizey=10; /*box的宽度和长度*/void draw(int x,int y) /* x, y为左上角坐标sizex,sizey 为长和宽*/{int sizx=sizex-1;int sizy=sizey-1;setcolor(15);/*这里最好用白色*/line(x,y,x+sizx-1,y);line(x,y+1,x+sizx-2,y+1);line(x,y,x,y+sizy-1);line(x+1,y,x+1,y+sizy-2);setcolor(8);/*这里最好用深灰色*/line(x+1,y+sizy,x+sizx,y+sizy);line(x+2,y+sizy-1,x+sizx,y+sizy-1);line(x+sizx-1,y+1,x+sizx-1,y+sizy);line(x+sizx,y+2,x+sizx,y+sizy);setcolor(7);/*这里最好用灰色*/putpixel(x,y+sizy,3);putpixel(x+1,y+sizy-1,3);putpixel(x+sizx,y,3);putpixel(x+sizx-1,y+1,3);setfillstyle(1, 7);/*这里最好用灰色,设置填充模式*/ bar(x+2,y+2,x+sizx-2,y+sizy-2);}void picture() /*画box*/{ int i,j;setcolor(15);rectangle(99,49,413,451);for(i=0;i<6;i++)for(j=0;j<14;j++){ a[i][j].color=0;a[i][j].x=104+j*22;a[i][j].y=54+i*14;draw(104+j*22,54+i*14);}sizex=50,sizey=5;}/*鼠标光标显示*/void MouseOn(int x,int y){draw(x,y);}/*隐藏鼠标*/void MouseOff(){int x,y;x=MouseX;y=MouseY;setfillstyle(1,0);bar(x,y,x+sizex,y+sizey);}/*鼠标是否加载MouseExist:1=加载0=未加载MouseButton:鼠标按键数目*/ void MouseLoad() {_AX=0x00;geninterrupt(0x33); MouseExist=_AX; MouseButton=_BX;}/*鼠标状态值初始化*/void MouseReset(){_AX=0x00;geninterrupt(0x33);}/*设置鼠标左右边界lx:左边界gx:右边界*/void MouseSetX(int lx,int rx) { _CX=lx;_DX=rx;_AX=0x07;geninterrupt(0x33);}/*设置鼠标上下边界uy:上边界dy:下边界*/void MouseSetY(int uy,int dy) {_CX=uy;_DX=dy;_AX=0x08;geninterrupt(0x33);}/*设置鼠标当前位置x:横向坐标y:纵向坐标*/void MouseSetXY(int x,int y) {_CX=x;_DX=y;_AX=0x04;geninterrupt(0x33);}/*设置鼠标速度(缺省值:vx=8,vy=1) 值越大速度越慢*/ void MouseSpeed(int vx,int vy){_CX=vx;_DX=vy;_AX=0x0f;geninterrupt(0x33);}/*获取鼠标当前位置*/void MouseGetXY(){_AX=0x03;geninterrupt(0x33);MouseX=_CX;MouseY=_DX;}void MouseStatus()/*鼠标按键情况*/ {int x;int status;status=0;/*默认鼠标没又移动*/x=MouseX;if(x==MouseX&&status==0) /*鼠标没动*/ { MouseGetXY();if(MouseX!=x)if(MouseX+50<413)status=1;}if(status)/*移动情况才重新显示鼠标*/{setfillstyle(1,0);bar(x,MouseY,x+sizex,MouseY+sizey);MouseOn(MouseX,MouseY);/*新位置显示*/ }}void Move(){int ballX; /*球的圆心*/int ballY=MouseY-R;int i,j,t=0;randomize();while(ballX=random(409))if(ballX>=105 && ballX<=408)break;while(kbhit){MouseStatus();if(ballY<=(58-R)) /*碰上反弹*/dy*=(-1);if(ballX>=(413-R)||ballX<=(108-R)) /*碰左右反弹*/ dx*=(-1);setcolor(YELLOW);circle(ballX+=dx,ballY-=dy,R-1);delay(2500);setcolor(0);circle(ballX,ballY,R-1);for(i=0;i<6;i++)for(j=0;j<14;j++) /*判断是否传记撞击box*/if(t<84&&a[i][j].color==0 && ballX>=a[i][j].x && ballX<=a[i][j].x+18&& ballY>=a[i][j].y && ballY<=a[i][j].y+10)dy*=(-1);a[i][j].color=1;setfillstyle(1,0);bar(a[i][j].x,a[i][j].y,a[i][j].x+18,a[i][j].y+10);}if(ballX==MouseX||ballX==MouseX-1||ballX==MouseX-2&&ballX==(MouseX+50+2)||ballX==(MouseX+50+1)||ballX==(MouseX+50)) /* 碰板反弹*/ if(ballY>=(MouseY-R)){ dx*=(-1);dy*=(-1); /*原路返回*/}if(ballX>MouseX && ballX<(MouseX+50)) /*碰板反弹*/ if(ballY>=(MouseY-R))dy*=(-1);if(t==84){ sleep(1);cleardevice();setcolor(RED);settextstyle(0,0,4);outtextxy(100,200,"Win");sleep(1);break;}if(ballY>MouseY){ sleep(1);cleardevice();setcolor(RED);settextstyle(0,0,4);outtextxy(100,200,"Game Over");sleep(1);}}}void main(){int gd=DETECT,gm;initgraph(&gd,&gm,"c:\\tc");picture();MouseSetX(100,362); /*设置鼠标移动的范围*/ MouseSetY(MouseY,MouseY); /*鼠标只能左右移动*/ MouseSetXY(150,MouseY); /*鼠标的初始位置*/ MouseOn(MouseX,MouseY); /*第一次显示鼠标*/ Move();closegraph();}。

《打砖块》游戏设计报告

《打砖块》游戏设计报告

——《打砖块》学院:班级:学号:姓名:一.游戏设计规则游戏开始时,小球会停在挡板正中间,且此时挡板可左右自由移动,当按下空格键后小球会弹出,并在程序设定的区域内不停的碰撞反弹。

当小球碰到墙壁、挡板和砖块时,均会以相反的速度反弹,并且砖块被碰撞后会自动消失。

挡板可左右移动以接住小球,若小球没有被接住,超出指定区域下边缘,则程序会自动提示“游戏结束”,点击“确定”后退出程序。

当所有的砖块均消失时,程序会弹出提示“恭喜你,你赢了”。

二.游戏设计思路整个游戏可以分为三个类:小球类、挡板类和砖块类。

其中最简单的当然是挡板了,在回调函数中增加“WM_KEYDOWN”的按键消息,在里面编写控制挡板移动的代码,挡板的移动是通过“上、下、左、右”四个键来实现的。

砖块在整个程序中负责两件事情,其一是程序初始化时随着小球和挡板出现在游戏界面中,再就是被小球碰到后消失。

控制砖块出现与否是通过一个bool变量“blockExist”来实现的,当该变量为“true”时,就将砖块贴到目标DC上,否则就不贴。

由于砖块数量很多,故可以用一个for循环来实现,所有的砖块用的都是一张图片,而变化的只是砖块的坐标。

本游戏中最复杂的要数小球了,因为小球要涉及到很多碰撞检测和反弹,而且这其中还和砖块、挡板有联系。

小球涉及到的碰撞有:小球与墙壁碰撞、小球与挡板碰撞、小球与砖块碰撞。

碰撞检测实际上是检测小球的坐标是否进入了某个特定的区域,若进入了,则小球要反弹;否则,按原来的路线继续前进。

小球能不断的反弹,事实上靠的是小球速度方向的改变,对于小球而言,它能出现在某个点上,是它所在坐标系中的坐标导致的。

若设小球的坐标为(x_ball,y_ball),其速度为水平:vx,竖直:vy,将其坐标与速度之间建立赋值关系,即:x_ball+=vx,y_ball-=vy。

只要对其坐标进行相对应的计算,就能控制小球的反弹了。

三.游戏主要代码int APIENTRY WinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance,LPSTR lpCmdLine,int nCmdShow){// TODO: Place code here.MSG msg;HACCEL hAccelTable;// Initialize global stringsLoadString(hInstance, IDS_APP_TITLE, szTitle, MAX_LOADSTRING);LoadString(hInstance, IDC_APIDEMOGAME, szWindowClass, MAX_LOADSTRING);MyRegisterClass(hInstance);// Perform application initialization:if (!InitInstance (hInstance, nCmdShow)){return FALSE;}hAccelTable = LoadAccelerators(hInstance, (LPCTSTR)IDC_APIDEMOGAME);// Main message loop:while (GetMessage(&msg, NULL, 0, 0)){if (!TranslateAccelerator(msg.hwnd, hAccelTable, &msg)){TranslateMessage(&msg);DispatchMessage(&msg);}}return msg.wParam;}A TOM MyRegisterClass(HINSTANCE hInstance){WNDCLASSEX wcex;wcex.cbSize = sizeof(WNDCLASSEX);wcex.style = CS_HREDRAW | CS_VREDRAW;wcex.lpfnWndProc = (WNDPROC)WndProc;wcex.cbClsExtra = 0;wcex.cbWndExtra = 0;wcex.hInstance = hInstance;wcex.hIcon = LoadIcon(hInstance, (LPCTSTR)IDI_APIDEMOGAME);wcex.hCursor = LoadCursor(NULL, IDC_ARROW);wcex.hbrBackground = (HBRUSH)(COLOR_WINDOW+1);wcex.lpszMenuName = (LPCSTR)IDC_APIDEMOGAME;wcex.lpszClassName = szWindowClass;wcex.hIconSm = LoadIcon(wcex.hInstance, (LPCTSTR)IDI_SMALL);return RegisterClassEx(&wcex);}BOOL InitInstance(HINSTANCE hInstance, int nCmdShow){hInst = hInstance; // Store instance handle in our global variablehWnd = CreateWindow(szWindowClass, szTitle, WS_OVERLAPPEDWINDOW ,400, 100, 400, 500, NULL, NULL, hInstance, NULL);if (!hWnd){return FALSE;}ShowWindow(hWnd, nCmdShow);UpdateWindow(hWnd);GetClientRect(hWnd,&rect); //取得内部窗口区域大小HBITMAP bmp;m_bg=(HBITMAP)LoadImage(NULL,"matlab.bmp",IMAGE_BITMAP,0,0, LR_LOADFROMFILE);m_board=(HBITMAP)LoadImage(NULL,"Board.bmp",IMAGE_BITMAP,0, 0,LR_LOADFROMFILE);m_ball=(HBITMAP)LoadImage(NULL,"ball_0.bmp",IMAGE_BITMAP,0,0, LR_LOADFROMFILE);bgDC=GetDC(hWnd);mdc=CreateCompatibleDC(bgDC);scDC=CreateCompatibleDC(bgDC);boardDC=CreateCompatibleDC(bgDC);ballDC=CreateCompatibleDC(bgDC);bmp=CreateCompatibleBitmap(bgDC,1024,745);SelectObject(mdc,bmp);SelectObject(scDC,m_bg);SelectObject(ballDC,m_ball);SelectObject(boardDC,m_board);int i;int bx=40,by=30; //控制砖块坐标//初始化砖块for(i=0;i<BN;i++){if(block[i].blockExist)block[i].bKilled=0;block[i].blockDC=CreateCompatibleDC(bgDC);m_block[i]=(HBITMAP)LoadImage(NULL,"block.bmp",IMAGE_BITMAP, 32,21,LR_LOADFROMFILE);SelectObject(block[i].blockDC,m_block[i]);block[i].rc.left=bx;block[i].rc.top=by;block[i].rc.right=block[i].rc.left+64;block[i].rc.bottom=block[i].rc.top+32;bx+=60;}return TRUE;}/********控制小球碰壁后反弹*************/ void DrawBall(){//计算X轴方向贴图坐标与速度x_ball+=vx;if(x_ball<=0){x_ball=0;vx=-vx;bHeng=false;}else if(x_ball>=rect.right-32){x_ball=rect.right-32;vx=-vx;bHeng=true;}//计算Y轴方向贴图坐标与速度y_ball-=vy;if(y_ball<=0){y_ball=0;vy=-vy;bZong=false;}/* if(y_ball>=rect.bottom-32){y_ball= rect.bottom-32;vy=-vy;}*/}/*****判断小球是否与砖块相碰*******/void CheckCrashBlock(){int i;float WIDTH = 96;float HEIGHT = 64;float tan=HEIGHT / WIDTH;//tanθ的值for(i=0;i<BN;i++){float x_ =(float)(x_ball - block[i].rc.left);float y_ =(float)(y_ball - block[i].rc.top);if((x_ball>=block[i].rc.left-32&&x_ball<=block[i].rc.right)&&(y_ball>=bloc k[i].rc.top-32&&y_ball<=block[i].rc.bottom)){block[i].bKilled=1;block[i].blockExist=false;num--;}else if(tan > abs(y_ / x_)) //在1、3区域{vx=-vx;x_ball=vx;}else //在2、4区域{vy=-vy;y_ball-=vy;}*/}}}/*****判断小球是否与挡板相碰******/void CheckCrashBoard(){if((y_ball+32)>y){if(((x_ball+64)>=x)&&(x_ball<=(x+128))){vy=-vy;y_ball-=vy;// vx=10;}else{MessageBox(hWnd,"游戏结束","提示",MB_OK|MB_ICONSTOP);exit(0);}}}void DrawMap(){GetClientRect(hWnd,&rect); //取得内部窗口区域大小int i;if(!win){BitBlt(mdc,0,0,1024,745,scDC,0,0,SRCCOPY);for(i=0;i<BN;i++){CheckCrashBlock();if(block[i].bKilled) //||block[i].blockDC==0continue;else{BitBlt(mdc,block[i].rc.left,block[i].rc.top,block[i].rc.right-block[i].rc.left,blo ck[i].rc.bottom-block[i].rc.top,block[i].blockDC,0,0,SRCCOPY);}}//挡板贴图BitBlt(mdc,x,y,128,32,boardDC,0,0,SRCCOPY);//小球贴图if(isKeyDown){DrawBall();CheckCrashBoard();}BitBlt(mdc,x_ball,y_ball,32,32,ballDC,32,0,SRCAND);BitBlt(mdc,x_ball,y_ball,32,32,ballDC,0,0,SRCPAINT);}//将整个图贴到目的DC上BitBlt(bgDC,0,0,1024,745,mdc,0,0,SRCCOPY);}DWORD WINAPI ThreadProc(LPVOID lpParameter ){void *ct = (void *)lpParameter;while(1){DrawMap();Sleep(80);}delete ct;return 0;}LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam){int wmId, wmEvent;PAINTSTRUCT ps;HDC hdc;void *ct;TCHAR szHello[MAX_LOADSTRING];LoadString(hInst, IDS_HELLO, szHello, MAX_LOADSTRING);GetClientRect(hWnd,&rect);switch (message){case WM_COMMAND:wmId = LOWORD(wParam);wmEvent = HIWORD(wParam);// Parse the menu selections:switch (wmId){case IDM_START:{CreateThread(NULL,1024,ThreadProc,ct,0,NULL);}break;case IDM_STARTAGAIN:{x=300;y=300;x_ball=319;y_ball=270;DrawMap();}break;case IDM_ABOUT:DialogBox(hInst, (LPCTSTR)IDD_ABOUTBOX, hWnd, (DLGPROC)About);break;case IDM_EXIT:DestroyWindow(hWnd);break;default:return DefWindowProc(hWnd, message, wParam, lParam);}break;case WM_PAINT:{hdc = BeginPaint(hWnd, &ps);// TODO: Add any drawing code here...HBITMAPm_bottom=(HBITMAP)LoadImage(NULL,"matlab.bmp",IMAGE_BITMAP,102 4,745,LR_LOADFROMFILE);HDC hDC=CreateCompatibleDC(hdc);SelectObject(hDC,m_bottom);BitBlt(hdc,0,0,1024,745,hDC,0,0,SRCCOPY);DeleteObject(m_bottom);DeleteDC(hDC);ReleaseDC(hWnd,hdc);EndPaint(hWnd, &ps);}break;case WM_KEYDOWN:{switch(wParam){case VK_LEFT:x-=30;if(x<=0)x=0;if(!isKeyDown)x_ball-=30;break;case VK_RIGHT:x+=30;if(x>=rect.right-128)x=rect.right-128;if(!isKeyDown)x_ball+=30;break;case VK_SPACE:isKeyDown=1;break;}}break;case WM_DESTROY:PostQuitMessage(0);KillTimer(hWnd,1);DeleteObject(m_ball);DeleteDC(ballDC);DeleteObject(m_bg);DeleteObject(m_board);DeleteDC(scDC);DeleteDC(boardDC);ReleaseDC(hWnd,bgDC);break;default:return DefWindowProc(hWnd, message, wParam, lParam);}return 0;}// Mesage handler for about box.LRESULT CALLBACK About(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam){switch (message){case WM_INITDIALOG:return TRUE;case WM_COMMAND:if (LOWORD(wParam) == IDOK || LOWORD(wParam) == IDCANCEL){EndDialog(hDlg, LOWORD(wParam));return TRUE;}break;}return FALSE;}四.游戏截图游戏截图(一)游戏截图(二)。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
6、总结
在期末的课程设计中,我选择的是设计一个游戏(打砖块),这对于我们来说是一次尝试与创新的过程,也可以说是一个挑战的过程毕竟以前没有做过这类的课设,缺乏一定的经验,现在利用自己学到的知识设计并制作一个游戏,这本身就是一个知识转化为生产力的过程,所以我很兴奋,投入了很高的热情和努力
在具体设计和实施中,我感受到了一个程序与无到有的过程,对具体的设计步骤,思路,方法,技巧都有了进一步的了解,并且感受深刻。
通过这次的设计,我学到了很多,同时也学到了细心与耐心的培养。我想这在将来的工作或者社会“旅程”中都将起到很大的作用,同时也学会了如何与人相处,与他人配合,共同完成这份作业。
课 程 设 计 报 告
课程名称:面向对象程序设计C++
设计题目:打砖块游戏
专 业:计算机科学与技术
姓 名:
学 号:
指导教师:李 晓 虹
2015 年 12 月 30 日
一、 需求分析
本系统为一个用C#实现的为我们所熟悉的简单的打砖块游戏,该系统的具体功能如下: 能简便的开始游戏,游戏中的功能与日常我们所熟悉的游戏的功能一致 ,直到砖块全部打光过关和在砖块打光之前机会用完游戏结束功能; 当游戏结束时会自动弹出消息框提示本关所获得得分数; 当过关时会出现提示图片,点击进入下一关,下一关的方块位置和所组成的形状。
2、系统运行环境
(1)硬件环境:计算机
(2)软件环境:本系统的设计采用Visual C++6.0编写。在Windows7环境 下测试通过
(3)本游戏软件在Windows平台下都可以运行
三、总体设计
3.1 开发与设计的总体思想
3.1.1 设计思路
随着社会生活节奏的加快,越来越多的人,选择在自己的闲暇时间用玩游戏的方式去缓解自己的生活工作上的压力,所以,此款游戏的最终目标就是给游戏玩家带来一种精神上的放松以及娱乐消遣带来的快乐。所以经过反复仔细的思考,我决定在用一种简单、大方的颜色作为游戏的背景颜色,并且里面插播一首轻音乐来使游戏者感到轻松、愉悦。
四、详细设计
4.1 结构程图
通过结构流程图可以清晰的了解该游戏的具体运行情况,如图所示:
图4-1
4.2 游戏截屏
4.2.1 游戏主界面
图4-2
4.2.2 游戏开始界面
图4-3
4.2.3 游戏失败界面
图4-4
4.2.4 选择游戏关卡界面
图4-5
5、结果分析
经过测试,该系统能够正常运行,可以实现一些基本的操作,如控制方向键盘,对砖块进行左右方向的移动,以及可以进行关卡的设置,和最后结果的统计。在游戏过程中还插入了轻音乐。界面清晰明了,操作简单,可以满足一些游戏爱好者的需要。当然还有很多不足的地方,比如不能够保存当前该游戏者玩的关卡记录等问题。
在设计中我基本按照规范的方法和步骤进行,首先调查这个游戏,并查阅相关资料,然后确定设计方案,最后设计并制作,实施过程中我深刻的认识到认真做游戏的重要性。一开始由于不细心出现了错误,这方面我应该加强。在这次设计中我们两人一组,分工和相互协调很重要,我们扬长避短,各及所长和合作意识并有效地缩短开发时间。
3.2功能介绍
1) 游戏设计游戏开始时,小球会停在挡板正中间,而且此时小球可以随着挡板左右自由移动,当按下空格键小球弹出,并在程序设定的区域中不停碰撞反弹。
2) 当小球碰撞到墙壁、挡板、和砖块的时候,均以相同的速度反弹,并且砖块被碰撞后会以相同的速度反弹,并且当砖块被碰撞后会消失。
3) 挡板可以左右移动以接住小球,若超过三次没有接住,则游戏结束,按退出键退出,当所有砖块全部打光时则出现进入下一关的提示框,点击进入下一关。
相关文档
最新文档