吃豆豆--Java小游戏

来源:互联网 发布:联合国维和行动 知乎 编辑:程序博客网 时间:2024/05/21 06:53

吃豆豆

项目总结,要求用Java做一个小游戏
不想用网上现成的代码,也想做的有新意一点
什么贪吃蛇啊飞机大战啊超级玛丽啊……
之前有人写过或者有人在写,所有并不想做(@我东东哥)
打了3天4399吧,想到一个比较不错的游戏:吃豆豆


黄色的为我方小豆人,粉色红色橙色为小怪兽
可以通过键盘上下左右来控制小豆人运动,每次移动5个像素
小怪兽可以自行运动,每次移动30个像素
Enter键开始游戏,space暂停游戏
小豆人和小怪兽均不可以穿过墙体
如果小豆人撞到小怪兽,则游戏失败
豆豆全部吃完闯关成功
背景的地图是可以自己绘制的
小豆人图片、小怪兽图片也可以根据自己喜好添加

因为是用Java中的swing和AWT写的
所以界面可能有点丑难过(没办法,我真的尽力了)
Java真的不太适合游戏的界面制作
整个界面是使用那种按表格绘制
用Timer每300毫秒进行重绘(当然用线程实现更好)
画面有点卡顿,不过双缓冲技术可以很好地解决闪屏问题

制作过程中遇到的比较麻烦的地方
就是判断小豆人和小怪兽运动方向能否执行
之前写的代码一直有bug,
if条件中考虑的情况不全和各条件的顺序不对
各种穿墙不移动数组越界,真的是改到绝望了难过
不过还好后来发现了并修复了这些bug
现在的游戏我还是很满意的大笑

在游戏开始之前加入了登录界面
类似于QQ的登录界面
使用了动态gif图片作为背景
嗯画面挺漂亮的

密码使用了JPasswordField做的
当时以为获得密码框中文本要用getText()
结果一直报空指针异常
查了API文档才发现要用getPassword()
emmmm……


后续:

本来是想做Tap Tap Dash(点点冲刺)的
不过游戏对灵敏度和画面流畅要求比较高
Java的Timer和多线程很难满足要求
细节实现起来也比较难
所以,很遗憾吧
等以后学习了前端语言,再慢慢写吧
写完这个才发现,做这类游戏的套路基本是一致的
做完吃豆豆,坦克大战飞机大战贪吃蛇之类的游戏都能自己做了
游戏还有待改善,比如吃了某种水果就能使小怪兽暂停什么的
或者给三个小怪兽设置独立的人格……

附键盘监听器的代码
mc.addKeyListener(new KeyAdapter() {@Overridepublic void keyPressed(KeyEvent e) {int key = e.getKeyCode();if (flag[player.p_y / 30][player.p_x / 30] == 0) {flag[player.p_y / 30][player.p_x / 30] = 1;}switch (key) {case KeyEvent.VK_LEFT:player.p_image = Player.im1;if(player.p_x==0)break;if ((player.p_x % 30 != 0|| (player.p_y % 30 != 0 && Data.point[player.p_y / 30 + 1][player.p_x / 30 - 1] == 1 && Data.point[player.p_y / 30][player.p_x / 30 - 1] == 1)|| (player.p_y % 30 == 0 && Data.point[player.p_y / 30][player.p_x / 30 - 1] == 1))) {player.p_x -= 5;}break;case KeyEvent.VK_RIGHT:player.p_image = Player.im3;if(player.p_x>=570)break;if ((player.p_x % 30 != 0|| (player.p_y % 30 != 0 && Data.point[player.p_y / 30 + 1][player.p_x / 30 + 1] == 1 && Data.point[player.p_y / 30][player.p_x / 30 + 1] == 1)|| (player.p_y % 30 == 0 && Data.point[player.p_y / 30][player.p_x / 30 + 1] == 1))) {player.p_x += 5;}break;case KeyEvent.VK_UP:player.p_image = Player.im5;if (player.p_y>0 && (player.p_y % 30 != 0|| (player.p_x % 30 != 0 && Data.point[player.p_y / 30 - 1][player.p_x / 30 + 1] == 1 && Data.point[player.p_y / 30 - 1][player.p_x / 30] == 1)|| (player.p_x % 30 == 0 && Data.point[player.p_y / 30 - 1][player.p_x / 30] == 1)) ){player.p_y -= 5;}break;case KeyEvent.VK_DOWN:player.p_image = Player.im2;if (player.p_y<570 && (player.p_y % 30 != 0|| (player.p_x % 30 != 0 && Data.point[player.p_y / 30 + 1][player.p_x / 30 + 1] == 1&& Data.point[player.p_y / 30 + 1][player.p_x / 30] == 1)|| (player.p_x % 30 == 0 && Data.point[player.p_y / 30 + 1][player.p_x / 30] == 1)) ){player.p_y += 5;}break;case KeyEvent.VK_ENTER:time.start();break;case KeyEvent.VK_SPACE:time.stop();break;}}});

差不多整个项目有500-600行代码吧
学习的路还有很长,加油!




原创粉丝点击