小乌龟移动程序

程序运行结果::在一个窗体中画一只小乌龟,然后利用键盘的上下左右键控制小乌龟的移动

难点分析::在源代码中加了注释,程序的难点在于画出小乌龟和控制他的移动,画出小乌龟可以利用Graphics g类来实现,移动方式简单说就是乌龟在面板中位置的移动,如何控制控制的移呢?获得坐标,每次按键,使得乌龟在面板中的坐标发生变化,即可实现移动。加入键盘的监听器事件,这样点击键盘的上下左右键就会有相应,如果要实现小乌龟的自由移动,那就得加入线程和时间内的监听,和贪吃蛇小游戏的原理基本上类似。

 

 

import java.awt.Color;
import java.awt.Graphics;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;

import javax.swing.JFrame;
import javax.swing.JPanel;

/* 绘制王八,并设置键盘监听事件
 * 这个程序的主要目的在于在jframe中画出一只乌龟来,具体的实现根据不同的图形的拼凑,搭建一个乌龟的形状。
 * 其次实现监听器事件,也就是说通过键盘控制乌龟移动的方向,当按下向上的键的时候,乌龟向上移动,这个怎么实现?
 * 利用位置坐标的移动,物体移动的实现在于其在容器中相对位置的改变,因此,。
* */
public class tEST3 {

     public static void main(String[] args) {
           //1. 创建一个窗体,大小1366*768
         JFrame frame = new JFrame();
        frame.setSize(1366, 768);

          /*//画一个板子
            JPanel panel = new JPanel();
               //设置面板的背景颜色
             panel.setBackground(Color.BLACK);
                / /设置窗体添加面板
                    frame.add(panel);*/
/**创建一个面板,并设置面板的背景颜色
* 并添加到窗体上去*/
XiaoWangBa xwb = new XiaoWangBa();
xwb.setBackground(Color.LIGHT_GRAY);
//窗体添加键盘监听事件,监听对象是面板
frame.addKeyListener(xwb);
frame.add(xwb);

//3.设置窗体标题 
frame.setTitle("乌龟");
//4.设置窗体关闭按钮功能
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
//5.设置窗体大小不可更改
frame.setResizable(false);
//2.设置窗体可见
frame.setVisible(true);

}

}

