发布时间:2025-12-11 00:50:35 浏览次数:2
文件列表
packageSys;importjavax.swing.*;importjava.awt.*;importjava.awt.event.*;importjava.util.LinkedList;importjava.util.Timer;importjava.util.TimerTask;publicclassMainFameextendsJFrameimplementsRunnable{privateSnakesnake;//蛇privateSnakesnake1;//蛇privateJPaneljpanel;//游戏棋盘privateNode[]food;//食物privateintsignSnake=1;//标记蛇finalObjectcluck=2;privatebooleanmoveBoolean=true;//privatebooleanfirstTime=true;publicMainFame(){//初始化框体initFrame();//初始化网格initGamePanel();//初始化蛇initSnake();//初始化食物initFood();setVisible(true);try{Thread.sleep(500);}catch(InterruptedExceptione){e.printStackTrace();}//初始化定时器//initTimer();//键盘监听setKyeListener();//启动多线程//RunnableR=this;-----//newThread(R).start();//newThread(R).start();}privatevoidinitFood(){food=newNode[3];for(inti=0;i<food.length;i++){food[i]=newNode();food[i].random();}}//键盘监听privatevoidsetKyeListener(){addKeyListener(newKeyAdapter(){//按下键盘@OverridepublicvoidkeyPressed(KeyEvente){if(moveBoolean){switch(e.getKeyCode()){caseKeyEvent.VK_UP->snake.setDirection(Direction.UP);caseKeyEvent.VK_DOWN->snake.setDirection(Direction.DOWN);caseKeyEvent.VK_LEFT->snake.setDirection(Direction.LEFT);caseKeyEvent.VK_RIGHT->snake.setDirection(Direction.RIGHT);caseKeyEvent.VK_W->snake1.setDirection(Direction.UP);caseKeyEvent.VK_S->snake1.setDirection(Direction.DOWN);caseKeyEvent.VK_A->snake1.setDirection(Direction.LEFT);caseKeyEvent.VK_D->snake1.setDirection(Direction.RIGHT);}}moveBoolean=true;}});}//多线程船舰蛇@Overridepublicvoidrun(){if(signSnake==1){signSnake++;Thread.currentThread().setName("->红色方<-");initTimer(snake,snake1,Thread.currentThread().getName());}elseif(signSnake==2){Thread.currentThread().setName("->绿色方<-");initTimer(snake1,snake,Thread.currentThread().getName());}}//初始化定时器privatevoidinitTimer(Snakesnake,Snakesnake1,Stringname){//创建定时器对象//定时器Timertimer=newTimer();//初始化定时任务TimerTasktimerTask=newTimerTask(){@Overridepublicvoidrun(){if(snake.getIslive()){synchronized(cluck){snake.move(snake1);//1,moveBoolean=true;}//吃食物,临界区处理Nodehead=snake.getBody().getFirst();for(Nodenode:food){if(head.getX()==node.getX()&&head.getY()==node.getY()){snake.eat();node.random();}}//更新棋盘jpanel.repaint();}else{timer.cancel();System.out.println("蛇线程"+name+"结束!!!");System.out.println("蛇线程"+name+"得分:"+snake.scor);}}};//每100毫秒执行一次定时任务timer.scheduleAtFixedRate(timerTask,0,100);}privatevoidinitSnake(){this.snake=newSnake(18);this.snake1=newSnake(22);}//初始化网格privatevoidinitGamePanel(){jpanel=newJPanel(){@Overridepublicvoidpaint(Graphicsg){super.paint(g);//清空棋盘g.clearRect(0,0,600,600);//画线for(inti=0;i<40;i++){g.drawLine(0,15*i,600,15*i);g.drawLine(15*i,0,15*i,600);}//绘制蛇g.setColor(Color.blue);LinkedList<Node>body=snake.getBody();for(inti=1;i<=body.size();i++){if(i==body.size()){g.setColor(Color.RED);}g.fillRect(body.get(body.size()-i).getX()*15,body.get(body.size()-i).getY()*15,15,15);}//for(Nodenode:body){//if(p==1){//g.setColor(Color.MAGENTA);//p++;//}else{//g.setColor(Color.RED);//}//g.fillRect(node.getX()*15,node.getY()*15,15,15);//}g.setColor(Color.PINK);LinkedList<Node>body1=snake1.getBody();for(inti=1;i<=body1.size();i++){if(i==body1.size()){g.setColor(Color.GREEN);}g.fillRect(body1.get(body1.size()-i).getX()*15,body1.get(body1.size()-i).getY()*15,15,15);}//for(Nodenode:body1){//if(p==1){//g.setColor(Color.PINK);//p++;//}else{//g.setColor(Color.GREEN);//}//g.fillRect(node.getX()*15,node.getY()*15,15,15);//}//绘制食物g.setColor(Color.BLACK);for(Nodenode:food){g.fillRect(node.getX()*15,node.getY()*15,15,15);}}};//添加网格到框体中add(jpanel);}//初始化框体publicvoidinitFrame(){//标题setTitle("胡柯洋的贪吃蛇");//大小setSize(616,639);//不可调节大小setResizable(false);//设置位置setLocation(0,200);//点x关闭setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);}publicstaticvoidstart(){JFramejFrame=newJFrame();JButtonjButton=newJButton("点击开始单人游戏");JButtonjButton1=newJButton("点击开始双人游戏");jButton.addActionListener(e->{RunnableR=newMainFame();newThread(R).start();});jButton1.addActionListener(e->{RunnableR=newMainFame();newThread(R).start();newThread(R).start();});jFrame.setLayout(newFlowLayout(FlowLayout.CENTER,20,20));jFrame.add(jButton1);jFrame.add(jButton);jFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);jFrame.pack();jFrame.setVisible(true);jFrame.setLocation(900,200);}publicstaticvoidmain(String[]args){start();System.out.println("主线程结束!!!");}}packageSys;importjava.util.LinkedList;publicclassSnake{//方向privateDirectiondirection=Direction.LEFT;//蛇身体privateLinkedList<Node>body;//蛇生命privatebooleanislive=true;//分数intscor=0;//intsign;//Snakesnake1;publicSnake(inty){initSnake(y);}//有移动蛇publicvoidmove(Snakesnake1){//intsign,if(islive){//&&sign==1//获取蛇头Nodehead=body.getFirst();NodenewHead;body.removeLast();//去掉蛇尾switch(direction){caseUP->{newHead=newNode(head.getX()%40,(head.getY()-1+40)%40);body.addFirst(newHead);}caseLEFT->{newHead=newNode((head.getX()-1+40)%40,head.getY()%40);body.addFirst(newHead);}caseDOWN->{newHead=newNode(head.getX()%40,(head.getY()+1)%40);body.addFirst(newHead);}caseRIGHT->{newHead=newNode((head.getX()+1)%40,head.getY()%40);body.addFirst(newHead);}}head=body.getFirst();if(head.getX()<0||head.getY()<0||head.getX()>=40||head.getY()>=40){this.islive=false;}//for(inti=1;i<body.size();i++){//Nodenode=body.get(i);//if(node.getX()==head.getX()&&node.getY()==head.getY()){//this.islive=false;//}//}intt=snake1.getBody().size();for(inti=0;i<t;i++){Nodenode=snake1.getBody().get(i);//errorif(node.getX()==head.getX()&&node.getY()==head.getY()){this.islive=false;break;}}}}//初始化蛇privatevoidinitSnake(inty){//初始化蛇的实例body=newLinkedList<>();//添加节点body.add(newNode(16,y));body.add(newNode(17,y));body.add(newNode(18,y));//body.add(newNode(19,20));//body.add(newNode(20,20));//body.add(newNode(21,20));//body.add(newNode(22,20));}publicLinkedList<Node>getBody(){returnbody;}publicvoidsetDirection(Directiondirection){this.direction=direction;}publicDirectiongetDirection(){returndirection;}//吃食物publicvoideat(){scor++;//获取蛇头Nodehead=body.getFirst();NodenewHead;switch(direction){caseUP->{newHead=newNode(head.getX(),head.getY()-1);body.addFirst(newHead);}caseLEFT->{newHead=newNode(head.getX()-1,head.getY());body.addFirst(newHead);}caseDOWN->{newHead=newNode(head.getX(),head.getY()+1);body.addFirst(newHead);}caseRIGHT->{newHead=newNode(head.getX()+1,head.getY());body.addFirst(newHead);}}}publicbooleangetIslive(){returnislive;}}packageSys;importjava.util.Random;publicclassNode{privateintx;privateinty;//publicbooleanisEat=false;publicNode(){}publicNode(intx,inty){this.x=x;this.y=y;}publicintgetX(){returnx;}publicvoidsetX(intx){this.x=x;}publicintgetY(){returny;}publicvoidsetY(inty){this.y=y;}publicvoidrandom(){Randomr=newRandom();this.x=r.nextInt(34)+3;this.y=r.nextInt(34)+3;}}packageSys;publicenumDirection{UP,DOWN,LEFT,RIGHT;}关于怎么在java中利用swing实现一个双人贪吃蛇游戏就分享到这里了,希望以上内容可以对大家有一定的帮助,可以学到更多知识。如果觉得文章不错,可以把它分享出去让更多的人看到。