简单的贪食蛇

import java.awt.Button;
import java.awt.Color;
import java.awt.GridLayout;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import java.util.LinkedList;
import java.util.Random;

import javax.swing.JFrame;
import javax.swing.JOptionPane;
import javax.swing.JPanel;

public class HungrySnake extends JPanel implements Runnable {

class Point {
@Override
public int hashCode() {
final int prime = 31;
int result = 1;
result = prime * result + getOuterType().hashCode();
result = prime * result + x;
result = prime * result + y;
return result;
}

@Override
public boolean equals(Object obj) {
if (this == obj)
return true;
if (obj == null)
return false;
if (getClass() != obj.getClass())
return false;
Point other = (Point) obj;
if (!getOuterType().equals(other.getOuterType()))
return false;
if (x != other.x)
return false;
if (y != other.y)
return false;
return true;
}

int x;
int y;

public Point(int x, int y) {
this.x = x;
this.y = y;
}

private HungrySnake getOuterType() {
return HungrySnake.this;
}
}

Button[][] buttonArray = new Button[20][20];

LinkedList<Point> snake = new LinkedList<Point>();

Direction currentDirection = Direction.up;
boolean pause = true;

Point food = new Point(8, 8);

private void init() {
GridLayout gl = new GridLayout(20, 20);
this.setLayout(gl);
for (int i = 0; i < buttonArray.length; i++) {
for (int j = 0; j < buttonArray[i].length; j++) {
Button bt = new Button();
bt.setEnabled(false);
buttonArray[i][j] = bt;
bt.setLabel(i + "" + j);
bt.setBackground(Color.BLUE);
this.add(bt);
}
}

snake.add(new Point(5, 5));

this.setVisible(true);
this.setBackground(Color.gray);
}

public void setPause(boolean b) {
pause = b;
}

public Direction getDirection() {
return currentDirection;
}

public void setDirection(Direction d) {
currentDirection = d;
}

public HungrySnake() {
init();
}

public enum Direction {
up, down, right, left;
}

private void paintSnake() {
for (int i = 0; i < buttonArray.length; i++) {
for (int j = 0; j < buttonArray[i].length; j++) {
buttonArray[i][j].setBackground(Color.gray);
}
}
for (Point snakePoint : snake) {
buttonArray[snakePoint.x][snakePoint.y].setBackground(Color.WHITE);
}
buttonArray[food.x][food.y].setBackground(Color.ORANGE);
}

public void restart() {
snake.clear();
snake.add(new Point(5, 5));
currentDirection = Direction.up;
food = new Point(8, 8);
paintSnake();
pause = true;
}

private void moveSnake() {
Point first = snake.getFirst();
// Point last = snake.getLast();
Point newPoint = new Point(first.x, first.y);
if (currentDirection == Direction.up) {
newPoint.x = first.x - 1;
}
if (currentDirection == Direction.down) {
newPoint.x = first.x + 1;
}
if (currentDirection == Direction.left) {
newPoint.y = first.y - 1;
}
if (currentDirection == Direction.right) {
newPoint.y = first.y + 1;
}
// out of field or touch itself
if (newPoint.x < 0 || newPoint.x > buttonArray.length || newPoint.y < 0 || newPoint.y > buttonArray.length || snake.contains(newPoint)) {
JOptionPane.showMessageDialog(this.getParent(), "总共吃了"+(snake.size()-1)+"个食物,"+"任务失败,重新开始!", "Failed", JOptionPane.ERROR_MESSAGE);
restart();
}
else {
// eat food
if (newPoint.x == food.x && newPoint.y == food.y) {
eatFood();
}
// only move
else {
snake.removeLast();
snake.addFirst(newPoint);
}
paintSnake();
}

}

private void eatFood() {
snake.addFirst(food);
genFood();
}

private void genFood() {
while (true) {
Random random = new Random();
int x = random.nextInt(9);
int y = random.nextInt(9);
Point genPoint = new Point(x, y);
if (snake.contains(genPoint)) {
continue;
} else {
food = genPoint;
break;
}
}

}

public void run() {
paintSnake();
while (true) {
if (pause == false) {
moveSnake();
try {
Thread.sleep(500);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}

public static void main(String[] args) {
JFrame frame = new JFrame();

final HungrySnake hs = new HungrySnake();

frame.add(hs);
frame.setTitle("Hungry Snake");
frame.setBounds(100, 100, 800, 800);
frame.addKeyListener(new KeyListener() {

@Override
public void keyTyped(KeyEvent e) {

}

@Override
public void keyPressed(KeyEvent e) {
if (e.getKeyCode() == KeyEvent.VK_UP) {
if(hs.getDirection() != Direction.down)
hs.setDirection(Direction.up);
}
if (e.getKeyCode() == KeyEvent.VK_DOWN) {
if(hs.getDirection() != Direction.up)
hs.setDirection(Direction.down);
}
if (e.getKeyCode() == KeyEvent.VK_RIGHT) {
if(hs.getDirection() != Direction.left)
hs.setDirection(Direction.right);
}
if (e.getKeyCode() == KeyEvent.VK_LEFT) {
if(hs.getDirection() != Direction.right)
hs.setDirection(Direction.left);
}

if (e.getKeyCode() == KeyEvent.VK_SPACE) {
hs.setPause(!hs.pause);
}
}

@Override
public void keyReleased(KeyEvent e) {

}

});
frame.show();
JOptionPane.showMessageDialog(frame, "按空格键开始或暂停。游戏规则很简单,不能碰边,不能碰自己,用方向键控制蛇前进方向。", "Start",JOptionPane.INFORMATION_MESSAGE);
Thread t = new Thread(hs);
t.start();

}

}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
贪食蛇是一款经典的游戏,玩家通过控制一条蛇在一个有边界的区域内移动,吃掉食物并尽可能长大。在Python中,可以使用Pygame等库来实现贪食蛇游戏。 在游戏中,需要实现以下功能: 1. 绘制游戏界面:使用图形库绘制游戏窗口、蛇和食物等元素。 2. 控制蛇的移动:根据玩家的输入控制蛇的方向,并更新蛇的位置。 3. 碰撞检测:检测蛇是否与边界或自身相撞,以及是否吃到了食物。 4. 更新游戏状态:根据碰撞检测的结果更新游戏状态,如增加蛇的长度、生成新的食物等。 5. 计分系统:记录玩家的得分,通常是根据吃到的食物数量计算得分。 以下是一个简单贪食蛇游戏的实现示例: ```python import pygame import random # 游戏初始化 pygame.init() width, height = 640, 480 screen = pygame.display.set_mode((width, height)) clock = pygame.time.Clock() # 蛇的初始位置和速度 snake_pos = [[100, 50], [90, 50], [80, 50]] snake_speed = [10, 0] # 食物的初始位置 food_pos = [random.randrange(1, width // 10) * 10, random.randrange(1, height // 10) * 10] food_spawn = True # 游戏主循环 running = True while running: for event in pygame.event.get(): if event.type == pygame.QUIT: running = False # 控制蛇的移动 keys = pygame.key.get_pressed() if keys[pygame.K_UP]: snake_speed = [0, -10] if keys[pygame.K_DOWN]: snake_speed = [0, 10] if keys[pygame.K_LEFT]: snake_speed = [-10, 0] if keys[pygame.K_RIGHT]: snake_speed = [10, 0] # 更新蛇的位置 snake_pos += snake_speed snake_pos += snake_speed # 碰撞检测 if snake_pos < 0 or snake_pos >= width or snake_pos < 0 or snake_pos[1] >= height: running = False if snake_pos in snake_pos[1:]: running = False if snake_pos == food_pos: food_spawn = False snake_pos.append([0, 0]) # 更新游戏状态 if not food_spawn: food_pos = [random.randrange(1, width // 10) * 10, random.randrange(1, height // 10) * 10] food_spawn = True # 绘制游戏界面 screen.fill((0, 0, 0)) for pos in snake_pos: pygame.draw.rect(screen, (0, 255, 0), pygame.Rect(pos, pos, 10, 10)) pygame.draw.rect(screen, (255, 0, 0), pygame.Rect(food_pos, food_pos, 10, 10)) pygame.display.flip() # 控制游戏帧率 clock.tick(30) # 游戏结束 pygame.quit() ```

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值