前言
实习时间:
实习学时:36学时
实习地点:北京科技大学信息楼
Java是一种可以撰写跨平台应用软件的面向对象的程序设计语言,是由Sun 公司于1995年5月推出的Java程序设计语言和Java平台的总称。Java 技术具有卓越的通用性、高效性、平台移植性和安全性,广泛应用于个人PC、数据中心、游戏控制台、科学超级计算机、移动电话和互联网,同时拥有全球最大的开发者专业社群。在全球云计算和移动互联网的产业环境下,Java更具备了显著优势和广阔前景。
Java 编程语言的风格十分接近C、C++语言。Java是一个纯的面向对象的程序设计语言,它继承了 C++语言面向对象技术的核心。Java舍弃了C ++语言中容易引起错误的指针、运算符重载、多重继承等特性,增加了垃圾回收器功能用于回收不再被引用的对象所占据的内存空间,使得程序员不用再为内存管理而担忧。在 Java 1.5 版本中,Java 又引入了泛型编程、类型安全的枚举、不定长参数和自动装/拆箱等语言特性。
Java 不同于一般的编译执行计算机语言和解释执行计算机语
言。它首先将源代码编译成二进制字节码,然后依赖各种不同平台上的虚拟机来解释执行字节码。从而实现了“一次编译、到处执行”的跨平台特性。不过,每次的执行编译后的字节码需要消耗一定的时间,这同时也在一定程度上降低了 Java 程序的运行效率。
实习目的和要求
认识实习是教学计划的主要部分之一, 它是培养学生实践能力和解决实际问题的第三课堂,它是专业知识培养的摇篮,也是对专业的实际应用和工作需求直接的认识与认知。实习中应该深入实际,认真观察,大胆实践,获取直接经验,巩固所学基本理论,保质保量完成指导老师所布置的任务。要习惯本专业工作的性质,要学会耐得住寂寞,在看似枯燥的编程中寻找兴趣点,大胆想象,培养我们的实践能力和创新能力, 开拓视野, 培养实际中研究、 观察、 分析、解决问题的能力。
认识实习是我们工科学生的一门必修课,通过认识实习,我们要对通信工程专业建立感性认识, 并进一步了解专业的学习实践环节,
培养自己专业的思想。 通过接触实际实习过程,一方面,达到对所学专业的性质、内容及其在工程技术领域中的地位有一定的认识, 为了解和巩固专业思想创造条件,在实践中了解专业、熟悉专业、热爱专业。另一方面,巩固、加深理解在课堂所学的理论知识,让自己的
理论知识更加扎实,专业技能更加过硬,更加善于理论联系实际。再有,通过分析利用编程解决生活中的小问题为进一步学习技术基础和专业知识奠定基础。
认知实习的过程中学生是以假想技术人员的身份完成老师布置的任务,在实习中应深入实际,认真实习,获取直接知识,巩固所学理论,培养和锻炼独立分析问题和 解决问题的能力。丰富和扩大学生的专业知识领域,也培养了学生的团结合作精神,牢固树立学生的群体意识,即个人智慧只 有在融入集体之中才能最大限度地发挥作用,让我们对于以后所担任的角色及工作内容有了更深的了解和体会,对于我们以后的实习和工作都是有很大帮助的。
实习要求
学生必须在教师指导下,按照实习大纲和实习计划进行实习,努力完成实习任务。
严格遵守学校的规章制度。实习期间要严格考勤,病假由指导教师批准,两天以上必须有医院诊断证明,超过一周时要及时向学院汇报。学生一般不得请事假,特殊情况需请事假时,三天以内由负责教师批准,三天以上报学院审批。无故不参加实习两天者由负责教师负责报学院给予通报批评;无故不参加实习三天(含)以上者,其成绩按不及格处理。
实习缺课三分之一以上天数者不予评定成绩。不交实习报告者,不得参加考核,其成绩按“0” 计。
严格遵守实验室的有关规章制度,对违反纪律的学生要进行批评教育,对情节严重者要及时向学院汇报处理,可取消其本次实习资格,其成绩按“0”分处理。
1、 实习期间应该注意自己的着装,不能穿背心、短裤和拖鞋
2、 实习期间一定要听从老师的指挥,认真遵守该有的课堂纪律,按时到教室,不擅自离开
3、 实习期间仔细观察,认真听老师和专家的讲解,遇到不懂得地方可以提出来,随时做笔记
实习所用工具介绍
Windows XP系统电脑一台,eclipse编程软件
实习内容
1.需求分析
俄罗斯方块是一个经典的小游戏,由于它简单有趣,因而得到了广泛的流行,男女老幼都适合。而俄罗斯方块游戏的设计工作复杂且富有挑战性,它包含的内容多,涉及的知识广泛,与图形界面联系较大,包括界面的显示与更新、 数据收集等,在设计的过程中,必将运用到各方面的知识,这对于我的认识实习及专业认知是有很大帮助
的。
2.系统功能设计
1. 本系统主要设计以下几种功能
1、游戏难度选择功能
如果玩家不选难度直接按“开始游戏”, 则使用默认的难度5,难度最高等级为10。
2、方块下落、变形功能
键盘上的左、右、下、上的箭头分别代表方块的向左、向右、向下、变形的功能。
3.升级功能
在游戏过程中能自主更改难度系数,如果觉得速度过慢,则可按“提高级数”,若过快,则可按“降低级数”
4.暂停功能
在游戏中方便暂时离开设置了“游戏暂停”功能。
5.帮助功能
界面中的帮助,能够使游戏者更好的使用该小游戏界面
6.界面设定
界面左侧为游戏区,上面有“游戏”“控制”“帮助”三个选项,右上方为下一个方块的提示,下方为等级和得分。
技术难点
因为是第一次使用java编程,所以对于基础应用还是不太会,如果只是看所谓的基础介绍,感觉短短两周是无法完成任务的。因为想到要做俄罗斯方块,众多类的建立会是个问题,而且俄罗斯方块看似简单,可是界面的布置,具体细节的功能实现
3.系统功能设计分析 1. 俄罗斯方块游戏根据功能的不同,设置了如下8个 类ErsBlocksGame,GameCanvas、ErsBlock、boolean、ControlPanel、JMenuBar、JMenu、JMenuItem。
每个类的描述如下:
2.1、ErsBlocsGAME
这个类中定义了生成方块的方法,用二维数组 int[][] pattern,存放 7 种方块的四种状态。在构造方法中以随机的形式生成方块,同 时提供了以下几种方法: 分别实现方块的重画、翻转、左移、右移、下落、同步显示等功能。
2.2、Command,处理控制类。这是一个实现 ActionListener 接口的类,主要处 理点击按钮事件。类中定义了三个 int 型变量:button_play,button_quit, button_pause,和一个 boolean 型的变量:pause_resume,并赋值。在 GameArea 类中通过事件响应,在按钮执行方法中调用其值,使用 switch 语句,根据不同 按钮不同的值,来响应不同的事件。 2.3、GameArea,游戏界面类。GameArea 继承了 JFrame,是俄罗斯方块的主要游 戏界面。这个类定义了 GameSetting 类的 gameScr 对象和 ImagePanel 类的 imagepanel 对象作为游戏区域面板和控制区域面板。在游戏区域,主要是根据 相应格子的设置标志来显示相应的图形图片,这样就实现了俄罗斯方块的实时显 示。 2.4、GameSetting, 游戏画布类。这个类生成的对象将作为游戏界面的方块下落 区域,画布的设置为 15 行 10 列,当中的方格边长为 30,类中还定义了一个二 维数组 int [][] scrArr 作为屏幕数组,表示每一个方格。游戏区域中每一个方 格是否存在游戏方块是由该方格的值来决定的,如果该方格的值为 1,则表示该 方格中存在游戏方块;如果该方格中的值为 0,则表示该方格中不存在游戏方 块,因此二维数组用于记录游戏区域中每个小方格的值。此外,类中还定义了画 方块的方法,根据不同的难度画出不同颜色的方块。单击 Play 按钮时,系统调 用 initScr( )方法,初始化屏幕,将屏幕数组清零。当满足满行删除的条件时, 系统调用 deleteFullLine( )方法,进行删行加分,而且每删除十行,难度自动 增加一级,方块颜色改变,并在难度显示框中相应显示。
2.5、GameOver,游戏结束弹出提示框类。当游戏结束时,系统弹出提示,包括 玩家分数以及询问玩家要继续游戏还是退出。 2.6、Help,帮助类。在游戏界面,按 F1 键,弹出提示窗口,获取帮助。 2.7、ImagePanel,背景图片类。这个类继承了 JPanel 类,用来作为游戏界面中 控制区域的容器,并添加图片。 2.8、JieMian,主界面类。这个类继承了 JPanel 类,作为游戏的第一个界面, 也是难度选择界面。定义了 9 个单选按钮,当玩家未选任何难度就按 Enter 时, 系统会弹出一个提示框,提示玩家先选难度再进入。 2.9、MyPanel,重写 MyPanel 类,使 Panel 的四周留空间。 2.10、MyTimer,定时线程类。类中定义了一个 run()方法,用 sleep()函数 实现方块下落的快慢,即调节难度。 2.11、PlayMidi,添加音乐类。在游戏过程中添加背景音乐。 2.12、WinListener,关闭窗口类。
第二篇:java俄罗斯方块实验报告
import javax.swing.JFrame;
public class Game {
public static void main(String[] args){
ShapeFactory shapeFactory=new ShapeFactory();
Ground ground =new Ground();
GamePanel gamePanel=new GamePanel();
Controller controller=new Controller(shapeFactory,ground,gamePanel); JFrame frame =new JFrame("俄罗斯方块");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setSize(gamePanel.getSize().width+10,gamePanel.getSize().height+35);
frame.add(gamePanel);
gamePanel.addKeyListener(controller);
frame.addKeyListener(controller);
frame.setVisible(true);
controller.newGame();
}
}
import java.awt.event.KeyAdapter;
import java.awt.event.KeyEvent;
//处理按键事件,处理逻辑
public class Controller extends KeyAdapter implements ShapeListener{ private Shape shape;
private ShapeFactory shapeFactory;
private Ground ground;
private GamePanel gamePanel;
public void keyPressed(KeyEvent e) { switch(e.getKeyCode()){ case KeyEvent.VK_UP: if(ground.isMoveable(shape, Shape.ROTATE)) shape.roate(); break; case KeyEvent.VK_DOWN:
} if(ground.isMoveable(shape, Shape.DOWN)) shape.moveDown(); break; if(ground.isMoveable(shape, Shape.LEFT)) case KeyEvent.VK_LEFT: shape.moveLeft(); break; case KeyEvent.VK_RIGHT: } if(ground.isMoveable(shape, Shape.RIGHT)) shape.moveRight(); break; gamePanel.display(ground, shape); //下面这个方法“synchronized”是同步的意思。因为有多个线程用到这个方法 public synchronized boolean isShapeMoveDown(Shape shape) { } @Override public void shapeMoveDown(Shape shape) { } public void newGame(){ } shape=shapeFactory.getShape(this); gamePanel.display(ground, shape); if(ground.isMoveable(shape, Shape.DOWN)) return true; ground.accept(this.shape);//图形变成障碍物 if(!ground.isFull()){ this.shape=shapeFactory.getShape(this);//产生一个新的图形 } if(ground.isFull()){ } return false; System.exit(0);
public Controller(ShapeFactory shapeFactory,Ground ground,GamePanel gamePanel){
}
} this.gamePanel=gamePanel; this.ground=ground; this.shapeFactory=shapeFactory;
import java.awt.Color;
import java.awt.Graphics;
import javax.swing.JPanel;
//整个游戏面板
public class GamePanel extends JPanel {
private Ground ground; private Shape shape;
//显示的方法
public void display(Ground ground,Shape shape){
}
protected void paintComponent(Graphics g) {
}
public GamePanel(){
}
} this.setSize(Global.WIDTH*Global.CELL_SIZE,Global.HEIGHT*Global.CELL_SIZE); //重新显示 g.setColor(new Color(0xcfcfcf)); g.fillRect(0,0,Global.WIDTH*Global.CELL_SIZE,Global.HEIGHT*Globalif(shape!=null&&ground!=null){ shape.drawMe(g); ground.drawMe(g); } System.out.println("GamePanel's display"); this.repaint(); this.shape=shape; this.ground=ground; .CELL_SIZE);
public class Global {
} public static final int CELL_SIZE =20; public static final int WIDTH = 15; public static final int HEIGHT = 15;
import java.awt.Graphics;
//存放障碍物的类
public class Ground {
private int[][] obstacles=new int[Global.WIDTH][Global.HEIGHT]; //障碍物 public void accept(Shape shape){//接受图形,把图形变成障碍物 System.out.println("Ground's accept"); } private void deleteFullLine(){ for(int y = Global.HEIGHT-1;y>=0;y--){//判断是否满行一行一行的判断,for(int x=0;x<4;x++){ } for(int y = Global.HEIGHT-1;y>=0;y--){ deleteFullLine(); } for(int y=0;y<4;y++){ } if(shape.isMember(x, y,false)){ } obstacles[shape.getLeft()+x][shape.getTop()+y]=1; 从最下面一行开始判断
boolean full=true;
for(int x=0;x<Global.WIDTH;x++){//判断这行是否有空白 if(obstacles[x][y]==0) } full=false;//如果有一列有空白。。则full=false if(full){ deleteLine(y);//消除这一行 }
} } private void deleteLine(int lineNum){//消除这一行的方法 } public void drawMe(Graphics g){ } public boolean isMoveable(Shape shape,int action){ int left=shape.getLeft(); int top=shape.getTop(); switch(action){ case Shape.LEFT: } for(int x=0;x<4;x++){ for(int y=0;y<4;y++){ if(shape.isMember(x,y,action==Shape.ROTATE)){ if(top + left--; break; left++; break; top++; break; System.out.println("Ground's drawMe"); for(int x=0;x<Global.WIDTH;x++){ } for(int y=0;y<Global.HEIGHT;y++){ } if(obstacles[x][y]==1){ } g.fill3DRect(x*Global.CELL_SIZE, y*Global.CELL_SIZE, Global.CELL_SIZE, Global.CELL_SIZE, true); for(int y=lineNum;y>0;y--){//满行的地方起,以上的行总体下一行 for(int x=0;x<Global.WIDTH;x++){ } for(int x=0; x<Global.WIDTH;x++){//第一行全部变成空白 obstacles[x][0]=0; } } obstacles[x][y]=obstacles[x][y-1]; case Shape.RIGHT: case Shape.DOWN:
y>=Global.HEIGHT||left+x<0||left+x>=Global.WIDTH||
obstacles[left+x][top+y]==1)//超出边界或者对应位置是障碍物返回false
} } } return true; } } return false; public boolean isFull(){ } for(int x=0;x<Global.WIDTH;x++){ } return false; if(obstacles[x][0]==1)//判断第一行是否有障碍物 return true;
import java.awt.Color;
import java.awt.Graphics;
//各种形状的方块
public class Shape {
public static final int ROTATE=0; public static final int LEFT=1; public static final int RIGHT=2; public static final int DOWN=3; private int[][]body; private int status; private int left; private int top; private ShapeListener listener;
//3个移动的方法:left,right,down。。没有向上的还有一个旋转的方法 public void moveLeft(){
}
public void moveRight(){ System.out.println("Shape's moveLeft"); left--;
} System.out.println("Shape's moveRight"); left++;
public void moveDown(){
}
public void roate(){
}
//显示方块的方法
public void drawMe(Graphics g){
}
private boolean getFlagByPoint(int x,int y){
}
private class ShapeDriver implements Runnable{
public void run() { while(listener.isShapeMoveDown(Shape.this)){ moveDown(); listener.shapeMoveDown(Shape.this); try { Thread.sleep(1000); } catch (InterruptedException e) { } int tempstatus=status; if(rotate){ } return body[tempstatus][y*4+x]==1; tempstatus=(status+1)%body.length; return body[status][y*4+x]==1; System.out.println("Shape's frawMe"); g.setColor(Color.BLUE); for(int x=0;x<4;x++){ for(int y=0;y<4;y++){ if(getFlagByPoint(x,y)){ System.out.println("Shape's roate"); status=(status+1)%body.length; System.out.println("Shape's moveDown"); top++; g.fill3DRect((left+x)*Global.CELL_SIZE ,(y+top)*Global.CELL_SIZE, } } } Global.CELL_SIZE,Global.CELL_SIZE,true); public boolean isMember(int x,int y,boolean rotate){
} } } } e.printStackTrace();
public Shape(){
}
public void addShapeListener(ShapeListener l){
}
public void setBody(int body[][]){
}
public void setStatus(int status){
}
public int getTop(){
}
public int getLeft(){
}
} return left; return top; this.status=status; this.body=body; if(l!=null) this.listener=l; new Thread(new ShapeDriver()).start();
import java.util.Random;
public class ShapeFactory {
private int shapes [][][]=new int[][][]{//7个 {
{ 1,0,0,0, 1,1,1,0, }, { 1,1,0,0, 1,0,0,0, 0,0,0,0, 0,0,0,0,
}, 1,0,0,0, 0,0,0,0, { 1,1,1,0, 0,0,1,0, }, { 0,1,0,0, 0,1,0,0, 1,1,0,0, 0,0,0,0, 0,0,0,0, 0,0,0,0,
}
},
{
{ 0,0,1,0, 1,1,1,0,
0,0,0,0, 0,0,0,0,
},
{ 1,0,0,0, 1,0,0,0,
1,1,0,0, 0,0,0,0,
},
{ 1,1,1,0, 1,0,0,0,
0,0,0,0, 0,0,0,0,
},
{ 1,1,0,0, 0,1,0,0,
0,1,0,0, 0,0,0,0,
}
},
{
{ 1,1,0,0, 0,1,1,0,
0,0,0,0, 0,0,0,0,
},
{ 0,1,0,0, 1,1,0,0,
1,0,0,0, 0,0,0,0,
},
{ 1,1,0,0, 0,1,1,0,
0,0,0,0, 0,0,0,0,
},
{ 0,1,0,0, 1,1,0,0,
1,0,0,0, 0,0,0,0,
}
},
{
{ 0,1,1,0, 1,1,0,0,
0,0,0,0, 0,0,0,0,
},
{ 1,0,0,0, 1,1,0,0,
0,1,0,0, 0,0,0,0,
},
}; }, { }, { } { 0,1,1,0, 1,1,0,0, }, { 1,0,0,0, 1,1,0,0, } 0,1,0,0, 0,0,0,0, 0,0,0,0, 0,0,0,0, { 1,1,1,1, 0,0,0,0, }, { 1,0,0,0, 1,0,0,0, }, { 1,1,1,1, 0,0,0,0, }, { 1,0,0,0, 1,0,0,0, } 1,0,0,0, 1,0,0,0, 0,0,0,0, 0,0,0,0, 1,0,0,0, 1,0,0,0, 0,0,0,0, 0,0,0,0, { 0,1,1,0, 0,1,1,0, }, { 0,1,1,0, 0,1,1,0, }, { 0,1,1,0, 0,1,1,0, }, { 0,1,1,0, 0,1,1,0, } 0,0,0,0, 0,0,0,0, 0,0,0,0, 0,0,0,0, 0,0,0,0, 0,0,0,0, 0,0,0,0, 0,0,0,0,
public Shape getShape(ShapeListener listener){//产生不同形状的图形 System.out.println("ShapeFactory's getShape");
Shape shape=new Shape();
shape.addShapeListener(listener);
int type= new Random().nextInt(shapes.length);
shape.setBody(shapes[type]);
shape.setStatus(0);
return shape;
}
}
public interface ShapeListener {
boolean isShapeMoveDown(Shape shape); } void shapeMoveDown(Shape shape);