20135129李畅宇实验三

《Java程序设计》课实验报告

班级:201351              姓名及学号:李畅宇 20135129

指导教师:娄佳鹏            必修/选修:选修

实验日期: 2015年6月4日      实验时间: 15:30~17:30

实验序号:(三)           成绩:

实验步骤

(一)敏捷开发与XP

学习软件工程的标准和流程,其中主要以敏捷开发流程为主,而其中有一极限编程作为学习流程的主要软件开发方法。包括:编码,测试,倾听,设计,作为学习者,我主要关注和研究了编码标准、结对编程、代码集体所有、测试、重构等。

(二)编码标准

编码是一个即主观又客观的过程,每个程序员都有他自己的编程风格,但是不管到底是怎么编程,都要有一个良好的编程风格,而这个风格,就是编程标准,让代码具有了良好的可读性。

实验过程记录:

(三)结对编程

结对编程是我新认识的编程形式,总体来说就是两个人进行一边编程一边测试的过程。我(20135127)和李畅宇(20135129)组成了小组,进行了小游戏和其他小程序的开发。

在试验中,我俩对于团队精神和合作有了新的认识,相互决策,相互帮助,由于实验楼问题多,所以我和他分别敲了一部分代码,再结合到一起构成完整代码。

(四)版本控制

对于大型的软件编程,一定会有很多个程序员对整个软件工程进行修缮和维护,在这之间,必然会产生很多个软件版本,为了能够更好的保证代码的安全和高效,产生了代码仓库。

本次实验,我们用了实验楼我的代码库,进行了代码库的开通以及git的实验练习。

实验过程记录:

(五)重构

对于程序的维护和开发便利,重构对于程序员应该说是一个很有利的工具,主要体现在对于大规模程序和代码段的修改中极大的提高效率和安全性。

主要包括,修改名称,对于方法、变量名、常量、类、接口以及参数对象等java编程常常修改和更正的地方。

实验过程记录:

(六)实践项目

本次java项目选择了“俄罗斯方块”,在试验过程中,使用到了GUI用户界面显示,并同时试写了测试代码。

通过不断地磨合与协作,小游戏成功的运行,并进行了试玩,效果良好,未发现结果错误。

实验过程记录:

import javax.swing.*;

import java.awt.*;

import java.awt.event.*;

//20135127陶俊杰

/**

* 游戏主类,继承自JFrame类,负责游戏的全局控制。

* 内含

* 1, 一个GameCanvas画布类的实例引用,

* 2, 一个保存当前活动块(ErsBlock)实例的引用,

* 3, 一个保存当前控制面板(ControlPanel)实例的引用;

*/

