20135337朱荟潼——实验三之结对实验项目

游戏名称:答题小能手

结对小伙伴:20135317韩玉琪

博客:http://www.cnblogs.com/hyq20135317

我的主要任务是:编写伪代码、完善代码、添加注释、TDD测试

Git:http://git.shiyanlou.com/135337

实验内容:

主要包括的类:JFrame、JPanel

1、JPanel类

JPanel类是主框架,程序的启动类。

其中包括游戏界面的创建、按钮的设置、事件监听器设置

2、JFrame类

JFrame类主要实现的是界面的布局绘制、按钮的坐标、设置每个项目布局、实现游戏的开始、重来、下一题。

伪代码:

创建一个容器f;

{

初始化界面;

//文字:

"题目:" ——问题文本框;

"选项:"——四个选项按钮;

"你的得分:"——计分文本框;

//按钮

"开始"、"下一个题目"、"重新练习";

}

设置布局管理器之网格布局;//需要设置面板的具体方位(居中);

添加侦听器,使按按钮后,发生动作;

从指定的位置读取文件数据;//确保不在游戏本机下仍可以读取到文件;

判断正误;//对,加一分;否则,不变;

下一题;//顺序读取文件中的下一道题;

开始;//从第一题开始答题,累计加分;

重新联系;//从第一题开始答题,分数归零;

产品代码:

package game;

public class QuestionBank {

String question;

String choiceA, choiceB, choiceC, choiceD;

String answer;

QuestionBank(String question, String choiceA, String choiceB,

String choiceC, String choiceD, String answer) {

this.question = question;

this.choiceA = choiceA;

this.choiceB = choiceB;

this.choiceC = choiceC;

this.choiceD = choiceD;

this.answer = answer;

}

}

package game;

public class AnswerQuestion {

public static void main(String args[]) {

new Function();

}

}

package game;

import javax.swing.*;

import java.awt.*;

import java.io.*;

import java.awt.event.*;

public class Function implements ActionListener {

private static final int Q_Number = 100;

JFrame f = new JFrame("答题小能手");//JFrame创建一个容器f,显示“答题小能手”

JPanel p1 = new JPanel();

JPanel p2 = new JPanel();

JPanel p3 = new JPanel();

JPanel p4 = new JPanel();

int index = 0, total = 0;                //初始化题目下标和分数

QuestionBank questions[] = new QuestionBank[Q_Number];

JLabel questionString = new JLabel("题目:");               //创建对象显示“题目”

JLabel choiceString = new JLabel("选项:");

JLabel totalString = new JLabel("你的得分:");

TextArea question = new TextArea("\t游戏规则:\n\t1.点击“开始”进行答题,点击下一题继续\n\t2.答题过程中点击“重新练习”,从第一道题作答,分数归0。\n\t3.答题过程中点击“开始”从第一道题作答,分数累计.\n\n\t\t现在,请单击<开始>进行游戏", 5, 60, 3);

JTextField totaltf = new JTextField("0", 5);

JRadioButton choiceA = new JRadioButton("a");            //创建一个单选按钮

JRadioButton choiceB = new JRadioButton("b");

JRadioButton choiceC = new JRadioButton("c");

JRadioButton choiceD = new JRadioButton("d");

ButtonGroup Group = new ButtonGroup();             //创建一个按钮分组框

JButton beginbt = new JButton("开始");

JButton nextbt = new JButton("下一个题目");

JButton practiceAgainbt = new JButton("重新练习");

File file = new File("src/Question_File/题目.txt");

public Function() {    //对frame进行基本设置

f.setSize(750, 600);          //设置大小width=750,height=600

f.setLocation(250, 50);          //设置位置left=250,top=50

f.setVisible(true);                 //可见

f.setLayout(new GridLayout(4, 1, 15, 15));          //设置布局管理器之网格布局,显式定义组件的网格位置。

p1.setLayout(new FlowLayout(FlowLayout.CENTER));             //组件剧中对齐

p2.setLayout(new FlowLayout(FlowLayout.CENTER));

p3.setLayout(new FlowLayout(FlowLayout.CENTER));

p4.setLayout(new FlowLayout(FlowLayout.CENTER));

Group.add(choiceA);            //将面板choiceA添加到radioGroup中

Group.add(choiceB);

Group.add(choiceC);

Group.add(choiceD);

p1.add(questionString) ;            //将"题目:"添加到p1中

p1.add(question);           //将游戏问题添加到p1中

p2.add(choiceString);          //将"选项:"添加到p2

p2.add(choiceA);               //将A、B、C、D选择添加到p2

p2.add(choiceB);

p2.add(choiceC);

p2.add(choiceD);

p3.add(totalString);          //将"你的得分:"添加到p3

p3.add(totaltf);           //将计分添加到p3

p4.add(beginbt);         //将按钮"开始"添加到p4

p4.add(nextbt);            //将按钮"下一个题目"添加到p4

p4.add(practiceAgainbt);          //将按钮"重新练习"添加到p4

//将面板1、2、3、4添加到容器f

f.add(p1);

f.add(p2);

f.add(p3);

f.add(p4);

//添加侦听器,使按按钮后,发生动作

nextbt.addActionListener(this);

beginbt.addActionListener(this);

practiceAgainbt.addActionListener(this);

readFile();           //从指定的位置读取文件数据

}

public void readFile() {

String s, question, choiceA, choiceB, choiceC, choiceD, answer;

try {

int count = 0;            //初始化计数

FileInputStream in = new FileInputStream(file);            //创建流文件读入

byte b[] = new byte[in.available()];          //先定义了一个byte类型的数组,数组长度为:文件读入的长度

in.read(b);         //文件读取

s = new String(b);                    //创建一个string对象,并将其返回给s

String c[] = s.split("&&");               //用“&&”分割字符串

for (int i = 0; i < c.length; i++) {                //通过循环,无论按下任何一个选项都将跳入下一个问题

question = c[i++];

choiceA = c[i++];

choiceB = c[i++];

choiceC = c[i++];

choiceD = c[i++];

answer = c[i];

questions[count++] = new QuestionBank(question, choiceA,

choiceB, choiceC, choiceD, answer);

}

} catch (Exception e) {                //捕获异常

e.printStackTrace();

}

}

public void ifRight() {           //对答题正确与否进行打分

if (choiceA.isSelected()) {

if (questions[index].answer.equals(choiceA.getText())) {

total++;             //如果与获取文件中的答案相等,则加1分

}

}

if (choiceB.isSelected()) {

if (questions[index].answer.equals(choiceB.getText())) {

total++;

}

}

if (choiceC.isSelected()) {

if (questions[index].answer.equals(choiceC.getText())) {

total++;

}

}

if (choiceD.isSelected()) {

if (questions[index].answer.equals(choiceD.getText())) {

total++;

}

}

totaltf.setText(Integer.toString(total));

}

public void setQuestion(int index) {           //读取各选项的内容

question.setText(questions[index].question);

choiceA.setText(questions[index].choiceA);

choiceB.setText(questions[index].choiceB);

choiceC.setText(questions[index].choiceC);

choiceD.setText(questions[index].choiceD);

Group.clearSelection();

}

public void actionPerformed(ActionEvent e) {

if (e.getSource() == nextbt) {         //下一题

ifRight();           //判断是否正确

if (index < questions.length) {                   //如果“下一题”的下标在问题长度范围内,则进行下一题

setQuestion(++index);

}

}

if (e.getSource() == practiceAgainbt) {               //如果“重新开始”,从第一题开始

totaltf.setText(Integer.toString(0));

index = 0;

total = 0;

ifRight();

if (index < questions.length) {

setQuestion(index);

}

}

if (e.getSource() == beginbt) {              //如果“开始”,从第一题开始

index=0;

if (total != 0) {

ifRight();

if (index < questions.length) {

setQuestion(index);

}

}else{

setQuestion(0);

}

}

}

}

