java編寫簡易貪吃蛇游戲
本文實(shí)例為大家分享了java編寫的貪吃蛇源碼,供大家參考,具體內(nèi)容如下
程序共包含以下兩個(gè)文件:
文件:ShellWin.java
import java.awt.Color;
import java.awt.Dimension;
import java.awt.FlowLayout;
import java.awt.Graphics;
import java.awt.event.*;
import javax.swing.Box;
import javax.swing.JButton;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
@SuppressWarnings("serial")
public class ShellWin extends JPanel implements Runnable{ //實(shí)現(xiàn)了鍵盤與鼠標(biāo)兩個(gè)接口
int direction;
int length;
int score=0;
boolean control=false;
int[] xs=new int[400]; //蛇的個(gè)數(shù),xy,坐標(biāo)控制
int[] ys=new int[400];
int douX;int douY;
Thread thread;
public ShellWin()
{
setPreferredSize(new Dimension(600, 600));
setLocation(100, 100);
setBackground(Color.GREEN);
thread=new Thread(this); //為這個(gè)類添加一個(gè)線程
create_snake();
create_bean();
}
public void paintComponent(Graphics g) //繪制
{
super.paintComponent(g); //Jpanel內(nèi)的方法,起到清屏的作用
g.drawString("分?jǐn)?shù):"+score, 50, 50);
g.drawRect(0,0, 600, 600);
show_snake(g);
show_bean(g);
}
//能不能吃豆,能不能死
void die()
{
JOptionPane.showMessageDialog(null, "game over", "游戲結(jié)束", JOptionPane.ERROR_MESSAGE);
}
void eat()
{
length++;
this.score+=100;
create_bean();
}
boolean out_bounds()
{
if(xs[0]==-10||xs[0]==600||ys[0]==-10||ys[0]==600) //出界即死
{
return true;
}
return false;
}
void change_direction(int new_direction) //控制方向
{
if(direction%2!=new_direction%2||direction==0) // 2 4 3 1 上下左右
{
direction=new_direction;
}
}
boolean eat_self()
{
for (int i = 1; i < length; i++) {
if(xs[0]==xs[i]&&ys[0]==ys[i])
{
return true;
}
}
return false;
}
boolean can_eat()
{
if(xs[0]==douX&&ys[0]==douY)
{
return true;
}
return false;
}
void create_snake()
{
direction=0;length=5;
for (int i = 0; i < length; i++) {
xs[i]=400;
ys[i]=400+10*i;
}
}
void create_bean()
{
douX=10*(int)(Math.random()*60);
douY=10*(int)(Math.random()*60);
for (int i = 0; i < length; i++) {
if(xs[i]==douX&&ys[i]==douY)
{
create_bean();
return;
}
}
}
void show_bean(Graphics g) //仍然得要寫入到paintComponent方法內(nèi)
{
g.setColor(Color.RED);
g.fillOval(douX, douY, 10, 10);
}
void crawl()
{
if(direction!=0)
for (int i = length-1; i >0; i--) { // 2 4 3 1 上下左右
xs[i]=xs[i-1]; //后一個(gè)替代前一個(gè) 4=3;
ys[i]=ys[i-1];
}
switch (direction) {
case 1:
xs[0]=xs[0]+10;
break;
case 2:
ys[0]=ys[0]-10;
break;
case 3:
xs[0]=xs[0]-10;
break;
case 4:
ys[0]=ys[0]+10;
break;
default:
break;
}
}
void show_snake(Graphics g)
{
for (int i = 0; i < length; i++) {
g.setColor(Color.BLUE);
if(i==0){
g.drawOval(xs[i], ys[i], 10, 10);
continue;
}
g.drawRect(xs[i], ys[i], 10, 10); //蛇的長度與大小
}
}
@Override
public void run() {
while(control)
{
try {
if(can_eat())
{
eat();
}
if(out_bounds())
{
die();
return;
}
if(eat_self())
{
die();
return;
}
crawl();
Thread.sleep(200);
repaint();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
class panel extends JPanel implements ActionListener,KeyListener{
JButton startGame=new JButton("開始");
JButton stopGame=new JButton("停止");
Box box1; //盒式布局
panel(){
setLayout(new FlowLayout());
box1=Box.createHorizontalBox();
box1.add(startGame);
box1.add(Box.createHorizontalStrut(2));
box1.add(stopGame);
setSize(800,800);
setBackground(Color.black);
addKeyListener(this); //為ShellWin 對象注冊一個(gè)偵聽器
startGame.addActionListener(this); //為開始按鈕添加偵聽器,this指代的是Actionistener這個(gè)類所創(chuàng)建的對象
stopGame.addActionListener(this); //為結(jié)束按鈕添加偵聽器,this指代的是Actionistener這個(gè)類所創(chuàng)建的對象
}
@Override
public void actionPerformed(ActionEvent e) {
if(e.getSource()==startGame)
{
this.requestFocus(); //將光標(biāo)添加到該控件中
control=true;
thread.start(); //線程開始
//***********************************
this.repaint(100,100, 600, 600);
}
if(e.getSource()==stopGame)
{
this.requestFocus(); //將光標(biāo)添加到該控件中
control=false; //線程結(jié)束
}
}
@Override
public void keyPressed(KeyEvent e) {
switch (e.getKeyCode()) {
case KeyEvent.VK_UP:
change_direction(2);
break;
case KeyEvent.VK_DOWN:
if(direction!=0)
change_direction(4);
break;
case KeyEvent.VK_LEFT:
change_direction(3);
break;
case KeyEvent.VK_RIGHT:
change_direction(1);
break;
default:
break;
}
}
@Override
public void keyReleased(KeyEvent e) {
// TODO Auto-generated method stub
}
@Override
public void keyTyped(KeyEvent e) {
// TODO Auto-generated method stub
}
}
}
文件:ShellMain.java
import javax.swing.Box;
import javax.swing.JFrame;
@SuppressWarnings("serial")
public class ShellMain extends JFrame {
ShellWin win=new ShellWin();
ShellWin.panel pan=win.new panel();
Box box,box2;
ShellMain(){
box2=Box.createHorizontalBox();
box2.add(win);
box=Box.createVerticalBox();
box.add(pan.box1);
box.add(Box.createVerticalStrut(8));
box.add(box2);
pan.add(box);
setTitle("貪吃蛇");
setSize(800,800);
setVisible(true);
setLayout(null);
add(pan);
setLocation(0,0);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
}
public static void main(String[] args) {
new ShellMain();
}
}
更多精彩游戲,請參考專題《java經(jīng)典小游戲》
更多有趣的經(jīng)典小游戲?qū)崿F(xiàn)專題,分享給大家:
以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
java使用CountDownLatch等待多線程全部執(zhí)行完成
這篇文章主要為大家詳細(xì)介紹了使用CountDownLatch等待多線程全部執(zhí)行完成,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2018-10-10
Spring?Cloud?Alibaba實(shí)現(xiàn)服務(wù)的無損下線功能(案例講解)
這篇文章主要介紹了Spring?Cloud?Alibaba實(shí)現(xiàn)服務(wù)的無損下線功能?,本文通過實(shí)例代碼給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2023-03-03
記一次集成swagger2(Knife4j)在線文檔提示:Knude4j文檔請求異常的解決辦法
Knife4j是一個(gè)集Swagger2 和 OpenAPI3為一體的增強(qiáng)解決方案,下面這篇文章主要給大家介紹了關(guān)于一次集成swagger2(Knife4j)在線文檔提示:Knude4j文檔請求異常的解決辦法,文中通過代碼介紹的非常詳細(xì),需要的朋友可以參考下2024-02-02
Java多線程中線程池常見7個(gè)參數(shù)的詳解以及執(zhí)行流程
本文主要介紹了Java多線程中線程池常見7個(gè)參數(shù)的詳解以及執(zhí)行流程,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2023-07-07
springboot 如何配置多個(gè)jndi數(shù)據(jù)源
這篇文章主要介紹了springboot 如何配置多個(gè)jndi數(shù)據(jù)源的操作,具有很好的參考價(jià)值,希望對大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-07-07
JAVA發(fā)送HTTP請求,返回HTTP響應(yīng)內(nèi)容,應(yīng)用及實(shí)例代碼
這篇文章主要介紹了JAVA發(fā)送HTTP請求,返回HTTP響應(yīng)內(nèi)容,應(yīng)用及實(shí)例代碼,需要的朋友可以參考下2014-02-02
Netty分布式pipeline管道Handler的刪除邏輯操作
這篇文章主要為大家介紹了Netty分布式pipeline管道Handler的刪除邏輯操作,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-03-03
Java實(shí)現(xiàn)將png格式圖片轉(zhuǎn)換成jpg格式圖片的方法【測試可用】
這篇文章主要介紹了Java實(shí)現(xiàn)將png格式圖片轉(zhuǎn)換成jpg格式圖片的方法,涉及java文件讀寫及圖形創(chuàng)建等相關(guān)操作技巧,需要的朋友可以參考下2018-03-03

