用java做一个较为完整的贪吃蛇
@[
------ 因为有个关于游戏的兴趣课没去,该课讲得是贪吃蛇,所以自己一直都想尝试去做下的,借这个寒假的机会,就自己学了,自己做的还是较为全面的,有登陆界面,可以选择游戏难度,游戏过程有背景音乐,死亡时也有特殊音乐。
(一)制作游戏登陆界面
1.1添加游戏开始背景图
1.2设置开始与退出登陆
1.3添加游戏模式选择框
游戏效果图展示
游戏代码
package Snake;
import java.applet.AudioClip;
import java.awt.FlowLayout;
import java.awt.Graphics;
import java.awt.Image;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.ItemEvent;
import java.awt.event.ItemListener;
import java.io.File;
import java.net.URL;
import javax.imageio.ImageIO;
import javax.swing.AbstractListModel;
import javax.swing.ComboBoxModel;
import javax.swing.ImageIcon;
import javax.swing.JButton;
import javax.swing.JComboBox;
import javax.swing.JFrame;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.UIManager;
public class View{
JFrame frame=new JFrame();
ImageIcon loginview=new ImageIcon("./src/Image/loginview.jpg");//登陆界面背景图
JButton ks_jb;
JButton tc_jb;
Backimage im=new Backimage();
Combobox combobox=new Combobox();//下拉列表框模型
JComboBox<String>jc=new JComboBox<>(combobox);//下拉列表框
String x="model";
public View(){
frame.setSize(406,329);
//窗口可见
frame.setVisible(true);
//窗口关闭方式
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
//窗口不可改变
frame.setResizable(false);
//窗口放于中心
frame.setLocationRelativeTo(null);
//设置字体,位置
ks_jb=new JButton("开始");
tc_jb=new JButton("退出");
ks_jb.setBounds(90,250,60,30);
ks_jb.setFont(Front.f1);
tc_jb.setBounds(260,250,60,30);
tc_jb.setFont(Front.f1);
jc.setBounds(170,250,70,30);
jc.setFont(Front.f1);
im.setBounds(0, 0, 406, 329);
frame.setLocationRelativeTo(null);
frame.getContentPane().setLayout(null);
frame.getContentPane().add(ks_jb);
frame.getContentPane().add(tc_jb);
frame.getContentPane().add(jc);
frame.getContentPane().add(im);
//增加选项监听器
jc.addItemListener(new Listener());
//增加动作监听器
ks_listener ks_tin=new ks_listener();
tc_listener tc_tin=new tc_listener();
ks_jb.addActionListener(ks_tin);
tc_jb.addActionListener(tc_tin);
}
class Backimage extends JPanel
{
//要把图片画到JPanle,需要重写一个Paint方法
public void paint(Graphics g) //
{
loginview.paintIcon(this, g, 0, 0);
}
}
//下拉列表框模型
class Combobox extends AbstractListModel<String>implements ComboBoxModel<String>{
String selecteditem=null;
String[]test={"简单","困难","地狱"};
@Override
public int getSize() {
// TODO Auto-generated method stub
return test.length;
}
@Override
public String getElementAt(int index) {
// TODO Auto-generated method stub
return test[index];
}
@Override
public void setSelectedItem(Object anItem) {//返回选项的索引值
// TODO Auto-generated method stub
selecteditem=(String)anItem;
}
@Override
public Object getSelectedItem() {//返回索引值对应的选项
// TODO Auto-generated method stub
return selecteditem;
}
}
public class Listener implements ItemListener{
@Override
public void itemStateChanged(ItemEvent e) {
// TODO Auto-generated method stub
if (e.getStateChange() == ItemEvent.SELECTED) {
x=combobox.getSelectedItem().toString();
}
}
}
public class ks_listener implements ActionListener{
@Override
public void actionPerformed(ActionEvent e) {
// TODO Auto-generated method stub
if(x.equals("model")){
JOptionPane.showMessageDialog(frame,"请先选择游戏模式");
}
else if(x.equals("简单")){
System.out.println("简单");
Snake snake=new Snake(200);
frame.dispose();
}
else if(x.equals("困难")){
Snake snake=new Snake(50);
frame.dispose();
}
else if(x.equals("地狱")){
Snake snake=new Snake(10);
frame.dispose();
}
}
}
public class tc_listener implements ActionListener{
@Override
public void actionPerformed(ActionEvent e) {
// TODO Auto-generated method stub
System.exit(0);
}
}
public static void main(String[] args){
try {
UIManager.setLookAndFeel("javax.swing.plaf.metal.MetalLookAndFeel");
} catch (Exception e) {
e.printStackTrace();
}
View view=new View();
}
}
(二)制作游戏运行过程
2.1画出蛇的运行范围
2.2添加上部标题图
2.3设计蛇的移动
2.4利用计时器循环运行
2.5添加游戏背景音乐
效果图展示
游戏代码
package Snake;
import java.applet.Applet;
import java.applet.AudioClip;
import java.awt.Color;
import java.awt.Font;
import java.awt.Graphics;
import java.awt.Image;
import java.awt.event.ActionListener;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import java.io.File;
import java.net.MalformedURLException;
import java.net.URL;
import java.util.Random;
import java.util.Timer;
import java.util.TimerTask;
import javax.imageio.ImageIO;
import javax.swing.ImageIcon;
import javax.swing.JFrame;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.UIManager;
public class Snake implements KeyListener{
JFrame frame=new JFrame("贪吃蛇");
Drawpanel panel=new Drawpanel();
//蛇的身体组成图及食物
ImageIcon sup = new ImageIcon("./src/Image/up.png");
ImageIcon sdown = new ImageIcon("./src/Image/down.png");
ImageIcon sleft = new ImageIcon("./src/Image/left.png");
ImageIcon sright = new ImageIcon("./src/Image/right.png");
ImageIcon sfood = new ImageIcon("./src/Image/food.png");
ImageIcon sbody = new ImageIcon("./src/Image/body.png");
ImageIcon pan = new ImageIcon("./src/Image/pan.png");
//用数组存储蛇的各个部位
int[] snakex=new int[100];
int[] snakey=new int[100];
//随机生成食物位置
Random random=new Random();
int foodx=random.nextInt(34)*25+25;
int foody=random.nextInt(24)*25+75;
int len;//身体长度
int score;//得分
String sdirection;//运动方向
boolean start;//开始标志
boolean end;//结束标志
int i;
Timer timer=new Timer();//计时器
Smove smove=new Smove();//计时器运行的方法
File file;//音频文件
AudioClip audioclip;//播放
URL url;//转换成路径
public Snake(int velocity){
//增加键盘监听器
frame.addKeyListener(this);
initialization();
frame.setSize(911,700);
//窗口可见
frame.setVisible(true);
//窗口关闭方式
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
//窗口不可改变
// frame.setResizable(false);
//窗口放于中心
panel.setBounds(0,0,911,700);
frame.setLocationRelativeTo(null);
frame.getContentPane().add(panel);
timer.schedule(smove,0,velocity);//开始循环运行
}
//建立画板
class Drawpanel extends JPanel{
//用画笔
public void paint(Graphics g){
g.fillRect(25, 75, 850, 650);//运行图
//标题
pan.paintIcon(this, g, 25, 11);
//蛇头
if(sdirection.equals("u")){
sup.paintIcon(this, g, snakex[0], snakey[0]);
}
else if(sdirection.equals("d")){
sdown.paintIcon(this, g, snakex[0], snakey[0]);
}
else if(sdirection.equals("l")){
sleft.paintIcon(this, g, snakex[0], snakey[0]);
}
else if(sdirection.equals("r")){
sright.paintIcon(this, g, snakex[0], snakey[0]);
}
//蛇身
for(i=1;i<len;i++)
{
sbody.paintIcon(this, g, snakex[i], snakey[i]);
}
//食物
sfood.paintIcon(this, g, foodx, foody);
//长度以及得分
g.setColor(Color.BLACK);
g.setFont(new Font("arial",Font.PLAIN,15));
g.drawString("score : "+score, 650, 37);
g.drawString("len :"+len, 650, 57);
}
}
//初始化
public void initialization(){
snakex[0]=100;
snakex[1]=75;
snakex[2]=50;
snakey[0]=100;
snakey[1]=100;
snakey[2]=100;
score=0;
len=3;
start=true;
end=false;
sdirection="r";
//音频文件循环播放
file=new File("./src/Music/musicview.wav");
try {
url=file.toURI().toURL();
} catch (MalformedURLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
audioclip=Applet.newAudioClip(url);
audioclip.loop();
}
class Smove extends TimerTask{
@Override
public void run() {
//蛇身运动
if(start==true&&end==false){
for(i=len;i>0;i--){
snakex[i]=snakex[i-1];
snakey[i]=snakey[i-1];
}
//蛇头运动
if(sdirection.equals("u")){
snakey[0]=snakey[0]-25;
if(snakey[0]<75)
{
snakey[0]=650;
}
}
else if(sdirection.equals("d")){
snakey[0]=snakey[0]+25;
if(snakey[0]>650){
snakey[0]=75;
}
}
else if(sdirection.equals("l")){
snakex[0]=snakex[0]-25;
if(snakex[0]<25){
snakex[0]=850;
}
}
else if(sdirection.equals("r")){
snakex[0]=snakex[0]+25;
if(snakex[0]>850){
snakex[0]=25;
}
}
//吃掉食物
if(snakex[0]==foodx&&snakey[0]==foody){
score++;
len++;
foodx=random.nextInt(34)*25+25;
foody=random.nextInt(24)*25+75;
}
//触碰自身时死亡,游戏结束
for(i=1;i<len;i++){
if(snakex[0]==snakex[i]&&snakey[0]==snakey[i]){
end=true;
audioclip.stop();
file=new File("./src/Music/musicend.wav");
try {
url=file.toURI().toURL();
} catch (MalformedURLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
audioclip=Applet.newAudioClip(url);
audioclip.play();
int n=JOptionPane.showConfirmDialog(null, "是否开始下一局游戏", "贪吃蛇",JOptionPane.YES_NO_OPTION);
if(n==0){
audioclip.stop();
initialization();
}
if(n==1){
frame.dispose();
View view=new View();
}
}
}
panel.repaint();//重复画图
}
}
}
@Override
public void keyPressed(KeyEvent e) {
// TODO Auto-generated method stub
if(e.getKeyCode()==KeyEvent.VK_SPACE){
}
else if( e.getKeyCode()==KeyEvent.VK_UP&&sdirection!="d"){
sdirection="u";
}
else if( e.getKeyCode()==KeyEvent.VK_DOWN&&sdirection!="u"){
sdirection="d";
}
else if( e.getKeyCode()==KeyEvent.VK_LEFT&&sdirection!="r"){
sdirection="l";
}
else if( e.getKeyCode()==KeyEvent.VK_RIGHT&&sdirection!="l"){
sdirection="r";
}
}
@Override
public void keyTyped(KeyEvent e) {
// TODO Auto-generated method stub
}
@Override
public void keyReleased(KeyEvent e) {
// TODO Auto-generated method stub
}
}