运行截图:

对答案正确与否的TDD测试:

import java.awt.event.ActionEvent;

import org.junit.Before;

import org.junit.Test;

import junit.framework.TestCase;

public class FunctionTest extends TestCase{

public static Function function=new Function();

@Before

public void setUp() throws Exception {

}

@Test

public void testIfRight() {

function.ifRight();

if(function.practiceAgainbt != null){

assertEquals(0,function.total);

}

}

@Test

public void testreadFile(){

function.readFile();

}

@Test

public void testsetQuestion(){

}

@Test

public void testactionPerformed(){

if(function.practiceAgainbt != null){

assertEquals(0,function.total);

}

}

}

TDD截图:

总结:

在这次结对编写游戏的实验当中,我们选择了答题游戏——“答题小能手”。首先,查找网络上的代码,对别人的代码进行了学习,了解开发者开发一个游戏的整体思路。然后,我们讨论了对自己的游戏的想法(主要是在游戏规则上面,发现了所查找的游戏代码存在很多的Bug)。最后,受到了所参考的代码的启发,同时也设定了自己的游戏规则,使这个游戏规则更加完善合理。

在这次结对实验当中。伪代码的编写,让我对这个游戏整体进程有了大致的了解。添加注释看上去是一项比较简单的工作,但是通过添加注释,我复习了JFrame、布局管理器的功能,以前学习课本敲代码时的思路比较“顺序化”,敲一行理解一行,而这次面对完整的代码在进行注释,开始时不太理解JFrame的一些功能调用,慢慢地往后发现在具体调用先前的功能(比如:p1.add(questionString);把“题目”放入“Panel1”)。让我对程序有了更深刻的学习以及对知识的再一次巩固。

时间: 2024-10-09 04:32:56

20135337朱荟潼——实验三之结对实验项目的相关文章

20135337朱荟潼——实验三

实验三 敏捷开发与XP实践 实验内容 1. XP基础 2. XP核心实践 3. 相关工具 实验步骤 (一)敏捷开发与XP 软件工程是把系统的.有序的.可量化的方法应用到软件的开发.运营和维护上的过程.软件工程包括下列领域:软件需求分析.软件设计.软件构建.软件测试和软件维护. 人们在开发.运营.维护软件的过程中有很多技术.做法.习惯和思想体系.软件工程把这些相关的技术和过程统一到一个体系中,叫“软件开发流程”.软件开发流程的目的是为了提高软件开发.运营.维护的效率,并提高软件的质量.用户满意度.

