概述
学习目标:
贪吃蛇游戏开发
学习内容:
实现贪吃蛇游戏基本功能,屏幕上随机出现一个“食物”,称为豆子,
上下左右控制“蛇”的移动,吃到“豆子”以后“蛇”的身体加长一点。
“蛇”碰到边界或蛇头与蛇身相撞,蛇死亡,游戏结束。
为游戏设计友好的交互界面;例如欢迎界面,游戏界面,
游戏结束界面。要有开始键、暂停键和停止退出的选项。
对蛇吃到豆子进行分值计算,可以设置游戏速度,游戏音乐
等拓展元素。
学习产出:
package snake;
import java.awt.;
import java.awt.event.;
import javax.swing.*;
import java.util.LinkedList;
import java.util.Random;
import java.util.Timer;
import java.util.TimerTask;
public class MainFrame extends JFrame{
private Snake snake;
private Timer timer;
private JPanel JPanel;
private Node food;
public MainFrame() /*throws HeadlessException*/{
initFrame();
initGamePalge();
initSnake();
initFood();
initTimer();
setKeyListener();
}
private void initFood() {
food=new Node();
food.random();
}
private void setKeyListener() {
addKeyListener(new KeyAdapter(){
public void keyPressed(KeyEvent e) {
switch(e.getKeyCode()) {
case KeyEvent.VK_UP:
if(snake.getDirection()!=Direction.DOWN) {
snake.setDirection(Direction.UP);
}
break;
case KeyEvent.VK_DOWN:
if(snake.getDirection()!=Direction.UP) {
snake.setDirection(Direction.DOWN);
}
break;
case KeyEvent.VK_LEFT:
if(snake.getDirection()!=Direction.RIGHT) {
snake.setDirection(Direction.LEFT);
}
break;
case KeyEvent.VK_RIGHT:
if(snake.getDirection()!=Direction.LEFT) {
snake.setDirection(Direction.RIGHT);
}
break;
}
}
});
}
private void initTimer() {
timer=new Timer();
TimerTask timerTask=new TimerTask() {
public void run() {
snake.move();
Node head=snake.getBody().getFirst();
if(head.getX()==food.getX()&&head.getY()==food.getY()) {
snake.eat(food);
food.random();
}
JPanel.repaint();
}
};
timer.scheduleAtFixedRate(timerTask,0,100);
}
private void initSnake() {
snake=new Snake();
}
private void initGamePalge() {
JPanel JPanel=new JPanel() {
public void paint(Graphics g) {
g.clearRect(0, 0, 600, 600);
for(int i=0;i<40;i++) {
g.drawLine(0, i*15, 600, i*15);
}
for(int i=0;i<40;i++) {
g.drawLine(i*15, 0, i*15, 600);
}
LinkedList<Node> body=snake.getBody();
for(Node node:body) {
g.fillRect(node.getX()*15,node.getY()*15,15,15);
}
g.fillRect(food.getX()*15, food.getY()*15,15,15);
}
};
add(JPanel);
}
private void initFrame() {
setTitle("贪吃蛇");
setSize(640,620);
setLocation(400,400);
setResizable(false);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
}
class Node {
private int x;
private int y;
public Node() {
}
public Node(int x,int y) {
this.x=x;
this.y=y;
}
public int getX() {
return x;
}
public void setX(int x) {
this.x=x;
}
public int getY() {
return y;
}
public void setY(int y) {
this.y=y;
}
public void random(){
Random r=new Random();
this.x=r.nextInt(40);
this.y=r.nextInt(40);
}
}
class Snake {
private LinkedList<Node> body;
private Direction direction=Direction.LEFT;
private boolean isLiving=true;
public Snake() {
initSnake();
}
private void initSnake() {
body=new LinkedList<>();
body.addFirst(new Node(18,20));
body.addFirst(new Node(19,20));
body.addFirst(new Node(20,20));
body.addFirst(new Node(21,20));
}
public void move() {
if(isLiving) {
Node head=body.getFirst();
switch(direction) {
case UP:
body.add(new Node(head.getX(),head.getY()-1));
break;
case DOWN:
body.add(new Node(head.getX(),head.getY()+1));
break;
case LEFT:
body.add(new Node(head.getX()-1,head.getY()));
break;
case RIGHT:
body.add(new Node(head.getX()+1,head.getY()));
break;
}
body.removeLast();
head=body.getFirst();
if(head.getX()<0||head.getY()<0||head.getX()>=40||head.getY()>=40) {
isLiving=false;
}
for(int i=1;i<body.size();i++) {
Node node=body.get(i);
if(head.getX()==node.getX()&&head.getY()==node.getY()) {
isLiving=false;
}
}
}
}
public LinkedList<Node> getBody(){
return body;
}
public void
setBody(LinkedList<Node> body){
this.body=body;
}
public Direction getDirection() {
return direction;
}
public void setDirection(Direction direction) {
this.direction=direction;
}
public void eat(Node food) {
Node head=body.getFirst();
switch(direction) {
case UP:
body.add(new Node(head.getX(),head.getY()-1));
break;
case DOWN:
body.add(new Node(head.getX(),head.getY()+1));
break;
case LEFT:
body.add(new Node(head.getX()-1,head.getY()));
break;
case RIGHT:
body.add(new Node(head.getX()+1,head.getY()));
break;
}
}
}
enum Direction {
UP,DOWN,LEFT,RIGHT
}
public static void main(String[] args) {
new MainFrame().setVisible(true);
}
}
运用节点控制蛇头移动,食物生成和蛇体增长,设置撞墙死亡和吃自己死亡,通过repaint重绘画布,通过定时更新,eclipseTime模块运行出错。
最后
以上就是坦率河马为你收集整理的计算机软件实习项目二学习目标:学习内容:学习产出:的全部内容,希望文章能够帮你解决计算机软件实习项目二学习目标:学习内容:学习产出:所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复