public class ErsBlocksGame extends JFrame {

/**

*  每填满一行计多少分

*/

public final static int PER_LINE_SCORE = 100;

/**

* 积多少分以后能升级

*/

public final static int PER_LEVEL_SCORE = PER_LINE_SCORE * 20;

/**

* 最大级数是10级

*/

public final static int MAX_LEVEL = 10;

/**

* 默认级数是5

*/

public final static int DEFAULT_LEVEL = 5;

private GameCanvas canvas;

private ErsBlock block;

private boolean playing = false;

private ControlPanel ctrlPanel;

private JMenuBar bar = new JMenuBar();

private JMenu

mGame = new JMenu("Game"),

mControl = new JMenu("Control"),

mWindowStyle = new JMenu("WindowStyle"),

mInfo = new JMenu("Information");

private JMenuItem

miNewGame = new JMenuItem("New Game"),

miSetBlockColor = new JMenuItem("Set Block Color ..."),

miSetBackColor = new JMenuItem("Set Background Color ..."),

miTurnHarder = new JMenuItem("Turn up the level"),

miTurnEasier = new JMenuItem("Turn down the level"),

miExit = new JMenuItem("Eixt"),

miPlay = new JMenuItem("Play"),

miPause = new JMenuItem("Pause"),

miResume = new JMenuItem("Resume"),

miStop = new JMenuItem("Stop"),

miAuthor = new JMenuItem("Author : [email protected]"),

miSourceInfo = new JMenuItem("You can get the source code / document by email");

private JCheckBoxMenuItem

miAsWindows = new JCheckBoxMenuItem("Windows"),

miAsMotif = new JCheckBoxMenuItem("Motif"),

miAsMetal = new JCheckBoxMenuItem("Metal", true);

/**

* 主游戏类的构造函数

* @param title String,窗口标题

*/

public ErsBlocksGame(String title) {

super(title);

setSize(315, 392);

Dimension scrSize = Toolkit.getDefaultToolkit().getScreenSize();

setLocation((scrSize.width - getSize().width) / 2,

(scrSize.height - getSize().height) / 2);

createMenu();

Container container = getContentPane();

container.setLayout(new BorderLayout(6, 0));

canvas = new GameCanvas(20, 12);

ctrlPanel = new ControlPanel(this);

container.add(canvas, BorderLayout.CENTER);

container.add(ctrlPanel, BorderLayout.EAST);

addWindowListener(new WindowAdapter() {

public void windowClosing(WindowEvent we) {

stopGame();

System.exit(0);

}

});

addComponentListener(new ComponentAdapter() {

public void componentResized(ComponentEvent ce) {

canvas.fanning();

}

});

show();

canvas.fanning();

}

/**

* 让游戏“复位”

*/

public void reset() {

ctrlPanel.reset();

canvas.reset();

}

/**

* 判断游戏是否还在进行

* @return boolean, true-还在运行,false-已经停止

*/

public boolean isPlaying() {

return playing;

}

/**

* 得到当前活动的块

* @return ErsBlock, 当前活动块的引用

*/

public ErsBlock getCurBlock() {

return block;

}

/**

* 得到当前画布

* @return GameCanvas, 当前画布的引用

*/

public GameCanvas getCanvas() {

return canvas;

}

/**

* 开始游戏

*/

public void playGame() {

play();

ctrlPanel.setPlayButtonEnable(false);

miPlay.setEnabled(false);

ctrlPanel.requestFocus();

}

/**

* 游戏暂停

*/

public void pauseGame() {

if (block != null) block.pauseMove();

ctrlPanel.setPauseButtonLabel(false);

miPause.setEnabled(false);

miResume.setEnabled(true);

}

/**

* 让暂停中的游戏继续

*/

public void resumeGame() {

if (block != null) block.resumeMove();

ctrlPanel.setPauseButtonLabel(true);

miPause.setEnabled(true);

miResume.setEnabled(false);

ctrlPanel.requestFocus();

}

/**

* 用户停止游戏

*/

public void stopGame() {

playing = false;

if (block != null) block.stopMove();

miPlay.setEnabled(true);

miPause.setEnabled(true);

miResume.setEnabled(false);

ctrlPanel.setPlayButtonEnable(true);

ctrlPanel.setPauseButtonLabel(true);

}

/**

* 得到当前游戏者设置的游戏难度

* @return int, 游戏难度1-MAX_LEVEL

*/

public int getLevel() {

return ctrlPanel.getLevel();

}

/**

* 让用户设置游戏难度

* @param level int, 游戏难度1-MAX_LEVEL

*/

public void setLevel(int level) {

if (level < 11 && level > 0) ctrlPanel.setLevel(level);

}

/**

* 得到游戏积分

* @return int, 积分。

*/

public int getScore() {

if (canvas != null) return canvas.getScore();

return 0;

}

/**

* 得到自上次升级以来的游戏积分,升级以后,此积分清零

* @return int, 积分。

*/

public int getScoreForLevelUpdate() {

if (canvas != null) return canvas.getScoreForLevelUpdate();

return 0;

}

/**

* 当分数累计到一定的数量时,升一次级

* @return boolean, ture-update successufl, false-update fail

*/

public boolean levelUpdate() {

int curLevel = getLevel();

if (curLevel < MAX_LEVEL) {

setLevel(curLevel + 1);

canvas.resetScoreForLevelUpdate();

return true;

}

return false;

}

/**

* 游戏开始

*/

private void play() {

reset();

playing = true;

Thread thread = new Thread(new Game());

thread.start();

}

/**

* 报告游戏结束了

*/

private void reportGameOver() {

JOptionPane.showMessageDialog(this, "Game Over!");

}

/**

* 建立并设置窗口菜单

*/

private void createMenu() {

bar.add(mGame);

bar.add(mControl);

bar.add(mWindowStyle);

bar.add(mInfo);

mGame.add(miNewGame);

mGame.addSeparator();

mGame.add(miSetBlockColor);

mGame.add(miSetBackColor);

mGame.addSeparator();

mGame.add(miTurnHarder);

mGame.add(miTurnEasier);

mGame.addSeparator();

mGame.add(miExit);

mControl.add(miPlay);

mControl.add(miPause);

mControl.add(miResume);

mControl.add(miStop);

mWindowStyle.add(miAsWindows);

mWindowStyle.add(miAsMotif);

mWindowStyle.add(miAsMetal);

mInfo.add(miAuthor);

mInfo.add(miSourceInfo);

setJMenuBar(bar);

miPause.setAccelerator(

KeyStroke.getKeyStroke(KeyEvent.VK_P, KeyEvent.CTRL_MASK));

miResume.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_ENTER, 0));

