找回密码
 注册
查看: 990|回复: 13

java贪吃蛇

[复制链接]
发表于 2004-6-24 13:14:55 | 显示全部楼层 |阅读模式
借个地方存一下
[code:1]import javax.swing.*;
import java.util.*;
import java.awt.*;
import java.awt.event.*;

class SnakeApp {
       
        public static void main(String[] args) {
                SnakeFrame frame=new SnakeFrame();
                frame.addWindowListener(new WindowAdapter() {
                        public void windowClosing(WindowEvent e) {
                               
                                System.exit(0);
                        }
                });
                frame.setSize(WIDTH,HEIGHT);
                frame.setResizable(false);
                frame.setLocation(300,200);
                frame.setTitle("贪吃蛇 V1.0");
                //show frame               
                frame.show();
        }
        private static final int WIDTH=300;
        private static final int HEIGHT=270;       
}

class SnakeFrame extends JFrame{
        SnakeFrame(){
               
                        final SnakePanel p=new SnakePanel(this);
                       
                //添加菜单;;;;;;;;;;;;;;;;;;;;-----{
                        JMenuBar menubar=new JMenuBar();
                        setJMenuBar(menubar);               
                        //File menu
                        JMenu fileMenu=new JMenu("文件");
                       
                        fileMenu.add(new
                        AbstractAction("帮助")
                                {
                                        public void actionPerformed(ActionEvent event){
                                                JOptionPane.showConfirmDialog(
                                                p,"上下左右 控制|"+"enter-暂停","操纵说明",
                                                JOptionPane.OK_OPTION,JOptionPane.INFORMATION_MESSAGE);
                                        }       
                                }                       
                                );                       
                       
                        fileMenu.add(new
                        AbstractAction("退出")
                                {
                                        public void actionPerformed(ActionEvent event){
                                                System.exit(0);
                                        }       
                                }                       
                                );       
                       
                        menubar.add(fileMenu);
                       
                        //"设置"菜单
                         JMenu optionMenu=new JMenu("设置");
                         
                         //等级选项
                      ButtonGroup groupDegree = new ButtonGroup();
               
                      JRadioButtonMenuItem oneItem
                         = new JRadioButtonMenuItem("第1级");
                     
                      JRadioButtonMenuItem twoItem
                         = new JRadioButtonMenuItem("第2级");
                      JRadioButtonMenuItem threeItem
                         = new JRadioButtonMenuItem("第3级");
                      threeItem.setSelected(true);
                      JRadioButtonMenuItem fourItem
                         = new JRadioButtonMenuItem("第4级");                                        
                      JRadioButtonMenuItem fiveItem
                         = new JRadioButtonMenuItem("第5级");                     
                     
                      groupDegree.add(oneItem);
                      groupDegree.add(twoItem);
                      groupDegree.add(threeItem);
                      groupDegree.add(fourItem);
                      groupDegree.add(fiveItem);
                     
                      oneItem.addActionListener(new listener(300)        );
                      twoItem.addActionListener(new listener(200)        );
                      threeItem.addActionListener(new listener(100)        );
                      fourItem.addActionListener(new listener(70)        );
                      fiveItem.addActionListener(new listener(50)        );
                     
                      JMenu degreeMenu=new JMenu("等级");
                      degreeMenu.add(oneItem);       
                      degreeMenu.add(twoItem);
                      degreeMenu.add(threeItem);
                      degreeMenu.add(fourItem);       
                      degreeMenu.add(fiveItem);
                     
                      optionMenu.add(degreeMenu);
                         
                      // 风格选项
               
                      final JCheckBoxMenuItem showGridItem = new JCheckBoxMenuItem("显示网格");
                                showGridItem.setSelected(true);
                                showGridItem.addActionListener( new
                                ActionListener(){
                                        public void actionPerformed(ActionEvent e)
                                        {
                                                if(!showGridItem.isSelected()){
                                                        p.setBackground(Color.blue);
                                                }else{
                                                        p.setBackground(Color.lightGray);
                                                }
                                                       
                                        }       
                                }
                                );       
                               
                      ButtonGroup group = new ButtonGroup();
               
                      JRadioButtonMenuItem springItem
                         = new JRadioButtonMenuItem("春天气息");
                      springItem.setSelected(true);
                      JRadioButtonMenuItem summerItem
                         = new JRadioButtonMenuItem("夏天风采");
                      JRadioButtonMenuItem autumnItem
                         = new JRadioButtonMenuItem("秋天浪漫");
                      JRadioButtonMenuItem winterItem
                         = new JRadioButtonMenuItem("冬天雪白");                                        
                     
                     
                      group.add(springItem);
                      group.add(summerItem);
                      group.add(autumnItem);
                      group.add(winterItem);
                 
                       
                        JMenu stylemenu=new JMenu("风格");
                        stylemenu.add(showGridItem);
                        stylemenu.addSeparator();
                        stylemenu.add(springItem);
                        stylemenu.add(summerItem);
                        stylemenu.add(autumnItem);
                        stylemenu.add(winterItem);
                       
                        optionMenu.add(stylemenu);
                       
                        menubar.add(optionMenu);
                       
                       
                //menu;;;;;;;;;;;;;;;;;;;;-----}
                       
                       
                        Container contentpane=getContentPane();
                        contentpane.setLayout(new FlowLayout());
                        contentpane.add(p);
                        //p.setBackground(Color.blue);
                       
                        //;;;;;;;;;
                        JButton newcmd=new JButton("新游戏");
                        newcmd.addActionListener(new
                        ActionListener(){
                                public void actionPerformed(ActionEvent e)
                                {       
                                        //System.out.println("new game");
                                        p.newGame(speedtime);
               
                                }
                               
                        }                       
                        );                       
                        JButton stopcmd=new JButton("暂停");
                        stopcmd.addActionListener(new
                        ActionListener(){
                                public void actionPerformed(ActionEvent e)
                                {
                                        p.stopGame();
                                }
                               
                        }                       
                        );
                       
                        JButton runcmd=new JButton("继续");
                        runcmd.addActionListener(new
                        ActionListener(){
                                public void actionPerformed(ActionEvent e)
                                {
                                        p.resumeGame();
                                }
                               
                        }                       
                        );                       
                       
                        scoreField=new JTextField("0",3);
                        scoreField.setEnabled(false);
                        scoreField.setHorizontalAlignment(scoreField.CENTER);
                       
                        JPanel toolPanel=new JPanel();
                        toolPanel.add(newcmd);
                        toolPanel.add(stopcmd);
                        toolPanel.add(runcmd);
                        toolPanel.add(scoreField);
                        contentpane.add(toolPanel);
                        //;;;;;;;;;                       
        }
        public JTextField scoreField;
        private long speedtime=100;
        private class listener implements ActionListener{
                private long pause;
                listener(long pause){
                        if (pause>10){
                                this.pause=pause;
                        }else{
                                this.pause=100;
                        }
                       
                }
                public void actionPerformed(ActionEvent e){
                       
                        speedtime=pause;
                }
        }
       
}