//面板类
class XiaoWangBa extends JPanel implements KeyListener{
//王八的坐标位置
int x = 400,y = 200;
//王八四条腿(foot)的坐标
int fx1 = 400,fy1 = 200;
int fx2 = 400,fy2 = 200;
int fx3 = 400,fy3 = 200;
int fx4 = 400,fy4 = 200;

//移动变量
int f = 0;

//绘制方法,先输入paint再alt+/
@Override //JFrame frame
public void paint(Graphics g) {
// TODO Auto-generated method stub
super.paint(g);
//1.第一步先设置画笔的颜色
//2.第二步再对画布进行画图设置坐标
/**画脑袋*/
//设置画笔颜色
//g.setColor(Color.yellow);
// Red Green Blue
g.setColor(new Color(0, 100, 0));

//绘制实心椭圆
g.fillOval(x, y, 70, 100);

/**画眼睛*/
//设置画笔颜色
g.setColor(Color.black);
g.fillOval(x+10, y+30, 10, 10);
g.fillOval(x+50, y+30, 10, 10);
/*	//眼睛发亮
g.setColor(Color.white);
g.fillOval(x+15, y+30, 4, 4);
g.fillOval(x+55, y+30, 4, 4);*/

/**画尾巴*/
g.setColor(new Color(0, 100, 0));
g.fillOval(x, y+290, 60, 80);
//设置画笔颜色和背景颜色相同
g.setColor(Color.LIGHT_GRAY);
g.fillOval(x+20, y+300, 60, 80);

/**画王八四条腿*/
//左上
g.setColor(new Color(0, 100, 0));
g.fillOval(fx1-85, fy1+80, 70, 70);

//右上
g.setColor(new Color(0, 100, 0));
g.fillOval(fx2+85, fy2+80, 70, 70);
//左下
g.setColor(new Color(0, 100, 0));
g.fillOval(fx3-85, fy3+235, 70, 70);

//右下
g.setColor(new Color(0, 100, 0));
g.fillOval(fx4+85, fy4+235, 70, 70);
/**绘制王八壳*/
g.setColor(new Color(0, 50, 0));
g.fillOval(x-66, y+70, 200, 240);
/**绘制龟纹*/
g.setColor(Color.black);
g.drawOval(x-66, y+70, 200, 240);
//(上)左中右
g.setColor(Color.yellow);
g.fillOval(x-40, y+130, 50, 30);

g.setColor(Color.BLUE);
g.fillOval(x+15, y+80, 30, 50);

g.setColor(Color.yellow);
g.fillOval(x+60, y+130, 50, 30);
//中间
g.setColor(new Color(255, 0, 0));
g.fillOval(x+10, y+155, 45, 45);
//(下)左中右
g.setColor(Color.BLUE);
g.fillOval(x-45, y+195, 50, 30);

g.setColor(Color.yellow);
g.fillOval(x+20, y+220, 30, 50);

g.setColor(Color.BLUE);
g.fillOval(x+70, y+195, 50, 30);

//画直线(上)
g.setColor(Color.BLACK);
g.drawLine(x-10, y+82, x+20, y+158);

g.setColor(Color.BLACK);
g.drawLine(x+80, y+82, x+43, y+158);

//画直线(中间)
g.setColor(Color.BLACK);
g.drawLine(x-65, y+180, x+10, y+180);

g.setColor(Color.BLACK);
g.drawLine(x+133, y+180, x+55, y+180);

//画直线(下)
g.setColor(Color.BLACK);
g.drawLine(x-10, y+298, x+20, y+198);

g.setColor(Color.BLACK);
g.drawLine(x+80, y+298, x+43, y+198);
}

@Override
public void keyTyped(KeyEvent e) {
// TODO Auto-generated method stub

}

@Override
public void keyPressed(KeyEvent e) {
// 按键盘事件
//测试上键
if(e.getKeyCode()==KeyEvent.VK_UP && fy1>0) {
if(fy1<fy2) {
f = 1;
}else {
f = 0;
}

y=y-10;
if(f==0) {
fy1-=20;
fy4-=20;
}if(f==1) {
fy2-=20;
fy3-=20;
}
//System.out.println("测试上键");
}

//如果按的是下键
if(e.getKeyCode()==KeyEvent.VK_DOWN) {
//System.out.println("123");
if(fy1<fy2) {
f = 1;
}else {
f = 0;
}
y+=10;
if(f == 1) {
fy1+=20;
fy4+=20;
}
if(f == 0) {
fy2+=20;
fy3+=20;
}
}
//如果按的是左键
if(e.getKeyCode()==KeyEvent.VK_LEFT &&fx1>99) {
if(fx1>fx2) {
f = 1;
}else {
f = 0;
}
x-=10;
if(f == 1) {
fx1-=20;
fx4-=20;
}
if(f == 0) {
fx2-=20;
fx3-=20;
}
}
//如果按的是右键
if(e.getKeyCode()==KeyEvent.VK_RIGHT) {
if(fx1<fx2) {
f = 1;
}else {
f = 0;
}
x+=10;
if(f == 1) {
fx1+=20;
fx4+=20;
}
if(f == 0) {
fx2+=20;
fx3+=20;
}
}
/*if(e.getKeyCode()==KeyEvent.VK_DOWN&& fy1>0) {
y=y+10;
if(fy1<=fy2) {
fy1+=20;
fy4+=20;
}else {
fy2+=20;
fy3+=20;
}
System.out.println("测试下键");
}
if(e.getKeyCode()==KeyEvent.VK_LEFT && fx1>0 ) {
x-=10;
if(fx1>=fx2) {
fx1-=20;
fx4-=20;
}else {
fx2-=20;
fx3-=20;
}
System.out.println("测试左键");
}
if(e.getKeyCode()==KeyEvent.VK_RIGHT && fx1>0) {
x+=10;
if(fx1<=fx2) {
fx1+=20;
fx4+=20;
}else {
fx2-=20;
fx3-=20;
}
System.out.println("测试右键");
}*/
//重新绘制paint方法(重新调用paint方法)
repaint();
}

@Override
public void keyReleased(KeyEvent e) {
// TODO Auto-generated method stub

}

}

 

 

 

 

 

运行结果::

 

 

 

 

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值