Java 贪吃蛇报告.docx
《Java 贪吃蛇报告.docx》由会员分享,可在线阅读,更多相关《Java 贪吃蛇报告.docx(27页珍藏版)》请在冰豆网上搜索。
Java贪吃蛇报告
《Java高级编程》课程报告
第xx小组:
贪吃蛇游戏项目
小组成员及分工
姓名
角色
负责功能
组长
设计与编码
测试
主要完成模式选择窗口和游戏主窗口菜单栏下拉菜单的设计与程序编写,贪吃蛇游戏界面布局,游戏的操作步骤设计。
程序的调试
主要完成游戏主窗口的设计与编程,设计贪吃蛇的移动方向键设置,得分规则等,以及最后程序的调试。
主要完成主菜单窗口的设计和程序编写,界面的设计布局,游戏主窗口界面背景设置,按钮的图片设置等。
一、实验环境
操作系统:
Windows7
编程环境:
Eclipse、JDK
二、实验内容与完成情况
(主要介绍项目总体功能分析与说明。
)
贪吃蛇小游戏的JAVA程序是利用上↑、下↓、左←、右→方向键来改变蛇的运动方向,按空键暂停游戏,按enter键重新开始。
长按某个方向键后,蛇的运动速度会加快,在随机的地方产生食物,吃到食物就变成新的蛇体,碰到壁或自身则游戏结束,否则正常进行游戏。
以不同的速度和不同方向吃到食物所获得的分数也不相同。
窗口功能说明:
设计了三个窗口,分别是游戏主窗口,主菜单窗口,模式选择窗口。
?
菜单栏分别为:
游戏菜单(重新开始)和帮助菜单以及返回(返回主菜单)?
。
其中,按返回菜单按钮后会显示主菜单,其包括游戏开始、设置、退出游戏三项按钮选择;如果按“设置”按钮会进入“模式选择”窗口。
而模式选择窗口菜单包括了初级、中级、高级、返回按钮。
1、功能1(主菜单窗口)
(1)主菜单窗口主要是提供“游戏开始”、“设置”和“退出”按钮。
“游戏开始”按钮按下后会进入“游戏主窗口”开始游戏;“设置”按钮是调用“模式选择”窗口对游戏贪吃蛇的速度进行设置;“退出”按钮按下则会直接退出游戏。
(2)功能1实现的流程图
实现的效果图如下:
(3)功能1(主菜单窗口)代码:
packageSwing;
import;
import;
import;
import;
import;
import;
import;
import;
import;
import;
import;
publicclasssetMenuextendsJFrame{
privateintspeed1=200;
publicstaticintspeed=200;
//staticintspeed=20;
privateJPanelcontentPane;
/**
*Launchtheapplication.
*/
publicstaticvoidmain(String[]args){
EventQueue.invokeLater(newRunnable(){
publicvoidrun(){
try{
setMenuframe=newsetMenu(speed);
frame.SsetMenu(frame);
frame.setVisible(true);
}catch(Exceptione){
e.printStackTrace();
}
}
});
}
/**
*Createtheframe.
*/
publicsetMenu(intspeed2){
speed1=speed2;
(speed2);
}
publicvoidSsetMenu(finalsetMenuframe){
setTitle("主菜单");
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setBounds(100,100,250,350);
contentPane=newJPanel();
contentPane.setBackground(newColor(102,204,102));
contentPane.setBorder(newEmptyBorder(5,5,5,5));
setContentPane(contentPane);
contentPane.setLayout(null);
//按钮:
游戏开始
JButtonNewGameButton=newJButton("");
NewGameButton.setIcon(newImageIcon("img/gamebegin.png"));
NewGameButton.setBounds(53,52,123,40);
NewGameButton.addActionListener(newActionListener(){
publicvoidactionPerformed(ActionEvente){
Gamegs=newGame(speed1);
frame.dispose();
}
});
contentPane.add(NewGameButton);
//按钮:
游戏设置
JButtonsetButton=newJButton("");
setButton.addMouseListener(newMouseAdapter(){
@Override
publicvoidmouseClicked(MouseEvente){
modelframe1=newmodel();
frame1.Mmodel(frame1);
frame1.setVisible(true);
frame.dispose();
}
});
//按钮图片设置
setButton.setIcon(newImageIcon("img/set.png"));
setButton.setBounds(53,128,123,45);
contentPane.add(setButton);
//按钮:
游戏推出
JButtonexitButton=newJButton("");
exitButton.setIcon(newImageIcon("img/exit.png"));
exitButton.setBounds(53,206,123,40);
exitButton.addActionListener(newActionListener(){
publicvoidactionPerformed(ActionEvente){
System.exit(0);
}
});
contentPane.add(exitButton);
}
}
2、功能2(模式选择窗口)
(1)功能2的文字描述:
“模式选择”窗口菜单包括了初级、中级、高级、返回按钮。
其中当选择按下初级、中级、高级按钮后,会弹出一个“游戏难度“窗口,并提示设置成功:
**,并按下”确定“按钮后窗口关闭同时模式选择成功,按下”返回“按钮返回主菜单窗口。
(2)功能2(模式选择窗口)实现的流程图
实现的效果图如下:
(3)功能2(模式选择窗口)代码:
packageSwing;
import;
import;
import;
import;
import;
import;
import;
import;
import;
import;
import;
publicclasssetMenuextendsJFrame{
privateintspeed1=200;
publicstaticintspeed=200;
//staticintspeed=20;
privateJPanelcontentPane;
/**
*Launchtheapplication.
*/
publicstaticvoidmain(String[]args){
EventQueue.invokeLater(newRunnable(){
publicvoidrun(){
try{
setMenuframe=newsetMenu(speed);
frame.SsetMenu(frame);
frame.setVisible(true);
}catch(Exceptione){
e.printStackTrace();
}
}
});
}
/**
*Createtheframe.
*/
publicsetMenu(intspeed2){
speed1=speed2;
System.out.println(speed2);
}
publicvoidSsetMenu(finalsetMenuframe){
setTitle("主菜单");
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setBounds(100,100,250,350);
contentPane=newJPanel();
contentPane.setBackground(newColor(102,204,102));
contentPane.setBorder(newEmptyBorder(5,5,5,5));
setContentPane(contentPane);
contentPane.setLayout(null);
//按钮:
游戏开始
JButtonNewGameButton=newJButton("");
NewGameButton.setIcon(newImageIcon("img/gamebegin.png"));
NewGameButton.setBounds(53,52,123,40);
NewGameButton.addActionListener(newActionListener(){
publicvoidactionPerformed(ActionEvente){
Gamegs=newGame(speed1);
frame.dispose();
}
});
contentPane.add(NewGameButton);
//按钮:
游戏设置
JButtonsetButton=newJButton("");
setButton.addMouseListener(newMouseAdapter(){
@Override
publicvoidmouseClicked(MouseEvente){
modelframe1=newmodel();
frame1.Mmodel(frame1);
frame1.setVisible(true);
frame.dispose();
}
});
//按钮图片设置
setButton.setIcon(newImageIcon("img/set.png"));
setButton.setBounds(53,128,123,45);
contentPane.add(setButton);
//按钮:
游戏推出
JButtonexitButton=newJButton("");
exitButton.setIcon(newImageIcon("img/exit.png"));
exitButton.setBounds(53,206,123,40);
exitButton.addActionListener(newActionListener(){
publicvoidactionPerformed(ActionEvente){
System.exit(0);
}
});
contentPane.add(exitButton);
}
}
3、功能3(贪吃蛇游戏窗口)
(1)能3(贪吃蛇游戏窗口)文字描述:
贪吃蛇游戏窗口界面包括蛇体与食物游戏区域,正上方有即时计分框(记录目前所得的分数),左上角有三个下拉菜单选项包括“菜单”下拉菜单,“帮助”菜单,“返回”菜单。
点击“菜单”菜单会出现下拉的“重新开始”选项同时也可以按下Enter键重新开始游戏;点击“帮助”菜单会出现“游戏说明”选项,点击进入后出现游戏帮助信息;点击“返回”菜单则直接返回主菜单选择窗口。
贪吃蛇游戏窗口大小是固定的目的是确定并设置当蛇体碰触到边框后提示游戏失败的出框,在规定的窗口范围内蛇体可以通过按上↑、下↓、左←、右→方向键控制其运动方向;在吃到界面区域中出现的食物后蛇体会变长,而以不同的速度和运动长度(UP和DOWN是偶数,RIGHT和LEFT是奇数)所得到的分数也不一样。
按空键游戏暂停,按Enter键游戏重新开始。
(2)功能3现的流程图:
(3)功能3(贪吃蛇游戏窗口)代码:
packageSwing;
import;
import;
import;
import;
import;
import;
import;
import;
import;
import;
import;
import;
import;
import;
import;
import;
import;
import;
import;
import;
import;
import;
import;
import;
import;
import;
import;
import;
//MainClass
publicclassGameextendsKeyAdapterimplementsImageObserver{
//初始速度
intspeed_all=200;
BufferedImagebgImage=null;
JFramemainFrame;
JPaneljPanel;
//CanvaspaintCanvas;
JLabellabelScore;//计分牌
SnakeModelsnakeModel=null;//蛇
publicstaticfinalintDEFAULT_WIDTH=500;
publicstaticfinalintDEFAULT_HEIGHT=400;
publicstaticfinalintnodeWidth=10;
publicstaticfinalintnodeHeight=10;
privateJMenuBarmenuBar;
privateJMenumenu;
privateJMenuItemmenuItem;
privateJMenuBarmenuBar_1;
privateJMenumnNewMenu;
privateJMenumnNewMenu_1;
privateJMenuItemmntmNewMenuItem;
privateJMenuItemmntmNewMenuItem_1;
privateJMenumnNewMenu_2;
//GreedSnake():
初始化游戏界面
publicGame(intspeed_gs){
speed_all=speed_gs;
("Game:
"+speed_all);
//设置界面元素
mainFrame=newJFrame("贪吃蛇游戏");
Containercp=mainFrame.getContentPane();
aoao(mainFrame);
jPanel=newJPanel();
jPanel.setPreferredSize(newDimension(DEFAULT_WIDTH-10,DEFAULT_HEIGHT-10));//500*390
//paintCanvas.setSize(DEFAULT_WIDTH+20,DEFAULT_HEIGHT+20);
jPanel.addKeyListener(this);
cp.add(jPanel,BorderLayout.CENTER);
//cp.add(paintCanvas,BorderLayout.CENTER);
JPanelpanelButtom=newJPanel();
panelButtom.setLayout(newBorderLayout());
cp.add(panelButtom,BorderLayout.SOUTH);
//score
labelScore=newJLabel("所得分数为:
",JLabel.CENTER);
mainFrame.getContentPane().add(labelScore,BorderLayout.NORTH);
mainFrame.addKeyListener(this);
mainFrame.pack();
mainFrame.setResizable(false);//设置窗口大小不能变化
mainFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
mainFrame.setVisible(true);
begin();
}
//keyPressed():
按键检测及菜单设置
publicvoidaoao(finalJFramemainFrame){
mainFrame.setJMenuBar(menuBar);
menuBar_1=newJMenuBar();
mainFrame.setJMenuBar(menuBar_1);
mnNewMenu=newJMenu("菜单");
menuBar_1.add(mnNewMenu);
mntmNewMenuItem=newJMenuItem("重新开始");
mntmNewMenuItem.addActionListener(newActionListener(){
publicvoidactionPerformed(ActionEventarg0){
Gamegs=newGame(speed_all);
mainFrame.dispose();
}
});
mnNewMenu.add(mntmNewMenuItem);
mnNewMenu_1=newJMenu("帮助");
mnNewMenu_1.addMouseListener(newMouseAdapter(){
@Override
publicvoidmouseClicked(MouseEvente){
snakeModel.changePauseState();
}
});
menuBar_1.add(mnNewMenu_1);
mntmNewMenuItem_1=newJMenuItem("游戏说明");
mntmNewMenuItem_1.addActionListener(newActionListener(){
//游戏说明响应时间
publicvoidactionPerformed(ActionEventarg0){
JOptionPane.showMessageDialog(null,"按→←↑↓控制方向,空格键暂停,Enter键重新开始","游戏帮助",JOptionPane.INFORMATION_MESSAGE);
}
});
mnNewMenu_1.add(mntmNewMenuItem_1);
mnNewMenu_2=newJMenu("返回");
mnNewMenu_2.addMouseListener(newMouseAdapter()
{//连接主菜单
@Override
publicvoidmouseClicked(MouseEventarg0){
setMenuframe123=newsetMenu(speed_all);
frame123.SsetMenu(frame123);
frame123.setVisible(true);
mainFrame.dispose();
//("123456");
}
});
menuBar_1.add(mnNewMenu_2);
}
//键盘响应时间设置
publicvoidkeyPressed(KeyEvente){
intkeyCode=e.getKeyCode();
if(snakeModel.running)
switch(keyCode){
caseKeyEvent.VK_UP:
snakeModel.changeDirection(SnakeModel.UP);
break;
caseKeyEvent.VK_DOWN:
snakeModel.changeDirection(SnakeModel.DOWN);
break;
caseKeyEvent.VK_LEFT:
snakeModel.changeDirection(SnakeModel.LEFT);
break;
caseKeyEvent.VK_RIGHT:
snakeModel.changeDirection(SnakeModel.RIGHT);
break;
caseKeyEvent.VK_ADD:
caseKeyEvent.VK_PAGE_UP:
snakeModel.speedUp();//加速
break;
caseKeyEvent.VK_SUBTRACT:
caseKeyEvent.VK_PAGE_DOWN:
snakeModel.speedDown();//减速
break;
caseKeyEvent.VK_SPACE:
caseKeyEvent.VK_P:
snakeModel.changePauseState();//