打字游戏:选择两个单词

时间:2014-02-23 09:38:09

标签: java linked-list

我正在制作像zType这样的游戏 我在验证输入时遇到问题。如下图所示,选择两个单词。我该如何解决这个问题,请帮助。

这是我的游戏类

import java.awt.Canvas;
import java.awt.event.KeyListener;
import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.event.KeyEvent;
import java.awt.image.BufferStrategy;
import java.awt.image.BufferedImage;
import java.io.IOException;
import java.util.LinkedList;
import javax.imageio.ImageIO;
import javax.swing.JFrame;

public class Game extends Canvas implements Runnable, KeyListener
{
public static final int WIDTH  = 640;
public static final int HEIGHT = 680; 
public final String TITLE = "Game";

private boolean running = false;
private Thread thread;

private BufferedImage spriteSheet = null;
private BufferedImage background = null;

public int level = 1;
public int fps = 0;
public int score = 0;
private int enemy_count = 15;
private int enemy_killed = 0;
private int enemy_notkilled = 0;
private boolean target = false;
public String t = "";

private Controller c;
private Textures tex;
private LinkedList<Enemy> e = new LinkedList<Enemy>();
private Enemy enemy;

public void init()
{
    requestFocus();
    try
    {
        spriteSheet = ImageIO.read(getClass().getResource("/sprite_sheet.png"));
        background = ImageIO.read(getClass().getResource("/background.png"));
    }
    catch(IOException e)
    {
        e.printStackTrace();
    }

    tex = new Textures(this);
    c = new Controller(tex, this);
    addKeyListener(this);
    c.createEnemy(enemy_count);
    e = c.getEnemy();
}

private synchronized void start()
{
    if(running)
        return;

    running = true;
    thread = new Thread(this);
    thread.start();
}

private synchronized void stop()
{
    if(!running)
        return;

    running = false;
    try
    {
        thread.join();
    }
    catch(InterruptedException e)
    {
        e.printStackTrace();
    } 
    System.exit(1);
}

public void run()
{
    init();
    long lastTime = System.nanoTime();
    final double amountOfTicks= 60.0;
    double ns = 1000000000 / amountOfTicks;
    double delta = 0;
    int frames = 0;
    long timer = System.currentTimeMillis();

    while(running)
    {
        long now = System.nanoTime();
        delta += (now - lastTime) / ns;
        lastTime = now;

        if(delta >= 1)
        {
            update();
            delta--;
        }
        render();
        frames++;

        if(System.currentTimeMillis() - timer > 1000)
        {
            timer += 1000;
            fps = frames;
            frames = 0;
        }
    }
    stop();
}

private void update()
{
    c.update();

    if(enemy_killed + enemy_notkilled >= enemy_count)
    {
        e.clear();
        t = "";
        level++;
        enemy_killed = 0;
        enemy_notkilled = 0;
        c.createEnemy(enemy_count);
    }
}

private void render()
{
    BufferStrategy bs = this.getBufferStrategy();

    if(bs == null)
    {
        createBufferStrategy(3);
        return;
    }

    Graphics g = bs.getDrawGraphics();

    g.drawImage(background, 0, 0, null);

    c.render(g);

    g.dispose();
    bs.show();
}

public void keyPressed(KeyEvent ek)
{
    int key = ek.getKeyCode();
    char character = Character.toLowerCase(ek.getKeyChar());
    boolean result = isValid(key);

    if(result && !target) 
    {
            for(int i = 0; i < e.size(); i++)
                if(e.get(i).getFirstLetter() == character && e.get(i).getOnScreen())
                {
                    enemy = e.get(i);
                    t = enemy.getText();
                    if(enemy.getCurrentIndex() == 0)
                        enemy.addCurrentIndex();
                    target = true;
                    System.out.println("---"+enemy.text);
                    break;
                }
    }
    else if(result && t.charAt(enemy.getCurrentIndex()) == character)
        enemy.addCurrentIndex();
}

public void keyReleased(KeyEvent ek){ }

public void keyTyped(KeyEvent ek){ }


public static void main(String[] args)
{ 
    Game game = new Game();

    game.setPreferredSize(new Dimension(WIDTH, HEIGHT));
    game.setMaximumSize(new Dimension(WIDTH, HEIGHT));
    game.setMinimumSize(new Dimension(WIDTH, HEIGHT));

    JFrame frame = new JFrame(game.TITLE);
    frame.add(game);
    frame.pack();
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    frame.setResizable(false);
    frame.setLocationRelativeTo(null);
    frame.setVisible(true);

    game.start();
}

public boolean isValid(int key)
{
    return key >= 65 && key <= 90 ? true : false;
}
public BufferedImage getSpriteSheet()
{
    return spriteSheet;
}
public int getEnemy_count()
{
    return enemy_count;
}
public void setEnemy_count(int enemy_count)
{
    this.enemy_count = enemy_count;
}
public int getEnemy_killed()
{
    return enemy_killed;
}
public void setEnemy_killed(int enemy_killed)
{
    this.enemy_killed = enemy_killed;
}
public int getEnemy_notkilled()
{
    return enemy_notkilled;
}
public void setEnemy_notkilled(int enemy_notkilled)
{
    this.enemy_notkilled = enemy_notkilled;
}
public void addScore(int k)
{
    score += k;
}
public void falseTarget()
{
    target = false;
}
public String getT()
{
    return t;
}
public void setT(String k)
{
    t = k;
}

}

