帮我用java开发一个小游戏,使用JFrame 要求是练习阶段: (1)出示指导语。“屏幕中央将会出现一个向上或者向下的三角形,如果三角形向上,请用食指按J键;如果三角形向下,不要按键;请尽可能在三角形消失前且又快又准地做出反应。按空格键继续。 (2)首先呈现注视点(即白色十字)100-300ms。 (3)然后在屏幕中央呈现一个向上或者向下的三角形,呈现500ms。如果三角形向上,被试用食指按N键为正确反应;如果三角形向下,被试不按键为正确反应。每个试次都有正确或错误的反馈。箭头向上或向下各随机呈现20个试次。 (4)呈现注视点(即白色十字)1700-1900ms。 (5)反馈按键结果(反馈字体为红色)。当箭头向上时,如果按键反应时为0-100ms或按其他键(Y),反馈“错”;如果按键反应时在100-500ms之间反馈“对”;如果按键反应时大于500ms或者不按键,反馈“慢”。当箭头向下时,如果按键反馈“错”;如果不按键反馈“对”。
时间: 2023-11-28 19:49:33 浏览: 26
好的,以下是一个简单的Java小游戏代码,实现了你的要求:
```java
import java.awt.Color;
import java.awt.Font;
import java.awt.Graphics;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import java.util.Random;
import javax.swing.JFrame;
import javax.swing.JPanel;
public class TriangleGame extends JPanel implements KeyListener {
private static final long serialVersionUID = 1L;
private static final int WIDTH = 600;
private static final int HEIGHT = 400;
private static final int TRIANGLE_SIZE = 100;
private static final int CROSS_SIZE = 20;
private static final int ARROW_UP = 0;
private static final int ARROW_DOWN = 1;
private static final int WAIT_TIME = 1700;
private static final int TRIANGLE_TIME = 500;
private static final int FEEDBACK_TIME = 200;
private int arrowDirection;
private boolean isKeyPressed;
private long startTime;
private int correctCount;
private int wrongCount;
private int slowCount;
private Random random;
public TriangleGame() {
JFrame frame = new JFrame("Triangle Game");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setSize(WIDTH, HEIGHT);
frame.setResizable(false);
frame.addKeyListener(this);
frame.add(this);
frame.setVisible(true);
arrowDirection = ARROW_UP;
isKeyPressed = false;
correctCount = 0;
wrongCount = 0;
slowCount = 0;
random = new Random();
}
private void drawArrow(Graphics g) {
int x = (WIDTH - TRIANGLE_SIZE) / 2;
int y = (HEIGHT - TRIANGLE_SIZE) / 2;
if (arrowDirection == ARROW_UP) {
g.drawLine(x, y + TRIANGLE_SIZE, x + TRIANGLE_SIZE / 2, y);
g.drawLine(x + TRIANGLE_SIZE / 2, y, x + TRIANGLE_SIZE, y + TRIANGLE_SIZE);
g.drawLine(x, y + TRIANGLE_SIZE, x + TRIANGLE_SIZE, y + TRIANGLE_SIZE);
} else {
g.drawLine(x, y, x + TRIANGLE_SIZE / 2, y + TRIANGLE_SIZE);
g.drawLine(x + TRIANGLE_SIZE / 2, y + TRIANGLE_SIZE, x + TRIANGLE_SIZE, y);
g.drawLine(x, y, x + TRIANGLE_SIZE, y);
}
}
private void drawCross(Graphics g) {
int x = (WIDTH - CROSS_SIZE) / 2;
int y = (HEIGHT - CROSS_SIZE) / 2;
g.setColor(Color.WHITE);
g.fillRect(x, y, CROSS_SIZE, CROSS_SIZE);
g.setColor(Color.BLACK);
g.drawLine(x, y + CROSS_SIZE / 2, x + CROSS_SIZE, y + CROSS_SIZE / 2);
g.drawLine(x + CROSS_SIZE / 2, y, x + CROSS_SIZE / 2, y + CROSS_SIZE);
}
private void drawFeedback(Graphics g, String feedback) {
g.setColor(Color.RED);
g.setFont(new Font("Arial", Font.BOLD, 30));
g.drawString(feedback, (WIDTH - g.getFontMetrics().stringWidth(feedback)) / 2, HEIGHT / 2);
}
private void showInstruction(Graphics g) {
g.setColor(Color.BLACK);
g.setFont(new Font("Arial", Font.PLAIN, 20));
g.drawString("屏幕中央将会出现一个向上或者向下的三角形,如果三角形向上,请用食指按J键;如果三角形向下,不要按键;请尽可能在三角形消失前且又快又准地做出反应。按空格键继续。", 20, HEIGHT / 2 - 50);
}
private void showResult(Graphics g) {
g.setColor(Color.BLACK);
g.setFont(new Font("Arial", Font.PLAIN, 20));
g.drawString("正确次数:" + correctCount + ",错误次数:" + wrongCount + ",反应过慢次数:" + slowCount, 20, HEIGHT / 2 - 50);
}
@Override
public void paint(Graphics g) {
super.paint(g);
if (arrowDirection == -1) {
showInstruction(g);
} else if (System.currentTimeMillis() - startTime < WAIT_TIME) {
drawCross(g);
} else if (System.currentTimeMillis() - startTime < WAIT_TIME + TRIANGLE_TIME) {
drawArrow(g);
} else if (isKeyPressed) {
if (arrowDirection == ARROW_UP) {
if (System.currentTimeMillis() - startTime < WAIT_TIME + TRIANGLE_TIME + FEEDBACK_TIME) {
if (System.currentTimeMillis() - startTime < WAIT_TIME + TRIANGLE_TIME + FEEDBACK_TIME / 2) {
drawFeedback(g, "反应过快");
} else {
if (KeyEvent.VK_J == getKeyCode()) {
if (System.currentTimeMillis() - startTime < WAIT_TIME + TRIANGLE_TIME + 2 * FEEDBACK_TIME) {
drawFeedback(g, "正确");
correctCount++;
}
} else {
drawFeedback(g, "错误");
wrongCount++;
}
}
}
} else {
if (System.currentTimeMillis() - startTime < WAIT_TIME + TRIANGLE_TIME + FEEDBACK_TIME) {
if (KeyEvent.VK_N == getKeyCode()) {
drawFeedback(g, "错误");
wrongCount++;
} else {
drawFeedback(g, "正确");
correctCount++;
}
}
}
} else {
if (arrowDirection == ARROW_UP) {
drawFeedback(g, "反应过慢");
slowCount++;
} else {
drawFeedback(g, "正确");
correctCount++;
}
}
if (arrowDirection != -1) {
showResult(g);
}
}
private int getKeyCode() {
for (int keyCode : new int[] { KeyEvent.VK_J, KeyEvent.VK_N, KeyEvent.VK_Y }) {
if (isKeyPressed(keyCode)) {
return keyCode;
}
}
return -1;
}
private boolean isKeyPressed(int keyCode) {
return isKeyPressed && getKeyEvent().getKeyCode() == keyCode;
}
private KeyEvent getKeyEvent() {
return (KeyEvent) getRegisteredKeyEvents().get(0);
}
@Override
public void keyTyped(KeyEvent e) {
}
@Override
public void keyPressed(KeyEvent e) {
isKeyPressed = true;
}
@Override
public void keyReleased(KeyEvent e) {
isKeyPressed = false;
}
public static void main(String[] args) {
new TriangleGame().run();
}
private void run() {
while (true) {
arrowDirection = random.nextInt(2);
isKeyPressed = false;
startTime = System.currentTimeMillis();
repaint();
try {
Thread.sleep(WAIT_TIME + TRIANGLE_TIME + FEEDBACK_TIME);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
```
你可以复制上述代码到Java IDE中,进行编译运行。