java實(shí)現(xiàn)簡(jiǎn)易貪吃蛇游戲
本文實(shí)例為大家分享了java實(shí)現(xiàn)貪吃蛇游戲的具體代碼,供大家參考,具體內(nèi)容如下
1.封裝貪吃蛇身體,抽象出貪吃蛇結(jié)點(diǎn)類Node,結(jié)點(diǎn)用ArrayList存儲(chǔ)
import java.awt.*;
public class Node {
private int x;
private int y;
public Node(int x, int y) {
this.x = x;
this.y = y;
}
public Node(){
}
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 drawNode(int i, Graphics g){
if(i==0){//頭繪制成圓
g.fillOval(this.x,this.y,20-1,20-1);
}else{//身體繪制成矩形
g.fillRect(this.x,this.y,20-1,20-1);
}
}
}
2.主類
import java.awt.*;
import java.awt.event.*;
import java.util.ArrayList;
public class Snake extends Frame implements KeyListener , ActionListener {
//初始蛇移動(dòng)方向
String fx="right";
//碰撞判斷
boolean is_attack=false;
private ArrayList<Node> body=new ArrayList<Node>();
{
body.add(new Node(160, 60));
body.add(new Node(140, 60));
body.add(new Node(120, 60));
int x=(int)(Math.random()*580);
int y=(int)(Math.random()*580);
body.add(new Node(x-x%20,y-y%20));
}
/**
* 貪吃蛇
* 1、窗體
* 位置(坐標(biāo)) * 標(biāo)題 * 大小 * 背景顏色 * 窗體的大小不可變 * 可見(jiàn)
* 2、繪制蛇
*/
public Snake(){
//窗體標(biāo)題
super.setTitle("貪吃蛇游戲");
//窗體位置
super.setLocation(100,100);
//窗體大小
super.setSize(600,600);
//背景顏色
super.setBackground(new Color(252,255, 208));
//設(shè)置窗體可見(jiàn)
super.setVisible(true);
// 窗體大小不可變
super.setResizable(false);
//給關(guān)閉按鈕添加事件
super.addWindowListener(new WindowAdapter() {
@Override
public void windowClosing(WindowEvent e) {
System.exit(0);
}
});
//獲取聚焦
super.setFocusable(true);
//添加鍵盤監(jiān)聽
super.addKeyListener(this);
start();
}
public void start(){
while(!is_attack){
try{
Thread.sleep(200);
}catch (Exception e){
e.printStackTrace();
}
//碰撞檢測(cè)
attack_check();
//刷新窗體,調(diào)用paint方法
repaint();
}
}
//碰撞檢測(cè)
public void attack_check(){
//撞到身體檢測(cè)
for(int i=1;i<body.size()-1;i++){
if (body.get(0).getX()==body.get(i).getX()&&body.get(0).getY()==body.get(i).getY()){
is_attack=true;
}
}
//撞到邊界
if(body.get(0).getX()==0||body.get(0).getX()==600||body.get(0).getY()==0||body.get(0).getY()==600){
is_attack=true;
}
}
//移動(dòng)貪吃蛇
public void move(){
//吃到食物判斷,頭結(jié)點(diǎn)坐標(biāo)和食物坐標(biāo)相等
if ((body.get(0).getX()==body.get(body.size()-1).getX())&&(body.get(0).getY()==body.get(body.size()-1).getY())) {
//出現(xiàn)下一個(gè)食物
int x=(int)(Math.random() * 580);
int y=(int)(Math.random() * 580);
body.get(body.size()-1).setX(x-x%20);
body.get(body.size()-1).setY(y-y%20);
//蛇身加一個(gè)結(jié)點(diǎn)
body.add(body.size()-1,new Node(0,0));
}
//移動(dòng)頭尾節(jié)點(diǎn),使貪吃蛇移動(dòng)
Node node=body.get(0);
if (fx.equals("up")){
node=new Node(node.getX(),node.getY()-20);
//加頭
body.add(0,node);
//去尾
body.remove(body.size()-2);
}if (fx.equals("down")){
node=new Node(node.getX(),node.getY()+20);
//加頭
body.add(0,node);
//去尾
body.remove(body.size()-2);
}if (fx.equals("right")){
node=new Node(node.getX()+20,node.getY());
//加頭
body.add(0,node);
//去尾
body.remove(body.size()-2);
}if (fx.equals("left")){
node=new Node(node.getX()-20,node.getY());
//加頭
body.add(0,node);
//去尾
body.remove(body.size()-2);
}
}
/**
* 展示窗體|每一次刷新窗體都會(huì)執(zhí)行的方法
* @param g 畫筆
*/
@Override
public void paint(Graphics g) {
g.setColor(new Color(105, 78,255));
for(int i=0; i<body.size(); i++){
body.get(i).drawNode(i,g);
}
move();
//游戲結(jié)束繪制
if(is_attack){
g.setColor(new Color(255, 67, 40));
Font ft = new Font("宋體", Font.PLAIN, 40);
g.setFont(ft);
g.drawString("很遺憾,游戲結(jié)束",150,300);
}
}
//事件監(jiān)聽
@Override
public void actionPerformed(ActionEvent e) {
}
@Override
public void keyPressed(KeyEvent e) {
int keyCode=e.getKeyCode();
if(keyCode==KeyEvent.VK_UP){
fx="up";
}if (keyCode==KeyEvent.VK_DOWN){
fx="down";
}if (keyCode==KeyEvent.VK_LEFT){
fx="left";
}if (keyCode==KeyEvent.VK_RIGHT){
fx="right";
}
}
@Override
public void keyTyped(KeyEvent e) {
}
@Override
public void keyReleased(KeyEvent e) {
}
/**
* main方法
* @param args
*/
public static void main(String[] args) {
new Snake();
}
}
運(yùn)行圖片

游戲結(jié)束

以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
基于request.getAttribute與request.getParameter的區(qū)別詳解
本篇文章小編為大家介紹,基于request.getAttribute與request.getParameter的區(qū)別詳解。需要的朋友參考下2013-04-04
Java中Stream的flatMap與map使用場(chǎng)景及區(qū)別詳解
這篇文章主要介紹了Java中Stream的flatMap與map使用場(chǎng)景及區(qū)別詳解,Stream 流式操作,一般用于操作集合即 List 一類的數(shù)據(jù)結(jié)構(gòu),簡(jiǎn)單來(lái)說(shuō) Stream 的 map 使得其中的元素轉(zhuǎn)為另一種元素的映射(map)方法,需要的朋友可以參考下2024-01-01
Java實(shí)現(xiàn)用戶短信驗(yàn)證碼登錄功能實(shí)例代碼
現(xiàn)在不管是各類的網(wǎng)站,還是大小社交app,登錄方式是越來(lái)越多了,但是大部分還是以短信登錄為主,本文主要介紹了java短信驗(yàn)證碼登錄功能設(shè)計(jì)與實(shí)現(xiàn),感興趣的可以了解一下2021-11-11
Java并發(fā)編程之CountDownLatch的使用
CountDownLatch是一個(gè)倒數(shù)的同步器,常用來(lái)讓一個(gè)線程等待其他N個(gè)線程執(zhí)行完成再繼續(xù)向下執(zhí)行,本文主要介紹了CountDownLatch的具體使用方法,感興趣的可以了解一下2023-05-05
springboot訪問(wèn)template下的html頁(yè)面的實(shí)現(xiàn)配置
這篇文章主要介紹了springboot訪問(wèn)template下的html頁(yè)面的實(shí)現(xiàn)配置,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2020-12-12