这是我的敌人类

import java.awt.*;
import java.awt.font.TextAttribute;
import java.text.AttributedString;

public class Enemy
{
private double x ,y;
public String text;
private char firstLetter;
private AttributedString as;
private Controller c;
private Textures tex;
private Game game;
private int currentIndex = 0;
private int textLength = 0;
private double speed = 0.0;
private int stringWidth = 0;
private boolean onScreen = false;

public Enemy(double x, double y, double speed, Textures tex, Controller c, Game game, String text, int stringWidth)
{
    this.x = x;
    this.y = y;
    this.tex = tex;
    this.text = text;
    this.game = game;
    this.c = c;
    this.speed = speed;
    firstLetter = this.text.charAt(0);
    textLength = this.text.length();
    this.stringWidth = stringWidth;
}

public void update()
{
    y += speed;

    if(y >= 0)
        onScreen = true;

    if(currentIndex >= textLength)
    {
        game.addScore(5);
        game.setT("");
        c.removeEnemy(this);
        game.setEnemy_killed(game.getEnemy_killed() + 1);
        game.falseTarget();
    }
    if(y >= Game.HEIGHT - 50)
    {
        //game.decreaseHealth();
        game.setT("");
        c.removeEnemy(this);
        game.setEnemy_notkilled(game.getEnemy_notkilled() + 1);
        game.falseTarget();
        game.t ="";

    }
}

public void render(Graphics g)
{
    g.drawImage(tex.enemy, (int)x, (int)y, null);

    as = new AttributedString(text);
    if(currentIndex >= 1)
        as.addAttribute(TextAttribute.FOREGROUND, Color.WHITE, 0, currentIndex);

    as.addAttribute(TextAttribute.FONT, new Font("Consolas", Font.BOLD, 12), 0, text.length());
    g.drawString(as.getIterator(), (int)x + getAdd(stringWidth), (int)y + 13);
}
public double getX()
{
    return x;
}
public double getY()
{
    return y;
}
public String getText()
{
    return text;
}
public char getFirstLetter()
{
    return firstLetter;
}
public void addCurrentIndex()
{
    currentIndex++;
}
public int getCurrentIndex()
{
    return currentIndex;
}
public int getTextLength()
{
    return textLength;
}
public int getAdd(int width)
{
    return (96 / 2) - (width / 2); 
}
public boolean getOnScreen()
{
    return onScreen;
}

}

1 个答案:

答案 0 :(得分:0)

问题是,只要falseTarget()移出屏幕,您就会调用enemy。在您的示例中,当您按下“o”(对于名为“owe”的target = true)时,您指定了enemy,但后来又指定了enemy(可能是“喷气机”,可能是敌人)已经不再可见了)已完成“退出”屏幕(y >= Game.HEIGHT - 50),因此您调用了falseTarget() - 因此,当您按下'i'时,您启动了一个新的enemy( “冰”)。

在这种情况下,只有当从屏幕上退出的falseTarget()是当前定位的enemy时,您要做的就是致电if(y >= Game.HEIGHT - 50) { //game.decreaseHealth(); //game.setT(""); // <-- Commented this line out c.removeEnemy(this); game.setEnemy_notkilled(game.getEnemy_notkilled() + 1); if(game.getT().equals(text)) // <-- Added this if before calling falseTarget() { // and clearing the game's current enemy text game.falseTarget(); game.t =""; } }

{{1}}