class SnakePanel extends JPanel
                implements Runnable,KeyListener{
       
        public SnakePanel(SnakeFrame parent){
               
                this.parent=parent;
               
                grids=new JPanel[row][col];
                others=new LinkedList();
                snakeBody=new LinkedList();
                snakeHead=new ArrayIndexReadOnly(0,0);
                tempBlock=new ArrayIndexReadOnly(0,0);
                direction=new ArrayIndex(0,1);
               
                setLayout(new GridLayout(row,col,1,1));
               
                for(int i=0;i<row;i++){
                        for(int j=0;j<col;j++){
                                grids[i][j]=new JPanel();
                                grids[i][j].setBackground(othersColor);
                                add(grids[i][j]);
                        }
                }
               
                addKeyListener(this);
        }
       
        public void newGame(long speedTime){
                this.speedTime=speedTime;
                               
                if (gameHaveExit) {
               
                        snake.initializeV();
                }else{
                        //System.out.println("gameHaveExit=false");
                        snake=new SnakeModel(row,col);
                        gameHaveExit=true;
                        t=new Thread(this);
                        t.start();

                }
               
                requestFocus();
                direction.setX(0);
                direction.setY(1);
                gameScore=0;
                updateTextFiled(""+gameScore);
                isEnd=false;
               
        }
        public void stopGame(){
               
                requestFocus();
                isEnd=true;
        }

        public void resumeGame(){
               
                requestFocus();       
                isEnd=false;       
        }
        public int getGameScore(){
                return gameScore;
        }
        private void updateTextFiled(String str){
                ((SnakeFrame)parent).scoreField.setText(str);
        }
        private void updateBg(){
               
                snakeBody=snake.getSnake();
                Iterator e =snakeBody.iterator();
                while(e.hasNext()){
                        ArrayIndexReadOnly t=(ArrayIndexReadOnly)(e.next());
                        grids[t.getX()][t.getY()].setBackground(bodyColor);
                }
                //设定蛇头颜色
                snakeHead=snake.getSnakeHead();
                grids[snakeHead.getX()][snakeHead.getY()].setBackground(headColor);
                //设定背景颜色
                others=snake.getOthers();
                e =others.iterator();
                while(e.hasNext()){
                        ArrayIndexReadOnly t=(ArrayIndexReadOnly)(e.next());
                        grids[t.getX()][t.getY()].setBackground(othersColor);
                }
                //设定临时块的颜色
                tempBlock=snake.getTempBlock();
                grids[tempBlock.getX()][tempBlock.getY()].setBackground(tempColor);               
        }
        // allow panel to get input focus
        public boolean isFocusTraversable()
        {  
                return true;
        }       
       
        //实现Runnable接口
        public void run(){
               
                        while(true){
                               
                        try{
                                Thread.sleep(speedTime);
                        }catch (InterruptedException e){}
                                if(!isEnd){
                                        isEnd=!snake.move(direction);
                                        updateBg();
                                        if(snake.getReadyAddScore()){
                                                gameScore+=1;
                                                updateTextFiled(""+gameScore);
                                        }
                                }
                                                                       
                        }               
        }
       
        //实现KeyListener接口;;;;;;;;;;;;{
       
        public void keyPressed(KeyEvent event)
              {  
                 int keyCode = event.getKeyCode();

                         if(gameHaveExit){
                         if (keyCode == KeyEvent.VK_LEFT) {

                                 direction.setX(0);
                                 direction.setY(-1);                                        
                                

                                
                         }
                         else if (keyCode == KeyEvent.VK_RIGHT) {

                                 direction.setX(0);
                                 direction.setY(1);                                        
                                
                         }
                         else if (keyCode == KeyEvent.VK_UP) {


                                 direction.setX(-1);
                                 direction.setY(0);                                        
                                
                                
                         }
                         else if (keyCode == KeyEvent.VK_DOWN) {


                                 direction.setX(1);
                                 direction.setY(0);                                        
                                
                                
                         }                                
                                 else if (keyCode == KeyEvent.VK_ENTER){
                                         isEnd=!isEnd;
                                 }                                
                         }
                 

              }
                public void keyReleased(KeyEvent event){}
                public void keyTyped(KeyEvent event){}       
               
                //实现KeyListener接口;;;;;;;;;;;;}
               
               
                //数据成员
                JFrame parent=new JFrame();
                private int row=15;
                private int col=25;
                private JPanel[][] grids;
                private ArrayIndex direction;
               
                private SnakeModel snake;
                private LinkedList snakeBody;
                private LinkedList others;
                private ArrayIndexReadOnly snakeHead;
                private ArrayIndexReadOnly tempBlock;
               
                private long speedTime;
                private Color bodyColor=Color.red;
                private Color headColor=Color.green;
                private Color tempColor=Color.orange;
                private Color othersColor=Color.blue;
                private int gameScore=0;
                private boolean readyAddScore;
               
                private Thread t;
                private boolean isEnd;
                private static boolean gameHaveExit;
}

