用java完成唐诗测试游戏:从每句随机去掉一个字_代替,然后将去掉的字组合为4种选项,让用户选择正确答案。

用java完成唐诗测试游戏:从每句随机去掉一个字_代替,然后将去掉的字组合为4种选项,让用户选择正确答案。,第1张

Java程序:

import java.util.Random

public class Test0201 {

public static void main(String[] args) {

String[] poem = new String[]{"赠孟浩然",

"吾爱孟夫子", "风流天下闻",

"红颜弃轩冕", "白首卧松云",

"醉月频中圣", "迷花不事君",

"高山安可仰", "徒此揖清芬"}

String[] keys = new String[poem.length-1] //存储每句中抽出的单字

String[] items = new String[4] //存储4种备选答案选项

String correctItem

int i

drawKey(poem, keys)

correctItem = generateItems(keys, items)

System.out.println("以下唐诗的每一句都少一个字,请选择合适的选项,将各选项中的字接顺序填充后,形成完整的唐诗:\n")

System.out.println(poem[0])

for(i=1i<poem.lengthi++){

System.out.println(poem[i] + (i%2==1 ?"," : "。"))

}

System.out.println()

for(i=0i<items.lengthi++){

System.out.println(items[i])

}

System.out.print("\n正确答案:" + correctItem)

}

//从各句唐诗中抽取一个字并存储,将该字用“_”代替

public static void drawKey(String[] poem, String[] keys){

int i, pos

Random rand = new Random()

for(i=1i<poem.lengthi++){

pos=rand.nextInt(poem[i].length())

keys[i-1] = poem[i].substring(pos, pos+1)

poem[i] = poem[i].substring(0, pos) + "_" + poem[i].substring(pos+1)

}

}

//组成备选答案选项,返回正确答案

public static String generateItems(String[] keys, String[] items){

Random rand = new Random()

int[] arr

int n = keys.length

int pos = rand.nextInt(4) //正确答案的位置

int i, j

StringBuffer buff = new StringBuffer()

for(i=0i<ni++){

buff.append(keys[i])

}

items[pos] = (char)('A' + pos) + ". " + buff.toString()

buff.delete(0, n)

for(i=0i<4i++){

if(i == pos){

continue

}

arr = generateArray(n)

for(j=0j<nj++){

buff.append(keys[arr[j]])

}

items[i] =(char)('A' + i) + ". " + buff.toString()

buff.delete(0, n)

}

return items[pos]

}

//生成由n个数字[0, n-1]组成的随机数数组

private static int[] generateArray(int n){

int[] arr = new int[n]

Random rand = new Random()

int i

for(i=0i<n){

arr[i] = rand.nextInt(n)

if(isExistFigure(arr, i, arr[i])){

continue

}

i++

}

return arr

}

//判断某数字在数组中是否存在

private static boolean isExistFigure(int[] arr, int n, int key){

for(int i=0i<ni++){

if(arr[i] == key){

return true

}

}

return false

}

}

运行测试:

第一次测试:

以下唐诗的每一句都少一个字,请选择合适的选项,将各选项中的字接顺序填充后,形成完整的唐诗:

赠孟浩然

吾_孟夫子,

_流天下闻。

红颜弃轩_,

白首卧松_。

醉月频中_,

迷花不事_。

高山安_仰,

_此揖清芬。

A. 爱徒君风可云冕圣

B. 云徒君风冕圣爱可

C. 君冕圣可风云徒爱

D. 爱风冕云圣君可徒

正确答案:D. 爱风冕云圣君可徒

第二次测试:

以下唐诗的每一句都少一个字,请选择合适的选项,将各选项中的字接顺序填充后,形成完整的唐诗:

赠孟浩然

吾爱孟夫_,

风流天下_。

红颜弃_冕,

_首卧松云。

醉月频_圣,

迷花_事君。

高山_可仰,

徒此揖_芬。

A. 不白闻子中轩清安

B. 子闻轩白中不安清

C. 白不闻轩清安子中

D. 清子不白中安轩闻

正确答案:B. 子闻轩白中不安清

package test

import java.io.File

import java.io.FileNotFoundException

import java.io.IOException

import java.io.RandomAccessFile

