坦克大战程序代码
坦克大战源代码

import java.awt.Color;import java.awt.Frame;import java.awt.Graphics;import java.awt.Image;import java.awt.event.KeyAdapter;import java.awt.event.KeyEvent;import java.awt.event.WindowAdapter;import java.awt.event.WindowEvent;import java.util.ArrayList;import java.util.List;public class TankClient extends Frame {public static final int GAME_WIDTH = 800;public static final int GAME_HEIGHT = 600;Tank myTank = new Tank(50, 50, true, Tank.Direction.STOP, this);List<Missile> missiles = new ArrayList<Missile>();List<Explode> explodes = new ArrayList<Explode>();List<Tank> tanks = new ArrayList<Tank>();Image offScreenImage = null;@Overridepublic void paint(Graphics g) {g.drawString("missiles count:" + missiles.size(), 10, 50);g.drawString("explodes count:" + explodes.size(), 10, 70);g.drawString("tanks count:" + tanks.size(), 10, 90);for(int i=0; i<missiles.size(); i++) {Missile m = missiles.get(i);m.hitTanks(tanks);m.draw(g);}for(int i=0; i<explodes.size(); i++) {Explode e = explodes.get(i);e.draw(g);}for(int i=0; i<tanks.size(); i++) {Tank t = tanks.get(i);t.draw(g);}myTank.draw(g);}@Overridepublic void update(Graphics g) {if(offScreenImage == null) {offScreenImage = this.createImage(800, 600);}Graphics gOffScreen = offScreenImage.getGraphics();Color c = gOffScreen.getColor();gOffScreen.setColor(Color.GREEN);gOffScreen.fillRect(0, 0, GAME_WIDTH, GAME_HEIGHT);gOffScreen.setColor(c);paint(gOffScreen);g.drawImage(offScreenImage, 0, 0, null);}public void launchFrame() {//生产多少地方坦克for(int i=0; i<5; i++) {tanks.add(new Tank(50 + 40*(i+1), 50, false, Tank.Direction.D, this));}this.setLocation(400, 300);this.setSize(GAME_WIDTH, GAME_HEIGHT);this.setTitle("TankWar");this.addWindowListener(new WindowAdapter() {@Overridepublic void windowClosing(WindowEvent e) {System.exit(0);}});this.setResizable(false);this.setBackground(Color.GREEN);this.addKeyListener(new KeyMonitor());this.setVisible(true);new Thread(new PaintThread()).start();}public static void main(String[] args) {TankClient tc = new TankClient();unchFrame();}class PaintThread implements Runnable {public void run() {while(true) {repaint();try {Thread.sleep(50);} catch (InterruptedException e) {e.printStackTrace();}}}}class KeyMonitor extends KeyAdapter {@Overridepublic void keyReleased(KeyEvent e) {myTank.keyReleased(e);}@Overridepublic void keyPressed(KeyEvent e) {myTank.keyPressed(e);}}}import java.awt.Color;import java.awt.Graphics;import java.awt.Rectangle;import java.awt.event.KeyEvent;import java.util.Random;public class Tank {public static final int XSPEED = 5;public static final int YSPEED = 5;public static final int WIDTH = 30;public static final int HEIGHT = 30;boolean good;int x, y;private static Random r = new Random();private boolean live = true;private int step = r.nextInt(12) + 3;TankClient tc;boolean bL, bU, bR, bD;enum Direction {L, LU, U, RU, R, RD, D, LD, STOP};Direction dir = Direction.STOP;Direction ptDir = Direction.D;public Tank(int x, int y, boolean good) {this.x = x;this.y = y;this.good = good;}public Tank(int x, int y, boolean good, Direction dir, TankClient tc) { this(x, y, good);this.dir = dir;this.tc = tc;}public void draw(Graphics g) {if(!live) {if(!good) {tc.tanks.remove(this);}return;}Color c = g.getColor();if(good) g.setColor(Color.RED);else g.setColor(Color.BLUE);g.fillOval(x, y, WIDTH, HEIGHT);g.setColor(c);switch(ptDir) {case L:g.drawLine(x + WIDTH/2, y + HEIGHT/2, x, y + HEIGHT/2);break;case LU:g.drawLine(x + WIDTH/2, y + HEIGHT/2, x, y);break;case U:g.drawLine(x + WIDTH/2, y + HEIGHT/2, x + WIDTH/2, y);break;case RU:g.drawLine(x + WIDTH/2, y + HEIGHT/2, x + WIDTH, y);break;case R:g.drawLine(x + WIDTH/2, y + HEIGHT/2, x + WIDTH, y + HEIGHT/2);break;case RD:g.drawLine(x + WIDTH/2, y + HEIGHT/2, x + WIDTH, y + HEIGHT);break;case D:g.drawLine(x + WIDTH/2, y + HEIGHT/2, x + WIDTH/2, y + HEIGHT);break;case LD:g.drawLine(x + WIDTH/2, y + HEIGHT/2, x, y + HEIGHT);break;}move();}private void move() {switch(dir) {case L:x -= XSPEED;break;case LU:x -= XSPEED;y -= YSPEED;break;case U:y -= YSPEED;break;case RU:x += XSPEED;y -= YSPEED;break;case R:x += XSPEED;break;case RD:x += XSPEED;y += YSPEED;break;case D:y += YSPEED;break;case LD:x -= XSPEED;y += YSPEED;break;case STOP:break;}if(dir != Direction.STOP) {ptDir = dir;}if(x < 0) x = 0;if(y < 30) y = 30;if(x + WIDTH > TankClient.GAME_WIDTH) x = TankClient.GAME_WIDTH - WIDTH;if(y+ HEIGHT> TankClient.GAME_HEIGHT) y= TankClient.GAME_HEIGHT- HEIGHT;if(!good) {if(step == 0) {step = r.nextInt(12) + 3;Direction[] dirs = Direction.values();dir = dirs[r.nextInt(dirs.length)];}step --;if(r.nextInt(40) > 38) this.fire();}}public void keyPressed(KeyEvent e) {int key = e.getKeyCode();switch (key) {case KeyEvent.VK_LEFT:bL = true;break;case KeyEvent.VK_UP:bU = true;break;case KeyEvent.VK_RIGHT:bR = true;break;case KeyEvent.VK_DOWN:bD = true;break;}locateDirection();}private void locateDirection() {if(bL && !bU && !bR && !bD) dir = Direction.L;else if(bL && bU && !bR && !bD) dir = Direction.LU;else if(!bL && bU && !bR && !bD) dir = Direction.U;else if(!bL && bU && bR && !bD) dir = Direction.RU;else if(!bL && !bU && bR && !bD) dir = Direction.R;else if(!bL && !bU && bR && bD) dir = Direction.RD;else if(!bL && !bU && !bR && bD) dir = Direction.D;else if(bL && !bU && !bR && bD) dir = Direction.LD;else if(!bL && !bU && !bR && !bD) dir = Direction.STOP;}public void keyReleased(KeyEvent e) {int key = e.getKeyCode();switch (key) {case KeyEvent.VK_CONTROL:fire();break;case KeyEvent.VK_LEFT:bL = false;break;case KeyEvent.VK_UP:bU = false;break;case KeyEvent.VK_RIGHT:bR = false;break;case KeyEvent.VK_DOWN:bD = false;break;}locateDirection();}private Missile fire() {int x = this.x + WIDTH/2 - Missile.WIDTH/2;int y = this.y + HEIGHT/2 - Missile.HEIGHT/2;Missile m = new Missile(x, y, this.good, this.ptDir, this.tc);tc.missiles.add(m);return m;}public Rectangle getRect() {return new Rectangle(x, y, WIDTH, HEIGHT);}public boolean isLive() {return live;}public void setLive(boolean live) {this.live = live;}}import java.awt.Color;import java.awt.Graphics;import java.awt.Rectangle;import java.util.List;public class Missile {public static final int XSPEED = 10;public static final int YSPEED = 10;public static final int WIDTH = 10;public static final int HEIGHT = 10;TankClient tc;int x, y;Tank.Direction dir = Tank.Direction.R;boolean live = true;private boolean good;public Missile(int x, int y, boolean good, Tank.Direction dir) { this.x = x;this.y = y;this.good = good;this.dir = dir;}public Missile(int x, int y, boolean good, Tank.Direction dir, TankClient tc) {this(x, y, good, dir);this.tc = tc;}public void draw(Graphics g) {if(!live) {tc.missiles.remove(this);return;}Color c = g.getColor();g.setColor(Color.BLACK);g.fillOval(x, y, WIDTH, HEIGHT);g.setColor(c);move();}private void move() {switch(dir) {case L:x -= XSPEED;break;case LU:x -= XSPEED;y -= YSPEED;break;case U:y -= YSPEED;break;case RU:x += XSPEED;y -= YSPEED;break;case R:x += XSPEED;break;case RD:x += XSPEED;y += YSPEED;break;case D:y += YSPEED;break;case LD:x -= XSPEED;y += YSPEED;break;case STOP:break;}if(x< 0 || y< 0 || x> TankClient.GAME_WIDTH|| y> TankClient.GAME_HEIGHT) {live = false;}}public Rectangle getRect() {return new Rectangle(x, y, WIDTH, HEIGHT);}public boolean hitTank(Tank t) {if(this.live && t.isLive() && this.good != t.good&&this.getRect().intersects(t.getRect())) {this.live = false;t.setLive(false);tc.explodes.add(new Explode(x, y, tc));return true;}return false;}public boolean hitTanks(List<Tank> tanks) { for(int i=0; i<tanks.size(); i++) {if(this.hitTank(tanks.get(i))) {return true;}}return false;}}import java.awt.Color;import java.awt.Graphics;public class Explode {int x, y;private int[] diameters = {4, 7, 12, 18, 26, 32, 49, 30, 14, 6};private boolean live = true;private TankClient tc;int step = 0;public Explode(int x, int y, TankClient tc) {this.x = x;this.y = y;this.tc = tc;}public void draw(Graphics g) {if(!live) {tc.explodes.remove(this);return;}Color c = g.getColor();g.setColor(Color.ORANGE);g.fillOval(x, y, diameters[step], diameters[step]);g.setColor(c);step ++;if(step == diameters.length) {live = false;}}}。
C语言完整游戏项目坦克大战详细代码

C语⾔完整游戏项⽬坦克⼤战详细代码话不多说我们今天就来创造出属于我们⾃⼰的《坦克⼤战》,GOGOGO直接开始吧这次的源码⽐较详细,我分了好⼏个cpp⽂件,思路更加的清晰,请耐⼼⽤⼼的观看⾸先就是我们载⼊图⽚的函数tupian.cpp# include "tanke.h"障碍物void LaoWang(int * tilex, int * tiley){IMAGE img;loadimage(&img, _T("res\\tile.bmp"));putimage(*tilex, *tiley, 32 , 32 , &img, 32 * 5, 0 );}void tileHong(int * tilex, int * tiley){IMAGE img;loadimage(&img, _T("res\\tile.bmp"));putimage(*tilex, *tiley, 32, 32, &img, 32 * 0, 0 );return;}void tileLv(int * tilex, int * tiley){IMAGE img;loadimage(&img, _T("res\\tile.bmp"));putimage(*tilex, *tiley, 32, 32, &img, 32 * 2, 0 );return;}void tileBai(int * tilex, int * tiley){IMAGE img;loadimage(&img, _T("res\\tile.bmp"));putimage(*tilex, *tiley, 32, 32, &img, 32 * 1, 0 );return;}IMAGE img;loadimage(&img, _T("res\\tile.bmp"));putimage(*tilex, *tiley, 32, 32, &img, 32 * 3, 0 ); }//物品void FaZhang(int *wupinx, int *wupiny){IMAGE img;loadimage(&img, _T("res\\fazhang.jpg"));putimage(*wupinx, *wupiny, 24, 24, &img, 0, 0 ); }void ShouQiang(int *wupinx, int *wupiny){IMAGE img;loadimage(&img, _T("res\\shouqiang.jpg"));putimage(*wupinx, *wupiny, 24, 24, &img, 0, 0 ); }void ShangDian(int *wupinx, int *wupiny){IMAGE img;loadimage(&img,_T("res\\shangdian.jpg"));putimage(*wupinx, *wupiny, 32, 32, &img, 0, 0 ); }void YaoShui(int *wupinx, int *wupiny){IMAGE img;loadimage(&img, _T("res\\yaoshui.jpg"));putimage(*wupinx, *wupiny, 28, 28, &img, 0, 0 ); }void DunPai(int *wupinx, int *wupiny){IMAGE img;loadimage(&img, _T("res\\dunpai.jpg"));putimage(*wupinx, *wupiny, 28, 28, &img, 0, 0 ); }void XieZi(int *wupinx, int *wupiny){IMAGE img;loadimage(&img, _T("res\ iezi.jpg"));putimage(*wupinx, *wupiny, 28, 28, &img, 0, 0 ); }void Boss(int *wupinx, int *wupiny){IMAGE img;loadimage(&img, _T("res\\boss.jpg"));putimage(*wupinx, *wupiny, 32, 32, &img, 0, 0 ); }void BigBoss(int *wupinx, int *wupiny){IMAGE img;loadimage(&img, _T("res\\bigboss.jpg"));putimage(*wupinx, *wupiny, 32, 32, &img, 0, 0 ); }接下来是初始化的函数waiyuan.cpp# include "tanke.h"{setcolor(GREEN);settextstyle(0, 0, ("宋体"));char c2[20] = "⾃⼰⽣命值:";outtextxy(0, 20, c2);char c3[10] ;sprintf(c3, _T("%.1f"), 100* (60 - *j) / 60.0);outtextxy(90, 20, c3);}void DShengMing(int * d,int *k){setcolor(GREEN);settextstyle(0, 0, ("宋体"));char c2[20] = "敌⼈⽣命值:";outtextxy(0, 0, c2);char c3[10] ;sprintf(c3, _T("%.1f"), 100* (60 - *d) / 60.0);outtextxy(90, 0, c3);char c4[40] = "恭喜~! 现在起⾦币到2200有惊喜!";//胜利 if ( *k >= 8000 ){setcolor(YELLOW);settextstyle(30, 0, ("宋体"));outtextxy(150, 0, c4);}}void Gold(int * gold){setcolor(GREEN);settextstyle(0, 0, ("宋体"));char c2[20] = "⾦币:";outtextxy(0, 40, c2);char c3[10] ;sprintf(c3, _T("%d"), *gold);outtextxy(40, 40, c3);}void start(void){initgraph(200, 130);TCHAR s1[10]="坦克⼤战";TCHAR s2[30]="按A 开始游戏按B 退出游戏";TCHAR s3[30]="按W S A D控制⽅向";TCHAR s4[20]="按J 发射⼦弹";TCHAR s5[20]="按C 看攻略";outtextxy(70, 0, s1);outtextxy(0, 110, s2);outtextxy(60, 90, s5);outtextxy(55, 30, s4);outtextxy(35, 60, s3);while (true){Sleep(500);if (GetAsyncKeyState('A')){BeginBatchDraw();closegraph();initgraph(640, 480);Sleep(200);Quit();return ;}if (GetAsyncKeyState('C'))GongLue();}}}void GongLue(void){initgraph(450, 300);TCHAR s1[20]="游戏攻略:";TCHAR s2[50]="再打坦克之前先吃法杖打掉⽩⾊砖块,";TCHAR s3[50]="这样敌坦克打⽩⾊就不能回⾎了,boss更应如此。
c语言坦克大战最新代码

judge_tank_my(map,key);/*判断己方坦克运动函数*/
} aaa: ; } void map_all(int map[15][15])/*初始化地图函数*/ { int i,j; for(i=0;i<15;i++)
for(j=0;j<15;j++) switch(map[j][i]) { case 0: break; case 5:map_wall(i,j);break;/*地形*/ case 6:map_steel(i,j);break; case 7:map_water(i,j);break; case 8:map_border(i,j);break; case 9:map_base(i,j);break; }
void uptank(int i,int j,int color);/*画坦克函数*/ void downtank(int i,int j,int color); void lefttank(int i,int j,int color); void righttank(int i,int j,int color);
/* Note:Your choice is C IDE */ #include "graphics.h" #include "stdlib.h" #include "stdio.h"
#define a_UP 0x4800/*定义A坦克按键*/ #define a_DOWN 0x5000 #define a_LEFT 0x4b00 #define a_RIGHT 0x4d00 #define a_shoot 0x1c0d
void judge_moveshootway(int map[15][15],int i);/*炮弹运动时判断炮弹方 向函数*/ void judge_shoot(int m,int map[15][15],int i);/*判断炮弹打中的物体函数 */ void judge_shootway(int map[15][15],int i);/*炮弹打中物体时判断方向函 数*/
c语言坦克大战源代码

c语言坦克大战源代码/*游戏的整体思路大概是这样的?首先是欢迎界面,然后进入游戏界面,最后是gameover的界面。
本来打算做单人游戏,后来发现让敌人自主移动比较困难,所以改成了双人游戏?layer1控制按键是up,down,left,right,enter,player2控制按键是a,s,d,w,space。
*/#include<stdio.h>#include<string.h>#include<stdlib.h>#include<graphics.h>/*定义鼠标键值常量*/#define ESC 0x011b/*玩家1坦克按键*/#define UP 0x4800#define DOWN 0x5000#define LEFT 0x4b00#define RIGHT 0x4d00#define ENTER 0x1c0d#define up 0x1177/*玩家2坦克按键*/#define down 0x1f73#define left 0x1e61#define right 0x2064#define fire 0x246a/*定义游戏常量*//*双人游戏*/#define NUM 2/*坦克宽度*/#define WIDTH 20/*坦克的数量,宽度*//*定义global变量*******************************************//*子弹的属性*/struct myboom{/*如果子弹life为0则代表子弹没有发射*/int life;int x,y;int direction;};/*子弹们的初始属性*/struct myboom iboom[NUM]={{0},{0}};/*坦克的属性*/struct mytank{int life;int x,y;int direction;};/*坦克们的初始属性*/struct mytank itank[NUM]={{3,10*WIDTH,22*WIDTH},{1,440,40}};pre[NUM][2]={{10*WIDTH,22*WIDTH},{440,40}};/*xy[0]代表自己的坦克; xy[1]及以后代表敌军; 坦克坐标*//*存被子弹覆盖的图像*/void *boom_save[NUM];/*malloc开辟图像空间的大小*/int size;/*动画显示*/void *save[NUM];/*后来加上的。
坦克大战代码

private static final long serialVersionUID = 1L;
groundData o = new groundData();//地图数据,会在本线程中实时更新
int perStep = 1, sleepTime = 7;//线程的睡眠时间以及每次睡眠后坦克移动的像素
MyBullet3 enemyBullet[] = {sBullet,sBullet,sBullet,sBullet,sBullet,sBullet,sBullet,sBullet,sBullet,sBullet,sBullet,sBullet,sBullet,sBullet,sBullet,
sBullet,sBullet,sBullet,sBullet,sBullet,sBullet,sBullet,sBullet,sBullet,sBullet,sBullet,sBullet,sBullet,sBullet,sBullet,
int enemyNum = 0 , enemyMax = 6;//现有敌人数量,画面允许敌人的最大数量
boolean stuck = false ;//坦克是否无法前行
MyBullet3 bullet = new MyBullet3();//我方坦克炮弹
//敌方坦克炮弹
MyBullet3 sBullet = new MyBullet3();
g.fillOval(x + 35 , y + 15 , 10 , 10) ;
g.fillOval(x + 35 , y + 25 , 10 , 10) ;
g.fillOval(x + 35 , y + 35 , 10 , 10) ;
坦克大战程序代码(精心汇编)

class f extends JFrame {f(String title) {(title) ;(608 , 630) ;(300 , 100) ;;MyTank mp = new MyTank() ; (mp) ;(mp) ;new Thread(mp).start() ;}public static void main(String[] args) { f h = new f("坦克大战(版本") ; (true) ;}}//主战坦克class MyTank extends JPanel implements KeyListener , Runnable { int x = 280, y = 280 ;//坦克的初始位置int op = 1 ;//坦克的移动方向int color = 0 ;int tankspeed = 8 ;//坦克的速度int tankbullet = 8 ;//坦克的子弹速度int tankfbullet = 4 ;//敌军的子弹速度int shengming = 100 ;//生命int fenshu = 0 ;int nandu = 5 ; //设置游戏难度//子弹int dx = 295 , dy = 295 ;int dx1 = 295 , dy1 = -10 ;int dx2 = 600 , dy2 = 295 ;int dx3 = 295 , dy3 = 600 ;int dx4 = -10 , dy4 = 295 ;//敌军坦克int num = 10 ;//敌军坦克数量,不能修改int[] xf = new int[num] ;int[] yf = new int[num] ;int[] opf = new int[num] ;int[] dxf = new int[num] ;int[] dyf = new int[num] ;int[] dxf1 = new int[num] ;int[] dyf1 = new int[num] ;int[] dxf2 = new int[num] ;int[] dyf2 = new int[num] ;int[] dxf3 = new int[num] ;int[] dyf3 = new int[num] ;int[] dxf4 = new int[num] ;int[] dyf4 = new int[num] ;//构造函数,初始化敌军坦克的位置和状态MyTank() {for (int i = 0; i<num; i++) {xf[i] = (int) () * 560) ;yf[i] = (int) () * 560) ;dxf[i] = xf[i] + 15 ;dyf[i] = yf[i] + 15 ;}for (int i = 0; i<num; i++) {dxf1[i] = 295 ; dyf1[i] = -10 ;dxf2[i] = 600 ; dyf2[i] = 295 ;dxf3[i] = 295 ; dyf3[i] = 600 ;dxf4[i] = -10 ; dyf4[i] = 295 ;}}//主面版public void paint(Graphics g) { (g) ;;;("生命:" , 10 , 20 ) ;(50 , 10 , shengming * 5 , 10) ;(50 , 10 , 500 , 10) ;("得分: "+ fenshu , 10 , 40) ; if(op == 1) {;(x , y , 40 , 40) ;switch (color % 6) {case 0: ; break;case 1: ; break;case 2: ; break;case 3: ; break;case 5: ; break;}(x - 5 , y - 5 , 10 , 10) ; (x - 5 , y + 5 , 10 , 10) ; (x - 5 , y + 15 , 10 , 10) ; (x - 5 , y + 25 , 10 , 10) ; (x - 5 , y + 35 , 10 , 10) ; (x + 35 , y - 5 , 10 , 10) ; (x + 35 , y + 5 , 10 , 10) ; (x + 35 , y + 15 , 10 , 10) ; (x + 35 , y + 25 , 10 , 10) ; (x + 35 , y + 35 , 10 , 10) ; ;(x + 15 , y - 20 , 10 , 40) ; switch (color % 20) {case 1: ; break; case 2: ; break; case 3: ; break; case 4: ; break; case 5: ; break; case 6: ; break; case 7: ; break; case 8: ; break; case 9: ; break; case 10: ; break; case 11: ; break; case 12: ; break; case 13: ; break; case 14: ; break; case 15: ; break;case 17: ; break;case 18: ; break;case 19: ; break; }(x + 5 , y + 30 , 10 , 10) ; (x + 25 , y + 30 , 10 , 10) ; }if(op == 2) {;(x , y , 40 , 40) ;switch (color % 6) {case 0: ; break;case 1: ; break;case 2: ; break;case 3: ; break;case 5: ; break;}(x - 5 , y - 5 , 10 , 10) ; (x + 5 , y - 5 , 10 , 10) ; (x + 15 , y - 5 , 10 , 10) ; (x + 25 , y - 5 , 10 , 10) ; (x + 35 , y - 5 , 10 , 10) ; (x - 5 , y+35 , 10 , 10) ; (x + 5 , y+35 , 10 , 10) ; (x + 15 , y+35 , 10 , 10) ; (x + 25 , y+35 , 10 , 10) ; (x + 35 , y+35 , 10 , 10) ; ;(x + 20 , y + 15 , 40 , 10) ; switch (color % 20) {case 1: ; break; case 2: ; break; case 3: ; break; case 4: ; break; case 5: ; break; case 6: ; break; case 7: ; break; case 8: ; break; case 9: ; break; case 10: ; break; case 11: ; break; case 12: ; break; case 13: ; break; case 14: ; break; case 15: ; break;case 17: ; break;case 18: ; break;case 19: ; break; }(x , y + 5 , 10 , 10) ;(x , y + 25 , 10 , 10) ;}if(op == 3) {;(x , y , 40 , 40) ;switch (color % 6) {case 0: ; break;case 1: ; break;case 2: ; break;case 3: ; break;case 5: ; break;}(x - 5 , y - 5 , 10 , 10) ; (x - 5 , y + 5 , 10 , 10) ; (x - 5 , y + 15 , 10 , 10) ; (x - 5 , y + 25 , 10 , 10) ; (x - 5 , y + 35 , 10 , 10) ; (x + 35 , y - 5 , 10 , 10) ; (x + 35 , y + 5 , 10 , 10) ; (x + 35 , y + 15 , 10 , 10) ; (x + 35 , y + 25 , 10 , 10) ; (x + 35 , y + 35 , 10 , 10) ; ;(x + 15 , y + 20 , 10 , 40) ; switch (color % 20) {case 1: ; break; case 2: ; break; case 3: ; break; case 4: ; break; case 5: ; break; case 6: ; break; case 7: ; break; case 8: ; break; case 9: ; break; case 10: ; break; case 11: ; break; case 12: ; break; case 13: ; break; case 14: ; break; case 15: ; break;case 17: ; break;case 18: ; break;case 19: ; break; }(x + 5 , y , 10 , 10) ;(x + 25 , y , 10 , 10) ;}if(op == 4) {;(x , y , 40 , 40) ;switch (color % 6) {case 0: ; break;case 1: ; break;case 2: ; break;case 3: ; break;case 5: ; break;}(x - 5 , y - 5 , 10 , 10) ; (x + 5 , y - 5 , 10 , 10) ; (x + 15 , y - 5 , 10 , 10) ; (x + 25 , y - 5 , 10 , 10) ; (x + 35 , y - 5 , 10 , 10) ; (x - 5 , y+35 , 10 , 10) ; (x + 5 , y+35 , 10 , 10) ; (x + 15 , y+35 , 10 , 10) ; (x + 25 , y+35 , 10 , 10) ; (x + 35 , y+35 , 10 , 10) ; ;(x - 20 , y + 15 , 40 , 10) ; switch (color % 20) {case 1: ; break; case 2: ; break; case 3: ; break; case 4: ; break; case 5: ; break; case 6: ; break; case 7: ; break; case 8: ; break; case 9: ; break; case 10: ; break; case 11: ; break; case 12: ; break; case 13: ; break; case 14: ; break; case 15: ; break;case 17: ; break;case 18: ; break;case 19: ; break; }(x + 30 , y + 5 , 10 , 10) ; (x + 30 , y + 25 , 10 , 10) ; };(dx , dy , 10 , 10) ;(dx1 , dy1 , 10 , 10) ; (dx2 , dy2 , 10 , 10) ; (dx3 , dy3 , 10 , 10) ; (dx4 , dy4 , 10 , 10) ;for (int i = 0; i<num; i++) { if(opf[i] == 1) {(xf[i] - 5 , yf[i] - 5 , 10 , 10) ; (xf[i] - 5 , yf[i] + 5 , 10 , 10) ; (xf[i] - 5 , yf[i] + 15 , 10 , 10) ; (xf[i] - 5 , yf[i] + 25 , 10 , 10) ; (xf[i] - 5 , yf[i] + 35 , 10 , 10) ; (xf[i] + 35 , yf[i] - 5 , 10 , 10) ; (xf[i] + 35 , yf[i] + 5 , 10 , 10) ; (xf[i] + 35 , yf[i] + 15 , 10 , 10) ; (xf[i] + 35 , yf[i] + 25 , 10 , 10) ; (xf[i] + 35 , yf[i] + 35 , 10 , 10) ; (xf[i] + 15 , yf[i] - 20 , 10 , 40) ; (xf[i] + 5 , yf[i] + 30 , 10 , 10) ; (xf[i] + 25 , yf[i] + 30 , 10 , 10) ; }if(opf[i] == 2) {(xf[i] - 5 , yf[i] - 5 , 10 , 10) ; (xf[i] + 5 , yf[i] - 5 , 10 , 10) ; (xf[i] + 15 , yf[i] - 5 , 10 , 10) ; (xf[i] + 25 , yf[i] - 5 , 10 , 10) ; (xf[i] + 35 , yf[i] - 5 , 10 , 10) ; (xf[i] - 5 , yf[i] + 35 , 10 , 10) ; (xf[i] + 5 , yf[i] + 35 , 10 , 10) ; (xf[i] + 15 , yf[i] + 35 , 10 , 10) ; (xf[i] + 25 , yf[i] + 35 , 10 , 10) ; (xf[i] + 35 , yf[i] + 35 , 10 , 10) ; (xf[i] + 20 , yf[i] + 15 , 40 , 10) ; (xf[i] , yf[i] + 5 , 10 , 10) ;(xf[i] , yf[i] + 25 , 10 , 10) ;}if(opf[i] == 3) {(xf[i] - 5 , yf[i] - 5 , 10 , 10) ; (xf[i] - 5 , yf[i] + 5 , 10 , 10) ; (xf[i] - 5 , yf[i] + 15 , 10 , 10) ; (xf[i] - 5 , yf[i] + 25 , 10 , 10) ; (xf[i] - 5 , yf[i] + 35 , 10 , 10) ; (xf[i] + 35 , yf[i] - 5 , 10 , 10) ; (xf[i] + 35 , yf[i] + 5 , 10 , 10) ; (xf[i] + 35 , yf[i] + 15 , 10 , 10) ; (xf[i] + 35 , yf[i] + 25 , 10 , 10) ; (xf[i] + 35 , yf[i] + 35 , 10 , 10) ; (xf[i] + 15 , yf[i] + 20 , 10 , 40) ; (xf[i] + 5 , yf[i] , 10 , 10) ;(xf[i] + 25 , yf[i] , 10 , 10) ;}if(opf[i] == 4) {(xf[i] , yf[i] , 40 , 40) ;(xf[i] - 5 , yf[i] - 5 , 10 , 10) ; (xf[i] + 5 , yf[i] - 5 , 10 , 10) ; (xf[i] + 15 , yf[i] - 5 , 10 , 10) ; (xf[i] + 25 , yf[i] - 5 , 10 , 10) ; (xf[i] + 35 , yf[i] - 5 , 10 , 10) ; (xf[i] - 5 , yf[i] + 35 , 10 , 10) ; (xf[i] + 5 , yf[i] + 35 , 10 , 10) ; (xf[i] + 15 , yf[i] + 35 , 10 , 10) ; (xf[i] + 25 , yf[i] + 35 , 10 , 10) ; (xf[i] + 35 , yf[i] + 35 , 10 , 10) ; (xf[i] - 20 , yf[i] + 15 , 40 , 10) ; (xf[i] + 30 , yf[i] + 5 , 10 , 10) ; (xf[i] + 30 , yf[i] + 25 , 10 , 10) ; }(dxf1[i] , dyf1[i] , 10 , 10 ) ;(dxf2[i] , dyf2[i] , 10 , 10 ) ;(dxf3[i] , dyf3[i] , 10 , 10 ) ;(dxf4[i] , dyf4[i] , 10 , 10 ) ;}}public void keyTyped(KeyEvent e) { }//键盘控制坦克的移动,发弹public void keyPressed(KeyEvent e) { color ++ ;if() == {op = 1 ;y = y - tankspeed ;dy = dy - tankspeed ;if(y <= 0) {y = y + tankspeed ;dy = dy + tankspeed ; }}if() == {op = 2 ;x = x + tankspeed ; dx = dx + tankspeed ; if(x >= 560) {x = x - tankspeed ; dx = dx - tankspeed ; }}if() == {op = 3 ;y = y + tankspeed ; dy = dy + tankspeed ;if(y >= 560) {y = y - tankspeed ; dy = dy - tankspeed ; }}if() == {op = 4 ;x = x - tankspeed ; dx = dx - tankspeed ; if(x <= 0) {x = x + tankspeed ; dx = dx + tankspeed ; }}if() == {if(op == 1) {dx1 = dx ; dy1 = dy ;}if(op == 2) {dx2 = dx ; dy2 = dy ;}if(op == 3) {dx3 = dx ; dy3 = dy ;}if(op == 4) {dx4 = dx ; dy4 = dy ;}}() ;}public void keyReleased(KeyEvent e) { }public void run() {for (int a = 0; a<60000; a++) {dy1 = dy1 - tankbullet ;dx2 = dx2 + tankbullet ;dy3 = dy3 + tankbullet ;dx4 = dx4 - tankbullet ;for (int i = 0; i<num; i++) {dyf1[i] = dyf1[i] - tankfbullet ;dxf2[i] = dxf2[i] + tankfbullet ;dyf3[i] = dyf3[i] + tankfbullet ;dxf4[i] = dxf4[i] - tankfbullet ;}//判断是否被击中for (int i = 0; i<num; i++) {if(dyf1[i]<y + 38 &&dyf1[i]>y +8 && dxf1[i]-x>-10 && dxf1[i]-x<40) { ("被1击中") ;dxf1[i] = dxf[i] ; dyf1[i] = dyf[i] ;shengming = shengming - nandu ;}if(dxf2[i]>x+2 &&dxf2[i]<x+32 &&dyf2[i] - y >-10 && dyf2[i] - y <40 ) { ("被2击中") ;dxf2[i] = dxf[i] ; dyf2[i] = dyf[i] ;shengming = shengming - nandu ;}if(dyf3[i]>y+2 && dyf3[i]< y+32 && dxf3[i]-x >-10&& dxf3[i]-x<40) { ("被3击中") ;dxf3[i] = dxf[i] ; dyf3[i] = dyf[i] ;shengming = shengming - nandu ;}if(dxf4[i]>x+8 &&dxf4[i]<x+38 &&dyf4[i] - y >-10 && dyf4[i] - y <40 ) { ("被4击中") ;dxf4[i] = dxf[i] ; dyf4[i] = dyf[i] ;shengming = shengming - nandu ;}}//判断是否击中敌军for (int i = 0; i<num; i++) {if(dy1<yf[i] + 38 &&dy1>yf[i] +8 && dx1-xf[i]>-10 && dx1-xf[i]<40) { ("1击中") ;fenshu = fenshu + 100 ;xf[i] = (int)() * 560 );yf[i] = (int)() * 560 );}if(dx2>xf[i]+2 &&dx2<xf[i]+32 &&dy2 - yf[i] >-10 && dy2 - yf[i] <40 ) { ("2击中") ;fenshu = fenshu + 100 ;xf[i] = (int)() * 560 );yf[i] = (int)() * 560 );}if(dy3>yf[i]+2 && dy3< yf[i]+32 && dx3-xf[i] >-10&& dx3-xf[i]<40) { ("3击中") ;fenshu = fenshu + 100 ;xf[i] = (int)() * 560 );yf[i] = (int)() * 560 );}if(dx4>xf[i]+8 &&dx4<xf[i]+38 &&dy4 - yf[i] >-10 && dy4 - yf[i] <40 ) { ("4击中") ;fenshu = fenshu + 100 ;xf[i] = (int)() * 560 );yf[i] = (int)() * 560 );}dxf[i] = xf[i] + 15 ;dyf[i] = yf[i] + 15 ;}//坦克的移动for (int i = 0; i<num; i++) { switch (opf[i]) {case 1:{yf[i]-- ;dyf[i] -- ;for (int s = 0; s<num; s++) { if(yf[i] <= 0) {yf[i] ++ ;dyf[i] ++ ;}}break;}case 2:{xf[i]++ ;dxf[i]++ ;for (int s = 0; s<num; s++) { if(xf[i] >= 560){xf[i] -- ;dxf[i] -- ;}}break;}case 3:{yf[i]++ ;dyf[i]++ ;for (int s = 0; s<num ; s++) { if(yf[i] >= 560){yf[i] -- ;dyf[i] -- ;}}break;}case 4:{xf[i]-- ;dxf[i]-- ;for (int s = 0; s<num; s++) { if(xf[i] <= 0){xf[i] ++ ;dxf[i] ++ ;}}break;}}}try{(20) ;}catch(Exception e) {() ;}//坦克的开火if(a % 50 == 5) {if()>{for (int i = 0; i<2; i++) {if(opf[i] == 1) {dxf1[i] = dxf[i] ; dyf1[i] = dyf[i] ; }if(opf[i] == 2) {dxf2[i] = dxf[i] ; dyf2[i] = dyf[i] ; }if(opf[i] == 3) {dxf3[i] = dxf[i] ; dyf3[i] = dyf[i] ; }if(opf[i] == 4) {dxf4[i] = dxf[i] ; dyf4[i] = dyf[i] ; }}}}if(a % 50 == 15) {if()> {for (int i = 2; i<4; i++) {if(opf[i] == 1) {dxf1[i] = dxf[i] ; dyf1[i] = dyf[i] ; }if(opf[i] == 2) {dxf2[i] = dxf[i] ; dyf2[i] = dyf[i] ; }if(opf[i] == 3) {dxf3[i] = dxf[i] ; dyf3[i] = dyf[i] ; }if(opf[i] == 4) {dxf4[i] = dxf[i] ; dyf4[i] = dyf[i] ; }}}}if(a % 50 == 25) {if()>{for (int i = 4; i<6; i++) {if(opf[i] == 1) {dxf1[i] = dxf[i] ; dyf1[i] = dyf[i] ;}if(opf[i] == 2) {dxf2[i] = dxf[i] ; dyf2[i] = dyf[i] ; }if(opf[i] == 3) {dxf3[i] = dxf[i] ; dyf3[i] = dyf[i] ; }if(opf[i] == 4) {dxf4[i] = dxf[i] ; dyf4[i] = dyf[i] ; }}}}if(a % 50 == 35) {if()>{for (int i = 6; i<8; i++) {if(opf[i] == 1) {dxf1[i] = dxf[i] ; dyf1[i] = dyf[i] ; }if(opf[i] == 2) {dxf2[i] = dxf[i] ; dyf2[i] = dyf[i] ; }if(opf[i] == 3) {dxf3[i] = dxf[i] ; dyf3[i] = dyf[i] ; }if(opf[i] == 4) {dxf4[i] = dxf[i] ; dyf4[i] = dyf[i] ; }}}}if(a % 50 == 45) {if()> {for (int i = 8; i<10; i++) {if(opf[i] == 1) {dxf1[i] = dxf[i] ; dyf1[i] = dyf[i] ; }if(opf[i] == 2) {dxf2[i] = dxf[i] ; dyf2[i] = dyf[i] ; }if(opf[i] == 3) {dxf3[i] = dxf[i] ; dyf3[i] = dyf[i] ; }if(opf[i] == 4) {dxf4[i] = dxf[i] ; dyf4[i] = dyf[i] ; }}}//坦克的随机移动if(a % 50 == 1 ) {for (int i = 0; i<2; i++) { if( () > ) {if() > {opf[i] = 1 ;}else{opf[i] = 2 ;}}else{if() > {opf[i] = 3 ;}else{opf[i] = 4 ;}}}if(a % 50 == 11 ) {//坦克的随机移动for (int i = 2; i<4; i++) { if( () > ) {if() > {opf[i] = 1 ;}else{opf[i] = 2 ;}}else{if() > {opf[i] = 3 ;}else{}}}}if(a % 50 == 21 ) {//坦克的随机移动for (int i = 4; i<6; i++) { if( () > ) {if() > {opf[i] = 1 ;}else{opf[i] = 2 ;}}else{if() > {}else{opf[i] = 4 ;}}}}if(a % 50 == 31 ) {//坦克的随机移动for (int i = 6; i<8; i++) { if( () > ) {if() > {opf[i] = 1 ;}else{opf[i] = 2 ;}}else{if() > {opf[i] = 3 ;}else{opf[i] = 4 ;}}}}if(a % 50 == 41 ) {//坦克的随机移动for (int i = 8; i<10; i++) { if( () > ) {if() > {opf[i] = 1 ;}else{opf[i] = 2 ;}}else{if() > {opf[i] = 3 ;}else{opf[i] = 4 ;}}}}//重画if(shengming<=0){//弹出player1胜利对话框(null,"你结束了","Game Over !", ; //结束游戏(0) ;}() ;}}}。
坦克大战游戏编程实现

坦克大战游戏编程实现游戏编程实现坦克大战坦克大战是一款经典的电子游戏,在游戏中,玩家将控制一个坦克,通过操作坦克的移动和攻击,与其他玩家或电脑进行战斗。
本文将介绍如何使用编程语言实现坦克大战游戏。
设计思路在实现坦克大战游戏之前,首先需要明确游戏的基本要素和规则。
玩家将操作一个坦克,通过键盘或操纵杆控制坦克的移动和攻击。
游戏画面由地图、坦克、子弹等元素构成。
坦克可以向前、向后、向左、向右移动,可以发射子弹进行攻击。
玩家需要躲避敌方坦克的攻击,同时尽可能击败敌方坦克。
编程实现坦克的移动和攻击可以通过编程语言来实现。
以下是使用Java语言来编写坦克大战游戏的示例代码:```javapublic class TankGame extends JFrame {private Tank tank; // 玩家坦克private List<Tank> enemyTanks; // 敌方坦克列表private List<Bullet> bullets; // 子弹列表public TankGame() {// 初始化游戏窗口this.setSize(800, 600);this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); this.setVisible(true);// 初始化玩家坦克tank = new Tank(400, 500);// 初始化敌方坦克列表enemyTanks = new ArrayList<>();enemyTanks.add(new Tank(100, 100));enemyTanks.add(new Tank(300, 200));// 初始化子弹列表bullets = new ArrayList<>();// 添加键盘监听器,控制坦克移动和攻击this.addKeyListener(new KeyListener() {@Overridepublic void keyPressed(KeyEvent e) {int keycode = e.getKeyCode();switch (keycode) {case KeyEvent.VK_UP:tank.moveUp();break;case KeyEvent.VK_DOWN: tank.moveDown();break;case KeyEvent.VK_LEFT: tank.moveLeft();break;case KeyEvent.VK_RIGHT: tank.moveRight();break;case KeyEvent.VK_SPACE: bullets.add(tank.fire());break;default:break;}// 重新绘制游戏画面repaint();}@Overridepublic void keyReleased(KeyEvent e) { }@Overridepublic void keyTyped(KeyEvent e) { }});}// 绘制游戏画面public void paint(Graphics g) {super.paint(g);// 绘制玩家坦克tank.draw(g);// 绘制敌方坦克for (Tank enemyTank : enemyTanks) { enemyTank.draw(g);}// 绘制子弹for (Bullet bullet : bullets) {bullet.draw(g);}}public static void main(String[] args) {new TankGame();}}```在上述示例代码中,我们创建了一个继承自JFrame的主窗口,并在窗口中添加了一个玩家坦克、敌方坦克和子弹的列表。
python实现坦克大战游戏 附详细注释

python实现坦克大战游戏附详细注释本文实例为大家分享了python实现坦克大战的具体代码,供大家参考,具体内容如下:#功能实现游戏主窗口import pygame,time,random#导入模块_display = pygame.display#赋值给一个变量调用时方便color_red = pygame.Color(255,0,0)#同上vclass MainGame(object):screen_width = 900#游戏界面宽度screen_height = 550#界面的高度Tank_p1 = None#坦克对象window = None #窗口对象EnemyTank_list = []# 存储所有敌方坦克EnemTank_count = 10# 要创建的敌方坦克的数量Bullet_list = [] #创建我方子弹列表EnemyTank_bullet_list = []Explode_list= []wall_list = []def startGame(self):pygame.display.init()#初始化游戏模块的显示MainGame.window = _display.set_mode([MainGame.screen_width,MainGame.screen_height])#生成并加载游戏窗口、\#pygame.display模块及set_mode方法和pygame相关方法调用设置# 见<<https:///docs/ref/display.html#pygame.display.set_mode>> UC 浏览器实现自动翻译pygame.display.set_caption("坦克大战v1.0")#s设置游戏标题self.creatEnemyTank()#类中调用初始敌方坦克方法self.creatMyTank()#创建我方坦克self.creatWalls()#创建障碍物while True:#无限循环所有行为方法都要无限制的显示MainGame.window.fill(pygame.Color(0,0,0))#窗口颜色设置Window在开始方法已设置为游戏窗口self.getEvent()#死循环中获取事件的值对其进行相应处理MainGame.window.blit(self.drawText("剩余敌方数量%d" %len(MainGame.EnemyTank_list)),(7, 7))#循环游戏窗口加载文本bilt方法在页面写入另一个self.blitWalls()if MainGame.Tank_p1 and MainGame.Tank_p1.alive:MainGame.Tank_p1.displayTank()#循环调用生成的坦克对象(显示)方法self.blitEnemyTank()# 此类中用self 循环展示敌方坦克if MainGame.Tank_p1 and not MainGame.Tank_p1.stop:MainGame.Tank_p1.move()# 移动MainGame.Tank_p1.hitWall()#撞击墙壁MainGame.Tank_p1.hitEnemyTank()#撞击敌方坦克方法self.blitEnemyBullet()#显示敌方坦克子弹self.blitBullet()#显示炮弹self.blitExplode()#显示爆炸效果time.sleep(0.02)_display.update()#获取更新#将带有文字的surface 绘制到窗口中循环# 创建敌方坦克def creatEnemyTank(self):#创建敌方坦克top = 100for i in range(MainGame.EnemTank_count):#MainGame.EnemTank_count=5 五次循环创建敌方坦克speed = random.randint(3, 6) # 随机模块random.randint# 每次都随机生成一个left值left = random.randint(1, 7)eTank = EnemyTank(left * 100, top, speed)#生成敌方坦克类对象传入参数left 为随机MainGame.EnemyTank_list.append(eTank)#将创建的每一个敌方坦克添加到列表# 将坦克加入到窗口中def creatMyTank(self):MainGame.Tank_p1 = MyTank(400, 480) # 生成一个坦克类的实例对象music = Music("img/start.wav")music.play()def creatWalls(self):for i in range(1,10):wall = Wall(60*i,250)MainGame.wall_list.append(wall)def blitWalls(self):for wall in MainGame.wall_list:if wall.live == True:wall.displayWall()else:MainGame.wall_list.remove(wall)def blitEnemyTank(self):#显示敌方坦克若出现坦克图片重叠也是符合逻辑for eTank in MainGame.EnemyTank_list:if eTank.live :eTank.displayTank()#将列表中每一个进行显示eTank为敌方坦克类对象调用父类Tank类中显示方法eTank.randMove()eTank.hitWall()eTank.hitMyTank()ebullet = eTank.shot()if ebullet:#如果不为空MainGame.EnemyTank_bullet_list.append(ebullet)else:MainGame.EnemyTank_list.remove(eTank)def blitEnemyBullet(self):#将敌方坦克加入到窗口中for ebullet in MainGame.EnemyTank_bullet_list:if ebullet.alive:ebullet.display_bullet()ebullet.bulletMove()ebullet.hitWalls()if MainGame.Tank_p1.alive:ebullet.hitMyTank()else:MainGame.EnemyTank_bullet_list.remove(ebullet)def blitBullet(self):#显示子弹for bullet in MainGame.Bullet_list:#事件中获的子弹的列表进行遍历类似显示坦克方法逐个展示if bullet.alive:#Bullet类中设置的标签来判断子弹的存活True为生根据炮弹移动方法bulletmove()中所加限制条件bullet.display_bullet()#调用列表中子弹对象的显示方法bullet.bulletMove()#子弹的移动bullet.hitEnemyTank()#调用与敌方坦克的碰撞检测方法bullet.hitWalls()#d调用子弹碰撞墙壁else:MainGame.Bullet_list.remove(bullet)#如果为False bulletmove()中触碰墙壁就是False 就从列表删除循环执行def blitExplode(self):for explode in MainGame.Explode_list:if explode.live:explode.display_explode()music = Music("img/blast.wav")music.play()else:MainGame.Explode_list.remove(explode)def drawText(self,content):#文本写入游戏窗口pygame.font.init()#初始化字体font = pygame.font.SysFont("kaiti",18)#创建字体对象text_sf = font.render(content,True,color_red)#字体样式对象return text_sf #返回内容的surfacedef getEvent(self):#获取所有事件eventlist = pygame.event.get()#所有事件列表for event in eventlist:#遍历每一个事件进行判断键盘输入的字符#type属性if event.type == pygame.QUIT:#如果是QUIT(就是点击窗口的退出按钮叉号) print("退出游戏")self.gameOver()#退出方法if event.type == pygame.KEYUP:#如果键盘按钮抬起并且是上下左右键if event.key == pygame.K_LEFT or event.key == pygame.K_RIGHT or event.key == pygame.K_UP\or event.key == pygame.K_DOWN:if MainGame.Tank_p1 and MainGame.Tank_p1.alive:MainGame.Tank_p1.stop = True#stop为True 按钮抬起就停止start方法中的开关实现坦克按住按钮持续移动if event.type == pygame.KEYDOWN:#如果事件的类型为按下按键进行如下判断if event.key == pygame.K_ESCAPE :self.creatMyTank()if MainGame.Tank_p1 and MainGame.Tank_p1.alive:if event.key == pygame.K_LEFT:#如果为左方向键如下为同一类型print("向左移动")MainGame.Tank_p1.direction = "L"#设置坦克方向进行判断向左就是L,# 并设置游戏窗口的界限还可以利用方向作为字典的键获取坦克图片坦克的移动方向#就是加载不同方向的坦克图片呈现出移动的效果MainGame.Tank_p1.stop = False#坦克移动的开关循环使用False为移动if event.key == pygame.K_RIGHT:print("向右移动")MainGame.Tank_p1.direction = "R"MainGame.Tank_p1.stop = Falseif event.key ==pygame.K_UP:print("向上移动")MainGame.Tank_p1.direction = "U"MainGame.Tank_p1.stop = Falseif event.key == pygame.K_DOWN:print("向下移动")MainGame.Tank_p1.direction = "D"MainGame.Tank_p1.stop = Falseif event.key == pygame.K_SPACE:#空格键发射子弹if len(MainGame.Bullet_list) < 3:#控制子弹在屏幕显示的数量太多没有游戏体验列表中存储三个m = Bullet(MainGame.Tank_p1)#子弹类对象添加到列表开始方法调用显示子弹子弹触碰墙壁列表内移除对象MainGame.Bullet_list.append(m)music =Music("img/fire.wav")music.play()def gameOver(self):#游戏结束方法exit()class BaseItem(pygame.sprite.Sprite):def __init__(self):pygame.sprite.Sprite.__init__(self)class Tank(BaseItem):#坦克的父类def __init__(self,left,top):#坦克图片集合self.images = {"U":pygame.image.load("img/p1tankU.gif"),"D": pygame.image.load("img/p1tankD.gif"),"L":pygame.image.load("img/p1tankL.gif"),"R": pygame.image.load("img/p1tankR.gif"),}#坦克各方向图片的加载#坦克的方向self.direction = "U"#坦克初始化时候的默认图片,根据坦克的方向从字典里去提取self.image = self.images[self.direction]#坦克的区域(left,top,width,height)坦克位置以及坦克的大小self.rect = self.image.get_rect()self.rect.left = left#坦克距离左边位置修改默认参数指定的位置self.rect.top = top#将坦克距离上边的位置修改我指定的位置self.speed = 15#设置坦克的速度self.stop = True #设置移动的开关self.oldtop = self.rect.topself.oldleft = self.rect.leftdef move(self):self.oldtop = self.rect.topself.oldleft = self.rect.leftif self.direction == "U":#向上时if self.rect.top > 0:#self.rect = self.image.get_rect()# self.rect.top = top#将坦克距离上边的位置修改我指定的位置self.rect.top -= self.speed#坦克的速度距离每一次调用时相减直到<0时elif self.direction == "D":#向下时if self.rect.top < MainGame.screen_height-MainGame.Tank_p1.rect.height:#下边界小于窗口的高度减去坦克自身的高度的距离self.rect.top += self.speed #距离加速度的距离循环一次添加一次elif self.direction == "L":if self.rect.left > 0:self.rect.left -= self.speedelif self.direction == "R":if self.rect.left < MainGame.screen_width -MainGame.Tank_p1.rect.width: self.rect.left += self.speeddef stay(self):self.rect.left = self.oldleftself.rect.top = self.oldtopdef hitWall(self):for wall in MainGame.wall_list:if pygame.sprite.collide_rect(wall,self):self.stay()def shot(self):return Bullet(self)def displayTank(self):#坦克显示方法#1.重新设置坦克的图片self.image = self.images[self.direction]#2.将坦克加入到窗口中MainGame.window.blit(self.image,self.rect)#调用MainGame window方法# 传入图片和位置self.rect = self.image.get_rect()class MyTank(Tank):def __init__(self,left,top):super(MyTank,self).__init__(left,top)def hitEnemyTank(self):for etank in MainGame.EnemyTank_list:if pygame.sprite.collide_rect(etank,self):self.stay()class EnemyTank(Tank):#敌方坦克类def __init__(self,left,top,speed):#初始化敌方坦克三个参数self.images = {"U": pygame.image.load("img/enemy1U.gif"),"D": pygame.image.load("img/enemy1D.gif"),"L": pygame.image.load("img/enemy1L.gif"),"R": pygame.image.load("img/enemy1R.gif"), }#加载敌方坦克图片# 坦克的方向self.direction = self.randDirection()#自定义坦克的随机方向self.image = self.images[self.direction]#坦克的信息从字典中以键获得值# 坦克所在的区域Rect->self.rect = self.image.get_rect()#获得坦克图片的距离距左和距上# 指定坦克初始化位置分别距x,y轴的位置self.rect.left = left#距左的位置>>形参self.rect.top = top#距上的位置# 新增速度属性self.speed = speed #速度>>初始化时设置self.stop = Trueself.step = 50#设置步数self.live = Truedef randDirection(self):#随机生成敌方坦克的方向图片num = random.randint(1, 4)if num == 1:return 'U'elif num == 2:return 'D'elif num == 3:return 'L'elif num == 4:return 'R'def randMove(self):#敌方坦克随机移动if self.step <= 0:#如果步数为0self.direction = self.randDirection()#方向为随机方向self.step = 30# 重置步数else:self.move()#移动坦克位置不断改变self.step -= 1#步数每次循环减一def shot(self):s = random.randint(1,1000)if s <30:return Bullet(self)def hitMyTank(self):if pygame.sprite.collide_rect(self,MainGame.Tank_p1):self.stay()class Bullet(BaseItem):#炮弹类def __init__(self,tank):self.image = pygame.image.load("img\enemymissile.gif")self.direction = tank.direction#子弹速度self.speed = 18self.rect = self.image.get_rect()#获得子弹的对象的坐标只计算距离左侧和和上面#子弹初始化位置要根据坦克大方向进行调整可以自己画图计算if self.direction == "U":#子弹的位置left += 坦克宽度的一半- 子弹的宽度的一半self.rect.left = tank.rect.left + tank.rect.width/2 - self.rect.width/2self.rect.top = tank.rect.top - self.rect.heightelif self.direction == "D":self.rect.left = tank.rect.left + tank.rect.width / 2 - self.rect.width / 2self.rect.top = tank.rect.top - self.rect.heightelif self.direction == "L":self.rect.left = tank.rect.left - tank.rect.width / 2 - self.rect.width / 2self.rect.top = tank.rect.top + tank.rect.width/2 -self.rect.width/2elif self.direction == "R":self.rect.left = tank.rect.left + tank.rect.width / 2self.rect.top = tank.rect.top + tank.rect.width/2 -self.rect.width/2speed = 10#速度alive = True#设置一个小标签作判断def bulletMove(self):#炮弹移动if self.direction == "U":if self.rect.top > 0 :#距离限制计算self子弹对象本身rect.top距离窗口上方rect.left左侧self.rect.top -= self.speedelse:self.alive = False#此为<0时的情况同下都是触碰墙壁时的情况elif self.direction == "D":if self.rect.top < MainGame.screen_height - self.rect.height:#屏幕高度- 子弹的高度self.rect.top += self.speedelse:self.alive = Falseelif self.direction == "L":if self.rect.left > 0:self.rect.left -= self.speedelse:self.alive = Falseelif self.direction == "R":if self.rect.left < MainGame.screen_width - self.rect.width:self.rect.left += self.speedelse:self.alive = Falsedef hitEnemyTank(self):#我方子弹与敌方坦克相碰for etank in MainGame.EnemyTank_list:#敌方坦克列表if pygame.sprite.collide_rect(etank,self):#sprite中的相撞测试explode = Explode(etank)#产生一个爆炸效果MainGame.Explode_list.append(explode)self.alive = Falseetank.live = Falsedef hitMyTank(self):if pygame.sprite.collide_rect(self,MainGame.Tank_p1):explode = Explode(MainGame.Tank_p1)MainGame.Explode_list.append(explode)MainGame.Tank_p1.alive = Falseself.alive = Falsedef hitWalls(self):for wall in MainGame.wall_list:if pygame.sprite.collide_rect(wall,self):self.alive = Falsewall.hp -= 1if wall.hp <= 0:wall.live = Falsedef display_bullet(self):#显示子弹方法MainGame.window.blit(self.image,self.rect)#窗口写入class Explode:#爆炸效果def __init__(self,tank):self.step = 0self.rect = tank.rectself.images = [pygame.image.load("img/blast0.gif"),pygame.image.load("img/blast1.gif"),pygame.image.load("img/blast2.gif"),pygame.image.load("img/blast3.gif"),pygame.image.load("img/blast4.gif"),pygame.image.load("img/blast5.gif"),pygame.image.load("img/blast6.gif"),pygame.image.load("img/blast7.gif"),]self.live = Trueself.image = self.images[self.step]def display_explode(self):#显示爆炸效果if self.step < len(self.images):MainGame.window.blit(self.image,self.rect)self.image = self.images[self.step]self.step += 1else:self.live = Falseself.step = 0class Wall:def __init__(self,left,top):self.image = pygame.image.load("img/steels.gif") self.rect = self.image.get_rect()self.rect.left = leftself.rect.top = topself.live = Trueself.hp = 3def displayWall(self):#显示障碍物MainGame.window.blit(self.image,self.rect)class Music:#音效def __init__(self,filename):self.filename = filenamepygame.mixer.init()#混合器的初始pygame.mixer.music.load(self.filename)#加载音乐文件def play(self):pygame.mixer.music.play(loops=0)#播放音乐MainGame().startGame()。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
import java.awt.* ;import javax.swing.* ;import java.awt.event.*;import java.util.EventListener;class f extends JFrame {f(String title) {this.setTitle(title) ;this.setSize(608 , 630) ;this.setLocation(300 , 100) ;this.setBackground(Color.BLACK) ;MyTank mp = new MyTank() ;this.add(mp) ;this.addKeyListener(mp) ;new Thread(mp).start() ;}public static void main(String[] args) {f h = new f("坦克大战(版本1.0)") ;h.setVisible(true) ;}}//主战坦克class MyTank extends JPanel implements KeyListener , Runnable {int x = 280, y = 280 ;//坦克的初始位置int op = 1 ;//坦克的移动方向int color = 0 ;int tankspeed = 8 ;//坦克的速度int tankbullet = 8 ;//坦克的子弹速度int tankfbullet = 4 ;//敌军的子弹速度int shengming = 100 ;//生命int fenshu = 0 ;int nandu = 5 ; //设置游戏难度//子弹int dx = 295 , dy = 295 ;int dx1 = 295 , dy1 = -10 ;int dx2 = 600 , dy2 = 295 ;int dx3 = 295 , dy3 = 600 ;int dx4 = -10 , dy4 = 295 ;//敌军坦克int num = 10 ;//敌军坦克数量,不能修改int[] xf = new int[num] ;int[] yf = new int[num] ;int[] opf = new int[num] ;int[] dxf = new int[num] ;int[] dyf = new int[num] ;int[] dxf1 = new int[num] ;int[] dyf1 = new int[num] ;int[] dxf2 = new int[num] ;int[] dyf2 = new int[num] ;int[] dxf3 = new int[num] ;int[] dyf3 = new int[num] ;int[] dxf4 = new int[num] ;int[] dyf4 = new int[num] ;//构造函数,初始化敌军坦克的位置和状态MyTank() {for (int i = 0; i<num; i++) {xf[i] = (int) (Math.random() * 560) ; yf[i] = (int) (Math.random() * 560) ; dxf[i] = xf[i] + 15 ;dyf[i] = yf[i] + 15 ;}for (int i = 0; i<num; i++) {dxf1[i] = 295 ; dyf1[i] = -10 ;dxf2[i] = 600 ; dyf2[i] = 295 ;dxf3[i] = 295 ; dyf3[i] = 600 ;dxf4[i] = -10 ; dyf4[i] = 295 ;}}//主面版public void paint(Graphics g) { super.paint(g) ;this.setBackground(Color.YELLOW) ;g.setColor(Color.red) ;g.drawString("生命:" , 10 , 20 ) ;g.fillRect(50 , 10 , shengming * 5 , 10) ;g.drawRect(50 , 10 , 500 , 10) ;g.drawString("得分: "+ fenshu , 10 , 40) ;if(op == 1) {g.setColor(Color.red) ;g.fillRect(x , y , 40 , 40) ;switch (color % 6) {case 0: g.setColor(Color.blue) ; break; case 1: g.setColor(Color.yellow) ; break; case 2: g.setColor(Color.red) ; break;case 3: g.setColor(Color.orange) ; break; case 4: g.setColor(Color.green) ; break; case 5: g.setColor(Color.black) ; break; }g.fillOval(x - 5 , y - 5 , 10 , 10) ;g.fillOval(x - 5 , y + 5 , 10 , 10) ;g.fillOval(x - 5 , y + 15 , 10 , 10) ;g.fillOval(x - 5 , y + 25 , 10 , 10) ;g.fillOval(x - 5 , y + 35 , 10 , 10) ;g.fillOval(x + 35 , y - 5 , 10 , 10) ;g.fillOval(x + 35 , y + 5 , 10 , 10) ;g.fillOval(x + 35 , y + 15 , 10 , 10) ;g.fillOval(x + 35 , y + 25 , 10 , 10) ;g.fillOval(x + 35 , y + 35 , 10 , 10) ;g.setColor(Color.black) ;g.fillRect(x + 15 , y - 20 , 10 , 40) ;switch (color % 20) {case 0: g.setColor(Color.white) ; break; case 1: g.setColor(Color.white) ; break; case 2: g.setColor(Color.white) ; break; case 3: g.setColor(Color.white) ; break; case 4: g.setColor(Color.white) ; break; case 5: g.setColor(Color.white) ; break; case 6: g.setColor(Color.white) ; break;case 7: g.setColor(Color.white) ; break;case 8: g.setColor(Color.white) ; break;case 9: g.setColor(Color.white) ; break;case 10: g.setColor(Color.black) ; break;case 11: g.setColor(Color.black) ; break;case 12: g.setColor(Color.black) ; break;case 13: g.setColor(Color.black) ; break;case 14: g.setColor(Color.black) ; break;case 15: g.setColor(Color.black) ; break;case 16: g.setColor(Color.black) ; break;case 17: g.setColor(Color.black) ; break;case 18: g.setColor(Color.black) ; break;case 19: g.setColor(Color.black) ; break; }g.fillOval(x + 5 , y + 30 , 10 , 10) ;g.fillOval(x + 25 , y + 30 , 10 , 10) ;}if(op == 2) {g.setColor(Color.green) ;g.fillRect(x , y , 40 , 40) ;switch (color % 6) {case 0: g.setColor(Color.blue) ; break;case 1: g.setColor(Color.yellow) ; break;case 2: g.setColor(Color.red) ; break;case 3: g.setColor(Color.orange) ; break;case 4: g.setColor(Color.green) ; break;case 5: g.setColor(Color.black) ; break;}g.fillOval(x - 5 , y - 5 , 10 , 10) ;g.fillOval(x + 5 , y - 5 , 10 , 10) ;g.fillOval(x + 15 , y - 5 , 10 , 10) ;g.fillOval(x + 25 , y - 5 , 10 , 10) ;g.fillOval(x + 35 , y - 5 , 10 , 10) ;g.fillOval(x - 5 , y+35 , 10 , 10) ;g.fillOval(x + 5 , y+35 , 10 , 10) ;g.fillOval(x + 15 , y+35 , 10 , 10) ;g.fillOval(x + 25 , y+35 , 10 , 10) ;g.fillOval(x + 35 , y+35 , 10 , 10) ;g.setColor(Color.black) ;g.fillRect(x + 20 , y + 15 , 40 , 10) ;switch (color % 20) {case 0: g.setColor(Color.white) ; break;case 1: g.setColor(Color.white) ; break;case 2: g.setColor(Color.white) ; break;case 3: g.setColor(Color.white) ; break;case 4: g.setColor(Color.white) ; break;case 5: g.setColor(Color.white) ; break;case 6: g.setColor(Color.white) ; break;case 7: g.setColor(Color.white) ; break;case 8: g.setColor(Color.white) ; break;case 9: g.setColor(Color.white) ; break;case 10: g.setColor(Color.black) ; break;case 11: g.setColor(Color.black) ; break;case 12: g.setColor(Color.black) ; break;case 13: g.setColor(Color.black) ; break;case 14: g.setColor(Color.black) ; break;case 15: g.setColor(Color.black) ; break;case 16: g.setColor(Color.black) ; break;case 17: g.setColor(Color.black) ; break;case 18: g.setColor(Color.black) ; break;case 19: g.setColor(Color.black) ; break; }g.fillOval(x , y + 5 , 10 , 10) ;g.fillOval(x , y + 25 , 10 , 10) ;}if(op == 3) {g.setColor(Color.blue) ;g.fillRect(x , y , 40 , 40) ;switch (color % 6) {case 0: g.setColor(Color.blue) ; break;case 1: g.setColor(Color.yellow) ; break;case 2: g.setColor(Color.red) ; break;case 3: g.setColor(Color.orange) ; break;case 4: g.setColor(Color.green) ; break;case 5: g.setColor(Color.black) ; break;}g.fillOval(x - 5 , y - 5 , 10 , 10) ;g.fillOval(x - 5 , y + 5 , 10 , 10) ;g.fillOval(x - 5 , y + 15 , 10 , 10) ;g.fillOval(x - 5 , y + 25 , 10 , 10) ;g.fillOval(x - 5 , y + 35 , 10 , 10) ;g.fillOval(x + 35 , y - 5 , 10 , 10) ;g.fillOval(x + 35 , y + 5 , 10 , 10) ;g.fillOval(x + 35 , y + 15 , 10 , 10) ;g.fillOval(x + 35 , y + 25 , 10 , 10) ;g.fillOval(x + 35 , y + 35 , 10 , 10) ;g.setColor(Color.black) ;g.fillRect(x + 15 , y + 20 , 10 , 40) ;switch (color % 20) {case 0: g.setColor(Color.white) ; break;case 1: g.setColor(Color.white) ; break;case 2: g.setColor(Color.white) ; break;case 3: g.setColor(Color.white) ; break;case 4: g.setColor(Color.white) ; break;case 5: g.setColor(Color.white) ; break;case 6: g.setColor(Color.white) ; break;case 7: g.setColor(Color.white) ; break;case 8: g.setColor(Color.white) ; break;case 9: g.setColor(Color.white) ; break;case 10: g.setColor(Color.black) ; break;case 11: g.setColor(Color.black) ; break;case 12: g.setColor(Color.black) ; break;case 13: g.setColor(Color.black) ; break;case 14: g.setColor(Color.black) ; break;case 15: g.setColor(Color.black) ; break;case 16: g.setColor(Color.black) ; break;case 17: g.setColor(Color.black) ; break;case 18: g.setColor(Color.black) ; break;case 19: g.setColor(Color.black) ; break; }g.fillOval(x + 5 , y , 10 , 10) ;g.fillOval(x + 25 , y , 10 , 10) ;}if(op == 4) {g.setColor(Color.yellow) ;g.fillRect(x , y , 40 , 40) ;switch (color % 6) {case 0: g.setColor(Color.blue) ; break;case 1: g.setColor(Color.yellow) ; break;case 2: g.setColor(Color.red) ; break;case 3: g.setColor(Color.orange) ; break;case 4: g.setColor(Color.green) ; break;case 5: g.setColor(Color.black) ; break;}g.fillOval(x - 5 , y - 5 , 10 , 10) ;g.fillOval(x + 5 , y - 5 , 10 , 10) ;g.fillOval(x + 15 , y - 5 , 10 , 10) ;g.fillOval(x + 25 , y - 5 , 10 , 10) ;g.fillOval(x + 35 , y - 5 , 10 , 10) ;g.fillOval(x - 5 , y+35 , 10 , 10) ;g.fillOval(x + 5 , y+35 , 10 , 10) ;g.fillOval(x + 15 , y+35 , 10 , 10) ;g.fillOval(x + 25 , y+35 , 10 , 10) ;g.fillOval(x + 35 , y+35 , 10 , 10) ;g.setColor(Color.black) ;g.fillRect(x - 20 , y + 15 , 40 , 10) ;switch (color % 20) {case 0: g.setColor(Color.white) ; break;case 1: g.setColor(Color.white) ; break;case 2: g.setColor(Color.white) ; break;case 3: g.setColor(Color.white) ; break;case 4: g.setColor(Color.white) ; break;case 5: g.setColor(Color.white) ; break;case 6: g.setColor(Color.white) ; break;case 7: g.setColor(Color.white) ; break;case 8: g.setColor(Color.white) ; break;case 9: g.setColor(Color.white) ; break;case 10: g.setColor(Color.black) ; break;case 11: g.setColor(Color.black) ; break;case 12: g.setColor(Color.black) ; break;case 13: g.setColor(Color.black) ; break;case 14: g.setColor(Color.black) ; break;case 15: g.setColor(Color.black) ; break;case 16: g.setColor(Color.black) ; break;case 17: g.setColor(Color.black) ; break;case 18: g.setColor(Color.black) ; break;case 19: g.setColor(Color.black) ; break; }g.fillOval(x + 30 , y + 5 , 10 , 10) ;g.fillOval(x + 30 , y + 25 , 10 , 10) ;}g.setColor(Color.black) ;g.fillOval(dx , dy , 10 , 10) ;g.fillOval(dx1 , dy1 , 10 , 10) ;g.fillOval(dx2 , dy2 , 10 , 10) ;g.fillOval(dx3 , dy3 , 10 , 10) ;g.fillOval(dx4 , dy4 , 10 , 10) ;for (int i = 0; i<num; i++) {if(opf[i] == 1) {g.fillRect(xf[i] , yf[i] , 40 , 40) ;g.fillOval(xf[i] - 5 , yf[i] - 5 , 10 , 10) ; g.fillOval(xf[i] - 5 , yf[i] + 5 , 10 , 10) ; g.fillOval(xf[i] - 5 , yf[i] + 15 , 10 , 10) ;g.fillOval(xf[i] - 5 , yf[i] + 25 , 10 , 10) ;g.fillOval(xf[i] - 5 , yf[i] + 35 , 10 , 10) ;g.fillOval(xf[i] + 35 , yf[i] - 5 , 10 , 10) ;g.fillOval(xf[i] + 35 , yf[i] + 5 , 10 , 10) ;g.fillOval(xf[i] + 35 , yf[i] + 15 , 10 , 10) ;g.fillOval(xf[i] + 35 , yf[i] + 25 , 10 , 10) ;g.fillOval(xf[i] + 35 , yf[i] + 35 , 10 , 10) ;g.fillRect(xf[i] + 15 , yf[i] - 20 , 10 , 40) ;g.fillOval(xf[i] + 5 , yf[i] + 30 , 10 , 10) ;g.fillOval(xf[i] + 25 , yf[i] + 30 , 10 , 10) ; }if(opf[i] == 2) {g.fillRect(xf[i] , yf[i] , 40 , 40) ;g.fillOval(xf[i] - 5 , yf[i] - 5 , 10 , 10) ; g.fillOval(xf[i] + 5 , yf[i] - 5 , 10 , 10) ; g.fillOval(xf[i] + 15 , yf[i] - 5 , 10 , 10) ;g.fillOval(xf[i] + 25 , yf[i] - 5 , 10 , 10) ;g.fillOval(xf[i] + 35 , yf[i] - 5 , 10 , 10) ;g.fillOval(xf[i] - 5 , yf[i] + 35 , 10 , 10) ;g.fillOval(xf[i] + 5 , yf[i] + 35 , 10 , 10) ;g.fillOval(xf[i] + 15 , yf[i] + 35 , 10 , 10) ;g.fillOval(xf[i] + 35 , yf[i] + 35 , 10 , 10) ;g.fillRect(xf[i] + 20 , yf[i] + 15 , 40 , 10) ;g.fillOval(xf[i] , yf[i] + 5 , 10 , 10) ;g.fillOval(xf[i] , yf[i] + 25 , 10 , 10) ;}if(opf[i] == 3) {g.fillRect(xf[i] , yf[i] , 40 , 40) ;g.fillOval(xf[i] - 5 , yf[i] - 5 , 10 , 10) ; g.fillOval(xf[i] - 5 , yf[i] + 5 , 10 , 10) ; g.fillOval(xf[i] - 5 , yf[i] + 15 , 10 , 10) ;g.fillOval(xf[i] - 5 , yf[i] + 25 , 10 , 10) ;g.fillOval(xf[i] - 5 , yf[i] + 35 , 10 , 10) ;g.fillOval(xf[i] + 35 , yf[i] - 5 , 10 , 10) ;g.fillOval(xf[i] + 35 , yf[i] + 5 , 10 , 10) ;g.fillOval(xf[i] + 35 , yf[i] + 15 , 10 , 10) ;g.fillOval(xf[i] + 35 , yf[i] + 25 , 10 , 10) ;g.fillOval(xf[i] + 35 , yf[i] + 35 , 10 , 10) ;g.fillRect(xf[i] + 15 , yf[i] + 20 , 10 , 40) ;g.fillOval(xf[i] + 5 , yf[i] , 10 , 10) ;g.fillOval(xf[i] + 25 , yf[i] , 10 , 10) ;}if(opf[i] == 4) {g.fillRect(xf[i] , yf[i] , 40 , 40) ;g.fillOval(xf[i] - 5 , yf[i] - 5 , 10 , 10) ; g.fillOval(xf[i] + 5 , yf[i] - 5 , 10 , 10) ; g.fillOval(xf[i] + 15 , yf[i] - 5 , 10 , 10) ;g.fillOval(xf[i] + 25 , yf[i] - 5 , 10 , 10) ;g.fillOval(xf[i] + 35 , yf[i] - 5 , 10 , 10) ;g.fillOval(xf[i] - 5 , yf[i] + 35 , 10 , 10) ;g.fillOval(xf[i] + 5 , yf[i] + 35 , 10 , 10) ;g.fillOval(xf[i] + 25 , yf[i] + 35 , 10 , 10) ;g.fillOval(xf[i] + 35 , yf[i] + 35 , 10 , 10) ;g.fillRect(xf[i] - 20 , yf[i] + 15 , 40 , 10) ;g.fillOval(xf[i] + 30 , yf[i] + 5 , 10 , 10) ;g.fillOval(xf[i] + 30 , yf[i] + 25 , 10 , 10) ; }g.fillOval(dxf1[i] , dyf1[i] , 10 , 10 ) ;g.fillOval(dxf2[i] , dyf2[i] , 10 , 10 ) ;g.fillOval(dxf3[i] , dyf3[i] , 10 , 10 ) ;g.fillOval(dxf4[i] , dyf4[i] , 10 , 10 ) ;}}public void keyTyped(KeyEvent e) {}//键盘控制坦克的移动,发弹public void keyPressed(KeyEvent e) {color ++ ;if(e.getKeyCode() == KeyEvent.VK_UP) {op = 1 ;y = y - tankspeed ;dy = dy - tankspeed ;if(y <= 0) {y = y + tankspeed ;dy = dy + tankspeed ;}}if(e.getKeyCode() == KeyEvent.VK_RIGHT) {op = 2 ;x = x + tankspeed ;dx = dx + tankspeed ;if(x >= 560) {x = x - tankspeed ;dx = dx - tankspeed ;}}if(e.getKeyCode() == KeyEvent.VK_DOWN) {op = 3 ;y = y + tankspeed ;dy = dy + tankspeed ;if(y >= 560) {y = y - tankspeed ;dy = dy - tankspeed ;}}if(e.getKeyCode() == KeyEvent.VK_LEFT) { op = 4 ;x = x - tankspeed ;dx = dx - tankspeed ;if(x <= 0) {x = x + tankspeed ;dx = dx + tankspeed ;}}if(e.getKeyCode() == KeyEvent.VK_SPACE) { if(op == 1) {dx1 = dx ; dy1 = dy ;}if(op == 2) {dx2 = dx ; dy2 = dy ;}if(op == 3) {dx3 = dx ; dy3 = dy ;}if(op == 4) {dx4 = dx ; dy4 = dy ;}}this.repaint() ;}public void keyReleased(KeyEvent e) {}public void run() {for (int a = 0; a<60000; a++) {dy1 = dy1 - tankbullet ;dx2 = dx2 + tankbullet ;dy3 = dy3 + tankbullet ;dx4 = dx4 - tankbullet ;for (int i = 0; i<num; i++) {dyf1[i] = dyf1[i] - tankfbullet ;dxf2[i] = dxf2[i] + tankfbullet ;dyf3[i] = dyf3[i] + tankfbullet ;dxf4[i] = dxf4[i] - tankfbullet ;}//判断是否被击中for (int i = 0; i<num; i++) {if(dyf1[i]<y + 38 &&dyf1[i]>y +8 && dxf1[i]-x>-10 && dxf1[i]-x<40) { System.out.println ("被1击中") ;dxf1[i] = dxf[i] ; dyf1[i] = dyf[i] ;shengming = shengming - nandu ;}if(dxf2[i]>x+2 &&dxf2[i]<x+32 &&dyf2[i] - y >-10 && dyf2[i] - y <40 ) { System.out.println ("被2击中") ;dxf2[i] = dxf[i] ; dyf2[i] = dyf[i] ;shengming = shengming - nandu ;}if(dyf3[i]>y+2 && dyf3[i]< y+32 && dxf3[i]-x >-10&& dxf3[i]-x<40) { System.out.println ("被3击中") ;dxf3[i] = dxf[i] ; dyf3[i] = dyf[i] ;shengming = shengming - nandu ;}if(dxf4[i]>x+8 &&dxf4[i]<x+38 &&dyf4[i] - y >-10 && dyf4[i] - y <40 ) { System.out.println ("被4击中") ;dxf4[i] = dxf[i] ; dyf4[i] = dyf[i] ;shengming = shengming - nandu ;}}//判断是否击中敌军for (int i = 0; i<num; i++) {if(dy1<yf[i] + 38 &&dy1>yf[i] +8 && dx1-xf[i]>-10 && dx1-xf[i]<40) { System.out.println ("1击中") ;fenshu = fenshu + 100 ;xf[i] = (int)(Math.random() * 560 );yf[i] = (int)(Math.random() * 560 );}if(dx2>xf[i]+2 &&dx2<xf[i]+32 &&dy2 - yf[i] >-10 && dy2 - yf[i] <40 ) { System.out.println ("2击中") ;fenshu = fenshu + 100 ;xf[i] = (int)(Math.random() * 560 );yf[i] = (int)(Math.random() * 560 );}if(dy3>yf[i]+2 && dy3< yf[i]+32 && dx3-xf[i] >-10&& dx3-xf[i]<40) { System.out.println ("3击中") ;fenshu = fenshu + 100 ;xf[i] = (int)(Math.random() * 560 );yf[i] = (int)(Math.random() * 560 );}if(dx4>xf[i]+8 &&dx4<xf[i]+38 &&dy4 - yf[i] >-10 && dy4 - yf[i] <40 ) { System.out.println ("4击中") ;fenshu = fenshu + 100 ;xf[i] = (int)(Math.random() * 560 );yf[i] = (int)(Math.random() * 560 );}dxf[i] = xf[i] + 15 ;dyf[i] = yf[i] + 15 ;}//坦克的移动for (int i = 0; i<num; i++) {switch (opf[i]) {case 1:{yf[i]-- ;dyf[i] -- ;for (int s = 0; s<num; s++) {if(yf[i] <= 0) {yf[i] ++ ;dyf[i] ++ ;}}break;}case 2:{xf[i]++ ;dxf[i]++ ;for (int s = 0; s<num; s++) { if(xf[i] >= 560){xf[i] -- ;dxf[i] -- ;}}break;}case 3:{yf[i]++ ;dyf[i]++ ;for (int s = 0; s<num ; s++) { if(yf[i] >= 560){yf[i] -- ;dyf[i] -- ;}}break;}case 4:{xf[i]-- ;dxf[i]-- ;for (int s = 0; s<num; s++) { if(xf[i] <= 0){xf[i] ++ ;dxf[i] ++ ;}}break;}}}try{Thread.sleep(20) ;}catch(Exception e) {e.printStackTrace() ;}//坦克的开火if(a % 50 == 5) {if(Math.random()>0.5){for (int i = 0; i<2; i++) {if(opf[i] == 1) {dxf1[i] = dxf[i] ; dyf1[i] = dyf[i] ; }if(opf[i] == 2) {dxf2[i] = dxf[i] ; dyf2[i] = dyf[i] ; }if(opf[i] == 3) {dxf3[i] = dxf[i] ; dyf3[i] = dyf[i] ; }if(opf[i] == 4) {dxf4[i] = dxf[i] ; dyf4[i] = dyf[i] ; }}}}if(a % 50 == 15) {if(Math.random()>0.5) {for (int i = 2; i<4; i++) {if(opf[i] == 1) {dxf1[i] = dxf[i] ; dyf1[i] = dyf[i] ; }if(opf[i] == 2) {dxf2[i] = dxf[i] ; dyf2[i] = dyf[i] ; }if(opf[i] == 3) {dxf3[i] = dxf[i] ; dyf3[i] = dyf[i] ; }if(opf[i] == 4) {dxf4[i] = dxf[i] ; dyf4[i] = dyf[i] ; }}}}if(a % 50 == 25) {if(Math.random()>0.5){for (int i = 4; i<6; i++) {if(opf[i] == 1) {dxf1[i] = dxf[i] ; dyf1[i] = dyf[i] ; }if(opf[i] == 2) {dxf2[i] = dxf[i] ; dyf2[i] = dyf[i] ; }if(opf[i] == 3) {dxf3[i] = dxf[i] ; dyf3[i] = dyf[i] ; }if(opf[i] == 4) {dxf4[i] = dxf[i] ; dyf4[i] = dyf[i] ; }}}}if(a % 50 == 35) {if(Math.random()>0.5){for (int i = 6; i<8; i++) {if(opf[i] == 1) {dxf1[i] = dxf[i] ; dyf1[i] = dyf[i] ; }if(opf[i] == 2) {dxf2[i] = dxf[i] ; dyf2[i] = dyf[i] ; }if(opf[i] == 3) {dxf3[i] = dxf[i] ; dyf3[i] = dyf[i] ; }if(opf[i] == 4) {dxf4[i] = dxf[i] ; dyf4[i] = dyf[i] ; }}}}if(a % 50 == 45) {if(Math.random()>0.5) {for (int i = 8; i<10; i++) {if(opf[i] == 1) {dxf1[i] = dxf[i] ; dyf1[i] = dyf[i] ; }if(opf[i] == 2) {dxf2[i] = dxf[i] ; dyf2[i] = dyf[i] ; }if(opf[i] == 3) {dxf3[i] = dxf[i] ; dyf3[i] = dyf[i] ; }if(opf[i] == 4) {dxf4[i] = dxf[i] ; dyf4[i] = dyf[i] ; }}}}//坦克的随机移动if(a % 50 == 1 ) {for (int i = 0; i<2; i++) {if( Math.random() > 0.5 ) {if(Math.random() > 0.5){opf[i] = 1 ;}else{opf[i] = 2 ;}}else{if(Math.random() > 0.5){opf[i] = 3 ;}else{opf[i] = 4 ;}}}}if(a % 50 == 11 ) {//坦克的随机移动for (int i = 2; i<4; i++) {if( Math.random() > 0.5 ) {if(Math.random() > 0.5){opf[i] = 1 ;}else{}}else{if(Math.random() > 0.5){ opf[i] = 3 ;}else{opf[i] = 4 ;}}}}if(a % 50 == 21 ) {//坦克的随机移动for (int i = 4; i<6; i++) { if( Math.random() > 0.5 ) { if(Math.random() > 0.5){ opf[i] = 1 ;}else{opf[i] = 2 ;}}else{if(Math.random() > 0.5){ opf[i] = 3 ;}else{opf[i] = 4 ;}}}}if(a % 50 == 31 ) {//坦克的随机移动for (int i = 6; i<8; i++) { if( Math.random() > 0.5 ) { if(Math.random() > 0.5){ opf[i] = 1 ;}else{opf[i] = 2 ;}}else{if(Math.random() > 0.5){ opf[i] = 3 ;}else{}}}}if(a % 50 == 41 ) {//坦克的随机移动for (int i = 8; i<10; i++) {if( Math.random() > 0.5 ) {if(Math.random() > 0.5){opf[i] = 1 ;}else{opf[i] = 2 ;}}else{if(Math.random() > 0.5){opf[i] = 3 ;}else{opf[i] = 4 ;}}}}//重画if(shengming<=0){//弹出player1胜利对话框JOptionPane.showMessageDialog(null,"你结束了!!!","Game Over !", JOptionPane.ERROR_MESSAGE); //结束游戏System.exit(0) ;}this.repaint() ;}}}。