贪吃蛇JAVA源代码完整版.docx

上传人:b****8 文档编号:9855505 上传时间:2023-02-07 格式:DOCX 页数:14 大小:416.35KB
下载 相关 举报
贪吃蛇JAVA源代码完整版.docx_第1页
第1页 / 共14页
贪吃蛇JAVA源代码完整版.docx_第2页
第2页 / 共14页
贪吃蛇JAVA源代码完整版.docx_第3页
第3页 / 共14页
贪吃蛇JAVA源代码完整版.docx_第4页
第4页 / 共14页
贪吃蛇JAVA源代码完整版.docx_第5页
第5页 / 共14页
点击查看更多>>
下载资源
资源描述

贪吃蛇JAVA源代码完整版.docx

《贪吃蛇JAVA源代码完整版.docx》由会员分享,可在线阅读,更多相关《贪吃蛇JAVA源代码完整版.docx(14页珍藏版)》请在冰豆网上搜索。

贪吃蛇JAVA源代码完整版.docx

贪吃蛇JAVA源代码完整版

游戏贪吃蛇的JAVA源代码

一.文档说明

a)本代码主要功能为实现贪吃蛇游戏,GUI界面做到尽量简洁和原游戏相仿。

目前版本包含计分,统计最高分,长度自动缩短计时功能。

b)本代码受计算机系大神指点,经许可后发布如下,向Java_online网致敬

c)运行时请把.java文件放入defaultpackage即可运行。

二.运行截图

a)文件位置

b)进入游戏

c)游戏进行中

 

三.JAVA代码

importjava.awt.*;

importjava.awt.event.*;

importstaticjava.lang.String.format;

importjava.util.*;

importjava.util.List;

importjavax.swing.*;