20135337朱荟潼Java实验报告二

实验二 Java面向对象程序设计 一.实验内容 1. 初步掌握单元测试和TDD 2. 理解并掌握面向对象三要素:封装.继承.多态 3. 初步掌握UML建模 4. 熟悉S.O.L.I.D原则 5. 了解设计模式 二.实验要求 1.没有Linux基础的同学建议先学习<Linux基础入门(新版)><Vim编辑器> 课程 2.完成实验.撰写实验报告,实验报告以博客方式发表在博客园,注意实验报告重点是运行结果,遇到的问题(工具查找,安装,使用,程序的编辑,调试,运行等).解决办法(空洞的方法

实验五Java网络编程及安全——20135337朱荟潼

实验五 Java网络编程及安全 结对伙伴:20135317韩玉琪(负责服务器方)http://www.cnblogs.com/hyq20135317/p/4567241.html 实验内容 1.掌握Socket程序的编写: 2.掌握密码技术的使用: 3.设计安全 实验步骤 1.信息安全传送: 发送方A——————>接收方B A加密时,用B的公钥 B解密时,用B的私钥 发送方A对信息(明文)采用DES密钥加密,使用RSA加密前面的DES密钥信息,最终将混合信息进行传递.同时用hash函数将明文进行

1203 实验三 进程调度模拟实验

实验三 进程调度模拟实验 物联网工程   张学玲  201306104140 一.        实验目的        用高级语言完成一个进程调度程序,以加深对进程的概念及进程调度算法的理解. 二.        实验内容和要求 实验内容 完成两个算法(简单时间片轮转法.多级反馈队列调度算法)的设计.编码和调试工作,完成实验报告. 1) 每个进程有一个进程控制块(PCB)表示.进程控制块包含如下信息:进程名.优先级.到达时间.需要运行时间.已用CPU时间.进程状态等等. 2) 每个进程的状态可

实验三 ShellShock 攻击实验

ShellShock 攻击实验 沙雨济 一. 实验描述 2014年9月24日,Bash中发现了一个严重漏洞shellshock,该漏洞可用于许多系统,并且既可以远程也可以在本地触发.在本实验中,学生需要亲手重现攻击来理解该漏洞,并回答一些问题. 二. 预备知识 1. 什么是ShellShock? Shellshock,又称Bashdoor,是在Unix中广泛使用的Bash shell中的一个安全漏洞,首次于2014年9月24日公开.许多互联网守护进程,如网页服务器,使用bash来处理某些命令,从

实验三ShellShock 攻击实验

次旺巴 一. 实验描述 2014年9月24日,Bash中发现了一个严重漏洞shellshock,该漏洞可用于许多系统,并且既可以远程也可以在本地触发.在本实验中,学生需要亲手重现攻击来理解该漏洞,并回答一些问题. 二. 预备知识 1. 什么是ShellShock? Shellshock,又称Bashdoor,是在Unix中广泛使用的Bash shell中的一个安全漏洞,首次于2014年9月24日公开.许多互联网守护进程,如网页服务器,使用bash来处理某些命令,从而允许攻击者在易受攻击的Bash

实验三 进程调度模拟实验

13物联网      201306104107      黄鸿佳 1. 目的和要求 实验目的   13物联网      201306104107      黄鸿佳 用高级语言完成一个进程调度程序,以加深对进程的概念及进程调度算法的理解. 实验要求 设计一个有 N(N不小于5)个进程并发执行的进程调度模拟程序. 进程调度算法:“时间片轮转法”调度算法对N个进程进行调度. 2. 实验内容 完成两个算法(简单时间片轮转法.多级反馈队列调度算法)的设计.编码和调试工作,完成实验报告. 1) 每个进程有一

实验三 进程调度模拟程序实验

一.        实验目的 用高级语言完成一个进程调度程序,以加深对进程的概念及进程调度算法的理解. 二.        实验内容和要求 设计一个有 N个进程并发执行的进程调度模拟程序. 进程调度算法:采用最高优先级优先的调度算法(即把处理机分配给优先级最高的进程)和先来先服务(若优先级相同)算法. (1).   每个进程有一个进程控制块(PCB)表示.进程控制块包含如下信息:进程名.优先级.到达时间.需要运行时间.已用CPU时间.进程状态等等. (2).  进程的优先级及需要的运行时间可以事

JAVA课程实验报告 实验三 敏捷开发与XP实践

北京电子科技学院(BESTI) 实     验    报     告 课程:Java程序设计  班级:1353  姓名:韩玉琪  学号:20135317 成绩:             指导教师:娄嘉鹏             实验日期:2015.5.29 实验密级:         预习程度:                     实验时间:15:30--18:00 仪器组次:         必修/选修: 选修             实验序号:3 实验名称:实验三 敏捷开发与XP实践 实