miNewGame.addActionListener(new ActionListener() {

public void actionPerformed(ActionEvent ae) {

stopGame();

reset();

setLevel(DEFAULT_LEVEL);

}

});

miSetBlockColor.addActionListener(new ActionListener() {

public void actionPerformed(ActionEvent ae) {

Color newFrontColor =

JColorChooser.showDialog(ErsBlocksGame.this,

"Set color for block", canvas.getBlockColor());

if (newFrontColor != null)

canvas.setBlockColor(newFrontColor);

}

});

miSetBackColor.addActionListener(new ActionListener() {

public void actionPerformed(ActionEvent ae) {

Color newBackColor =

JColorChooser.showDialog(ErsBlocksGame.this,

"Set color for block", canvas.getBackgroundColor());

if (newBackColor != null)

canvas.setBackgroundColor(newBackColor);

}

});

miTurnHarder.addActionListener(new ActionListener() {

public void actionPerformed(ActionEvent ae) {

int curLevel = getLevel();

if (curLevel < MAX_LEVEL) setLevel(curLevel + 1);

}

});

miTurnEasier.addActionListener(new ActionListener() {

public void actionPerformed(ActionEvent ae) {

int curLevel = getLevel();

if (curLevel > 1) setLevel(curLevel - 1);

}

});

miExit.addActionListener(new ActionListener() {

public void actionPerformed(ActionEvent ae) {

System.exit(0);

}

});

miPlay.addActionListener(new ActionListener() {

public void actionPerformed(ActionEvent ae) {

playGame();

}

});

miPause.addActionListener(new ActionListener() {

public void actionPerformed(ActionEvent ae) {

pauseGame();

}

});

miResume.addActionListener(new ActionListener() {

public void actionPerformed(ActionEvent ae) {

resumeGame();

}

});

miStop.addActionListener(new ActionListener() {

public void actionPerformed(ActionEvent ae) {

stopGame();

}

});

miAsWindows.addActionListener(new ActionListener() {

public void actionPerformed(ActionEvent ae) {

String plaf = "com.sun.java.swing.plaf.windows.WindowsLookAndFeel";

setWindowStyle(plaf);

canvas.fanning();

ctrlPanel.fanning();

miAsWindows.setState(true);

miAsMetal.setState(false);

miAsMotif.setState(false);

}

});

miAsMotif.addActionListener(new ActionListener() {

public void actionPerformed(ActionEvent ae) {

String plaf = "com.sun.java.swing.plaf.motif.MotifLookAndFeel";

setWindowStyle(plaf);

canvas.fanning();

ctrlPanel.fanning();

miAsWindows.setState(false);

miAsMetal.setState(false);

miAsMotif.setState(true);

}

});

miAsMetal.addActionListener(new ActionListener() {

public void actionPerformed(ActionEvent ae) {

String plaf = "javax.swing.plaf.metal.MetalLookAndFeel";

setWindowStyle(plaf);

canvas.fanning();

ctrlPanel.fanning();

miAsWindows.setState(false);

miAsMetal.setState(true);

miAsMotif.setState(false);

}

});

}