class SnakeModel {
       
        public ArrayIndexReadOnly getSnakeHead(){
                return (ArrayIndexReadOnly)(snake.getLast());
        }
       
        public ArrayIndexReadOnly getSnakeTail(){
                return (ArrayIndexReadOnly)(snake.getFirst());
        }
        public ArrayIndex getRuningDiriction(){
                return runingDiriction;
        }
        public LinkedList getSnake(){
                return snake;
        }
       
        public LinkedList getOthers(){
                return others;
        }       
        public int getScore(){
                return gameScore;
        }
        public boolean getReadyAddScore(){
                return readyAddScore;
        }
        private void setSnakeHead(ArrayIndex snakeHead){
                this.snakeHead=snakeHead;
        }

        public ArrayIndexReadOnly getTempBlock(){
                return tempBlock;
        }       
        private void setTempBlock(){
                tempBlock=(ArrayIndexReadOnly)(others.get((int)(Math.random()*others.size())));
        }
        private void moveTo(Object a,LinkedList from,LinkedList to){
                from.remove(a);
                to.add(a);
        }
       
        public void initializeV(){
                others.clear();
                snake.clear();
                gameScore=0;
                 for(int i=0;i<row;i++){
                         for(int j=0;j<col;j++){
                                 //jps[i][j]=new ArrayIndexReadOnly(i,j);
                                
                                 others.add(jps[i][j]);
                         }
                 }
                
                 //初始化蛇的形状([5][5]、[5][6]、[5][7])
                 for(int i=5;i<8;i++){
                         moveTo(jps[5][i],others,snake);
                        
                 }
                 snakeHead=new ArrayIndex(5,7);

                
                 //设置随机块
                 tempBlock=new ArrayIndexReadOnly(0,0);
                 setTempBlock();
                 //初始化运动方向
                 runingDiriction=new ArrayIndex(0,1);
                                
        }
        public SnakeModel(int row1,int col1){
                 row=row1;
                 col=col1;
                 jps=new ArrayIndexReadOnly[row][col];
                 snake=new LinkedList();
                 others=new LinkedList();
                
                 for(int i=0;i<row;i++){
                         for(int j=0;j<col;j++){
                                 jps[i][j]=new ArrayIndexReadOnly(i,j);
                                 //others.add(jps[i][j]);
                         }
                 }
                                 
                 initializeV();

                
         }
       
