targetElem = new SnakeElement(0, 0);
do{
x = Math.abs(rnd.nextInt(w));
y = Math.abs(rnd.nextInt(h));
} while (square[x][y].isBorder);
targetElem.setSpeed(0, 0);
targetElem.xPos = x; targetElem.yPos = y;
square[x][y].setUsed(true);
}
public void paintComponent(Graphics g){
super.paintComponent(g);
int squareW = (getWidth())/w;
int squareH = (getHeight())/h;
for(int x = 0; x<w; x++){
for(int y = 0; y<h; y++){
square[x][y].setSize(squareW, squareH);
square[x][y].setLocation(x*squareW, y*squareH);
g.setColor(Color.BLUE);
g.setFont( new Font("1", Font.BOLD, 20) );
if ( !isGameRun ){
g.drawString("Розпочніть нову гру", 40, 100);
} else {
if (isGamePause){
g.drawString("ПАУЗА", 100, 100);
public void run (){
while (true){
if (isGameRun && !isGamePause){
keyBlocked = true;
int n = snake.colElements-1;
SnakeElement lastElem = new SnakeElement(snake.elem[n].xPos, snake.elem[n].yPos);
lastElem.setSpeed(snake.elem[n].xSpeed, snake.elem[n].ySpeed);
square[lastElem.xPos][lastElem.yPos].setUsed(false);
square[lastElem.xPos][lastElem.yPos].setBorder(false);
snake.move();
crash = square[snake.elem[0].xPos][snake.elem[0].yPos].isBorder;
target = !crash &&
square[snake.elem[0].xPos][snake.elem[0].yPos].used;
if (target){
snake.increment(lastElem);
createTarget();
cheeckWin();
keyBlocked = false;
for (int i = 0; i<snake.colElements; i++){
square[snake.elem[i].xPos][snake.elem[i].yPos].setUsed(true);
square[snake.elem[i].xPos][snake.elem[i].yPos].setBorder(true);
square[snake.elem[i].xPos][snake.elem[i].yPos].n = i;
if (crash) { processCrash(); }
repaint();
informPanel.updateInfo(snake.getLives(), snake.colElements,
gameSpeed, colObstacles);
informPanel.repaint();
try { Thread.sleep (delay); }
catch ( InterruptedException ex){ }
public void cheeckWin(){
if (snake.isMaxLong()) {
JOptionPane.showMessageDialog(frame,
"Ви перемогли!\nНа швидкості "+gameSpeed, "Ігрова інформація",
JOptionPane.INFORMATION_MESSAGE);
stopGame();
try { Thread.sleep (delay*2); }
setDefault();
public void processCrash(){
snake.decrementLive();
if (snake.isKilled()) {
"Гру завершено!", "Ігрова інформація",
public void newGame(){
if (isGameRun) stopGame();
snake.resetLives();
isGameRun = true;
isGamePause = false;
public void pauseGame(){
isGamePause = !isGamePause;
} else{
public void stopGame( ){
isGameRun = false;
public void setGameSpeed(int s){
gameSpeed = s;
switch (gameSpeed){
case 1: delay = 400; break;
case 2: delay = 200; break;
case 3: delay = 100; break;
public void start(){
setGameSpeed(2);
th = new Thread(this);
th.start();
public void stop(){}
public void keyPressed (KeyEvent e){
switch (e.getKeyCode()) { // Яку клавішу натиснули.
case KeyEvent.VK_LEFT :
if (!snake.elem[0].isMovingRight() && !keyBlocked){
snake.setMoveLeft();
break;
case KeyEvent.VK_RIGHT :
if (!snake.elem[0].isMovingLeft() && !keyBlocked){
snake.setMoveRight();
case KeyEvent.VK_UP :
if (!snake.elem[0].isMovingDown() && !keyBlocked){
snake.setMoveUp();
case KeyEvent.VK_DOWN :
if (!snake.elem[0].isMovingUp() && !keyBlocked){
snake.setMoveDown();
case KeyEvent.VK_SPACE :
newGame();
case KeyEvent.VK_P :
pauseGame();
public void keyTyped(KeyEvent e){}
public void keyReleased(KeyEvent e){}
import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
public class InformPanel extends JPanel{
JLabel label;
boolean rn = true;
protected int lives, len, speed, obstacles;
public InformPanel(final GameField field) {
label = new JLabel("Інформація гри");
add(label);
public void setDefault(){
updateInfo(0, 0, 0, 0);
public void updateInfo(int lives, int len, int speed, int obstacles){
this.lives = lives;
this.len = len;
this.speed = speed;
this.obstacles = obstacles;
int h = 100;
g.drawString(" Життя: " + lives, 1, h += 30);
g.drawString("Елементів: " + len, 1, h += 30);
g.drawString("Швидкість: " + speed, 1, h += 30);
g.drawString(" Перепони: " + obstacles, 1, h += 30);
class Snake {
int colElements;
final int maxLen = 16;
SnakeElement elem[];
int xNextSpeed, yNextSpeed;
Страницы: 1, 2, 3, 4