码迷,mamicode.com
首页 > 其他好文 > 详细

这是现代软件工程课结对作业 ——小游戏“贪吃蛇”

时间:2015-05-17 21:40:12      阅读:206      评论:0      收藏:0      [点我收藏+]

标签:

Github代码链接

https://github.com/liangjianming/jieduizuoye

实验简介:

本次实验为合作实验

实验分工:

本次选择了经典的游戏贪吃蛇,相信大家都玩过,这次实验分工是这样的:

实验的逻辑框架为讨论之后得出;

如果顺利吃掉食物即为成功,并输出成功,如果撞到自己和墙即为失败,输出游戏失败,添加了一些简单的游戏界面,游戏监听器和线程等,

定义食物是随机的,由

random() 

决定,

并控制了窗口大小坐标:

十位*60为横坐标

 weix=(int)(food[0]*0.1)*60; 

个位*40为纵坐标

weiy=(int)(food[0]%10)*40; 

为蛇头添加键盘监视器  

snake[0].addKeyListener(this); 

判断是否撞墙 

if(x<0||x>=this.getWidth()||y<0||y>=this.getHeight())

自定义面板类,继承了键盘和线程接口

class MyPanel extends Panel implements KeyListener,Runnable 

实验心得:

以前的实验都是自己去做去完成,但是本次体验了分工合作的方式,终于感觉了分工合作的快速和乐趣,提高了工作效率,但是之间的磨合确实需要一定的时间,总体上互相学习了知识,合作蛮愉快的。

运行结果截图:

技术分享

技术分享

技术分享

技术分享

技术分享

附录:合作后的实验代码

package 贪吃蛇;

import java.awt.*; 

import java.awt.event.*; 

public class GreedSnake //主类 

 

/** 

* @param args 

*/ 

