打砖块JAVA课程设计报告.docx
《打砖块JAVA课程设计报告.docx》由会员分享,可在线阅读,更多相关《打砖块JAVA课程设计报告.docx(24页珍藏版)》请在冰豆网上搜索。
打砖块JAVA课程设计报告
Java课程设计报告
XX/XX学年第X学期
项目名称:
打砖块游戏
项目负责人:
XXX学号:
XXXXX
同组者:
XXX学号:
XXXXX
同组者:
XX学号:
XXXXX
指导教师:
XXX班级:
XXXXXXX
课程设计时间:
XXXXXXXXXXXXXXXXXXXX
课程设计地点:
XXXXXXXXX
[课程设计目的及要求]
《JAVA程序设计》是计算机相关专业的必修专业基础课程,起实践性、应用性很强。
实践教学环节是必不可少的一个重要环节。
本课程的程序设计专题实际是计算机相关专业学生学习完《JAVA程序设计》课程后,进行的一次全面的综合训练,JAVA程序设计的实际目的是加深对理论教学内容的理解和掌握,使学生较系统地掌握程序设计及其在网络开发中的广泛应用,基本方法及技巧,为学生综合应用所学知识,利用软件工程为基础进行软件开发、并在实践应用方面打下一定基础。
能够针对具体的有一定代表性的综合应用类课题设计、分析,全面掌握面向对象的思想、JAVA语言的应用技巧、方法,通过该课程设计使学生进一步理解和掌握利用JAVA开发综合系统的过程,学会用Eclispe、Jbuilder等开发工具。
同时培养学生的合作意识和团队精神。
培养学生对实际系统的采用面向对象的方法进行分析及设计能力,从而是学生提高JAVA语言运用及开发的综合力。
[课程设计题目]
软件系统名称:
JAVA打砖块
人员安排:
学号
姓名
职责
XX
XXX
界面设计、代码编写
XX
XXX
代码编写、流程图
XX
XXX
程序测试、BUG修复、写报告
任务目的:
1.实现游戏的正常运行;
2.培养JAVA程序开发及设计的兴趣;
3.培养团队合作意识;
[程序中使用的数据结构和符号说明]
HitBrick类
GreenBallThread控制小球路线
xUp,yUp,bouncing定义变量存储16位数值形式
x,y小球坐标
xDx,yDy坐标增量
MAX_X,MAX_Y坐标最大值
renew初始化
label标签
Rx,Ry横板坐标
Brick[]砖块
ball小球
HitBrick()定义小球横板及砖块位置坐标
keyPressd(keyEent)定义小球启动键(按空格键启动)
keyReleased(keyEvent)接收键盘事件侦听器接口)
keyTyped(keyEvent)键入空格键时调用keyEvent
paint(Graphics)对砖块填充颜色
move定义小球的运动轨迹和砖块的消失
main主函数
BallThread类
通过继承Thread类使Ball类线程化,并把小球的弹跳动作放进Run()中执行
Brick类
定义砖块坐标位置和砖块按钮
Ball类
定义小球坐标位置
[程序设计流程]
程序中使用的部分方法解释
开始命令:
空格键
privateJLabellabel;定义一个标签,label=newJLabel("按空格键开始");内容为空格键开始,addKeyListener(this);定义一个键盘监听器,
if(e.getKeyCode()==e.VK_SPACE){
if(renew){
greenBallThread=newBallThread(this);
bouncing=true;
greenBallThread.start();
label.setVisible(false);
}
renew=false;
}
重置并开始游戏
移动命令:
方向键左键和右键
if(e.getKeyCode()==e.VK_LEFT){
Rx=Rx-20;
if(bouncing){
if(Rx<0){
Rx=0;
}
}
else{
if(Rx<0){
Rx=0;
}
else{
x=x-20;
ball.ball_x=x;
}
}
repaint();
}
同开始命令原理,如果键入左键,横版向左移动20个单位(Rx为横板坐标),如果小球还在运动,当横板移到最左侧(Rx=0),不能再向左移动,则横板靠在最左侧(Rx=0),
if(e.getKeyCode()==e.VK_RIGHT){
Rx=Rx+20;
if(bouncing){
if(Rx+80>300){
Rx=220;
}
}
else{
if(Rx+80>300){
Rx=220;
}
else{
x=x+20;
ball.ball_x=x;
}
}
repaint();
}
}
向右移动同向左移动原理,因为定义界面横坐标最大值为300,横板长度80,故Rx=220时碰最右侧
砖块设定:
brick[0]=newBrick(0,60,50,20);
brick[1]=newBrick(50,60,50,20);
brick[2]=newBrick(100,60,50,20);
……
brick[16]=newBrick(200,160,50,20);
brick[17]=newBrick(250,160,50,20);
ball=newBall(150,450,10,10);
publicvoidpaint(Graphicsg){
super.paint(g);
ball.rect.setLocation(x,y);
if(bouncing){
for(inti=0;i<=17;i++){
if(brick[i].visible==true){
switch(i){
case0:
g.setColor(Color.blue);
break;
case1:
g.setColor(Color.cyan);
break;
case2:
g.setColor(Color.gray);
break;
……
case17:
g.setColor(Color.yellow);
break;
}
g.fill3DRect(brick[i].brick_x,brick[i].brick_y,brick[i].brick_width,brick[i].brick_height,true);
}
}
g.setColor(Color.red);
g.fillOval(x,y,10,10);
g.setColor(Color.blue);
g.fillRect(Rx,Ry,80,20);
brick[0]=newBrick(0,60,50,20);设置砖块坐标,ball=newBall(150,450,10,10);和小球的坐标
if(brick[i].visible==true)判断砖块存在,用switch语句,逐个对砖块填充颜色,最后四行代码是分别对小球和横板颜色坐标的定义
小球的移动:
try{
Thread.currentThread().sleep(25);
}
catch(InterruptedExceptionexception){
System.err.println(exception.toString());
}
定义小球的速度,若发生错误,则执行catch语句,打印错误
for(inti=0;i<=17;i++){
if(ball.rect.intersects(brick[i].rect)&&brick[i].visible){
brick[i].visible=false;
yUp=!
yUp;/
}
}
当小球接触到砖块时,砖块不可见(消失)
if(x+5>Rx&&x+5=Ry){
yUp=false;
xDx=(int)(Math.random()*5+2);
yDy=(int)(Math.random()*5+2);
}
判断小球坐标和横板坐标,当小球落在横板坐标之内,小球反弹,小球横坐标和纵坐标都以一个随机值改变后运动
if(xUp==true){
x+=xDx;
}
else{
x-=xDx;
}
if(yUp==true){
y+=yDy;
}
else{
y-=yDy;
}
判断小球横坐标如果在增加,小球横坐标=小球原横坐标+小球横坐标增量,否则小球横坐标=小球原横坐标-小球横坐标增量;纵坐标同理
if(y<=0){
y=0;
ball.ball_y=y;
yUp=true;
xDx=(int)(Math.random()*5+2);
yDy=(int)(Math.random()*5+2);
}
elseif(y>=MAX_Y-15){
yDy=(int)(Math.random()*5+2);
//yUp=false;
break;
}
判断小球到画面顶部(定义顶部的纵坐标为0),小球向下反弹,原理同小球和横板接触的反弹规则,否则,判断小球纵坐标是否大于MAX_Y-15(纵坐标最大值-15),反弹规则改变为横坐标不变,纵坐标随机改变
if(x<=0){
x=0;
ball.ball_x=x;
xUp=true;
xDx=(int)(Math.random()*5+2);
yDy=(int)(Math.random()*5+2);
}
elseif(x>=MAX_X-10){
x=MAX_X-10;
ball.ball_x=x;
xDx=(int)(Math.random()*5+2);
yDy=(int)(Math.random()*5+2);
xUp=false;
}
判断小球到画面最左侧(定义最左侧横坐标为0),向右侧反弹,反弹规则同小球和横板接触的反弹规则,或者小球到画面最右侧,向左反弹,反弹规则同上,(if(x>=MAX_X-10)判断小球是否到右边侧,小球的直径为10)
inti;
for(i=0;i<=17&&brick[i].visible==false;i++){
}
if(i==18){
break;
}
如果所有砖块都不可见,则重新玩
renew=true;//初始化
bouncing=false;
for(inti=0;i<=17;i++){
brick[i].visible=true;
}
xUp=true;
yUp=false;
xDx=1;
yDy=1;
x=150;
y=450;
Rx=120;
Ry=460;//
重新开始,初始化,小球静止,所有砖块可见,小球在横坐标方向,可随横板移动而移动,纵坐标在未开时游戏前不能改变,定义小球横坐标和纵坐标增量都为1,小球初始位置坐标(150,450)横板初始位置坐标(120,460)
[源程序]
importjava.awt.*;
importjavax.swing.*;
importjava.awt.event.*;
importjavax.swing.event.*;
publicclassHitBrickextendsJFrameimplementsKeyListener{
privateBallThreadgreenBallThread;//控制小球的线程
privatebooleanxUp,yUp,bouncing;
privateintx,y,xDx,yDy;//小球坐标,增量
privatefinalintMAX_X=300,MAX_Y=500;
privatebooleanrenew;
privateJLabellabel;
privateintRx,Ry;//横板坐标
privateBrickbrick[]=newBrick[18];//砖块
privateBallball;//小球
publicHitBrick(){
super("打砖块");
Containerpane=getContentPane();//设置空白面板容器
label=newJLabel("按空格键开始");//标签
label.setHorizontalAlignment(JLabel.CENTER);//水平
label.setVerticalAlignment(JLabel.BOTTOM);//垂直
pane.add(label);//向面板里添加标签
xUp=true;//横坐标可以移动
yUp=false;//纵坐标不可以移动
xDx=1;
yDy=1;
x=150;//小球坐标
y=450;
Rx=120;//横板坐标
Ry=460;
renew=true;
bouncing=false;
addKeyListener(this);//键盘监听器
brick[0]=newBrick(0,60,50,20);//砖块坐标
brick[1]=newBrick(50,60,50,20);
brick[2]=newBrick(100,60,50,20);
brick[3]=newBrick(150,60,50,20);
brick[4]=newBrick(200,60,50,20);
brick[5]=newBrick(250,60,50,20);
brick[6]=newBrick(0,90,50,20);
brick[7]=newBrick(50,110,50,20);
brick[8]=newBrick(100,130,50,20);
brick[9]=newBrick(150,130,50,20);
brick[10]=newBrick(200,110,50,20);
brick[11]=newBrick(250,90,50,20);
brick[12]=newBrick(0,160,50,20);
brick[13]=newBrick(50,160,50,20);
brick[14]=newBrick(100,160,50,20);
brick[15]=newBrick(150,160,50,20);
brick[16]=newBrick(200,160,50,20);
brick[17]=newBrick(250,160,50,20);
ball=newBall(150,450,10,10);//球的坐标
setSize(MAX_X,MAX_Y);//窗口大小
setResizable(false);
setVisible(true);//可视化
}
publicvoidkeyPressed(KeyEvente){
if(e.getKeyCode()==e.VK_SPACE){
if(renew){
greenBallThread=newBallThread(this);
bouncing=true;
greenBallThread.start();
label.setVisible(false);
}
renew=false;
}
if(e.getKeyCode()==e.VK_LEFT){
Rx=Rx-20;
if(bouncing){
if(Rx<0){
Rx=0;
}
}
else{
if(Rx<0){
Rx=0;
}
else{
x=x-20;
ball.ball_x=x;
}
}
repaint();
}
if(e.getKeyCode()==e.VK_RIGHT){
Rx=Rx+20;
if(bouncing){
if(Rx+80>300){
Rx=220;
}
}
else{
if(Rx+80>300){
Rx=220;
}
else{
x=x+20;
ball.ball_x=x;
}
}
repaint();
}
}
publicvoidkeyReleased(KeyEvente){}
publicvoidkeyTyped(KeyEvente){}
publicvoidpaint(Graphicsg){
super.paint(g);
ball.rect.setLocation(x,y);
if(bouncing){
for(inti=0;i<=17;i++){
if(brick[i].visible==true){
switch(i){
case0:
g.setColor(Color.blue);
break;
case1:
g.setColor(Color.cyan);
break;
case2:
g.setColor(Color.gray);
break;
case3:
g.setColor(Color.green);
break;
case4:
g.setColor(Color.magenta);
break;
case5:
g.setColor(Color.yellow);
break;
case6:
g.setColor(Color.white);
break;
case7:
g.setColor(Color.black);
break;
case8:
g.setColor(Color.orange);
break;
case9:
g.setColor(Color.pink);
break;
case10:
g.setColor(Color.darkGray);
break;
case11:
g.setColor(Color.red);
break;
case12:
g.setColor(Color.blue);
break;
case13:
g.setColor(Color.cyan);
break;
case14:
g.setColor(Color.gray);
break;
case15:
g.setColor(Color.green);
break;
case16:
g.setColor(Color.magenta);
break;
case17:
g.setColor(Color.yellow);
break;
}
g.fill3DRect(brick[i].brick_x,brick[i].brick_y,brick[i].brick_width,brick[i].brick_height,true);
}
}
g.setColor(Color.red);
g.fillOval(x,y,10,10);
g.setColor(Color.blue);
g.fillRect(Rx,Ry,80,20);
}
else{
for(inti=0;i<=17;i++){
switch(i){
case0:
g.setColor(Color.blue);
break;
case1:
g.setColor(Color.cyan);
break;
case2:
g.setColor(Color.gray);
break;
case3:
g.setColor(Color.green);
break;
case4:
g.setColor(Color.magenta);
break;
case5:
g.setColor(Color.yellow);
break;
case6:
g.setColor(Color.white);
break;
case7:
g.setColor(Color.black);
break;
case8:
g.setColor(Color.orange);
break;
case9:
g.setColor(Color.pink);
break;
case10:
g.setColor(Color.darkGray);
break;
case11:
g.setColor(Color.red);
break;
case12:
g.setColor(Color.blue);
break;
case13:
g.setColor(Color.cyan);
break;
case14:
g.setColor(Color.gray);
break;
case15:
g.setColor(Color.green);
break;
case16:
g.setColor(Color.magenta);
break;
case17:
g.setColor(Color.yellow);
break;
}
g.fill3DRect(brick[i].brick_x,brick[i].brick_y,brick[i].brick_width,brick[i].brick_height,true);
}
g.setColor(Color.red);
g.fillOval(x,y,10,10);
g.setColor(Color.blue);
g.fillRect(Rx,Ry,80,20);
}
}
publicvoidmove(){
while(true){
try{
Thread.currentThread().sleep(25);
}
catch(InterruptedExceptionexception){
System.err.println(exception.toString());
}
for(inti=0;i<=17;i++){
if(ball.rect.intersects(brick[i].rect)&&brick[i].visible){
brick[i].visible=false;
yUp=!
yUp;//打到球不可见
}
}
if(x+5>Rx&&x+5=Ry){
yUp=false;
xDx=(int)(Math.random()*5+2);//小球坐标增量
yDy=(int)(Math.random()*5+2);
}
if(xUp==true){
x+=xDx;//小球左右移动坐标改变
}
else{
x-=xDx;
}
if(yUp==true){
y+=yDy;
}
else{
y-=yDy;
}
if(y<=0){