狐狸行走小游戏
今天写了一个小游戏,狐狸行走
主要实现了以下几个功能
1.人自动行走
2.背景会随着人物的行走进行改变
3.键盘监听,按下方向键,人物方向也会随之改变
4.人物不能走出画面外
下面是代码(还可以继续完善):
1 package games; 2 3 import java.awt.*; 4 import java.awt.event.*; 5 import javax.swing.*; 6 7 /** 8 * @author: 赵哲 9 * com.qf.01 10 */ 11 @SuppressWarnings({"all"}) 12 public class Game { 13 14 15 //TODO:变量“声明”在此 16 17 int x = 400; 18 int y = 500; 19 int z = 0; 20 int fx = 0; 21 int dong = 0; 22 23 窗口 ck = null; 24 定时器 ds1 = null; 25 26 Game() { 27 //TODO:程序初始化在此 28 29 ck = new 窗口(); 30 //窗口 宽+2*立体边, 高+2*立体边+标题栏 31 ck.setSize(5 * 2 + 1000, 700 + 2 * 5 + 25); 32 //设定窗口可见性setVisible true/false 33 ck.setVisible(true); 34 //延时的毫秒 35 ds1 = new 定时器(50); 36 } 37 38 class 窗口 extends JFrame { 39 菜单 cd = null; 40 面板 mb = null; 41 窗口监听器 exit = null; 42 键盘监听器 jp = null; 43 44 窗口() { 45 jp = new 键盘监听器(); 46 this.addKeyListener(jp); 47 48 cd = new 菜单(); 49 this.setJMenuBar(cd); 50 51 mb = new 面板(); 52 this.add(mb); 53 54 exit = new 窗口监听器(); 55 this.addWindowListener(exit); 56 57 this.repaint(); 58 } 59 60 class 菜单 extends JMenuBar { 61 JMenu dan; //菜单 62 JMenuItem xiang1; //菜单项 63 64 菜单监听器 cdjtq; 65 66 菜单() { 67 dan = new JMenu("游戏"); //菜单 68 xiang1 = new JMenuItem("开局"); //菜单项 69 70 this.add(dan); 71 dan.add(xiang1); 72 73 cdjtq = new 菜单监听器(); 74 xiang1.addActionListener(cdjtq); 75 } 76 77 class 菜单监听器 implements ActionListener { 78 public void actionPerformed(ActionEvent e) { 79 //TODO:菜单事件处理 80 if (e.getSource() == xiang1) { 81 82 } 83 } 84 } 85 } 86 87 class 窗口监听器 extends WindowAdapter { 88 public void windowClosing(WindowEvent e) { 89 ds1.xc.stop(); 90 System.exit(0); 91 } 92 } 93 94 class 键盘监听器 implements KeyListener { 95 //TODO:键盘处理,可加入KeyEvent.VK_XXX 96 public void keyPressed(KeyEvent e) { 97 switch (e.getKeyCode()) { 98 case KeyEvent.VK_LEFT://左 99 x -= 10; 100 fx = 2; 101 //z 增加 背景图片向右走 102 //z 减少 背景图片向左走 103 if (x < 0) { 104 z += 20; 105 106 x = 0; 107 if (z > 0) { 108 z = 0; 109 } 110 } 111 112 break; 113 case KeyEvent.VK_RIGHT://右 114 x += 10; 115 fx = 0; 116 if(x>900) 117 { 118 z -=20; 119 x=900; 120 if(z<-2000) 121 { 122 z=-2000; 123 } 124 } 125 break; 126 case KeyEvent.VK_UP://上 127 y -= 10; 128 fx = 1; 129 if(y<0) 130 { 131 y=0; 132 } 133 break; 134 case KeyEvent.VK_DOWN://下 135 y += 10; 136 fx = 3; 137 if(y>550) 138 { 139 y=550; 140 } 141 break; 142 } 143 if (dong >= 3) { 144 dong = 0; 145 } else { 146 dong++; 147 } 148 repaint(); 149 } 150 151 public void keyReleased(KeyEvent e) { 152 } 153 154 public void keyTyped(KeyEvent e) { 155 } 156 } 157 158 class 面板 extends JPanel { 159 鼠标监听器 sb = null; 160 161 面板() { 162 sb = new 鼠标监听器(); 163 this.addMouseListener(sb); 164 this.addMouseMotionListener(sb); 165 } 166 167 class 鼠标监听器 extends MouseAdapter implements MouseMotionListener { 168 public void mousePressed(MouseEvent e) { 169 } 170 171 public void mouseDragged(MouseEvent e) { 172 } 173 174 public void mouseMoved(MouseEvent e) { 175 } 176 177 public void mouseReleased(MouseEvent e) { 178 } 179 180 public void mouseClicked(MouseEvent e)//鼠标单击 181 { 182 //mx my鼠标的位置 183 int mx = e.getX(); 184 int my = e.getY(); 185 //鼠标左键 BUTTON1、右键BUTTON3 186 if (e.getButton() == MouseEvent.BUTTON1) { 187 //TODO:鼠标左键单击 188 189 } 190 191 repaint(); 192 } 193 } 194 195 public void paint(Graphics g) { 196 //g.setColor(Color.BLUE); //设定颜色:RED GREEN BLUE ORANGE WHITE GRAY BLACK PINK 197 //g.drawRect(左,上,宽,高); //矩形 198 //g.fillRect(左,上,宽,高); //实心矩形 199 //g.drawOval(左,上,宽,高); //椭圆 200 //g.fillOval(左,上,宽,高); //实心椭圆 201 202 //Image tu=(new ImageIcon( 路径 )).getImage(); //路径:图片-右键-属性-路径src/ 203 //g.drawImage(tu,x,y,null); 204 205 //TODO:绘图在此 206 Image image = (new ImageIcon("fox/5.png")).getImage(); 207 g.drawImage(image, z, 0, null); 208 209 Image image2 = Toolkit.getDefaultToolkit().getImage("fox//" + fx + "-" + dong + ".png"); 210 g.drawImage(image2, x, y, null); 211 212 } 213 } 214 } 215 216 class 定时器 implements Runnable//实现Runnable接口 217 { 218 Thread xc = null; 219 long jianGe; 220 221 定时器(long jianGe) { 222 this.jianGe = jianGe; 223 xc = new Thread(this); 224 xc.start(); 225 } 226 227 public void run() { 228 while (true) { 229 try { 230 xc.sleep(jianGe); 231 232 if (this == ds1) { 233 //TODO:定时处理 234 235 switch (fx) { 236 case 2://左 237 x -= 20; 238 if (x < 0) { 239 z += 20; 240 x = 0; 241 if (z > 0) { 242 z = 0; 243 } 244 } 245 fx = 2; 246 break; 247 case 0://右 248 x += 20; 249 if (x > 900) { 250 z -= 20; 251 x = 900; 252 if (z < -2000) { 253 z = -2000; 254 } 255 } 256 fx = 0; 257 break; 258 case 1://上 259 y -= 20; 260 if (y < 0) { 261 y = 0; 262 } 263 fx = 1; 264 break; 265 case 3://下 266 y += 20; 267 if (y > 550) { 268 y = 550; 269 } 270 fx = 3; 271 break; 272 } 273 if (dong >= 3) { 274 dong = 0; 275 } else { 276 dong++; 277 ck.repaint(); 278 } 279 ck.repaint(); 280 281 } 282 } catch (InterruptedException e) { 283 e.printStackTrace(); 284 } 285 } 286 } 287 } 288 289 //main主方法 ,主类的“入口方法” 290 public static void main(String[] args) { 291 new Game(); 292 } 293 }
利用了Java提供的JFrame类来实现
主要是坐标的改变来实现人物与背景的改变
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· AI 智能体引爆开源社区「GitHub 热点速览」
· 三行代码完成国际化适配,妙~啊~
· .NET Core 中如何实现缓存的预热?