public class test2 {

static void check(char[] ch,char[] ch2,RandomAccessFile raf){//检查

for (int i = 0 i < ch2.length i++) {

if(ch[i] != ch2[i]){

modify(ch,i, raf)

}

}

}

static void modify(char[] ch,int i ,RandomAccessFile raf){//修改

try {

raf.seek(i*2)//跳指针

raf.write(String.valueOf(ch[i]).getBytes())//写正确答案

} catch (IOException e) {

// TODO Auto-generated catch block

e.printStackTrace()

}

}

public static void main(String[] args) {

File f = new File("D://李白静夜思.txt")//注意文件内的内容也是一行,没有回车

RandomAccessFile raf

byte[] b = new byte[48]

String text = "床前明月光,疑是地上霜。举头望明月,低头思故乡。"

char[] ch = text.toCharArray()//正确版本

char[] ch2//错误版本

try {

raf = new RandomAccessFile(f, "rw")

for(int i=0i<b.lengthi++){  

b[i] = raf.readByte()  // 读取一个字节  

}  

String text2 = new String(b)  

ch2 = text2.toCharArray()//把读来的数据放入错误数组

check(ch, ch2,raf)

raf.close()

} catch (FileNotFoundException e) {

// TODO Auto-generated catch block

e.printStackTrace()

} catch (IOException e) {

// TODO Auto-generated catch block

e.printStackTrace()

}

}

}

纯手打,望采纳(我文件是放在D盘的根目录下的)

/*

将以下代码保存为MainFrame.java JDK1.6编译通过

保存我没有做,也不难。方法我已经空下了,你可以自己写写试试.

把txtGuessRecord.getText()的内容写到文件里就行了

*/

import java.awt.Dimension

import java.awt.event.ActionEvent

import java.awt.event.ActionListener

import java.text.ParseException

import java.text.SimpleDateFormat

import java.util.Date

import java.util.Locale

import java.util.Random

import java.util.regex.Matcher

import java.util.regex.Pattern

import java.util.regex.PatternSyntaxException

import javax.swing.Box

import javax.swing.BoxLayout

import javax.swing.JButton

import javax.swing.JComboBox

import javax.swing.JFormattedTextField

import javax.swing.JFrame

import javax.swing.JLabel

import javax.swing.JScrollPane

import javax.swing.JTextArea

import javax.swing.SwingUtilities

import javax.swing.UIManager

import javax.swing.text.DefaultFormatter

public class MainFrame extends JFrame implements ActionListener {

/**

*

*/

private static final long serialVersionUID = 1L

/**

* @param args

*/

private JLabel lblResult

private JLabel lblInfo

private JFormattedTextField txtInput

private JTextArea txtGuessRecord

private JButton btnGuess

private JButton btnRestart

private JButton btnClear

private JButton btnSave

private JComboBox cbType

// 是否正确

private boolean isRight = false

// 最大次数

private static final int MAX_TIME = 5

// 当前猜测的次数

private static final int NUM = 0

private static final int LETTER = 1

private static int current_time = 0

// 当前题目

private char current_puzzle = ' '

// 用户回答

private char player_answer = ' '

public MainFrame() {

initComponent()

setPreferredSize(new Dimension(450, 220))

pack()

setVisible(true)

setTitle("猜谜游戏")

setDefaultCloseOperation(DISPOSE_ON_CLOSE)

try {

UIManager

.setLookAndFeel(new com.sun.java.swing.plaf.windows.WindowsLookAndFeel())

SwingUtilities.updateComponentTreeUI(MainFrame.this)

} catch (Exception ex) {

}

}

// 初始化组件

private void initComponent() {

lblResult = new JLabel()

lblInfo = new JLabel("准备好了吗?", JLabel.LEFT)

txtGuessRecord = new JTextArea(5, 30)

btnGuess = new JButton("猜一下")

btnRestart = new JButton("开始")

btnClear = new JButton("清除")

btnSave = new JButton("保存")

String[] item = new String[] { "数字", "字母" }

cbType = new JComboBox(item)

cbType.setMaximumSize(new Dimension(70, 20))

String ps = "[a-zA-Z\\d]"

Pattern p = Pattern.compile(ps)

txtInput = new JFormattedTextField(new RegexFormatter(p))

txtInput.setMaximumSize(new Dimension(55, 20))

txtInput.setMinimumSize(new Dimension(55, 20))

btnRestart.addActionListener(this)

btnGuess.addActionListener(this)

btnClear.addActionListener(this)

btnGuess.setEnabled(false)

txtGuessRecord.setEditable(false)

setLayout(new BoxLayout(getContentPane(), BoxLayout.PAGE_AXIS))

Box mainBox = Box.createVerticalBox()

add(mainBox)

setText('?')

mainBox.add(lblResult)

Box box = Box.createHorizontalBox()

box.add(lblInfo)

mainBox.add(box)

Box b = Box.createHorizontalBox()

b.add(txtInput)

Box hBox = Box.createHorizontalBox()

hBox.add(b)

hBox.add(btnGuess)

hBox.add(Box.createHorizontalStrut(3))

hBox.add(btnRestart)

hBox.add(Box.createHorizontalStrut(3))

hBox.add(btnClear)

hBox.add(Box.createHorizontalStrut(3))

hBox.add(btnSave)

hBox.add(Box.createHorizontalStrut(3))

hBox.add(cbType)

mainBox.add(hBox)

JScrollPane scroll = new JScrollPane(txtGuessRecord)

mainBox.add(scroll)

}

@Override

public void actionPerformed(ActionEvent e) {

if (e.getSource() == btnRestart) {

// 重玩

restart()

} else if (e.getSource() == btnGuess)

// 猜

guess()

else if (e.getSource() == btnClear)

// 清除

clear()

else if (e.getSource() == btnSave)

save()

}

// 设置显示答案

private void setText(char c) {

StringBuilder sb = new StringBuilder()

sb.append("<html><font size = 72 color = red><center>")

sb.append(c)

sb.append("</center></font></html>")

lblResult.setText(sb.toString())

}

// 创建随机字符

private char createRandomChar(int type) {

Random rand = new Random()

int low = 0

int range = 0

switch (type) {

case NUM:

low = (int) '0'

range = (int) '9' - low + 1

break

case LETTER:

low = (int) 'A'

range = (int) 'Z' - low + 1

break

}

int i = rand.nextInt(range) + low

char c = (char) i

return c

}

// 向记录框中输出时间

private void recordTime() {

Date date = new Date()

SimpleDateFormat formater = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss",

Locale.US)

String sd = formater.format(date)

txtGuessRecord.append(sd)

}

