java贪吃蛇代码(最全的java游戏网站)
年末啦,小编首先祝各位程序员新年快乐!真的是应了那句话:过了12岁之后,那岁数可就是不按规律的蹭蹭的往上涨啊,就在今年2018年,最后一批90后也步入了18岁的成人礼。正式宣布90后退出青年市场,00后统治世界~我们也即将是老去的一代。
小编偶然想到童年玩过的那些经典游戏,在当下吃鸡,撸啊撸风靡的时代,那些小游戏渐渐被人遗忘,现在回想起来,当时那些游戏还是很好玩的呢,各位看官觉得呢?所以小编自己动手写出了贪吃蛇游戏的java代码,又重温了一下,仿佛又回到了童年时代。下面给大家介绍一下代码的逻辑和具体的代码是什么:
1.逻辑判断
要点分析:
1)数据结构:matrix[][]用来存储地图上面的信息,如果什么也没有设置为false,
如果有食物或蛇,设置为true;nodearray,一个linkedlist,用来保存蛇的每
一节;food用来保存食物的位置;而node类是保存每个位置的信息。
2)重要函数:
changedirection(int newdirection) ,用来改变蛇前进的方向,而且只是
保存头部的前进方向,因为其他的前进方向已经用位置来指明了。 其中newdirection
必须和原来的direction不是相反方向,所以相反方向的值用了同样的奇偶性。在测试
的时候使用了direction%2!=newdirection%2 进行判断。
moveon(),用来更新蛇的位置,对于当前方向,把头部位置进行相应改变。如果越界,
结束;否则,检测是否遇到食物(加头部)或身体(结束);如果什么都没有,加上头部,
去掉尾部。由于用了linkedlist数据结构,省去了相当多的麻烦。
2.具体代码
public class snakepanel extends jpanel implements keylistener,actionlistener {
imageicon up = new imageicon(“up.png”);
imageicon down = new imageicon(“down.png”);
imageicon right = new imageicon(“right.png”);
imageicon left = new imageicon(“left.png”);
imageicon title = new imageicon(“title.jpg”);
imageicon food = new imageicon(“food.png”);
imageicon body = new imageicon(“body.png”);
/*
* 定义数组记录蛇头和蛇身体的坐标,变量len表示蛇的长度
* 变量方向表示蛇移动的方向
*/
int[] snakex = new int[750];
int[] snakey = new int[750];
random rand = new random();
int foodx = rand.nextint(34)*25+25;
int foody = rand.nextint(24)*25+75;
int len = 3;
int score = 0;
string fangxiang = “r”;//r右、l左、u上、d下
boolean isstarted = false;//判断游戏是否开始
boolean isfailed = false;//判断是否死亡
//计时器:1.时间 2.时间到了去找的对象
timer timer = new timer(300, this);
public snakepanel(){
this.setfocusable(true);//取得焦点
this.addkeylistener(this);
setup();
timer.start();
}
/*
* graphics图像
* public void paint(graphics g) 以绘制组件。
* 应用程序不应直接调用 paint,而是应该使用 repaint 方法来安排重绘组件。
* 参数:g (相当于画笔)- 在其中进行绘制的 graphics 上下文
*/
public void paint(graphics g){
// super.paint(g);
// this.setbackground(color.white);
this.getrootpane().setbackground(color.white);
/*
* public void painticon(component c,graphics g,int x,int y)
* 绘制图标。
* 图标的左上角在图形上下文 g 的坐标空间中的点 (x, y) 处绘制。
* 如果此图标没有图像观察者,则此方法使用 c 组件作为观察者。
* 参数:c(画布) – 用作观察者的组件,如果此图标没有图像观察者
g (画笔)- 图形上下文
x – 图标左上角的 x 坐标
y – 图标左上角的 y 坐标
*/
title.painticon(this, g, 25, 11);
/*
* void java.awt.graphics.fillrect(int x, int y, int width, int height)
* 填充指定的矩形。
* 该矩形左边和右边位于 x 和 x + width – 1。
* 顶边和底边位于 y 和 y + height – 1。
* 得到的矩形覆盖的区域宽度为 width 像素,高度为 height 像素。
* 使用图形上下文的当前颜色填充该矩形。
* 参数:x – 要填充矩形的 x 坐标。
y – 要填充矩形的 y 坐标。
width – 要填充矩形的宽度。
height – 要填充矩形的高度。
*/
g.fillrect(25, 75, 850, 600);
//画蛇头,先判断蛇头的方向
if(fangxiang.equals(“r”)){
right.painticon(this, g, snakex[0], snakey[0]);
}else if(fangxiang.equals(“l”)){
left.painticon(this, g, snakex[0], snakey[0]);
}else if(fangxiang.equals(“u”)){
up.painticon(this, g, snakex[0], snakey[0]);
}else if(fangxiang.equals(“d”)){
down.painticon(this, g, snakex[0], snakey[0]);
}
//画蛇的身体
for (int i = 1; i < len; i++) {
body.painticon(this, g, snakex[i], snakey[i]);
}
//游戏没有开始时,显示提示语(!isstarted)
if(isstarted == false){
g.setcolor(color.white);
g.setfont(new font(“微软雅黑”,font.bold,35));
g.drawstring(“press space to start/pause”, 250, 350);
}
if(isfailed){
g.setcolor(color.white);
g.setfont(new font(“微软雅黑”,font.bold,35));
g.drawstring(“game over! press space to restart”, 200, 350);
}
food.painticon(this, g, foodx, foody);
//添加分数
g.setcolor(color.white);
g.drawstring(“score : “+score, 600, 45);
}
public void setup(){
isstarted = false;
isfailed = false;
len = 3;
snakex[0] = 100;
snakey[0] = 100;
snakex[1] = 75;
snakey[1] = 100;
snakex[2] = 50;
snakey[2] = 100;
}
@override
public void keypressed(keyevent e) {
// todo auto-generated method stub
int keycode = e.getkeycode();
//实现转向,不能实现反转
if(keycode == keyevent.vk_space){
if (isfailed) {
// isstarted = false;
// isfailed = false;
setup();
}else {
// isstarted = true;
isstarted = !isstarted;//改变当前状态
// repaint();
}
}else if(keycode == keyevent.vk_up && fangxiang != “d”){
fangxiang = “u”;
}else if(keycode == keyevent.vk_down && fangxiang != “u”){
fangxiang = “d”;
}else if(keycode == keyevent.vk_right && fangxiang != “l”){
fangxiang = “r”;
}else if(keycode == keyevent.vk_left && fangxiang != “r”){
fangxiang = “l”;
}
}
@override
public void actionperformed(actionevent e) {
// todo auto-generated method stub
//1.再定义个闹钟
timer.start();
//2.移动数据
if (isstarted && !isfailed) {
//移动身体
for (int i = len; i >0; i–) {
snakex[i] = snakex[i-1];
snakey[i] = snakey[i-1];
}
//移动头
if(fangxiang.equals(“r”)){
snakex[0] = snakex[0] + 25;
if(snakex[0] > 850)
snakex[0] = 25;
}else if(fangxiang.equals(“l”)){
snakex[0] = snakex[0] – 25;
if(snakex[0] < 25) snakex[0] = 850;
}else if(fangxiang.equals(“u”)){
snakey[0] = snakey[0] – 25;
if(snakey[0] < 75) snakey[0] = 650;
}else if(fangxiang.equals(“d”)){
snakey[0] = snakey[0] + 25;
if(snakey[0] > 650) snakey[0] = 75;
}
}
//吃食物
if(snakex[0] == foodx && snakey[0] == foody){
len ++;
score ++;
foodx = rand.nextint(34)*25+25;
foody = rand.nextint(24)*25+75;
}
//判断身体相碰,游戏结束
for (int i = 1; i < len; i++) {
if (snakex[0] == snakex[i] && snakey[0] == snakey[i]) {
isfailed = true;
}
}
//3.repaint()
repaint();
}
@override
public void keyreleased(keyevent e) {
// todo auto-generated method stub
}
@override
public void keytyped(keyevent e) {
// todo auto-generated method stub
}
}
package 贪吃蛇;
import java.applet.applet;
import java.io.file;
import java.net.malformedurlexception;
import javax.swing.jframe;
public class snake {
public static void main(string[] args) {
// todo auto-generated method stub
jframe frame = new jframe();
frame.setbounds(10, 10, 900, 720);
frame.setresizable(false);
frame.setdefaultcloseoperation(jframe.exit_on_close);
snakepanel panel = new snakepanel();
frame.add(panel);
frame.setvisible(true);
}
}
代码量有点大,小伙伴们可以复制到eclipse中运行就可以了。
在最后呢,祝各位小伙伴永远18岁,新年快乐~谢谢观看~
推荐阅读
-
nes游戏模拟器哪个好用(最全的java游戏网站)
-
nes游戏模拟器哪个好用(最全的java游戏网站)
-
入门的java游戏小程序教程(简单java小程序代码)
-
入门的java游戏小程序教程(简单java小程序代码)
-
java贪吃蛇代码(最全的java游戏网站)
-
java简单小游戏源代码大全(最全的java游戏网站)
-
Java实现经典拳皇误闯冒险岛游戏的示例代码
-
Java实现经典角色扮演侦探游戏游戏的示例代码
-
Java实现经典拳皇误闯冒险岛游戏的示例代码
-
【贪吃蛇—Java程序员写Android游戏】系列 3. 用J2ME实现Android的Snake Sample详解 Android游戏JavaUI多线程