        //如果move成功返回true,否则(结束),返回false
        //参数direction是ArrayIndex类型,
        //direction 的值:(0,1)表示向右(0,-1)表示向左
        //(1,0)表示向下(-1,0)表示向上
       
        public boolean move(ArrayIndex direction){
                //判断给的方向是不是跟运行方向相反
                if (direction.reverse(runingDiriction)){
                        snakeHead.setX(snakeHead.getX()+runingDiriction.getX());
                        snakeHead.setY(snakeHead.getY()+runingDiriction.getY());                       
                }else{
                        snakeHead.setX(snakeHead.getX()+direction.getX());
                        snakeHead.setY(snakeHead.getY()+direction.getY());                       
                }

               
                //如果蛇吃了随机块
                try{
                if ((snakeHead.getX()==tempBlock.getX())
                        &&(snakeHead.getY()==tempBlock.getY()))
                        {
                        moveTo(jps[snakeHead.getX()][snakeHead.getY()],others,snake);
                        setTempBlock();
                       
                        gameScore+=1;
                        readyAddScore=true;
                               
                        }else{
                                readyAddScore=false;
                                //是否出界
                                if((snakeHead.getX()<row)&&(snakeHead.getY()<col)){
                                        //如果不出界,判断是否与自身相交
                                        if(snake.contains(jps[snakeHead.getX()][snakeHead.getY()])){
                                                //如果相交,游戏结束
                                                return false;
                                        }else{
                                                //如果不相交,就把snakeHead加到snake里面,并且把尾巴移出
                                                moveTo(jps[snakeHead.getX()][snakeHead.getY()],others,snake);
                                                moveTo(snake.getFirst(),snake,others);
                                        }
                                       
                                }else{
                                        //出界!游戏结束
                                        return false;
                                }                               
                        }
               
               
               
                       
                       
                       
                }catch(ArrayIndexOutOfBoundsException e){
                        return false;
                }
                        //更新运行方向
                if (!(direction.reverse(runingDiriction)
                ||direction.equals(runingDiriction))){
                                runingDiriction.setX(direction.getX());
                                runingDiriction.setY(direction.getY());
                        }
               
                return true;
        }
       
        private int row,col;
        private ArrayIndex snakeHead;
        private ArrayIndexReadOnly[][] jps;
        private LinkedList snake;
        private LinkedList others;
        private ArrayIndexReadOnly tempBlock;
        private ArrayIndex runingDiriction;
        private int gameScore=0;
        private boolean readyAddScore=false;
}