private void guess() {

if (txtInput.getValue() == null)

return

// 用户的答案

player_answer = Character.toUpperCase(txtInput.getValue().toString()

.charAt(0))

// 判断答案

if (player_answer < current_puzzle)

txtGuessRecord.append("小了\n")

else if (player_answer > current_puzzle)

txtGuessRecord.append("大了\n")

else {

txtGuessRecord.append("正确\n")

isRight = true

}

// 猜了一次

++current_time

// 显示游戏信息

showInfo()

if (isRight || current_time >= MAX_TIME)

stop()

}

// 重新开始

private void restart() {

// 记录时间

recordTime()

txtGuessRecord.append("  游戏开始\n")

// 状态清零

current_time = 0

btnGuess.setEnabled(true)

isRight = false

current_puzzle = createRandomChar(cbType.getSelectedIndex())

setText('?')

showInfo()

}

// 停止游戏

private void stop() {

btnGuess.setEnabled(false)

setText(current_puzzle)

// 正确的情况

if (isRight) {

String info = String.format("你用了%d次猜对了\n", current_time)

txtGuessRecord.append(info)

} else

// 超过次数的情况

txtGuessRecord.append("你输了\n")

recordTime()

txtGuessRecord.append("  游戏结束\n")

}

// 显示游戏信息

private void showInfo() {

String info = String.format("已经猜了%d次, 还剩 %d次 ", current_time,

MAX_TIME - current_time)

lblInfo.setText(info)

}

// 清空记录框

private void clear() {

txtGuessRecord.setText("")

}

private void save() {

// 尚未实现

}

public static void main(String[] args) {

// TODO Auto-generated method stub

SwingUtilities.invokeLater(new Runnable() {

public void run() {

new MainFrame()

}

})

}

// 正则格式类, 文本框匹配用

class RegexFormatter extends DefaultFormatter {

/**

*

*/

private static final long serialVersionUID = 1L

private Pattern pattern

private Matcher matcher

public RegexFormatter() {

super()

}

public RegexFormatter(String pattern) throws PatternSyntaxException {

this()

setPattern(Pattern.compile(pattern))

}

public RegexFormatter(Pattern pattern) {

this()

setPattern(pattern)

}

public void setPattern(Pattern pattern) {

this.pattern = pattern

}

public Pattern getPattern() {

return pattern

}

protected void setMatcher(Matcher matcher) {

this.matcher = matcher

}

protected Matcher getMatcher() {

return matcher

}

public Object stringToValue(String text) throws ParseException {

Pattern pattern = getPattern()

if (pattern != null) {

Matcher matcher = pattern.matcher(text)

if (matcher.matches()) {

setMatcher(matcher)

return super.stringToValue(text)

}

throw new ParseException("Pattern did not match", 0)

}

return text

}

}

}


欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/bake/11595704.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-17
下一篇 2023-05-17

发表评论

登录后才能评论

评论列表(0条)

保存