publicclassSnakeextendsJPanelimplementsRunnable{

enumDir{

up(0,-1),right(1,0),down(0,1),left(-1,0);

Dir(intx,inty){

this.x=x;this.y=y;

}

finalintx,y;

}

staticfinalRandomrand=newRandom();

staticfinalintWALL=-1;

staticfinalintMAX_ENERGY=1500;

volatilebooleangameOver=true;

ThreadgameThread;

intscore,hiScore;

intnRows=44;

intnCols=64;

Dirdir;

intenergy;

int[][]grid;

Listsnake,treats;

FontsmallFont;

publicSnake(){

setPreferredSize(newDimension(640,440));

setBackground(Color.white);

setFont(newFont("SansSerif",Font.BOLD,48));

setFocusable(true);

smallFont=getFont().deriveFont(Font.BOLD,18);

initGrid();

addMouseListener(newMouseAdapter(){

@Override

publicvoidmousePressed(MouseEvente){

if(gameOver){

startNewGame();

repaint();

}

}

});

addKeyListener(newKeyAdapter(){

@Override

publicvoidkeyPressed(KeyEvente){

switch(e.getKeyCode()){

caseKeyEvent.VK_UP:

if(dir!

=Dir.down)

dir=Dir.up;

break;

caseKeyEvent.VK_LEFT:

if(dir!

=Dir.right)

dir=Dir.left;

break;

caseKeyEvent.VK_RIGHT:

if(dir!

=Dir.left)

dir=Dir.right;

break;

caseKeyEvent.VK_DOWN:

if(dir!

=Dir.up)

dir=Dir.down;

break;

}

repaint();

}

});

}

voidstartNewGame(){

gameOver=false;

stop();

initGrid();

treats=newLinkedList<>();

dir=Dir.left;

energy=MAX_ENERGY;

if(score>hiScore)

hiScore=score;

score=0;

snake=newArrayList<>();

for(intx=0;x<7;x++)

snake.add(newPoint(nCols/2+x,nRows/2));

do

addTreat();

while(treats.isEmpty());

(gameThread=newThread(this)).start();

}

voidstop(){

if(gameThread!

=null){

Threadtmp=gameThread;

gameThread=null;

tmp.interrupt();

}

}

voidinitGrid(){

grid=newint[nRows][nCols];

for(intr=0;r

for(intc=0;c

if(c==0||c==nCols-1||r==0||r==nRows-1)

grid[r][c]=WALL;

}

}

}

@Override

publicvoidrun(){

while(Thread.currentThread()==gameThread){

try{

Thread.sleep(Math.max(75-score,25));

}catch(InterruptedExceptione){

return;

}

if(energyUsed()||hitsWall()||hitsSnake()){

gameOver();

}else{

if(eatsTreat()){

score++;

energy=MAX_ENERGY;

growSnake();

}

moveSnake();

addTreat();

}

repaint();

}

}

booleanenergyUsed(){

energy-=10;

returnenergy<=0;

}

booleanhitsWall(){

Pointhead=snake.get(0);

intnextCol=head.x+dir.x;

intnextRow=head.y+dir.y;

returngrid[nextRow][nextCol]==WALL;

}

booleanhitsSnake(){

Pointhead=snake.get(0);

intnextCol=head.x+dir.x;

intnextRow=head.y+dir.y;

for(Pointp:

snake)

if(p.x==nextCol&&p.y==nextRow)

returntrue;

returnfalse;

}

booleaneatsTreat(){

Pointhead=snake.get(0);

intnextCol=head.x+dir.x;

intnextRow=head.y+dir.y;

for(Pointp:

treats)

if(p.x==nextCol&&p.y==nextRow){

returntreats.remove(p);

}

returnfalse;

}

voidgameOver(){

gameOver=true;

stop();

}

voidmoveSnake(){

for(inti=snake.size()-1;i>0;i--){

Pointp1=snake.get(i-1);

Pointp2=snake.get(i);

p2.x=p1.x;

p2.y=p1.y;

}

Pointhead=snake.get(0);

head.x+=dir.x;

head.y+=dir.y;

}

voidgrowSnake(){

Pointtail=snake.get(snake.size()-1);

intx=tail.x+dir.x;

inty=tail.y+dir.y;

snake.add(newPoint(x,y));

}

voidaddTreat(){

if(treats.size()<3){

if(rand.nextInt(10)==0){//1in10

if(rand.nextInt(4)!

=0){//3in4

intx,y;

while(true){

x=rand.nextInt(nCols);

y=rand.nextInt(nRows);

if(grid[y][x]!

=0)

continue;

Pointp=newPoint(x,y);

if(snake.contains(p)||treats.contains(p))

continue;

treats.add(p);

break;

}

}elseif(treats.size()>1)

treats.remove(0);

}

}

}

voiddrawGrid(Graphics2Dg){

g.setColor(Color.lightGray);

for(intr=0;r

for(intc=0;c

if(grid[r][c]==WALL)

g.fillRect(c*10,r*10,10,10);

}

}

}

voiddrawSnake(Graphics2Dg){

g.setColor(Color.blue);

for(Pointp:

snake)

g.fillRect(p.x*10,p.y*10,10,10);

g.setColor(energy<500?

Color.red:

Color.orange);

Pointhead=snake.get(0);

g.fillRect(head.x*10,head.y*10,10,10);

}

voiddrawTreats(Graphics2Dg){

g.setColor(Color.green);

for(Pointp:

treats)

g.fillRect(p.x*10,p.y*10,10,10);

}

voiddrawStartScreen(Graphics2Dg){

g.setColor(Color.blue);

g.setFont(getFont());

g.drawString("Snake",240,190);

g.setColor(Color.orange);

g.setFont(smallFont);

g.drawString("(clicktostart)",250,240);

}

voiddrawScore(Graphics2Dg){

inth=getHeight();

g.setFont(smallFont);

g.setColor(getForeground());

Strings=format("hiscore%dscore%d",hiScore,score);

g.drawString(s,30,h-30);

g.drawString(format("energy%d",energy),getWidth()-150,h-30);

}

@Override

publicvoidpaintComponent(Graphicsgg){

super.paintComponent(gg);

Graphics2Dg=(Graphics2D)gg;

g.setRenderingHint(RenderingHints.KEY_ANTIALIASING,

RenderingHints.VALUE_ANTIALIAS_ON);

drawGrid(g);

if(gameOver){

drawStartScreen(g);

}else{

drawSnake(g);

drawTreats(g);

drawScore(g);

}

}

publicstaticvoidmain(String[]args){

SwingUtilities.invokeLater(()->{

JFramef=newJFrame();

f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

f.setTitle("Snake");

f.setResizable(false);

f.add(newSnake(),BorderLayout.CENTER);

f.pack();

f.setLocationRelativeTo(null);

f.setVisible(true);

});

}

}

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 高等教育 > 文学

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1