class ArrayIndex {
        private int x;
        private int y;
        ArrayIndex(int x,int y){
                this.x=x;
                this.y=y;
        }
        int getX(){
                return x;
        }
        int getY(){
                return y;
        }
        void setX(int x){
                this.x=x;
        }
        void setY(int y){
                this.y=y;
        }
        public boolean equalOrRev(ArrayIndex e){
                return ((e.getX()==getX())&&(e.getY()==getY()))
                ||((e.getX()==getX())&&(e.getY()==-1*getY()))       
                ||((e.getX()==-1*getX())&&(e.getY()==getY()));

        }
        public boolean equals(ArrayIndex e){
                return(e.getX()==getX())&&(e.getY()==getY());
        }
       
        public boolean reverse(ArrayIndex e){
                return ((e.getX()==getX())&&(e.getY()==-1*getY()))       
                ||((e.getX()==-1*getX())&&(e.getY()==getY()));
        }       
}

class ArrayIndexReadOnly{
        private int x;
        private int y;
        ArrayIndexReadOnly(int x,int y){
                this.x=x;
                this.y=y;
        }
        int getX(){
                return x;
        }
        int getY(){
                return y;
        }
        public boolean equalOrRev(ArrayIndexReadOnly e){
                return ((e.getX()==getX())&&(e.getY()==getY()))
                ||((e.getX()==getX())&&(e.getY()==-1*getY()))       
                ||((e.getX()==-1*getX())&&(e.getY()==getY()));

        }
        public boolean equals(ArrayIndexReadOnly e){
                return(e.getX()==getX())&&(e.getY()==getY());
        }
       
        public boolean reverse(ArrayIndexReadOnly e){
                return ((e.getX()==getX())&&(e.getY()==-1*getY()))       
                ||((e.getX()==-1*getX())&&(e.getY()==getY()));
        }       
}[/code:1]
发表于 2004-6-24 13:51:44 | 显示全部楼层
阿,8会吧.   
回复

使用道具 举报

 楼主| 发表于 2004-6-24 15:14:19 | 显示全部楼层

什么不会?
回复

使用道具 举报

发表于 2004-6-24 22:06:58 | 显示全部楼层
嗨,兄弟,帖个抓图嘛,上次魔方也如此~~~
回复

使用道具 举报

发表于 2004-6-24 23:09:35 | 显示全部楼层
[quote:6970aa5ed7="lanche"]嗨,兄弟,帖个抓图嘛,上次魔方也如此~~~[/quote] 要借地方就要让我们开开眼啊。
回复

使用道具 举报

 楼主| 发表于 2004-6-25 09:19:14 | 显示全部楼层
截图

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?注册

×
回复

使用道具 举报

发表于 2004-6-26 11:15:57 | 显示全部楼层
虽然界面简单了点,不过也顶顶。
我就是没时间学java,连c++都没摸,因为连c都还没用透呀~~~
回复

使用道具 举报

发表于 2004-6-26 14:32:11 | 显示全部楼层
good!
回复

使用道具 举报

发表于 2004-6-28 07:55:14 | 显示全部楼层
对了duotaiya, 你现在的主页跑哪了?
回复

使用道具 举报

发表于 2004-6-28 07:57:12 | 显示全部楼层
再写个俄罗斯方块吧,我想看看代码。
回复

使用道具 举报

 楼主| 发表于 2004-6-28 22:58:31 | 显示全部楼层
http://javaboy.512j.com
没办法,空间太小了,而且主要是不支持mysql,想传个blog都不行!
回复

使用道具 举报

发表于 2004-6-29 04:43:22 | 显示全部楼层
这两天考试,过两天贴个我改的curser的俄罗斯上来
回复

使用道具 举报

发表于 2004-6-29 08:33:39 | 显示全部楼层
就想要java写的,因为我想用gtk再写一遍(水平差,练练手)。curses的我有。
回复

使用道具 举报

发表于 2004-7-1 18:26:43 | 显示全部楼层
duotaiya,

告诉我怎么把本机上的贴图 贴上来?
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

GMT+8, 2025-2-15 13:42 , Processed in 0.076370 second(s), 17 queries .

© 2001-2025 Discuz! Team. Powered by Discuz! X3.5.

快速回复 返回顶部 返回列表