一、帮忙给个java小游戏源程序
这是一个贪食蛇的程序,仅供参考(多给点分吧,代码注释非常详细,给100分就很满足了):
/**************************************************************************
*1)主要部分已经集成为一个对象SnakeModel,利用键盘控制实现操作。
*************************************************************************/
//=============================================
//=============================================
public class GreedSnake implements KeyListener
SnakeModel snakeModel=null;//蛇
public static final int canvasWidth=200;
public static final int canvasHeight=300;
public static final int nodeWidth=10;
public static final int nodeHeight=10;
//----------------------------------------------------------------------
//----------------------------------------------------------------------
mainFrame=new JFrame("GreedSnake");
Container cp=mainFrame.getContentPane();
labelScore=new JLabel("Score:");
cp.add(labelScore,BorderLayout.NORTH);
paintCanvas.setSize(canvasWidth+1,canvasHeight+1);
paintCanvas.addKeyListener(this);
cp.add(paintCanvas,BorderLayout.CENTER);
JPanel panelButtom=new JPanel();
panelButtom.setLayout(new BorderLayout());
labelHelp=new JLabel("PageUp, PageDown for speed;",JLabel.CENTER);
panelButtom.add(labelHelp,BorderLayout.NORTH);
labelHelp=new JLabel("ENTER or R or S for start;",JLabel.CENTER);
panelButtom.add(labelHelp,BorderLayout.CENTER);
labelHelp=new JLabel("SPACE or P for pause",JLabel.CENTER);
panelButtom.add(labelHelp,BorderLayout.SOUTH);
cp.add(panelButtom,BorderLayout.SOUTH);
mainFrame.addKeyListener(this);
mainFrame.setResizable(false);
mainFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
//----------------------------------------------------------------------
//----------------------------------------------------------------------
public void keyPressed(KeyEvent e)
if(snakeModel.running) switch(keyCode)
snakeModel.changeDirection(SnakeModel.UP);
snakeModel.changeDirection(SnakeModel.DOWN);
snakeModel.changeDirection(SnakeModel.LEFT);
snakeModel.changeDirection(SnakeModel.RIGHT);
snakeModel.changePauseState();//暂停或继续
if(keyCode==KeyEvent.VK_R|| keyCode==KeyEvent.VK_S
|| keyCode==KeyEvent.VK_ENTER)
//----------------------------------------------------------------------
//----------------------------------------------------------------------
public void keyReleased(KeyEvent e)
//----------------------------------------------------------------------
//----------------------------------------------------------------------
public void keyTyped(KeyEvent e)
//----------------------------------------------------------------------
//repaint():绘制游戏界面(包括蛇和食物)
//----------------------------------------------------------------------
Graphics g=paintCanvas.getGraphics();
g.fillRect(0,0,canvasWidth,canvasHeight);
LinkedList na=snakeModel.nodeArray;
//----------------------------------------------------------------------
//drawNode():绘画某一结点(蛇身或食物)
//----------------------------------------------------------------------
private void drawNode(Graphics g,Node n)
g.fillRect(n.x*nodeWidth,n.y*nodeHeight,nodeWidth-1,nodeHeight-1);
//----------------------------------------------------------------------
//----------------------------------------------------------------------
String s="Score:"+snakeModel.score;
//----------------------------------------------------------------------
//begin():游戏开始,放置贪吃蛇
//----------------------------------------------------------------------
if(snakeModel==null||!snakeModel.running)
snakeModel=new SnakeModel(this,canvasWidth/nodeWidth,
this.canvasHeight/nodeHeight);
(new Thread(snakeModel)).start();
//----------------------------------------------------------------------
//----------------------------------------------------------------------
public static void main(String[] args)
GreedSnake gs=new GreedSnake();
/**************************************************************************
*1)数据结构:matrix[][]用来存储地图上面的信息,如果什么也没有设置为false,
*如果有食物或蛇,设置为true;nodeArray,一个LinkedList,用来保存蛇的每
*一节;food用来保存食物的位置;而Node类是保存每个位置的信息。
* changeDirection(int newDirection),用来改变蛇前进的方向,而且只是
*保存头部的前进方向,因为其他的前进方向已经用位置来指明了。其中newDirection
*必须和原来的direction不是相反方向,所以相反方向的值用了同样的奇偶性。在测试
*的时候使用了direction%2!=newDirection%2进行判断。
* moveOn(),用来更新蛇的位置,对于当前方向,把头部位置进行相应改变。如果越界,
*结束;否则,检测是否遇到食物(加头部)或身体(结束);如果什么都没有,加上头部,
*去掉尾部。由于用了LinkedList数据结构,省去了相当多的麻烦。
*************************************************************************/
//----------------------------------------------------------------------
//----------------------------------------------------------------------
//----------------------------------------------------------------------
//----------------------------------------------------------------------
class SnakeModel implements Runnable
boolean[][] matrix;//界面数据保存在数组里
LinkedList nodeArray=new LinkedList();
int timeInterval=200;//间隔时间(速度)
double speedChangeRate=0.75;//速度改变程度
boolean paused=false;//游戏状态
// UP和DOWN是偶数,RIGHT和LEFT是奇数
public static final int DOWN=4;
public static final int LEFT=1;
public static final int RIGHT=3;
//----------------------------------------------------------------------
//----------------------------------------------------------------------
public SnakeModel(GreedSnake gs,int maxX,int maxY)
Arrays.fill(matrix[i],false);//没有蛇和食物的地区置false
int initArrayLength=maxX>20? 10: maxX/2;
for(int i=0;i<initArrayLength;++i)
nodeArray.addLast(new Node(x,y));
matrix[x][y]=true;//蛇身处置true
matrix[food.x][food.y]=true;//食物处置true
//----------------------------------------------------------------------
//changeDirection():改变运动方向
//----------------------------------------------------------------------
public void changeDirection(int newDirection)
if(direction%2!=newDirection%2)//避免冲突
//----------------------------------------------------------------------
//----------------------------------------------------------------------
Node n=(Node)nodeArray.getFirst();
if((0<=x&&x<maxX)&&(0<=y&&y<maxY))
if(matrix[x][y])//吃到食物或者撞到身体
if(x==food.x&&y==food.y)//吃到食物
nodeArray.addFirst(food);//在头部加上一结点
//计分规则与移动长度和速度有关
int scoreGet=(10000-200*countMove)/timeInterval;
score+=scoreGet>0? scoreGet: 10;
nodeArray.addFirst(new Node(x,y));//加上头部
n=(Node)nodeArray.removeLast();//去掉尾部
return false;//越界(撞到墙壁)
//----------------------------------------------------------------------
//----------------------------------------------------------------------
JOptionPane.showMessageDialog(null,"GAME OVER",
"Game Over",JOptionPane.INFORMATION_MESSAGE);
//----------------------------------------------------------------------
//createFood():生成食物及放置地点
//----------------------------------------------------------------------
//----------------------------------------------------------------------
//----------------------------------------------------------------------
timeInterval*=speedChangeRate;
//----------------------------------------------------------------------
//----------------------------------------------------------------------
timeInterval/=speedChangeRate;
//----------------------------------------------------------------------
//changePauseState():改变游戏状态(暂停或继续)
//----------------------------------------------------------------------
public void changePauseState()
二、几个Java小游戏代码
import javax.sound.sampled.AudioFileFormat;
import javax.sound.sampled.AudioSystem;
import javax.swing.BorderFactory;
import javax.swing.JOptionPane;
import javax.swing.SwingUtilities;
import javax.swing.event.ChangeEvent;
import javax.swing.event.ChangeListener;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.KeyAdapter;
import java.awt.event.KeyEvent;
public class Frame extends JFrame implements Runnable{
JButton jButton1= new JButton();
JSlider jSlider1= new JSlider();
JButton jButton2= new JButton();
int count= 1, rapidity= 80;// count当前进行的个数, rapidity游标的位置
int rush[]={ 10,20,30};//游戏每关的个数可以自由添加.列{ 10,20,30,40,50}
char list[]={'A','B','C','D','E','F','G','H','I','J','K','L',
'M','N','O','P','Q','R','S','T','U','V','W','X','Y',
'Z','1','2','3','4','5','6','7','8','9'};//随机出现的数字可以自由添加
AudioClip Musci_anjian, Music_shibai, Music_chenggong;
setDefaultCloseOperation(EXIT_ON_CLOSE);
//-----------------声音文件---------------------
Musci_anjian= Applet.newAudioClip(new File("sounds//anjian.wav")
Music_shibai= Applet.newAudioClip(new File("sounds//shibai.wav")
Music_chenggong= Applet.newAudioClip(new File(
"sounds//chenggong.wav").toURL());
//---------------------------------------
private void jbInit() throws Exception{
contentPane=(JPanel) getContentPane();
setSize(new Dimension(588, 530));
jPanel1.setBorder(BorderFactory.createEtchedBorder());
jPanel1.setBounds(new Rectangle(4, 4, 573, 419));
jButton1.setBounds(new Rectangle(277, 442, 89, 31));
jButton1.addActionListener(new Frame1_jButton1_actionAdapter(this));
jSlider1.setBounds(new Rectangle(83, 448, 164, 21));
jLabel1.setBounds(new Rectangle(35, 451, 39, 18));
jButton2.setBounds(new Rectangle(408, 442, 89, 31));
jButton2.addActionListener(new Frame1_jButton2_actionAdapter(this));
jLabel2.setText("第一关:100个");
jLabel2.setBounds(new Rectangle(414, 473, 171, 21));
this.addKeyListener(new MyListener());
jButton1.addKeyListener(new MyListener());
jSlider1.addKeyListener(new MyListener());
jSlider1.addChangeListener(new ChangeListener(){
public void stateChanged(ChangeEvent e){
rapidity= jSlider1.getValue();
while(count<= rush[rush_count]){
Thread t= new Thread(new Tthread());
Thread.sleep(1000+(int)(Math.random()* 2000));//生产下组停顿时间
} catch(InterruptedException e){
while(true){//等待最后一个字符消失
if(zhengque== 0){//为了以后相除..如果全部正确或者错误就会出现错误.所以..
if(paiduan.equals("true")){//判断是否是自然结束
JOptionPane.showMessageDialog(null,"恭喜你过关了");
if(rush_count< rush.length){
if(rapidity> 10){//当速度大于10的时候在-5提加速度.怕速度太快
rapidity-= 5;//速度自动减10毫秒
jSlider1.setValue(rapidity);//选择位置
JOptionPane.showMessageDialog(null,"牛B...你通关了..");
JOptionPane.showMessageDialog(null,"请再接再励");
public void jButton1_actionPerformed(ActionEvent e){
public void jButton2_actionPerformed(ActionEvent e){
class Tthread implements Runnable{
show.setFont(new java.awt.Font("宋体", Font.PLAIN, 33));
X= 10+(int)(Math.random()* 400);
String parameter= list[(int)(Math.random()* list.length)]+"";
bean.setParameter(parameter);
//---------------------数字下移--------------------
show.setBounds(new Rectangle(X, Y+= 2, 33, 33));
} catch(InterruptedException e){
for(int i= number.size()- 1; i>= 0; i--){
Bean bn=((Bean) number.get(i));
if(parameter.equalsIgnoreCase(bn.getParameter())){
jLabel2.setText("正确:"+ zhengque+"个,错误:"+ cuowu
class MyListener extends KeyAdapter{
public void keyPressed(KeyEvent e){
String uu= e.getKeyChar()+"";
for(int i= 0; i< number.size(); i++){
Bean bean=((Bean) number.get(i));
if(uu.equalsIgnoreCase(bean.getParameter())){
bean.getShow().setVisible(false);
jLabel2.setText("正确:"+ zhengque+"个,错误:"+ cuowu+"个");
public static void main(String[] args){
UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
Dimension screenSize= Toolkit.getDefaultToolkit().getScreenSize();
Dimension frameSize= frame.getSize();
if(frameSize.height> screenSize.height){
frameSize.height= screenSize.height;
if(frameSize.width> screenSize.width){
frameSize.width= screenSize.width;
frame.setLocation((screenSize.width- frameSize.width)/ 2,
(screenSize.height- frameSize.height)/ 2);
class Frame1_jButton2_actionAdapter implements ActionListener{
Frame1_jButton2_actionAdapter(Frame adaptee){
public void actionPerformed(ActionEvent e){
adaptee.jButton2_actionPerformed(e);
class Frame1_jButton1_actionAdapter implements ActionListener{
Frame1_jButton1_actionAdapter(Frame adaptee){
public void actionPerformed(ActionEvent e){
adaptee.jButton1_actionPerformed(e);
public void setShow(JLabel show){
public void setParameter(String parameter){

