我創建了一個游戲,我在螢屏頂部的隨機 X 位置召喚 JTextFields,并在欄位中添加隨機單詞。
我不知道如何正確設定一種方法來檢查用戶的輸入是否等于板上的 JTextFields 單詞。我正在尋找任何想法來更改我的“GamePanel”類中的“checkWordSpelling”方法,以使 JTextFields 單詞和用戶輸入之間的比較可行。
現在我將物件存盤在:
ArrayList<EnemyTextFields> textFieldsCurrentlyOnBoard = new ArrayList<>();
一開始我認為這是一個好主意,因為我可以將當??前物件跟蹤到它所擁有的字串,但由于它是一個執行緒(并且我希望每個 JTextField 都是一個執行緒),我無法比較它們(?)。
我嘗試用 HashMap 替換我的 ArrayList ,它采用 currentThread 和 String(k,v) 但我實作它的方式,也沒有奏效。我嘗試了很多不同的東西,但我不能全部命名。
游戲是這樣的:

我在“GamePanel”類中有“EnemyTextField”私有類。這是每個 JTextField 是一個單獨的執行緒的地方:
private class EnemyTextField extends Thread {
private Random rng;
private int xPlace, yPlace;
private JTextField txtField;
private String currWord;
private int velocityOfTextField;
public EnemyTextField(String currWord,int velocityOfTextField) {
this.currWord = currWord;
this.velocityOfTextField = velocityOfTextField;
rng = new Random();
xPlace = rng.nextInt(600);
txtField = new JTextField(currWord);
}
/**
* Check if the textfield hits the bottom of the screen, and if it does, the application ends
* @return
*/
public boolean hitBottomOfScreen() {
if(yPlace >= height){
endGame();
return true;
}
return false;
}
/**
* Increments the textfield which belongs to the thread by 10.
*/
public void updateEnemyTextField() {
yPlace = yPlace 10;
txtField.setLocation(xPlace, yPlace);
}
/**
* adding the textfield to the JPanel(UI)
*/
public void createTextField(){
txtField.setLocation(xPlace, yPlace);
txtField.setSize(50 (currWord.length()*2), 50);
txtField.setBackground(Color.GREEN);
add(txtField);
}
@Override
public void run() {
while(!hitBottomOfScreen()) {
try {
//Sleeping for 1 second(1000milliseconds) between each "tick" or "refresh/update".
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
createTextField();
updateEnemyTextField();
}
}
}
}
這里我有創建 JTextFields 的 JPanel 代碼:
import javax.swing.*;
import java.awt.*;
import java.io.IOException;
import java.util.*;
import java.util.Timer;
public class GamePanel extends JPanel {
private JTextField guessingTextField;
private Label pointLabel;
private Label timeLabel;
private int width = 800;
private int height = 600;
private int currentTime;
private int points;
//Here is the Array of all the words from the textfile
ArrayList<String> listOfWordsFromFile;
//Here is where i save the k,v for the different JTextFields
ArrayList<EnemyTextField> textFieldsCurrentlyOnBoard;
private Timer timer;
public GamePanel() throws IOException {
setSize(width, height);
setLayout(null);
setBackground(Color.LIGHT_GRAY);
guessingTextField = new JTextField();
guessingTextField.setSize(120, 30);
guessingTextField.setLocation(width / 2 - 60, 530);
guessingTextField.setForeground(Color.BLACK);
guessingTextField.setBackground(Color.WHITE);
pointLabel = new Label();
pointLabel.setBackground(Color.WHITE);
pointLabel.setForeground(Color.BLACK);
pointLabel.setSize(120, 30);
pointLabel.setLocation(140, 1);
timeLabel = new Label();
timeLabel.setBackground(Color.WHITE);
timeLabel.setForeground(Color.BLACK);
timeLabel.setSize(30,30);
timeLabel.setLocation(155,1);
timeLabel.setText("1");
add(timeLabel);
add(pointLabel);
add(guessingTextField);
//inserts the ArrayList of words into "words" array.
listOfWordsFromFile = WordBox.getRandomWord("resources/Random words.txt");
setVisible(true);
guessingTextField.addActionListener(e -> {
//checkWord();
});
startTheGameAndResetValues();
checkWordSpelling();
}
/**
*This is the Method im struggling with.
*/
public void checkWordSpelling(){
Thread thread = new Thread(() -> {
while(true) {
try {
System.out.println(guessingTextField.getText());
java.util.Iterator<EnemyTextField> iterator = textFieldsCurrentlyOnBoard.iterator();
while(iterator.hasNext()){
EnemyTextField currentWord = iterator.next();
System.out.println(currentWord);
//
if(currentWord.equals(guessingTextField.getText())){
remove(currentWord.txtField);
iterator.remove();
}
}
} catch (Exception e) {
e.printStackTrace();
}
}
});
thread.start();
}
/*private void removeWord(EnemyTextField entry) {
java.util.Iterator<EnemyTextField> iterator = textFieldsCurrentlyOnBoard.values().iterator();
while (iterator.hasNext()){
EnemyTextField current = iterator.next();
if (textFieldsCurrentlyOnBoard.containsKey(entry)) {
remove(current.txtField);
iterator.remove();
}
}
}*/
/**
* gets called when game is over, displays an ending "popup".
*/
public void endGame() {
//cancel the while loop and make the game stop
JOptionPane.showInputDialog(null,"You lost, Game over.");
timer.cancel();
}
/**
* Method to reset all the values from what the previous round had.
*
* Creates a TimerTask which acts as the measurement of difficulty
* set to 3000milliseconds(3seconds), lower it to have words appear
* more frequently and higher it if you want the words to appear slower
*/
public void startTheGameAndResetValues() {
currentTime = 0;
points = 0;
textFieldsCurrentlyOnBoard = new ArrayList<>();
TimerTask timerTask = new TimerTask() {
@Override
public void run() {
while(true){
initNewWord();
try {
Thread.sleep(3000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
};
Timer time = new Timer();
time.schedule(timerTask,3000);
}
/**
* starts the "threading"
*/
public void initNewWord(){
String rngWord = randomWord();
EnemyTextField newWordForTextField = new EnemyTextField(rngWord,2);
//textFieldsCurrentlyOnBoard.add(newWordForTextField);
textFieldsCurrentlyOnBoard.add(newWordForTextField);
newWordForTextField.start();
}
/**
* Picks a random word from the ArrayList words.
* @return
*/
public String randomWord() {
Random rng = new Random();
System.out.println(listOfWordsFromFile);
int rngIndex = rng.nextInt(listOfWordsFromFile.size());
return listOfWordsFromFile.get(rngIndex);
}
這是從資源目錄中的“Random words.txt”中獲取單詞的“WordBox”類:
import java.io.*;
import java.util.ArrayList;
public class WordBox {
static ArrayList<String> listWords = new ArrayList<>();
/**
* Grabs all the words and puts each word
* @param filePath Grabs filepath from GamePanel
* @return ArrayList of all the words in the textfile.
* @throws IOException
*/
public static ArrayList<String> getRandomWord(String filePath) throws IOException {
try {
File file = new File(filePath);
BufferedReader br = new BufferedReader(new FileReader(file));
listWords = new ArrayList<>();
String strTemp;
while((strTemp = br.readLine())!= null) {
listWords.add(strTemp);
}
} catch (Exception e) {
e.printStackTrace();
}
System.out.println(listWords);
return listWords;
}
}
這是我的主要方法:
import java.io.IOException;
public class Main {
public static void main(String[] args) throws IOException {
new GameFrame();
}
}
對于有興趣測驗我的代碼的任何人,您可以將以下一些隨機詞放入“Random words.txt”檔案中:
flowers
skillful
home
channel
delirious
muddled
aware
blushing
unpack
neck
animated
supreme
snow
connect
skin
除了問題之外,如果有人發現我可以改進我的代碼的任何方法,我非常愿意接受建議和指導!
uj5u.com熱心網友回復:
如果您使用陣列串列來存盤資料,請使用此方法
ArrayList<String> JtextFiels = new ArrayList<String>();
JtextFiels.add("flowers");
JtextFiels.add("skillful");
JtextFiels.add("home");
JtextFiels.add("channel");
//I Assume That User Input Is Stored in a variable and for this case it is store in " userInput " variable
現在在這里你有你的陣列串列和用戶輸入存盤在一個變數中
if(JtextFiels.contains(userInput.trim())//here JtextFiels are your arraylist and userInput has the data stored which was entered by user
{
//here you can continue your code ..for example - "show a message that the user inputed word is there in the falling words"
}
如果用戶輸入的資料是大寫字母或單個大寫字母,您可能會遇到問題
所以你能做什么
if(JtextFiels.contains(userInput.trim().toLowerCase())// Or .toUpperCase()
{
//here the user inputed text is converted to lower case ...you can change it upper case according to your requirement
}
或者
你可以使用陣列來存盤資料,我會告訴你最后的區別
String[] JtextFiels=new String[100];//here 100 is the size of the array
JtextFiels[0]="flowers";//index 0
JtextFiels[1]="skillful";//index 1
JtextFiels[2]="home";//index 2
JtextFiels[3]="channel";//index 3
//arrays start from the index 0
//same as above you have the user inputed data with you stored in a variable ..in this case let the variable be userInput
這里你有一個陣列和用戶輸入的資料
for(int i=0;i<JtextFiels.length;i )//here a loop is used to itterate through each index of array
{
if(JtextFiels[i]!=null)//checks if the index exists or not
{
if(JtextFiels[i].trim().equalsIgnoreCase(userInput.trim()))
{
//here you can continue your code ..for example - "show a message that the user inputed word is there in the falling words"
}
}
}
現在兩者之間的區別是
ArrayList - 大小不固定
Array - 大小由我們固定
更多差異但現在這已經足夠了
你應該選擇什么?陣列串列或陣列
這取決于您的資料
---如果下降字數是固定的或者你知道最大字數..然后使用陣列
---如果下降的詞數不固定或沒有限制,并且您不知道您使用了多少個詞,并且如果詞是動態變化的,則使用arraylist
如果希望你明白這一點!,如果不能隨時詢問您的問題
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/462472.html
上一篇:從JavaNoClassDefFoundError在Excel中寫入
下一篇:創建在插入每個點后更新的多邊形