public static void main(String[] args) { 

new MyWindow(); 

 

 

class MyPanel extends Panel implements KeyListener,Runnable//自定义面板类,继承了键盘和线程接口 

 

/**

 * 

 */

private static final long serialVersionUID = 6206093104274956657L;

Button snake[]; //定义蛇按钮 

int shu=0; //蛇的节数 

int food[]; //食物数组 

boolean result=true; //判定结果是输 还是赢 

Thread thread; //定义线程 

static int weix,weiy; //食物位置 

boolean t=true; //判定游戏是否结束 

int fangxiang=0; //蛇移动方向 

int x=0,y=0; //蛇头位置 

MyPanel() 

 

setLayout(null); 

snake=new Button[20]; 

food=new int [20]; 

thread=new Thread(this); 

 

for(int j=0;j<20;j++) 

food[j]=(int)(Math.random()*99);//定义20个随机食物 

 

weix=(int)(food[0]*0.1)*60; //十位*60为横坐标 

weiy=(int)(food[0]%10)*40; //个位*40为纵坐标 

for(int i=0;i<20;i++) 

snake[i]=new Button(); 

 

add(snake[0]); 

snake[0].setBackground(Color.black); 

snake[0].addKeyListener(this); //为蛇头添加键盘监视器 

snake[0].setBounds(0,0,10,10); 

setBackground(Color.cyan); 

 

public void run() //接收线程 

 

while(t) 

 

if(fangxiang==0)//向右 

try 

x+=10; 

snake[0].setLocation(x, y);//设置蛇头位置 

 

if(x==weix&&y==weiy) //吃到食物 

shu++; 

weix=(int)(food[shu]*0.1)*60; 

weiy=(int)(food[shu]%10)*40; 

repaint(); //重绘下一个食物 

add(snake[shu]); //增加蛇节数和位置 

snake[shu].setBounds(snake[shu-1].getBounds()); 

Thread.sleep(100); //睡眠100ms 

catch(Exception e){} 

else if(fangxiang==1)//向左 

try 

x-=10; 

snake[0].setLocation(x, y); 

if(x==weix&&y==weiy) 

shu++; 

weix=(int)(food[shu]*0.1)*60; 

weiy=(int)(food[shu]%10)*40; 

repaint(); 

add(snake[shu]); 

snake[shu].setBounds(snake[shu-1].getBounds()); 

 

Thread.sleep(100); 

catch(Exception e){} 

else if(fangxiang==2)//向上 

try 

y-=10; 

snake[0].setLocation(x, y); 

if(x==weix&&y==weiy) 

shu++; 

weix=(int)(food[shu]*0.1)*60; 

weiy=(int)(food[shu]%10)*40; 

repaint(); 

add(snake[shu]); 

snake[shu].setBounds(snake[shu-1].getBounds()); 

Thread.sleep(100); 

catch(Exception e){} 

else if(fangxiang==3)//向下 

try 

y+=10; 

snake[0].setLocation(x, y); 

if(x==weix&&y==weiy) 

shu++; 

weix=(int)(food[shu]*0.1)*60; 

weiy=(int)(food[shu]%10)*40; 

repaint(); 

add(snake[shu]); 

snake[shu].setBounds(snake[shu-1].getBounds()); 

Thread.sleep(100); 

catch(Exception e){} 

int num1=shu; 

while(num1>1)//判断是否咬自己的尾巴 

if(snake[num1].getBounds().x==snake[0].getBounds().x&&snake[num1].getBounds().y==snake[0].getBounds().y) 

t=false; 

result=false; 

repaint(); 

num1--; 

if(x<0||x>=this.getWidth()||y<0||y>=this.getHeight())//判断是否撞墙 

t=false; 

result=false; 

repaint(); 

int num=shu; 

while(num>0) //设置蛇节位置 

snake[num].setBounds(snake[num-1].getBounds()); 

num--; 

 

if(shu==15) //如果蛇节数等于15则胜利 

t=false; 

result=true; 

repaint(); 

 

 

public void keyPressed(KeyEvent e) //按下键盘方向键 

if(e.getKeyCode()==KeyEvent.VK_RIGHT)//右键 

if(fangxiang!=1)//如果先前方向不为左 

fangxiang=0; 

 

else if(e.getKeyCode()==KeyEvent.VK_LEFT) 

{ if(fangxiang!=0) 

fangxiang=1; 

 

else if(e.getKeyCode()==KeyEvent.VK_UP) 

{ if(fangxiang!=3) 

fangxiang=2; 

 

else if(e.getKeyCode()==KeyEvent.VK_DOWN) 

{ if(fangxiang!=2) 

fangxiang=3; 

 

 

public void keyTyped(KeyEvent e) 

 

public void keyReleased(KeyEvent e) 

 

public void paint(Graphics g) //在面板上绘图 

int x1=this.getWidth()-1; 

int y1=this.getHeight()-1; 

g.setColor(Color.red); 

g.fillOval(weix, weiy, 10, 10);//食物 

g.drawRect(0, 0, x1, y1); //墙 

if(t==false&&result==false) 

g.drawString("GAME OVER!", 250, 200);//输出游戏失败 

else if(t==false&&result==true) 

g.drawString("YOU WIN!", 250, 200);//输出游戏成功 

 

class MyWindow extends Frame implements ActionListener//自定义窗口类 

/**

 * 

 */

private static final long serialVersionUID = -7766509774310515166L;

MyPanel my; 

Button btn; 

Panel panel; 

MyWindow() 

super("GreedSnake"); 

my=new MyPanel(); 

btn=new Button("begin"); 

panel=new Panel(); 

btn.addActionListener(this); 

panel.add(new Label("请先按begin后请再按Tab键选定蛇")); 

panel.add(btn); 

panel.add(new Label("按上下左右键控制蛇行动")); 

add(panel,BorderLayout.NORTH); 

add(my,BorderLayout.CENTER); 

setBounds(100,100,610,500); 

setVisible(true); 

validate(); 

addWindowListener(new WindowAdapter() 

public void windowClosing(WindowEvent e) 

System.exit(0); 

}); 

public void actionPerformed(ActionEvent e)//按下begin按钮 

 

if(e.getSource()==btn) 

try 

my.thread.start(); //开始线程 

my.validate(); 

catch(Exception ee){} 

 

}

这是现代软件工程课结对作业 ——小游戏“贪吃蛇”

标签:

原文地址:http://www.cnblogs.com/liangjianming/p/4510346.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!