/**

* 根据字串设置窗口外观

* @param plaf String, 窗口外观的描述

*/

private void setWindowStyle(String plaf) {

try {

UIManager.setLookAndFeel(plaf);

SwingUtilities.updateComponentTreeUI(this);

} catch (Exception e) {

}

}

/**

* 一轮游戏过程,实现了Runnable接口

* 一轮游戏是一个大循环,在这个循环中,每隔100毫秒,

* 检查游戏中的当前块是否已经到底了,如果没有,

* 就继续等待。如果到底了,就看有没有全填满的行,

* 如果有就删除它,并为游戏者加分,同时随机产生一个

* 新的当前块,让它自动下落。

* 当新产生一个块时,先检查画布最顶上的一行是否已经

* 被占了,如果是,可以判断Game Over了。

*/

private class Game implements Runnable {

public void run() {

int col = (int) (Math.random() * (canvas.getCols() - 3)),

style = ErsBlock.STYLES[(int) (Math.random() * 7)][(int) (Math.random() * 4)];

while (playing) {

if (block != null) {    //第一次循环时,block为空

if (block.isAlive()) {

try {

Thread.currentThread().sleep(100);

} catch (InterruptedException ie) {

ie.printStackTrace();

}

continue;

}

}

checkFullLine();        //检查是否有全填满的行

if (isGameOver()) {     //检查游戏是否应该结束了

miPlay.setEnabled(true);

miPause.setEnabled(true);

miResume.setEnabled(false);

ctrlPanel.setPlayButtonEnable(true);

ctrlPanel.setPauseButtonLabel(true);

reportGameOver();

return;

}

block = new ErsBlock(style, -1, col, getLevel(), canvas);

block.start();

col = (int) (Math.random() * (canvas.getCols() - 3));

style = ErsBlock.STYLES[(int) (Math.random() * 7)][(int) (Math.random() * 4)];

ctrlPanel.setTipStyle(style);

}

}

/**

* 检查画布中是否有全填满的行,如果有就删除之

*/

public void checkFullLine() {

for (int i = 0; i < canvas.getRows(); i++) {

int row = -1;

boolean fullLineColorBox = true;

for (int j = 0; j < canvas.getCols(); j++) {

if (!canvas.getBox(i, j).isColorBox()) {

fullLineColorBox = false;

break;

}

}

if (fullLineColorBox) {

row = i--;

canvas.removeLine(row);

}

}

}

/**

* 根据最顶行是否被占,判断游戏是否已经结束了。

* @return boolean, true-游戏结束了,false-游戏未结束

*/

private boolean isGameOver() {

for (int i = 0; i < canvas.getCols(); i++) {

ErsBox box = canvas.getBox(0, i);

if (box.isColorBox()) return true;

}

return false;

}

}

/**

* 程序入口函数

* @param args String[], 附带的命令行参数

*/

public static void main(String[] args) {

new ErsBlocksGame("Russia Blocks by [email protected]");

}

}

此代码由我和陶俊杰同学共同完成http://www.cnblogs.com/lcyyyyy/

共分为,方块控制,游戏主体,游戏测试;他负责俄罗斯方块的GUI,控制方块形状,判断是否连成一行,生成方块等。我主要负责分数计算,结束判断,游戏界面信息等。


步骤


耗时


百分比


需求分析


30min


5%


设计


1h


10%


代码实现


4h


40%


测试


4h


40%

时间: 2024-10-15 05:50:21

20135129李畅宇实验三的相关文章

20135129李畅宇实验五

---恢复内容开始--- 课程:Java程序与设计         班级:1351 姓名:李畅宇 陶俊杰 学号:20135129  20135127 成绩:             指导教师:娄嘉鹏       实验日期:2015.6.9 实验密级:         预习程度:             实验时间:15:30-18:00 仪器组次:          必修/选修:选修        实验序号:5 实验名称:Java网络编程及安全 实验目的与要求:结对编程,实现客户端和服务器之间数据

实验二Java面向对象程序设计_20135129李畅宇

