贪吃蛇游戏 望采纳
创新互联成立于2013年,是专业互联网技术服务公司,拥有项目成都网站建设、做网站网站策划,项目实施与项目整合能力。我们以让每一个梦想脱颖而出为使命,1280元左云做网站,已为上家服务,为左云各地企业和个人服务,联系电话:18980820575
import java.awt.Button;
import java.awt.Color;
import java.awt.GridLayout;
import java.awt.Point;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import java.util.*;
import javax.swing.JFrame;
import javax.swing.JOptionPane;
public class Snake extends JFrame implements KeyListener{
int Count=0;
Button[][] grid = new Button[20][20];
ArrayListPoint snake_list=new ArrayListPoint();
Point bean=new Point(-1,-1);//保存随机豆子【坐标】
int Direction = 1; //方向标志 1:上 2:下 3:左 4:右
//构造方法
public Snake()
{
//窗体初始化
this.setBounds(400,300,390,395);
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
GridLayout f=new GridLayout(20,20);
this.getContentPane().setBackground(Color.gray);
this.setLayout(f);
//初始化20*20个按钮
for(int i=0;i20;i++)
for(int j=0;j20;j++)
{
grid[i][j]=new Button();
this.add(grid[i][j]);
grid[i][j].setVisible(false);
grid[i][j].addKeyListener(this);
grid[i][j].setBackground(Color.blue);
}
//蛇体初始化
grid[10][10].setVisible(true);
grid[11][10].setVisible(true);
grid[12][10].setVisible(true);
grid[13][10].setVisible(true);
grid[14][10].setVisible(true);
//在动态数组中保存蛇体按钮坐标【行列】信息
snake_list.add(new Point(10,10));
snake_list.add(new Point(11,10));
snake_list.add(new Point(12,10));
snake_list.add(new Point(13,10));
snake_list.add(new Point(14,10));
this.rand_bean();
this.setTitle("总分:0");
this.setVisible(true);
}
//该方法随机一个豆子,且不在蛇体上,并使豆子可见
public void rand_bean(){
Random rd=new Random();
do{
bean.x=rd.nextInt(20);//行
bean.y=rd.nextInt(20);//列
}while(snake_list.contains(bean));
grid[bean.x][bean.y].setVisible(true);
grid[bean.x][bean.y].setBackground(Color.red);
}
//判断拟增蛇头是否与自身有碰撞
public boolean is_cross(Point p){
boolean Flag=false;
for(int i=0;isnake_list.size();i++){
if(p.equals(snake_list.get(i) )){
Flag=true;break;
}
}
return Flag;
}
//判断蛇即将前进位置是否有豆子,有返回true,无返回false
public boolean isHaveBean(){
boolean Flag=false;
int x=snake_list.get(0).x;
int y=snake_list.get(0).y;
Point p=null;
if(Direction==1)p=new Point(x-1,y);
if(Direction==2)p=new Point(x+1,y);
if(Direction==3)p=new Point(x,y-1);
if(Direction==4)p=new Point(x,y+1);
if(bean.equals(p))Flag=true;
return Flag;
}
//前进一格
public void snake_move(){
if(isHaveBean()==true){//////////////有豆子吃
Point p=new Point(bean.x,bean.y);//【很重要,保证吃掉的是豆子的复制对象】
snake_list.add(0,p); //吃豆子
grid[p.x][p.y].setBackground(Color.blue);
this.Count++;
this.setTitle("总分:"+Count);
this.rand_bean(); //再产生一个豆子
}else{///////////////////无豆子吃
//取原蛇头坐标
int x=snake_list.get(0).x;
int y=snake_list.get(0).y;
//根据蛇头坐标推算出拟新增蛇头坐标
Point p=null;
if(Direction==1)p=new Point(x-1,y);//计算出向上的新坐标
if(Direction==2)p=new Point(x+1,y);//计算出向下的新坐标
if(Direction==3)p=new Point(x,y-1);//计算出向左的新坐标
if(Direction==4)p=new Point(x,y+1);//计算出向右的新坐标
//若拟新增蛇头碰壁,或缠绕则游戏结束
if(p.x0||p.x19|| p.y0||p.y19||is_cross(p)==true){
JOptionPane.showMessageDialog(null, "游戏结束!");
System.exit(0);
}
//向蛇体增加新的蛇头坐标,并使新蛇头可见
snake_list.add(0,p);
grid[p.x][p.y].setVisible(true);
//删除原蛇尾坐标,使蛇尾不可见
int x1=snake_list.get(snake_list.size()-1).x;
int y1=snake_list.get(snake_list.size()-1).y;
grid[x1][y1].setVisible(false);
snake_list.remove(snake_list.size()-1);
}
}
@Override
public void keyPressed(KeyEvent e) {
if(e.getKeyCode()==KeyEvent.VK_UP Direction!=2) Direction=1;
if(e.getKeyCode()==KeyEvent.VK_DOWN Direction!=1) Direction=2;
if(e.getKeyCode()==KeyEvent.VK_LEFT Direction!=4) Direction=3;
if(e.getKeyCode()==KeyEvent.VK_RIGHT Direction!=3) Direction=4;
}
@Override
public void keyReleased(KeyEvent e) { }
@Override
public void keyTyped(KeyEvent e) { }
public static void main(String[] args) throws InterruptedException {
Snake win=new Snake();
while(true){
win.snake_move();
Thread.sleep(300);
}
}
}
根据你上面的提示和程序里的要求,修改了Database,新增了衣服的方法。每次计算的价格可以写成共通方法。希望其他人有好的建议也发上来。
import java.util.HashMap;
import java.util.Map;
public class Database {
private MapInteger, McBean data = new HashMapInteger, McBean();
public Database(){
McBean bean = new McBean();
bean.setNid(1);
bean.setSname("地瓜");
bean.setNprice(2.0);
bean.setSdescription("新鲜的地瓜");
data.put(1, bean);
bean = new McBean();
bean.setNid(2);
bean.setSname("土豆");
bean.setNprice(1.2);
bean.setSdescription("又好又大的土豆");
data.put(2, bean);
bean = new McBean();
bean.setNid(3);
bean.setSname("丝瓜");
bean.setNprice(1.5);
bean.setSdescription("本地丝瓜");
data.put(3, bean);
bean = new McBean();
bean.setNid(4);
bean.setSname("衣服");
bean.setNprice(30);
bean.setSdescription("衣服");
data.put(4, bean);
}
public McBean getMcBean(int nid){
return data.get(nid);
}
}
public class McBean {
private Integer nid; //商品编号
private String sname; //名称
private double nprice; //价格
private String sdescription; //描述
public Integer getNid() {
return nid;
}
public void setNid(Integer nid) {
this.nid = nid;
}
public String getSname() {
return sname;
}
public void setSname(String sname) {
this.sname = sname;
}
public double getNprice() {
return nprice;
}
public void setNprice(double nprice) {
this.nprice = nprice;
}
public String getSdescription() {
return sdescription;
}
public void setSdescription(String sdescription) {
this.sdescription = sdescription;
}
}
public class OrderItemBean {
private McBean mcbean; //商品
private int count; //商品数量
public McBean getMcbean() {
return mcbean;
}
public void setMcbean(McBean mcbean) {
this.mcbean = mcbean;
}
public int getCount() {
return count;
}
public void setCount(int count) {
this.count = count;
}
}
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
import java.util.Set;
public class ShoppingCar {
private double totalPrice; //购物车所有商品总价格
private int totalCount; //购物车所有商品数量
private MapInteger,OrderItemBean itemMap; //商品编号与订单项的键值对
public ShoppingCar(){
//初始化购物车
itemMap = new HashMapInteger, OrderItemBean();
Database db = new Database();
McBean bean = new McBean();
OrderItemBean orderItem1 = new OrderItemBean();
OrderItemBean orderItem2 = new OrderItemBean();
OrderItemBean orderItem3 = new OrderItemBean();
bean = db.getMcBean(1);
orderItem1.setMcbean(bean);
orderItem1.setCount(2);
bean = db.getMcBean(2);
orderItem2.setMcbean(bean);
orderItem2.setCount(5);
bean = db.getMcBean(4);
orderItem3.setMcbean(bean);
orderItem3.setCount(3);
itemMap.put(1, orderItem1);
itemMap.put(2, orderItem2);
itemMap.put(4, orderItem3);
totalCount = itemMap.size();
totalPrice = 0;
Set set = itemMap.entrySet();
Iterator i = set.iterator();
while(i.hasNext()){
Map.EntryInteger, OrderItemBean entry1=(Map.EntryInteger, OrderItemBean)i.next();
totalPrice += entry1.getValue().getCount() * entry1.getValue().getMcbean().getNprice();
}
}
public void buy(int nid){
//如果该商品是第一次购买,商品的信息从数据库获取,数据库的模拟代
//码见附录。itemMap增加一对键值对。
//如果不是第一次购买,则通过商品编号找到对应的定单项,然后更新定
//单项的商品数量。
//不管是否第一次购买,都得更新购物车的总价格和总数量。
Database db = new Database();
McBean mcBean = new McBean();
OrderItemBean orderItem = new OrderItemBean();
if(itemMap.get(nid) == null) {
mcBean = db.getMcBean(nid);
orderItem.setMcbean(mcBean);
orderItem.setCount(1);
itemMap.put(nid, orderItem);
} else {
orderItem = itemMap.get(nid);
orderItem.setCount(orderItem.getCount() + 1);
}
totalCount = itemMap.size();
totalPrice = 0;
Set set = itemMap.entrySet();
Iterator i = set.iterator();
while(i.hasNext()){
Map.EntryInteger, OrderItemBean entry1=(Map.EntryInteger, OrderItemBean)i.next();
totalPrice += entry1.getValue().getCount() * entry1.getValue().getMcbean().getNprice();
}
}
public void delete(int nid){
//通过商品编号删除的对应的定单项,然后从更新购物车的总价格和总数量。
itemMap.remove(nid);
totalCount = itemMap.size();
totalPrice = 0;
Set set = itemMap.entrySet();
Iterator i = set.iterator();
while(i.hasNext()){
Map.EntryInteger, OrderItemBean entry1=(Map.EntryInteger, OrderItemBean)i.next();
totalPrice += entry1.getValue().getCount() * entry1.getValue().getMcbean().getNprice();
}
}
public void update(int nid, int count){
///通过商品编号找到对应的对应的定单项,修改商品数量。然后从更新购物车的总价格和总数量。
OrderItemBean orderItem = new OrderItemBean();
orderItem = itemMap.get(nid);
orderItem.setCount(count);
totalCount = itemMap.size();
totalPrice = 0;
Set set = itemMap.entrySet();
Iterator i = set.iterator();
while(i.hasNext()){
Map.EntryInteger, OrderItemBean entry1=(Map.EntryInteger, OrderItemBean)i.next();
totalPrice += entry1.getValue().getCount() * entry1.getValue().getMcbean().getNprice();
}
}
public void clear(){
//清空定单项,购物车的总价格和总数量清零。
itemMap.clear();
totalCount = 0;
totalPrice = 0;
}
public void show(){
//显示购物车的商品,格式如下:
//商品编号 商品名称 单价 购买数量 总价
//1 地瓜 2.0 2 4.0
//2 衣服 30 5 150
//…
//合计:总数量:5 总价格:20元
System.out.println("商品编号" + " " + "商品名称" + " " + "单价" + " " + "购买数量" + " " + "总价" );
Set set = itemMap.entrySet();
Iterator i = set.iterator();
while(i.hasNext()){
Map.EntryInteger, OrderItemBean entry1=(Map.EntryInteger, OrderItemBean)i.next();
int nid = entry1.getKey();
String name = entry1.getValue().getMcbean().getSname();
double price = entry1.getValue().getMcbean().getNprice();
int count = entry1.getValue().getCount();
double totalprice = price * count;
System.out.println(nid + " "+ name + " " + price + " " + count + " " + totalprice);
}
System.out.println("合计:总数量:" + totalCount + " 总价格:" + totalPrice+ "元");
}
public static void main(String[] args) {
ShoppingCar shoppingCar = new ShoppingCar();
shoppingCar.show();
System.out.println("--------------------------------");
shoppingCar.buy(3);
shoppingCar.show();
System.out.println("--------------------------------");
shoppingCar.update(4, 2);
shoppingCar.show();
System.out.println("--------------------------------");
shoppingCar.delete(2);
shoppingCar.show();
System.out.println("--------------------------------");
shoppingCar.clear();
shoppingCar.show();
}
}
运行结果:
商品编号 商品名称 单价 购买数量 总价
1 地瓜 2.0 2 4.0
2 土豆 1.2 5 6.0
4 衣服 30.0 3 90.0
合计:总数量:3 总价格:100.0元
--------------------------------
商品编号 商品名称 单价 购买数量 总价
1 地瓜 2.0 2 4.0
2 土豆 1.2 5 6.0
3 丝瓜 1.5 1 1.5
4 衣服 30.0 3 90.0
合计:总数量:4 总价格:101.5元
--------------------------------
商品编号 商品名称 单价 购买数量 总价
1 地瓜 2.0 2 4.0
2 土豆 1.2 5 6.0
3 丝瓜 1.5 1 1.5
4 衣服 30.0 2 60.0
合计:总数量:4 总价格:71.5元
--------------------------------
商品编号 商品名称 单价 购买数量 总价
1 地瓜 2.0 2 4.0
3 丝瓜 1.5 1 1.5
4 衣服 30.0 2 60.0
合计:总数量:3 总价格:65.5元
--------------------------------
商品编号 商品名称 单价 购买数量 总价
合计:总数量:0 总价格:0.0元
根据你的描述,eat应该是一个工作空间的文件夹(.metadata是工作空间的配置文件),而那个EAT就是吃豆子的项目,用Eclipse的话,设置工作空间到????\eat就可以了.
一种是在打开的时候询问工作空间路径,输入你的eat文件夹的绝对路径就可以.
另一种是在Eclipse中,选文件(File) - 切换工作空间(Switch Workspace) 然后输入eat文件夹的绝对路径.
常理来讲,这样就能看到源代码了,至于运行,你需要找到这些源代码中的main方法,你可以在左侧的"包资源管理器(Package)"中找到EAT项目,在上面点击鼠标右键,点击运行方式(Run As), 选择运行的方式,不知道你的程序是Applet, 还是Application, 试一下吧,应该就可以运行起来了.
看你是自己学, 还是出去培训, 要是培训的话, 时间稍微长一点儿, 我说一下需要的知识吧, 时间根据各人对知识的接受能力而定:
首先需要的是Java基础
然后要弄明白面向对象的思想, 因为一个类也能做出来, 但是看着非常不好看, 而且不容易维护.
再就是学集合类, 贪食蛇用集合类来保存(比如链表)比较快, 操作起来也比较容易.
之后就是Java图形界面, AWT 和Swing 都可, 要会用JFrame的 paint方法, 不要用按钮组来模拟蛇的样子, 最好是用画笔画出来.
最后就是多线程了, 这个尤为重要, 因为贪食蛇需要两个线程来进行运行, 主要的难度就体现在多线程的控制上, 转向控制啊, 吃豆变长啊, 移动速度啊, 等等
大概就这些吧, ^_^, 祝你成功
C:\Mywindow.java:48: 无法将 javax.swing.AbstractButton 中的 addActionListener(java.awt.event.ActionListener) 应用于 (GoodWindow)
button.addActionListener(this);
^
1 错误
俄罗斯方块(Tetris)是经典的益智游戏,几乎是世界上最有影响力的益智游戏之一,游戏本身也很简单,只要不断消减掉落的方块就可以了。这个游戏被模仿了很多个版本,我这里的是EA出的疯狂俄罗斯方块(Tetris
Mania)。
超级泡泡龙(Super Bubble
Bobble)是Taito公司开发的游戏,主角是两只绿色和蓝色的小恐龙,通过吐出泡泡来消减屏幕上的彩球,游戏本身简单易学、妙趣横生,女孩子玩起来会上瘾的。
超级马里奥(Super Mario
Bros)是任天堂公司开发的著名横版过关游戏,是电子游戏历史上销量最大的系列游戏之一,早在任天堂的红白机时代就名声在外了,这个游戏几乎移植到了所有的任天堂游戏机,也包括电脑和手机。
吃豆(Pac-Man)是Namco公司开发的一个经典游戏,玩家控制游戏的主人公黄色小精灵吃掉藏在迷宫内所有的豆子,并且不能被“幽灵”抓到。
贪吃蛇(Retro
Snaker)是诺基亚手机上的一个元老级游戏,这个游戏短小精悍,很具可玩性,特别适合在手机上玩。据称,已经有超过十亿人玩过这个游戏。
钻石情迷(Bejeweled)是一个很好玩的益智游戏,有点像“对对碰”,游戏规则很简单,移动相邻的两个钻石,使任一排产生有三个或以上的相同钻石,即消去,上面的钻石靠重力落下。
祖玛(Zuma)是一款休闲益智游戏,玩法很像QQ龙珠,将中间吐出来的珠子向着周围连环滚出的同色珠子射打,够三个就能炸裂消除,简单有趣。
炸弹人(Bomberman)是Hudson公司开发的一款基于迷宫的游戏,游戏主角炸弹人是一个机器人,基本操作是放置炸弹,以十字型的方式爆炸,来炸死敌人,也可以炸死自己,还有些增强威力与技能道具增加了游戏的可玩性。
波斯王子(Prince of
Persia)是上世纪九十年代的一个经典游戏,我以前在DOS上玩过的最早的游戏之一,可惜游戏续集一代不如一代,Gameloft将波斯王子一代进行了重新开发制作,命名为Prince
of Persia Classic,并支持手机,其在手机上的效果很不错。
模拟人生(The Sims)是Electronic
Arts开发的一款以模拟普通人生活为主题的游戏,玩家可以操控模拟人物进行日常生活、社区交流以及建造房屋。在一个模拟的世界中,仿造真实的情境,控制生理和精神的需求。手机版的模拟人生简化了原始电脑游戏的一些因素,使得其可以在手机上方便的操作。