ava第二次实验报告 课程:Java实验   班级:201352     姓名:池彬宁  学号:20135212 成绩:             指导教师:娄佳鹏   实验日期:15.05.05 实验密级:         预习程度:             实验时间: 仪器组次:          必修/选修:选修          实验序号:2 实验名称:     Java面向对象程序设计 实验目的与要求: 1. 初步掌握单元测试和TDD 2. 理解并掌握面向对象三要素:封装.继承.多态 3

20135127陶俊杰实验三

<Java程序设计>课实验报告 班级:201351              姓名及学号:陶俊杰  20135127 指导教师:娄佳鹏            必修/选修:选修 实验日期: 2015年6月4日      实验时间: 15:30~17:30 实验序号:(三)           成绩: 实验步骤 (一)敏捷开发与XP 学习软件工程的标准和流程,其中主要以敏捷开发流程为主,而其中有一极限编程作为学习流程的主要软件开发方法.包括:编码,测试,倾听,设计,作为学习者,我主要关注和研究了编

实验三:分支结构程序设计

安徽工程大学 Python程序设计 实验报告 班级   物流192   姓名  刘晨晨 学号3190505214 日期     2020.4.5    指导老师       修宇 实验三 分支结构程序设计(设计性实验) [实验目的] (1)学会正确使用比较运算符与比较表达式.逻辑运算符和逻辑表达式 (2)熟练用if语句设计选择结构程序: [实验条件] PC机或者远程编程环境 [实验内容] 1.完成三个编程题. (1)设计一个货币转换程序 问题描述: 参考温度转换实例编制一个货币转换程序.????

实验三报告 20135209潘恒 20135204郝智宇

北京电子科技学院(BESTI) 实     验    报     告 课程:信息安全系统设计基础                       班级:1352 姓名:  潘恒       郝智宇 学号:20135209    20135204 成绩:           指导教师:娄嘉鹏          实验日期:2015.11.24 实验密级:       预习程度:            实验时间:15:30~17:30 仪器组次:04,09   必修/选修:必修           实验序

信息安全系统设计基础 实验三 实时系统的移植 20135327郭皓 20135329 李海空

北京电子科技学院(BESTI) 实     验    报     告 课程:信息安全设计基础                         班级:1353 姓名:郭皓 李海空 学号:20135327  20135329 成绩:             指导教师:娄嘉鹏        实验日期:2015.11.24 实验密级:         预习程度:         实验时间:15:30~18:00 仪器组次:          必修/选修:            实验序号:3 实验名称: 

实验三实验报告20135219洪韶武 20135201李辰希

北京电子科技学院(BESTI) 实     验    报     告 课程:信息安全系统设计基础                       班级:1352 姓名:  洪韶武        李辰希 学号:20135219    20135201 成绩:           指导教师:娄嘉鹏          实验日期:2015.12.8 实验密级:       预习程度:            实验时间:15:30~17:30 仪器组次:       必修/选修:必修           实验序

20155201李卓雯 20155212江振思 20155313杨瀚《信息安全技术》 实验三 数字证书应用

20155201李卓雯 20155212江振思 20155313杨瀚<信息安全技术> 实验三 数字证书应用 实验环境 操作系统:3台基于Win7系统的Windows Server 2003虚拟机 主机编号 角色 IP地址 7D CA 172.168.1.107 7E 服务器 172.168.1.115 7F 客户端 172.168.1.105 工具 IIS组件 证书组件 协议分析器 IE浏览器 实验原理 一.PKI技术 PKI是PublicKeyInfrastructure的缩写,通常译为公钥

20135333苏正生实验三实验报告

课程: Java程序设计 班级: 1353 姓名: 苏正生 学号: 2015333 成绩: 指导教师: 娄家鹏 实验日期: 2015.5.6 实验密级: 预习程度: 实验时间: 3:20~5:00 仪器组次: 必修/选修: 必修 实验序号: 实验三 实验名称: 敏捷开发与XP实践 实验内容: 1. XP基础 2. XP核心实践 3. 相关工具     实验仪器:   名称 型号 数量 笔记本电脑 Msi GS70     1                   实验步骤 (一)敏捷开发与XP 学