坦克大战源代码终极版
python+pygame实现坦克大战小游戏的示例代码(可以自定义子弹速度)

python+pygame实现坦克⼤战⼩游戏的⽰例代码(可以⾃定义⼦弹速度)python+pygame实现坦克⼤战⼩游戏—可以⾃定义⼦弹速度:运⾏环境–python3.7、pycharm;源码需要请:点赞留⾔邮箱;正常版⼦弹速度:普通速度版加速版⼦弹速度:⼦弹加速版另外还有多种道具,⽀持两⼈⼀起玩。
main()⽅法如下:def main():pygame.init()pygame.mixer.init()resolution = 630, 630screen = pygame.display.set_mode(resolution)pygame.display.set_caption("Tank Game ")# 加载图⽚,⾳乐,⾳效.background_image = pygame.image.load(r"..\image\background.png")home_image = pygame.image.load(r"..\image\home.png")home_destroyed_image = pygame.image.load(r"..\image\home_destroyed.png")bang_sound = pygame.mixer.Sound(r"..\music\bang.wav")bang_sound.set_volume(1)fire_sound = pygame.mixer.Sound(r"..\music\Gunfire.wav")start_sound = pygame.mixer.Sound(r"..\music\start.wav")start_sound.play()# 定义精灵组:坦克,我⽅坦克,敌⽅坦克,敌⽅⼦弹allTankGroup = pygame.sprite.Group()mytankGroup = pygame.sprite.Group()allEnemyGroup = pygame.sprite.Group()redEnemyGroup = pygame.sprite.Group()greenEnemyGroup = pygame.sprite.Group()otherEnemyGroup = pygame.sprite.Group()enemyBulletGroup = pygame.sprite.Group()# 创建地图bgMap = wall.Map()# 创建⾷物/道具但不显⽰prop = food.Food()# 创建我⽅坦克myTank_T1 = myTank.MyTank(1)allTankGroup.add(myTank_T1)mytankGroup.add(myTank_T1)myTank_T2 = myTank.MyTank(2)allTankGroup.add(myTank_T2)mytankGroup.add(myTank_T2)# 创建敌⽅坦克for i in range(1, 4):enemy = enemyTank.EnemyTank(i)allTankGroup.add(enemy)allEnemyGroup.add(enemy)if enemy.isred == True:redEnemyGroup.add(enemy)continueif enemy.kind == 3:greenEnemyGroup.add(enemy)continueotherEnemyGroup.add(enemy)# 敌军坦克出现动画appearance_image = pygame.image.load(r"..\image\appear.png").convert_alpha()appearance = []appearance.append(appearance_image.subsurface(( 0, 0), (48, 48)))appearance.append(appearance_image.subsurface((48, 0), (48, 48)))appearance.append(appearance_image.subsurface((96, 0), (48, 48)))# ⾃定义事件# 创建敌⽅坦克延迟200DELAYEVENT = EREVENTpygame.time.set_timer(DELAYEVENT, 200)# 创建敌⽅⼦弹延迟1000ENEMYBULLETNOTCOOLINGEVENT = EREVENT + 1 pygame.time.set_timer(ENEMYBULLETNOTCOOLINGEVENT, 1000)# 创建我⽅⼦弹延迟200MYBULLETNOTCOOLINGEVENT = EREVENT + 2pygame.time.set_timer(MYBULLETNOTCOOLINGEVENT, 200)# 敌⽅坦克静⽌8000NOTMOVEEVENT = EREVENT + 3pygame.time.set_timer(NOTMOVEEVENT, 8000)delay = 100moving = 0movdir = 0moving2 = 0movdir2 = 0enemyNumber = 3enemyCouldMove = Trueswitch_R1_R2_image = TruehomeSurvive = Truerunning_T1 = Truerunning_T2 = Trueclock = pygame.time.Clock()while True:for event in pygame.event.get():if event.type == pygame.QUIT:pygame.quit()sys.exit()# 我⽅⼦弹冷却事件if event.type == MYBULLETNOTCOOLINGEVENT:myTank_T1.bulletNotCooling = True# 敌⽅⼦弹冷却事件if event.type == ENEMYBULLETNOTCOOLINGEVENT:for each in allEnemyGroup:each.bulletNotCooling = True# 敌⽅坦克静⽌事件if event.type == NOTMOVEEVENT:enemyCouldMove = True# 创建敌⽅坦克延迟if event.type == DELAYEVENT:if enemyNumber < 4:enemy = enemyTank.EnemyTank()if pygame.sprite.spritecollide(enemy, allTankGroup, False, None):breakallEnemyGroup.add(enemy)allTankGroup.add(enemy)enemyNumber += 1if enemy.isred == True:redEnemyGroup.add(enemy)elif enemy.kind == 3:greenEnemyGroup.add(enemy)else:otherEnemyGroup.add(enemy)if event.type == pygame.KEYDOWN:if event.key == pygame.K_c and pygame.KMOD_CTRL:pygame.quit()sys.exit()if event.key == pygame.K_e:myTank_T1.levelUp()if event.key == pygame.K_q:myTank_T1.levelDown()if event.key == pygame.K_3:myTank_T1.levelUp()myTank_T1.levelUp()myTank_T1.level = 3if event.key == pygame.K_2:if myTank_T1.speed == 3:myTank_T1.speed = 24else:myTank_T1.speed = 3if event.key == pygame.K_1:for x, y in [(11,23),(12,23),(13,23),(14,23),(11,24),(14,24),(11,25),(14,25)]: bgMap.brick = wall.Brick()bgMap.brick.rect.left, bgMap.brick.rect.top = 3 + x * 24, 3 + y * 24bgMap.brickGroup.add(bgMap.brick)if event.key == pygame.K_4:for x, y in [(11,23),(12,23),(13,23),(14,23),(11,24),(14,24),(11,25),(14,25)]:bgMap.iron = wall.Iron()bgMap.iron.rect.left, bgMap.iron.rect.top = 3 + x * 24, 3 + y * 24bgMap.ironGroup.add(bgMap.iron)# 检查⽤户的键盘操作key_pressed = pygame.key.get_pressed()# 玩家⼀的移动操作if moving:moving -= 1if movdir == 0:allTankGroup.remove(myTank_T1)if myTank_T1.moveUp(allTankGroup, bgMap.brickGroup, bgMap.ironGroup): moving += 1allTankGroup.add(myTank_T1)running_T1 = Trueif movdir == 1:allTankGroup.remove(myTank_T1)if myTank_T1.moveDown(allTankGroup, bgMap.brickGroup, bgMap.ironGroup): moving += 1allTankGroup.add(myTank_T1)running_T1 = Trueif movdir == 2:allTankGroup.remove(myTank_T1)if myTank_T1.moveLeft(allTankGroup, bgMap.brickGroup, bgMap.ironGroup): moving += 1allTankGroup.add(myTank_T1)running_T1 = Trueif movdir == 3:allTankGroup.remove(myTank_T1)if myTank_T1.moveRight(allTankGroup, bgMap.brickGroup, bgMap.ironGroup): moving += 1allTankGroup.add(myTank_T1)running_T1 = Trueif not moving:if key_pressed[pygame.K_w]:moving = 7movdir = 0running_T1 = TrueallTankGroup.remove(myTank_T1)if myTank_T1.moveUp(allTankGroup, bgMap.brickGroup, bgMap.ironGroup): moving = 0allTankGroup.add(myTank_T1)elif key_pressed[pygame.K_s]:moving = 7movdir = 1running_T1 = TrueallTankGroup.remove(myTank_T1)if myTank_T1.moveDown(allTankGroup, bgMap.brickGroup, bgMap.ironGroup): moving = 0allTankGroup.add(myTank_T1)elif key_pressed[pygame.K_a]:moving = 7movdir = 2running_T1 = TrueallTankGroup.remove(myTank_T1)if myTank_T1.moveLeft(allTankGroup, bgMap.brickGroup, bgMap.ironGroup): moving = 0allTankGroup.add(myTank_T1)elif key_pressed[pygame.K_d]:moving = 7movdir = 3running_T1 = TrueallTankGroup.remove(myTank_T1)if myTank_T1.moveRight(allTankGroup, bgMap.brickGroup, bgMap.ironGroup): moving = 0allTankGroup.add(myTank_T1)if key_pressed[pygame.K_j]:if not myTank_T1.bullet.life and myTank_T1.bulletNotCooling:fire_sound.play()myTank_T1.shoot()myTank_T1.bulletNotCooling = False# 玩家⼆的移动操作if moving2:moving2 -= 1if movdir2 == 0:allTankGroup.remove(myTank_T2)myTank_T2.moveUp(allTankGroup, bgMap.brickGroup, bgMap.ironGroup) allTankGroup.add(myTank_T2)running_T2 = Trueif movdir2 == 1:allTankGroup.remove(myTank_T2)myTank_T2.moveDown(allTankGroup, bgMap.brickGroup, bgMap.ironGroup) allTankGroup.add(myTank_T2)running_T2 = Trueif movdir2 == 2:allTankGroup.remove(myTank_T2)myTank_T2.moveLeft(allTankGroup, bgMap.brickGroup, bgMap.ironGroup) allTankGroup.add(myTank_T2)running_T2 = Trueif movdir2 == 3:allTankGroup.remove(myTank_T2)myTank_T2.moveRight(allTankGroup, bgMap.brickGroup, bgMap.ironGroup) allTankGroup.add(myTank_T2)running_T2 = Trueif not moving2:if key_pressed[pygame.K_UP]:allTankGroup.remove(myTank_T2)myTank_T2.moveUp(allTankGroup, bgMap.brickGroup, bgMap.ironGroup) allTankGroup.add(myTank_T2)moving2 = 7movdir2 = 0running_T2 = Trueelif key_pressed[pygame.K_DOWN]:allTankGroup.remove(myTank_T2)myTank_T2.moveDown(allTankGroup, bgMap.brickGroup, bgMap.ironGroup) allTankGroup.add(myTank_T2)moving2 = 7movdir2 = 1running_T2 = Trueelif key_pressed[pygame.K_LEFT]:allTankGroup.remove(myTank_T2)myTank_T2.moveLeft(allTankGroup, bgMap.brickGroup, bgMap.ironGroup) allTankGroup.add(myTank_T2)moving2 = 7movdir2 = 2running_T2 = Trueelif key_pressed[pygame.K_RIGHT]:allTankGroup.remove(myTank_T2)myTank_T2.moveRight(allTankGroup, bgMap.brickGroup, bgMap.ironGroup) allTankGroup.add(myTank_T2)moving2 = 7movdir2 = 3running_T2 = Trueif key_pressed[pygame.K_KP0]:if not myTank_T2.bullet.life:# fire_sound.play()myTank_T2.shoot()# 画背景screen.blit(background_image, (0, 0))# 画砖块for each in bgMap.brickGroup:screen.blit(each.image, each.rect)# 花⽯头for each in bgMap.ironGroup:screen.blit(each.image, each.rect)# 画homeif homeSurvive:screen.blit(home_image, (3 + 12 * 24, 3 + 24 * 24))else:screen.blit(home_destroyed_image, (3 + 12 * 24, 3 + 24 * 24))# 画我⽅坦克1if not (delay % 5):switch_R1_R2_image = not switch_R1_R2_imageif switch_R1_R2_image and running_T1:screen.blit(myTank_T1.tank_R0, (myTank_T1.rect.left, myTank_T1.rect.top)) running_T1 = Falseelse:screen.blit(myTank_T1.tank_R1, (myTank_T1.rect.left, myTank_T1.rect.top)) # 画我⽅坦克2if switch_R1_R2_image and running_T2:screen.blit(myTank_T2.tank_R0, (myTank_T2.rect.left, myTank_T2.rect.top))running_T2 = Falseelse:screen.blit(myTank_T2.tank_R1, (myTank_T2.rect.left, myTank_T2.rect.top))# 画敌⽅坦克for each in allEnemyGroup:# 判断5⽑钱特效是否播放if each.flash:# 判断画左动作还是右动作if switch_R1_R2_image:screen.blit(each.tank_R0, (each.rect.left, each.rect.top))if enemyCouldMove:allTankGroup.remove(each)each.move(allTankGroup, bgMap.brickGroup, bgMap.ironGroup)allTankGroup.add(each)else:screen.blit(each.tank_R1, (each.rect.left, each.rect.top))if enemyCouldMove:allTankGroup.remove(each)each.move(allTankGroup, bgMap.brickGroup, bgMap.ironGroup)allTankGroup.add(each)else:# 播放5⽑钱特效if each.times > 0:each.times -= 1if each.times <= 10:screen.blit(appearance[2], (3 + each.x * 12 * 24, 3))elif each.times <= 20:screen.blit(appearance[1], (3 + each.x * 12 * 24, 3))elif each.times <= 30:screen.blit(appearance[0], (3 + each.x * 12 * 24, 3))elif each.times <= 40:screen.blit(appearance[2], (3 + each.x * 12 * 24, 3))elif each.times <= 50:screen.blit(appearance[1], (3 + each.x * 12 * 24, 3))elif each.times <= 60:screen.blit(appearance[0], (3 + each.x * 12 * 24, 3))elif each.times <= 70:screen.blit(appearance[2], (3 + each.x * 12 * 24, 3))elif each.times <= 80:screen.blit(appearance[1], (3 + each.x * 12 * 24, 3))elif each.times <= 90:screen.blit(appearance[0], (3 + each.x * 12 * 24, 3))if each.times == 0:each.flash = True# 绘制我⽅⼦弹1if myTank_T1.bullet.life:myTank_T1.bullet.move()screen.blit(myTank_T1.bullet.bullet, myTank_T1.bullet.rect)# ⼦弹碰撞⼦弹for each in enemyBulletGroup:if each.life:if pygame.sprite.collide_rect(myTank_T1.bullet, each):myTank_T1.bullet.life = Falseeach.life = Falsepygame.sprite.spritecollide(myTank_T1.bullet, enemyBulletGroup, True, None) # ⼦弹碰撞敌⽅坦克if pygame.sprite.spritecollide(myTank_T1.bullet, redEnemyGroup, True, None):prop.change()bang_sound.play()enemyNumber -= 1myTank_T1.bullet.life = Falseelif pygame.sprite.spritecollide(myTank_T1.bullet,greenEnemyGroup, False, None): for each in greenEnemyGroup:if pygame.sprite.collide_rect(myTank_T1.bullet, each):if each.life == 1:pygame.sprite.spritecollide(myTank_T1.bullet,greenEnemyGroup, True, None) bang_sound.play()enemyNumber -= 1elif each.life == 2:each.life -= 1each.tank = each.enemy_3_0elif each.life == 3:each.life -= 1each.tank = each.enemy_3_2myTank_T1.bullet.life = Falseelif pygame.sprite.spritecollide(myTank_T1.bullet, otherEnemyGroup, True, None): bang_sound.play()enemyNumber -= 1myTank_T1.bullet.life = False#if pygame.sprite.spritecollide(myTank_T1.bullet, allEnemyGroup, True, None):# bang_sound.play()# enemyNumber -= 1# myTank_T1.bullet.life = False# ⼦弹碰撞 brickGroupif pygame.sprite.spritecollide(myTank_T1.bullet, bgMap.brickGroup, True, None):myTank_T1.bullet.life = FalsemyTank_T1.bullet.rect.left, myTank_T1.bullet.rect.right = 3 + 12 * 24, 3 + 24 * 24 # ⼦弹碰撞 brickGroupif myTank_T1.bullet.strong:if pygame.sprite.spritecollide(myTank_T1.bullet, bgMap.ironGroup, True, None):myTank_T1.bullet.life = FalsemyTank_T1.bullet.rect.left, myTank_T1.bullet.rect.right = 3 + 12 * 24, 3 + 24 * 24 else:if pygame.sprite.spritecollide(myTank_T1.bullet, bgMap.ironGroup, False, None): myTank_T1.bullet.life = FalsemyTank_T1.bullet.rect.left, myTank_T1.bullet.rect.right = 3 + 12 * 24, 3 + 24 * 24 # 绘制我⽅⼦弹2if myTank_T2.bullet.life:myTank_T2.bullet.move()screen.blit(myTank_T2.bullet.bullet, myTank_T2.bullet.rect)# ⼦弹碰撞敌⽅坦克if pygame.sprite.spritecollide(myTank_T2.bullet, allEnemyGroup, True, None):bang_sound.play()enemyNumber -= 1myTank_T2.bullet.life = False# ⼦弹碰撞 brickGroupif pygame.sprite.spritecollide(myTank_T2.bullet, bgMap.brickGroup, True, None):myTank_T2.bullet.life = FalsemyTank_T2.bullet.rect.left, myTank_T2.bullet.rect.right = 3 + 12 * 24, 3 + 24 * 24 # ⼦弹碰撞 brickGroupif myTank_T2.bullet.strong:if pygame.sprite.spritecollide(myTank_T2.bullet, bgMap.ironGroup, True, None):myTank_T2.bullet.life = FalsemyTank_T2.bullet.rect.left, myTank_T2.bullet.rect.right = 3 + 12 * 24, 3 + 24 * 24 else:if pygame.sprite.spritecollide(myTank_T2.bullet, bgMap.ironGroup, False, None): myTank_T2.bullet.life = FalsemyTank_T2.bullet.rect.left, myTank_T2.bullet.rect.right = 3 + 12 * 24, 3 + 24 * 24 # 绘制敌⼈⼦弹for each in allEnemyGroup:# 如果⼦弹没有⽣命,则赋予⼦弹⽣命if not each.bullet.life and each.bulletNotCooling and enemyCouldMove:enemyBulletGroup.remove(each.bullet)each.shoot()enemyBulletGroup.add(each.bullet)each.bulletNotCooling = False# 如果5⽑钱特效播放完毕并且⼦弹存活则绘制敌⽅⼦弹if each.flash:if each.bullet.life:# 如果敌⼈可以移动if enemyCouldMove:each.bullet.move()screen.blit(each.bullet.bullet, each.bullet.rect)# ⼦弹碰撞我⽅坦克if pygame.sprite.collide_rect(each.bullet, myTank_T1):bang_sound.play()myTank_T1.rect.left, myTank_T1.rect.top = 3 + 8 * 24, 3 + 24 * 24each.bullet.life = Falsemoving = 0 # 重置移动控制参数for i in range(myTank_T1.level+1):myTank_T1.levelDown()if pygame.sprite.collide_rect(each.bullet, myTank_T2):bang_sound.play()myTank_T2.rect.left, myTank_T2.rect.top = 3 + 16 * 24, 3 + 24 * 24each.bullet.life = False# ⼦弹碰撞 brickGroupif pygame.sprite.spritecollide(each.bullet, bgMap.brickGroup, True, None):each.bullet.life = False# ⼦弹碰撞 ironGroupif each.bullet.strong:if pygame.sprite.spritecollide(each.bullet, bgMap.ironGroup, True, None):each.bullet.life = Falseelse:if pygame.sprite.spritecollide(each.bullet, bgMap.ironGroup, False, None):each.bullet.life = False# 最后画⾷物/道具if prop.life:screen.blit(prop.image, prop.rect)# 我⽅坦克碰撞⾷物/道具if pygame.sprite.collide_rect(myTank_T1, prop):if prop.kind == 1: # 敌⼈全毁for each in allEnemyGroup:if pygame.sprite.spritecollide(each, allEnemyGroup, True, None):bang_sound.play()enemyNumber -= 1prop.life = Falseif prop.kind == 2: # 敌⼈静⽌enemyCouldMove = Falseprop.life = Falseif prop.kind == 3: # ⼦弹增强myTank_T1.bullet.strong = Trueprop.life = Falseif prop.kind == 4: # 家得到保护for x, y in [(11,23),(12,23),(13,23),(14,23),(11,24),(14,24),(11,25),(14,25)]:bgMap.iron = wall.Iron()bgMap.iron.rect.left, bgMap.iron.rect.top = 3 + x * 24, 3 + y * 24bgMap.ironGroup.add(bgMap.iron)prop.life = Falseif prop.kind == 5: # 坦克⽆敌prop.life = Falsepassif prop.kind == 6: # 坦克升级myTank_T1.levelUp()prop.life = Falseif prop.kind == 7: # 坦克⽣命+1myTank_T1.life += 1prop.life = False# 延迟delay -= 1if not delay:delay = 100pygame.display.flip()clock.tick(60)总结到此这篇关于python+pygame实现坦克⼤战⼩游戏---可以⾃定义⼦弹速度的⽂章就介绍到这了,更多相关python+pygame实现坦克⼤战⼩游戏内容请搜索以前的⽂章或继续浏览下⾯的相关⽂章希望⼤家以后多多⽀持!。
韩顺平java坦克大战1.0版本_源代码

/**画坦克1。
0*/import java.awt.Color;import java.awt.Graphics;import java.awt.event。
KeyEvent;import java.awt。
event。
KeyListener;import java。
awt。
event.MouseEvent;import java。
awt。
event。
MouseListener;import java。
awt。
event.MouseMotionListener;import java.awt。
event。
WindowEvent;import java.awt。
event。
WindowListener;import javax。
swing。
JFrame;import javax.swing。
JPanel;public class MyTankGame extends JFrame{MyPanel mp=null;public static void main(String[] args){MyTankGame mtk=new MyTankGame();}public MyTankGame(){mp=new MyPanel();this.add(mp);//把面板加入窗体//注册监听this。
addMouseListener(mp);this.addKeyListener(mp);this。
addMouseMotionListener(mp);this.addWindowListener(mp);this.setTitle(”坦克大战");//窗体标题this。
setSize(600,400);//大小,宽,高(像素)this。
setLocation(300,300);//显示位置。
左边距,上边距//禁止用户改变窗口大小this。
setResizable(false);this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);this.setVisible(true);//显示}}//我的面板class MyPanel extends JPanel implements WindowListener,MouseListener,MouseMotionListener,KeyListener{//定义一个我的坦克Hero hero=null;Diren diren=null;public MyPanel(){hero=new Hero(300,200);diren=new Diren(100,0);//diren。
坦克大战

Java编程坦克大战源程序如下:图片自己添加,音乐为wav格式的:import javax.swing.*;import java.util.EventListener;import java.awt.*;import java.awt.event.*;import java.util.Vector;public class Tank1 extends JFrame implements ActionListener{MyPanel mb;passPanel pass;JMenuItem item1,item2;JMenu menu;JMenuBar bar;public static void main(String[] args){Tank1 tank=new Tank1();}public Tank1(){bar=new JMenuBar();menu=new JMenu("游戏(G)");menu.setMnemonic('G');//按Alt+F可以实现鼠标点击文件一样的功能item1=new JMenuItem("开始(N)");item2=new JMenuItem("退出(T)");item1.setMnemonic('N');item2.setMnemonic('T');item1.addActionListener(this);item1.setActionCommand("NEW");item2.addActionListener(this);item2.setActionCommand("OVER");menu.add(item1);menu.add(item2);bar.add(menu);pass=new passPanel();this.add(pass);Thread pa=new Thread(pass);pa.start();//起动关卡面板字体闪烁this.setJMenuBar(bar);this.setTitle("坦克游戏");this.setIconImage((new ImageIcon("tank.jpg")).getImage());this.setSize(700,700);this.setLocation(320,10);this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);this.setVisible(true);}public void actionPerformed(ActionEvent e) {if(e.getActionCommand().equals("NEW")){mb=new MyPanel();this.remove(pass);//删除旧面板,也就是关卡面板this.add(mb);this.addKeyListener(mb);//监听Thread t1=new Thread(mb);t1.start();//运行MyPanel类中的run方法this.setVisible(true);//显示游戏面板}if(e.getActionCommand().equals("OVER")){System.exit(0);}}}class passPanel extends JPanel implements Runnable{//关卡面板int time=0;//关卡面板闪烁时间public void paint(Graphics g){super.paint(g);g.fillRect(0,0,685,635);if(time%2==0){g.setColor(Color.green);Font myFont=new Font("华文行楷",Font.BOLD,60);g.setFont(myFont);g.drawString("坦克大战",220,300);}}public void run() {//闪烁功能while(true){try{Thread.sleep(500);}catch(Exception e){}time++;this.repaint();}}}class MyPanel extends JPanel implements KeyListener,Runnable{//自己定义的面板Vector<youTank> ytj=new Vector<youTank>();//定义敌方坦克,泛型,后面不用强制转换Vector<Burst> burst=new Vector<Burst>();//定义爆炸的集合Vector< MyTank> mytank=new Vector< MyTank>();MyTank mt=null;//定义一个我方坦克,Image tp1=null;//爆炸的图片Image tp2=null;Image tp3=null;Image tp4=null;Image tp5=null;Image tp6=null;int ytNum=3;//敌方坦克数量public MyPanel(){mt=new MyTank(310,500);//我方坦克出现位置mytank.add(mt);//添加集合mytank中for(int i=0;i<ytNum;i++){//敌方坦克youTank yt=new youTank((i)*300+10,50);yt.setDirect(1);yt.YT(ytj);//使得集合ytj一样Thread t3=new Thread(yt);t3.start();//启动敌方坦克线程Bullet yb=new Bullet(yt.x+27,yt.y+40,1);//定义敌方子弹yt.ybt.add(yb);Thread t4=new Thread(yb);t4.start();//子弹线程ytj.add(yt);//添加到敌方坦克集合中}//定义三张爆炸图片tp1=Toolkit.getDefaultToolkit().getImage(Panel.class.getResource("/bz.jpg"));tp2=Toolkit.getDefaultToolkit().getImage(Panel.class.getResource("/bz1.jpg"));tp3=Toolkit.getDefaultToolkit().getImage(Panel.class.getResource("/bz2.jpg"));tp4=Toolkit.getDefaultToolkit().getImage(Panel.class.getResource("/boss.jpg"));tp5=Toolkit.getDefaultToolkit().getImage(Panel.class.getResource("/boss1.jpg"));tp6=Toolkit.getDefaultToolkit().getImage(Panel.class.getResource("/boss2.jpg"));music sta=new music("./tank.wav");//音乐线程sta.start();}public void numbers(Graphics g){//显示敌我两方的坦克信息if(ytj.size()==0){//闯过关卡g.setColor(Color.green);Font myFont1=new Font("华文行楷",Font.BOLD,60);g.setFont(myFont1);g.drawString("闯关成功",220,300);}if(number.getMy()==-1||number.getBossCount()==-1){//我方被攻击完,或者boss灭亡g.setColor(Color.green);Font myFont1=new Font("华文行楷",Font.BOLD,100);g.setFont(myFont1);g.drawString("game over",180,300);}Font myFont=new Font("楷体",Font.BOLD,20);g.setFont(myFont);g.setColor(Color.red);//把血量设置为红色g.drawString("生命:",10,25);if(number.getMy()==-1){int J=number.getMy()+1;g.drawString(J+"",70, 25);}else{g.drawString(number.getMy()+"",70, 25);}g.fillRect(90,10,number.getMyCount()*60,15);g.drawRect(90,10,300,15);g.setColor(Color.green);g.drawString("得分: "+number.getScore(),10, 50); //击中敌方坦克数量g.setColor(Color.blue);g.drawString(":生命",630,25);g.drawString(number.getYou()+"",610,25);g.drawString(1+"",410,25);g.drawString(2+"",410,45);g.drawString(3+"",410,65);g.drawRect(430,30,170,15);g.drawRect(430,10,170,15);g.drawRect(430,50,170,15);try{g.fillRect(430,10,ytj.get(0).youCount*85,15);g.fillRect(430,30,ytj.get(1).youCount*85,15);g.fillRect(430,50,ytj.get(2).youCount*85,15);}catch(Exception e){}}public void paint(Graphics g){super.paint(g);g.fillRect(0,0,685,635);//对面板也就是画布进行填充黑色if(number.getBossCount()==3){g.drawImage(tp4,280,560,140,80,this);//添加boss}if(number.getBossCount()==2){g.drawImage(tp5,300,580,120,60,this);//添加boss}if(number.getBossCount()==1){g.drawImage(tp6,320,600,100,40,this);//添加boss}this.numbers(g);//启动numbers方法if(number.getMy()>=0){this.myDrawTank(mytank.get(0).getX(),mytank.get(0).getY(),g,mytank.get(0).direct,0);//对坦克进行制作}//g后面第一个代表方向,第二个代表我方和敌方坦克for(int i=0;i<ytj.size();i++){//敌方坦克youTank yt1=ytj.get(i);if(yt1.youCount!=0){//可以不带truethis.myDrawTank(yt1.getX(),yt1.getY(),g,yt1.direct,1);for(int j=0;j<yt1.ybt.size();j++){Bullet yb=yt1.ybt.get(j);//取集合类中的子弹if(yb!=null&&yb.limit==true){//使得子弹不能连接成一条线,limit控制子弹走到面板边界g.setColor(Color.blue);g.fillOval(yb.x,yb.y,10,10);}if(yb.limit==false){//如子弹到达边界时,则把这个子弹从集合类中删去yt1.ybt.remove(yb);}}}}for(int i=0;i<mytank.get(0).a.size();i++){Bullet bt1=mytank.get(0).a.get(i);//取集合类中的子弹if(bt1!=null&&bt1.limit==true){//使得子弹不能连接成一条线,limit控制子弹走到面板边界g.setColor(Color.red);g.fillOval(bt1.x,bt1.y,10,10);}if(bt1.limit==false){//如子弹到达边界时,则把这个子弹从集合类中删去mytank.get(0).a.remove(bt1);}}for(int i=0;i<burst.size();i++){//绘画出爆炸的效果Burst bt=burst.get(i);if(bt.time>6){g.drawImage(tp1,bt.x,bt.y,50,45,this);}else if(bt.time>3){g.drawImage(tp2,bt.x,bt.y,30,25,this);}else {g.drawImage(tp3,bt.x,bt.y,10,5,this);}bt.reduce();if(bt.time==0){burst.remove(bt);}}}public void hit(Bullet bt,Tank tk){//子弹击中坦克判断方法switch(tk.direct){//敌方坦克方向,如果子弹在坦克长宽大小范围内,则同时消失case 0:case 1:if(bt.x>tk.x&&bt.x<tk.x+65&&bt.y>tk.y&&bt.y<tk.y+50){tk.life=false;bt.limit=false;}break;case 2:case 3:if(bt.x>tk.x&&bt.x<tk.x+50&&bt.y>tk.y&&bt.y<tk.y+65){tk.life=false;bt.limit=false;}break;}}public void Life(int a){//坦克死亡和添加if(a==0){if(number.getYou()>0){ //如果敌方坦克还未出来的number.youNum();//坦克减少youTank yt=new youTank(number.getYou()*70,50);yt.setDirect(1);//设置坦克方向ytj.add(yt);yt.YT(ytj);//使得集合ytj一样Thread t6=new Thread(yt);t6.start();//启动敌方坦克线程}}if(a==1){if(number.getMyCount()==0){//如果被敌方击中5次Burst by1=new Burst(mytank.get(0).x,mytank.get(0).y);//添加爆炸burst.add(by1);if(number.getMy()>=0){number.myNum();//我方减少}if(number.getMy()>=0){mytank.remove(0);MyTank mt1=new MyTank(310,500);//我方坦克出现位置mytank.add(mt1);//添加集合mytank中number.setMyCount(5);}}}}public void myDrawTank(int x,int y,Graphics g,int direct,int form){//direct 意思是坦克的左右上下方向//form 意思是敌方和我方的坦克不一样,0代表我方,1代表敌方switch(form){case 0:g.setColor(Color.red);break;case 1:g.setColor(Color.blue);break;}switch(direct){case 0://代表坦克朝上g.fill3DRect(x,y,20,50,false);//矩形,前两个坐标,后长宽g.fill3DRect(x+20,y+10,24,30,false);//矩形,前两个坐标,后长宽g.fill3DRect(x+44,y,20,50,false);//矩形,前两个坐标,后长宽g.fill3DRect(x+27,y-20,10,30,false);g.fillOval(x+22,y+16,18,18);//画个圆break;case 1://代表朝下,改变直线位置g.fill3DRect(x,y,20,50,false);g.fill3DRect(x+20,y+10,24,30,false);g.fill3DRect(x+44,y,20,50,false);g.fill3DRect(x+27,y+40,10,30,false);g.fillOval(x+22,y+16,18,18);break;case 2://朝右g.fill3DRect(x,y,50,20,false);g.fill3DRect(x+10,y+20,30,24,false);g.fill3DRect(x,y+44,50,20,false);g.fill3DRect(x-20,y+27,30,10,false);g.fillOval(x+16,y+22,18,18);break;case 3://朝左g.fill3DRect(x,y,50,20,false);g.fill3DRect(x+10,y+20,30,24,false);g.fill3DRect(x,y+44,50,20,false);g.fill3DRect(x+40,y+27,30,10,false);g.fillOval(x+16,y+22,18,18);break;}}@Overridepublic void keyTyped(KeyEvent e) {}public void keyReleased(KeyEvent e) {}public void keyPressed(KeyEvent e) {if(e.getKeyCode()==KeyEvent.VK_W){this.mytank.get(0).setDirect(0);this.mytank.get(0).north();}else if(e.getKeyCode()==KeyEvent.VK_S){this.mytank.get(0).setDirect(1);this.mytank.get(0).south();}else if(e.getKeyCode()==KeyEvent.VK_A){this.mytank.get(0).setDirect(2);this.mytank.get(0).right();}else if(e.getKeyCode()==KeyEvent.VK_D){this.mytank.get(0).setDirect(3);this.mytank.get(0).left();}if(e.getKeyCode()==KeyEvent.VK_SPACE){//空格键控制子弹if(this.mytank.get(0).a.size()<10){//当子弹集合类中子弹数达到10个时,则不再发射子弹this.mytank.get(0).send();}}this.repaint();}@Overridepublic void run(){//让睡眠之后再重新绘制画面,就是为了让子弹自己运动while(true) {try{Thread.sleep(100);}catch(Exception e){}for(int i=0;i<ytj.size();i++){//boss被击中youTank yt2=ytj.get(i);for(int j=0;j<yt2.ybt.size();j++){Bullet by=yt2.ybt.get(j);if(number.getBossCount()==3){if(by.x>280&&by.x<420&&by.y>560){by.limit=false;number.BossCount();}}if(number.getBossCount()==2){if(by.x>300&&by.x<400&&by.y>580){by.limit=false;number.BossCount();}}if(number.getBossCount()==1){if(by.x>320&&by.x<400&&by.y>600){by.limit=false;number.BossCount();}}if(number.getBossCount()==0){number.BossCount();Burst by2=new Burst(340,600);//添加爆炸burst.add(by2);}}}for(int i=0;i<mytank.get(0).a.size();i++){//敌方,每个子弹都和每个敌方坦克比较Bullet bt2=mytank.get(0).a.get(i);//取出子弹if(bt2.limit){//如果子弹limit为truefor(int j=0;j<ytj.size();j++){youTank yt1=ytj.get(j);//取出敌方坦克if(yt1.life){this.hit(bt2,yt1);if(yt1.life==false){yt1.youCount--;yt1.life=true;if(yt1.youCount==0){ytj.remove(j);//如果死亡则删除number.scoreNum();//得分Burst by=new Burst(yt1.x,yt1.y);//添加爆炸burst.add(by);this.Life(0);}}}}}}for(int i=0;i<ytj.size();i++){//我方坦克是否被击中youTank yt2=ytj.get(i);for(int j=0;j<yt2.ybt.size();j++){Bullet by=yt2.ybt.get(j);this.hit(by,mytank.get(0));if(mytank.get(0).life==false){//我方坦克被击中number.myCountNum();//被击中mytank.get(0).life=true;//复活this.Life(1);}}}this.repaint();//在for外面,不然敌方坦克不能动}}}import java.io.File;import java.util.Vector;import javax.sound.sampled.AudioFormat;import javax.sound.sampled.AudioInputStream;import javax.sound.sampled.AudioSystem;import javax.sound.sampled.DataLine;import javax.sound.sampled.SourceDataLine;class Tank{int x=0,y=0;int direct=0;//坦克方向0代表向上,1代表向下,2代表向右,3代表向左int speed=10;//坦克速度boolean life=true;//定义坦克的生命死亡public int getDirect() {return direct;}public void setDirect(int direct) {this.direct = direct;}public int getSpeed() {return speed;}public void setSpeed(int speed) {this.speed = speed;}public int getX() {return x;}public void setX(int x) {this.x = x;}public int getY() {return y;}public void setY(int y) {this.y = y;}public Tank(int x,int y){//构造函数this.x=x;this.y=y;}}class MyTank extends Tank{//我方坦克,继承坦克类,子弹跟着坦克走Vector<Bullet> a=new Vector<Bullet>();//把子弹放到一个集合类中Bullet bt=null;//定义子弹public MyTank(int x,int y){super(x,y);}public void send(){//发射子弹方法switch(this.direct){//我方子弹方向和坦克方向一样,this.direct为Tank中的case 0:bt=new Bullet(x+27,y,0);//最后的0为子弹方向a.add(bt);//添加子弹break;case 1:bt=new Bullet(x+27,y+40,1);a.add(bt);break;case 2:bt=new Bullet(x,y+27,2);a.add(bt);break;case 3:bt=new Bullet(x+44,y+27,3);a.add(bt);break;}Thread t2=new Thread(bt);t2.start();//子弹的run方法,Bullet类中的}public void north(){//向上运动if(y>50){y-=speed;}}public void south(){if(y<570){y+=speed;}}public void right(){if(x>0){x-=speed;}}public void left(){if(x<620){x+=speed;}}}class youTank extends Tank implements Runnable{//敌方坦克,继承坦克类int speed=2;//可以继承坦克类的速度,也可以自己再定义int time=0;//时间int youCount=2;//敌方被击中次数Vector<Bullet> ybt=new Vector<Bullet>();//定义敌方坦克子弹集合Vector<youTank> ytj=new Vector<youTank>();public youTank(int x,int y){super(x,y);}public void YT(Vector<youTank> ytjh){this.ytj=ytjh;}public boolean crash(){boolean b=false;switch(this.direct){case 0:for(int i=0;i<ytj.size();i++){youTank yt=ytj.get(i);if(yt!=this){if(yt.direct==0||yt.direct==1){if(this.x>=yt.x && this.x<=yt.x+65 && this.y>=yt.y && this.y<=yt.y+50){return true;}if(this.x+65>=yt.x && this.x+65<=yt.x+65 && this.y>=yt.y && this.y<=yt.y+50){return true;}}if(yt.direct==3||yt.direct==2){if(this.x>=yt.x && this.x<=yt.x+50 && this.y>=yt.y && this.y<=yt.y+65){return true;}if(this.x+65>=yt.x && this.x+65<=yt.x+50 && this.y>=yt.y && this.y<=yt.y+65){return true;}}}}break;case 1:for(int i=0;i<ytj.size();i++){youTank yt=ytj.get(i);if(yt!=this){if(yt.direct==0||yt.direct==1){if(this.x>=yt.x&&this.x<=yt.x+65&&this.y>=yt.y&&this.y<=yt.y+50){return true;}if(this.x>=yt.x&&this.x<=yt.x+65&&this.y+65>=yt.y&&this.y+65<=yt.y+50){return true;}}if(yt.direct==3||yt.direct==2){if(this.x>=yt.x&&this.x<=yt.x+50&&this.y>=yt.y&&this.y<=yt.y+65){return true;}if(this.x>=yt.x&&this.x<=yt.x+50&&this.y+65>=yt.y&&this.y+65<=yt.y+65){return true;}}}}break;case 2:for(int i=0;i<ytj.size();i++){youTank yt=ytj.get(i);if(yt!=this){if(yt.direct==0||yt.direct==1){if(this.x>=yt.x&&this.x<=yt.x+65&&this.y+50>=yt.y&&this.y+50<=yt.y+50){return true;}if(this.x+65>=yt.x&&this.x+65<=yt.x+65&&this.y+50>=yt.y&&this.y+50<=yt.y+50){return true;}}if(yt.direct==3||yt.direct==2){if(this.x>=yt.x&&this.x<=yt.x+50&&this.y+50>=yt.y&&this.y+50<=yt.y+65){return true;}if(this.x+65>=yt.x&&this.x+65<=yt.x+50&&this.y+50>=yt.y&&this.y+50<=yt.y+65){return true;}}}}break;case 3:for(int i=0;i<ytj.size();i++){youTank yt=ytj.get(i);if(yt!=this){if(yt.direct==0||yt.direct==1){if(this.x+50>=yt.x && this.x+50<=yt.x+65 && this.y>=yt.y && this.y<=yt.y+50){return true;}if(this.x+50>=yt.x && this.x+50<=yt.x+65 && this.y+65>=yt.y && this.y+65<=yt.y+50){return true;}}if(yt.direct==3||yt.direct==2){if(this.x+50>=yt.x && this.x+50<=yt.x+50 && this.y>=yt.y && this.y<=yt.y+65){return true;}if(this.x+50>=yt.x && this.x+50<=yt.x+50 && this.y+65>=yt.y && this.y+65<=yt.y+65){return true;}}}}break;}return b;}public void run() {while(true){//坦克要一直活动,直到死亡switch(this.direct){case 0:for(int i=0;i<25;i++){if(y>50&&crash()==false){y-=speed;}try{Thread.sleep(50);}catch(Exception e){}}break;case 1:for(int i=0;i<25;i++){if(y<570&&crash()==false){y+=speed;}try{Thread.sleep(50);}catch(Exception e){}}break;case 2:for(int i=0;i<25;i++){if(x>0&&crash()==false){x-=speed;}try{Thread.sleep(50);}catch(Exception e){}}break;case 3:for(int i=0;i<25;i++){if(x<620&&crash()==false){x+=speed;}try{Thread.sleep(50);}catch(Exception e){}}break;}this.direct=(int)(Math.random()*4);//0到3之间的数字if(this.youCount==0){//如果坦克死亡break;}this.time++;if(time%2==0){//可以加,也可以不加if(this.youCount!=0){//没有死亡if(ybt.size()<6){//敌方坦克可以发射的子弹数Bullet yb=null;switch(direct){//坦克方向case 0:yb=new Bullet(x+27,y,0);//最后的0为子弹方向ybt.add(yb);break;case 1:yb=new Bullet(x+27,y+40,1);ybt.add(yb);break;case 2:yb=new Bullet(x,y+27,2);ybt.add(yb);break;case 3:yb=new Bullet(x+44,y+27,3);ybt.add(yb);break;}Thread t5=new Thread(yb);//子弹线程t5.start();}}}}}}class Bullet implements Runnable{//创建子弹类,实现线程接口int x;int y;int direct;//子弹方向int speed=5;//子弹速度boolean limit=true;//控制子弹走到面板边界public Bullet(int x,int y,int direct){this.x=x;this.y=y;this.direct=direct;}public void run() {while(true){//凡是线程下死循环就要有个睡眠try{Thread.sleep(50);}catch(Exception e){}switch(this.direct){//this.direct为本类中的case 0:y-=speed;break;case 1:y+=speed;break;case 2:x-=speed;break;case 3:x+=speed;break;}if(x<0||x>680||y<0||y>630){//控制子弹走到面板边界this.limit=false;break;}}}}class Burst{//定义爆炸类int x,y;int time=9;//生存时间boolean life=true;public Burst(int x,int y){this.x=x;this.y=y;}public void reduce(){if(time>0){time--;}else{this.life=false;}}}class number{//记录敌我两方的坦克数量private static int my=2;//我方还剩余人数private static int you=7;//还剩余人数private static int score=0;//得分private static int myCount=5;//我方被击中次数private static int bossCount=3;//boss只能被攻击三次public static int getBossCount() {return bossCount;}public static void setBossCount(int bossCount) {number.bossCount = bossCount;}public static int getScore() {return score;}public static void setScore(int score) {number.score = score;}public static int getMyCount() {return myCount;}public static void setMyCount(int myCount) {number.myCount = myCount;}public static int getMy() {return my;}public static void setMy(int my) {number.my = my;}public static int getYou() {return you;}public static void setYou(int you) {number.you = you;}public static void youNum(){//敌方减少you--;}public static void myNum(){//我方减少my--;}public static void myCountNum(){//被击中myCount--;}public static void scoreNum(){//得分score++;}public static void BossCount(){bossCount--;}}class music extends Thread {//插入音乐private String mus;public music(String musi){mus=musi;}public void run() {File file = new File(mus);AudioInputStream input = null;try {input = AudioSystem.getAudioInputStream(file);} catch (Exception e){}AudioFormat format = input.getFormat();SourceDataLine data = null; info = new (SourceDataLine.class, format);try {data = (SourceDataLine) AudioSystem.getLine(info);data.open(format);} catch (Exception e){}data.start();int str = 0;byte[] byt = new byte[1024];try {while (str != -1) {str = input.read(byt, 0, byt.length);if (str >= 0)data.write(byt, 0, str );}} catch (Exception e){}finally {data.drain();//将残留部分处理干净data.close();}}}。
java坦克大战源代码

package com.cwj.tankGame;import javax.sound.sampled.*;import java.io*;import java.awt.*;import java.io.IOException;import java.util.*;import javax.swing,*;import javax.imageio.ImageIO;import javax.swing.*;class AePlayWave extends Thread {private String filename;public AePlayWave(String wavfile) {filename = wavfile;}public void run() {File soundFile = new File(filename);AudioInputStream audioInputStream = null;try {audioInputStream = AudioSystem.getAudioInputStream(soundFile);} catch (Exception e1) {e1.printStackTrace();return;}AudioFormat format = audioInputStream.getFormat(); SourceDataLine auline = null; info = new (SourceDataLine.class, format); try {auline = (SourceDataLine) AudioSystem.getLine(info);auline.open(format);} catch (Exception e) {e.printStackTrace();return;}auline.start();int nBytesRead = 0;//这是缓冲byte[] abData = new byte[512];try {while (nBytesRead != -1) {nBytesRead = audioInputStream.read(abData, 0, abData.length); if (nBytesRead >= 0)auline.write(abData, 0, nBytesRead);}} catch (IOException e) {e.printStackTrace();return;} finally {auline.drain();auline.close();}}}class Bomb{int x;int y;int lifeTime = 10;boolean isLive=true;public Bomb(int x,int y){this.x=x;this.y=y;}public void lifeDown(){if(lifeTime>0){lifeTime--;}else{this.isLive=false;}}}class EnemyTank extends Tank implements Runnable{int n=1;//敌方坦克转弯n次发射一颗子弹int MaxShot = 10;int runDistance = 10;//变一次方向前进的距离//定义一个向量可以访问MyPanel上所有地方坦克Vector<EnemyTank> ets =new Vector<EnemyTank>();Vector<Shot> ss = new Vector<Shot>();public void setEts(Vector<EnemyTank> v){this.ets=v;}public int abs(int x){if(x>0)return x;elsereturn -x;}public boolean isTouchOther(){switch(this.direction){case 0://上for(int i=0;i<ets.size();i++){EnemyTank t = ets.get(i);if(t!=this)//不是自己这辆坦克{if(abs(this.x-t.x)<=40&&this.y>t.y&&this.y-t.y<=40) {return true;}}}break;case 2://下for(int i=0;i<ets.size();i++){EnemyTank t = ets.get(i);if(t!=this)//不是自己这辆坦克{if(abs(this.x-t.x)<=40&&t.y>this.y&&t.y-this.y<=40) {return true;}}}break;case 1://左for(int i=0;i<ets.size();i++){EnemyTank t = ets.get(i);if(t!=this)//不是自己这辆坦克{if(abs(this.y-t.y)<=40&&this.x>t.x&&this.x-t.x<=40) {return true;}}}break;case 3://右for(int i=0;i<ets.size();i++){EnemyTank t = ets.get(i);if(t!=this)//不是自己这辆坦克{if(abs(this.y-t.y)<=40&&this.x<t.x&&t.x-this.x<=40) {return true;}}}break;}return false;}public EnemyTank(int x,int y){super(x,y);}int time=0;public void sleep(){try{Thread.sleep(50);}catch(Exception e){e.printStackTrace();}}public void run() {while(true){switch(direction){case 0:for(int i =0;i<this.runDistance;i++){if(y>20&&!this.isTouchOther())y-=speed;this.sleep();}break; case 1:for(int i =0;i<this.runDistance;i++){if(x>20&&!this.isTouchOther())x-=speed;this.sleep();}break; case 2:for(int i =0;i<this.runDistance;i++){if(y<580&&!this.isTouchOther())y+=speed;this.sleep();}break; case 3:for(int i =0;i<this.runDistance;i++){if(x<780&&!this.isTouchOther())x+=speed;this.sleep();}break; }this.direction=(int)(Math.random()*4);if(this.isLive==false){break;}else{time++;if(time%n==0)if(ss.size()<MaxShot){Shot s = new Shot(x,y);s.setDirection(direction);ss.add(s);Thread t = new Thread(s);t.start();}}}}}class MyTank extends Tank{int MAXSHOT=20;public int getMAXSHOT() {return MAXSHOT;}public void setMAXSHOT(int mAXSHOT) { MAXSHOT = mAXSHOT;}Shot shot=null;Vector<Shot> ss = new Vector<Shot>(); public MyTank(int x,int y){super(x,y);}public void fire(){if(this.isLive==true){shot = new Shot(x,y);ss.add(shot);Thread t = new Thread(shot);t.start();shot.setDirection(this.direction);}}public void moveUp(){if(y>20)y-=speed;}public void moveLeft(){if(x>20)x-=speed;}public void moveDown(){if(y<580)y+=speed;}public void moveRight(){if(x<780)x+=speed;}class Node {int x;public int getX() {return x;}public void setX(int x) {this.x = x;}public int getY() {return y;}public void setY(int y) {this.y = y;}public int getDirection() {return direction;}public void setDirection(int direction) { this.direction = direction;}int y;int direction;public Node(int x,int y){this.x=x;this.y=y;}}class Record {//记录每关有多少敌人private static int etNum=20;private static int sum = 0;private static FileWriter fw=null;private static BufferedWriter bw = null; private static FileReader fr = null; private static BufferedReader br = null; private static Vector<Node> nodes=null; public static Vector<Node> getNodes() { return nodes;public static void setNodes(Vector<Node> nodes) { Record.nodes = nodes;}public static Vector<EnemyTank> ets = null;public static Vector<EnemyTank> getEts() {return ets;}public static void setEts(Vector<EnemyTank> ets) { Record.ets = ets;}public static void restoreRecord(){try {nodes = new Vector<Node>();File file = new File("e:\\tankGame.txt");if(!file.isDirectory()){if(file.createNewFile())System.out.println("成功创建文件e:\\tankGame.txt"); }fr = new FileReader("e:\\tankGame.txt");br = new BufferedReader(fr);String strSum = br.readLine();if(strSum!=null)sum = Integer.parseInt(strSum);else return;String str="";while((str=br.readLine())!=null){String []xyd=str.split(" ");int x,y,direction;x = Integer.parseInt(xyd[0]);y = Integer.parseInt(xyd[1]);direction = Integer.parseInt(xyd[2]);Node node = new Node(x,y);node.setDirection(direction);nodes.add(node);}for(int i=0;i<nodes.size();i++){System.out.println(nodes.get(i).x+" "+nodes.get(i).y+" "+nodes.get(i).direction); }} catch (Exception e) {e.printStackTrace();}finally{try {if(br!=null)br.close();if(fr!=null)fr.close();} catch (IOException e) {e.printStackTrace();}}}public static void keepRecord(){try {fw = new FileWriter("e:\\tankGame.txt");bw = new BufferedWriter(fw);bw.write(sum+"\r\n");for(int i =0;i<ets.size();i++){EnemyTank et = ets.get(i);if(et.isLive==true){String record = et.x+" "+et.y+" "+et.getDirection()+"\r\n";bw.write(record);}}} catch (Exception e) {e.printStackTrace();}finally{try {if(bw!=null)bw.close();if(fw!=null)fw.close();} catch (IOException e) {e.printStackTrace();}}}public static int getSum() {return sum;}public static void setSum(int sum) { Record.sum = sum;}public static void addSum(){sum++;}public static int getEtNum() {return etNum;}public static void setEtNum(int etNum) { Record.etNum = etNum;}public static int getMyLife() {return myLife;}public static void setMyLife(int myLise) { Record.myLife = myLise;}//生命数private static int myLife=3;public static void reduceEtNum(){etNum--;}public static void reduceMyLife(){myLife--;}}class Shot implements Runnable{int x;int speed=5;int y;int direction;boolean isLive=true;public void run(){while(true){try{Thread.sleep(100);}catch(Exception e){e.printStackTrace();}switch(this.direction){case 0:y-=speed;break;case 1:x-=speed;break;case 2:y+=speed;break;case 3:x+=speed;break;}if(x<0||x>800||y<0||y>600){this.isLive=false;break;}}//while}public int getSpeed() {return speed;}public void setSpeed(int speed) { this.speed = speed;}public int getX() {return x;}public void setX(int x) {this.x = x;}public int getY() {return y;}public void setY(int y) {this.y = y;}public int getDirection() {return direction;}public void setDirection(int direction) { this.direction = direction;}public Shot(int x,int y){this.x=x;this.y=y;}}class Tank{boolean isLive=true;int x=0;int y=0;int color;public int getColor() {return color;}public void setColor(int color) {this.color = color;}int speed=3;int direction=0;//0上1左2下3右public int getSpeed() {return speed;}public void setSpeed(int speed) { this.speed = speed;}public int getDirection() {return direction;}public void setDirection(int direction) { this.direction = direction;}public int getX() {return x;}public void setX(int x) {this.x = x;}public int getY() {return y;}public void setY(int y) {this.y = y;}public Tank(int x,int y){this.x=x;this.y=y;}}public class TankGame extends JFrame implements ActionListener{ MyPanel mp=null;MyStartPanel msp = null;JMenuBar jmb =null;JMenu jm1=null;JMenuItem jmi11 =null;JMenuItem jmi12 = null;JMenuItem jmi13 = null;JMenuItem jmi14 = null;public static void main(String[]args){TankGame t = new TankGame();}public TankGame(){/*mp=new MyPanel();this.add(mp);Thread t = new Thread(mp);t.start();this.addKeyListener(mp);*/jmb = new JMenuBar();jm1 = new JMenu("游戏(G)");jm1.setMnemonic('G');jmi11 = new JMenuItem("开始游戏(N)");jmi11.addActionListener(this);jmi11.setActionCommand("newgame");jmi11.setMnemonic('N');jmi12 = new JMenuItem("退出游戏(E)");jmi12.addActionListener(this);jmi12.setActionCommand("exitgame");jmi12.setMnemonic('E');jmi13 = new JMenuItem("退出并保存(O)");jmi13.addActionListener(this);jmi13.setActionCommand("exitandsave");jmi13.setMnemonic('O');jmi14 = new JMenuItem("继续游戏(S)");jmi14.addActionListener(this);jmi14.setActionCommand("continue");jmi14.setMnemonic('S');jm1.add(jmi11);jm1.add(jmi13);jm1.add(jmi14);jm1.add(jmi12);jmb.add(jm1);this.setJMenuBar(jmb);msp = new MyStartPanel();Thread t = new Thread(msp);t.start();this.add(msp);this.setSize(900, 700);this.setLocationRelativeTo(null);this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);this.setTitle("坦克大战欢迎加qq1036624975交流学习编程爱好者学习交流群294787264");this.setVisible(true);}public void actionPerformed(ActionEvent e) {if(e.getActionCommand().equals("newgame")){if(mp!=null)this.remove(mp);mp = new MyPanel("newGame");Thread t = new Thread(mp);t.start();this.remove(msp);this.add(mp);this.addKeyListener(mp);this.setVisible(true);AePlayWave apw = new AePlayWave("e://tank.wav"); new Thread(apw).start();}else if(e.getActionCommand().equals("exitgame")){System.exit(0);}else if(e.getActionCommand().equals("exitandsave")) {Record.setEts(mp.et);Record.keepRecord();System.exit(0);}else if(e.getActionCommand().equals("continue")){Record.restoreRecord();if(mp!=null)this.remove(mp);mp = new MyPanel("oldGame");Thread t = new Thread(mp);t.start();this.remove(msp);this.add(mp);this.addKeyListener(mp);this.setVisible(true);}}}class MyStartPanel extends JPanel implements Runnable {int count=0;public void paint(Graphics g){super.paint(g);g.fillRect(0, 0, 800, 600);if(count%6==0)g.setColor(Color.YELLOW);else if(count%6==1)g.setColor(Color.BLUE);else if(count%6==2)g.setColor(Color.CYAN);else if(count%6==3)g.setColor(Color.GREEN);else if(count%6==4)g.setColor(Color.ORANGE);else if(count%6==5)g.setColor(Color.PINK);g.setFont(new Font("黑体",Font.PLAIN,100));g.drawString("第一关",250,300);g.setFont(new Font("黑体",Font.PLAIN,20));g.drawString("w上s下a左d右j发射子弹", 0, 20);if(count>20000)count=0;}public void run() {while(true){try {Thread.sleep(300);} catch (Exception e) {e.printStackTrace();}count++;this.repaint();}}}class MyPanel extends JPanel implements KeyListener,Runnable {Image bomb1=null;Image bomb2=null;Image bomb3=null;MyTank mt = null;//我的坦克Vector<EnemyTank>et=new Vector<EnemyTank>();Vector<Bomb>bombs = new Vector<Bomb>();Vector<Node>nodes =null;int enemyTankNum=20;public MyPanel(String ifNew){Record.restoreRecord();mt = new MyTank(300,570);mt.setSpeed(7);mt.setColor(0);//初始化敌人的坦克if(ifNew.equals("newGame")){for(int i =0;i<enemyTankNum;i++){EnemyTank tank = null;if(i<10){tank=new EnemyTank((i+1)*70,20);}else{tank = new EnemyTank(((i-9))*70,80);}tank.setDirection(2);Thread t = new Thread(tank);t.start();Shot s = new Shot(tank.x,tank.y);s.setDirection(tank.direction);new Thread(s).start();tank.ss.add(s);tank.setColor(1);et.add(tank);tank.setEts(et);}}else if(ifNew.equals("oldGame")){nodes=Record.getNodes();for(int i =0;i<nodes.size();i++){Node node = nodes.get(i);EnemyTank tank = null;tank = new EnemyTank(node.getX(),node.getY()); tank.setDirection(node.getDirection());Thread t = new Thread(tank);t.start();Shot s = new Shot(tank.x,tank.y);s.setDirection(tank.direction);new Thread(s).start();tank.ss.add(s);tank.setColor(1);et.add(tank);tank.setEts(et);}}//三张图片,组成一颗炸弹try {bomb1=ImageIO.read(new File("image/bomb_1.gif"));bomb2=ImageIO.read(new File("image/bomb_2.gif"));bomb3=ImageIO.read(new File("image/bomb_3.gif"));} catch (IOException e) {// TODO Auto-generated catch blocke.printStackTrace();}//以下方式加载图片第一次爆炸效果不明显/*bomb1=Toolkit.getDefaultToolkit().getImage("image/bomb_1.gif"); bomb2=Toolkit.getDefaultToolkit().getImage("image/bomb_2.gif"); bomb3=Toolkit.getDefaultToolkit().getImage("image/bomb_3.gif");*/ }public void showMessage(Graphics g){this.paintTank(825, 20, g, 0, 1);this.paintTank(825, 80, g, 0, 0);g.setColor(Color.BLACK);g.drawString("x"+Record.getEtNum(),850,20);g.drawString("x"+Record.getMyLife(), 850, 80);g.setFont(new Font("华文彩云",Font.BOLD,20));g.drawString("总成绩", 2, 620);g.drawString(""+Record.getSum(), 76, 620);}public void paint(Graphics g){super.paint(g);g.fillRect(0, 0, 800, 600);this.showMessage(g);if(mt.isLive==true)paintTank(mt.getX(),mt.getY(),g,mt.getDirection(),mt.getColor());//画敌人坦克for(int i=0;i<et.size();i++){EnemyTank t = et.get(i);if(t.isLive==true){paintTank(t.getX(),t.getY(),g,t.getDirection(),t.getColor());for(int j = 0;j<t.ss.size();j++)//画子弹{if(s.isLive==true){g.setColor(Color.RED);g.fillRect(s.getX(), s.getY(), 5,5);}else{t.ss.remove(s);}}}else{et.remove(t);}}//爆炸效果for(int i=0;i<bombs.size();i++){Bomb b = bombs.get(i);if(b.lifeTime>6){g.drawImage(bomb1,b.x,b.y,40,40,this);}else if(b.lifeTime>3){g.drawImage(bomb2,b.x,b.y,40,40,this);}else{g.drawImage(bomb3,b.x,b.y,40,40,this);}b.lifeDown();if(b.lifeTime==0){bombs.remove(b);}}for(int i =0;i<mt.ss.size();i++)//我的画子弹{Shot s = mt.ss.get(i);if(s!=null&&s.isLive==true){g.setColor(Color.YELLOW);g.fillRect(s.getX(), s.getY(),5, 5);}if(s.isLive==false) //子弹清空,才能打下一发子弹{}}}//被攻击public void hitMyTank(){for(int i=0;i<et.size();i++){EnemyTank e=et.get(i);for(int j=0;j<e.ss.size();j++){Shot enemyShot = e.ss.get(j); boolean res=false;res = this.isHitTank(enemyShot, mt); if(res==true)Record.reduceMyLife();}}}//攻击敌方坦克public void hitEnemyTank(){for(int i=0;i<mt.ss.size();i++){Shot shot = mt.ss.get(i);if(shot.isLive==true){for(int j =0;j<et.size();j++){EnemyTank etank = et.get(j);if(etank.isLive==true){boolean res=false;res=this.isHitTank(shot, etank);if(res==true){Record.reduceEtNum();Record.addSum();}}}}}}//判断子弹是否击中坦克public boolean isHitTank(Shot shot,Tank etank){boolean res=false;if(shot.x>etank.x-20&&shot.x<etank.x+20&&shot.y>etank.y-20&&shot.y<etank.y+20&&et ank.isLive==true)//子弹击中{shot.isLive=false;etank.isLive=false;Bomb bomb = new Bomb(etank.getX()-20,etank.getY()-20);bombs.add(bomb);res = true;}return res;}public void paintTank(int x,int y,Graphics g,int direction,int type){switch(type)//判断坦克类型{case 0:g.setColor(Color.yellow);//自己的break;case 1:g.setColor(Color.RED);//敌人的break;}switch(direction){case 0://上g.fillRect(x-20, y-20, 40, 40);g.fill3DRect(x-5, y-20, 10, 20,false);break;case 1://左g.fillRect(x-20, y-20, 40, 40);g.fill3DRect(x-20, y-5, 20, 10,false);break;case 2://下g.fillRect(x-20, y-20, 40, 40);g.fill3DRect(x-5, y, 10, 20,false);break;case 3://右g.fillRect(x-20, y-20, 40, 40);g.fill3DRect(x, y-5, 20, 10,false);break;}}@Overridepublic void keyTyped(KeyEvent e) {// TODO Auto-generated method stub}@Overridepublic void keyPressed(KeyEvent e) {// TODO Auto-generated method stubif(e.getKeyCode()==KeyEvent.VK_J)//发射子弹{if(this.mt.ss.size()<this.mt.getMAXSHOT()) {this.mt.fire();}}if(e.getKeyCode()==KeyEvent.VK_W){mt.setDirection(0);this.mt.moveUp();}else if(e.getKeyCode()==KeyEvent.VK_A) {mt.setDirection(1);this.mt.moveLeft();}else if(e.getKeyCode()==KeyEvent.VK_S) {mt.setDirection(2);this.mt.moveDown();}else if(e.getKeyCode()==KeyEvent.VK_D) {mt.setDirection(3);this.mt.moveRight();}this.repaint();}@Overridepublic void keyReleased(KeyEvent e) {// TODO Auto-generated method stub}@Overridepublic void run() {// TODO Auto-generated method stubwhile(true){try {Thread.sleep(50);//50毫秒重绘一次} catch (InterruptedException e) {// TODO Auto-generated catch blocke.printStackTrace();}this.hitEnemyTank();//判断己方坦克是否击中敌方坦克this.hitMyTank();//判断敌方坦克是否击中己方坦克this.repaint();}}}。
坦克大战程序代码

importjava.awt.*;importjavax.swing.*;importimportclassfextendsJFrame{f(Stringtitle){this.setTitle(title);this.setSize(608,630);this.setLocation(300,100);this.setBackground(Color.BLACK); MyTankmp=newMyTank();this.add(mp);this.addKeyListener(mp); newThread(mp).start();}publicstaticvoidmain(String[]args){ fh=newf("坦克大战(版本1.0)");h.setVisible(true);}}//主战坦克//子弹intdx=295,dy=295;intdx1=295,dy1=-10;intdx2=600,dy2=295;intdx3=295,dy3=600;intdx4=-10,dy4=295;//敌军坦克intnum=10;//敌军坦克数量,不能修改int[]xf=newint[num];int[]yf=newint[num];int[]opf=newint[num];int[]dxf=newint[num];int[]dyf=newint[num];int[]dxf1=newint[num];int[]dyf2=newint[num];int[]dxf3=newint[num];int[]dyf3=newint[num];int[]dxf4=newint[num];int[]dyf4=newint[num];//构造函数,初始化敌军坦克的位置和状态MyTank(){for(inti=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(inti=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;}}//主面版publicvoidpaint(Graphicsg){switch(color%6){case0:g.setColor(Color.blue);break; case1:g.setColor(Color.yellow);break; case2:g.setColor(Color.red);break; case3:g.setColor(Color.orange);break; case4:g.setColor(Color.green);break; case5: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+35,10,10);g.setColor(Color.black);g.fillRect(x+15,y-20,10,40);switch(color%20){case0:g.setColor(Color.white);break; case1:g.setColor(Color.white);break; case2:g.setColor(Color.white);break; case3:g.setColor(Color.white);break; case4:g.setColor(Color.white);break; case5:g.setColor(Color.white);break; case6:g.setColor(Color.white);break; case7:g.setColor(Color.white);break; case8:g.setColor(Color.white);break; case9:g.setColor(Color.white);break;case10:g.setColor(Color.black);break; case11:g.setColor(Color.black);break; case12:g.setColor(Color.black);break; case13:g.setColor(Color.black);break; case14:g.setColor(Color.black);break; case15:g.setColor(Color.black);break;}}g.fillRect(x,y,40,40);switch(color%6){case0:g.setColor(Color.blue);break; case1:g.setColor(Color.yellow);break; case2:g.setColor(Color.red);break; case3:g.setColor(Color.orange);break; case4:g.setColor(Color.green);break; case5: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+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){case0:g.setColor(Color.white);break; case1:g.setColor(Color.white);break; case2:g.setColor(Color.white);break; case3:g.setColor(Color.white);break; case4:g.setColor(Color.white);break; case5:g.setColor(Color.white);break; case6:g.setColor(Color.white);break; case7:g.setColor(Color.white);break; case8:g.setColor(Color.white);break;case9:g.setColor(Color.white);break; case10:g.setColor(Color.black);break; case11:g.setColor(Color.black);break; case12:g.setColor(Color.black);break; case13:g.setColor(Color.black);break; case14:g.setColor(Color.black);break;}}g.setColor(Color.blue);g.fillRect(x,y,40,40);switch(color%6){case0:g.setColor(Color.blue);break; case1:g.setColor(Color.yellow);break; case2:g.setColor(Color.red);break; case3:g.setColor(Color.orange);break; case4:g.setColor(Color.green);break; case5: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+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){case0:g.setColor(Color.white);break; case1:g.setColor(Color.white);break; case2:g.setColor(Color.white);break; case3:g.setColor(Color.white);break; case4:g.setColor(Color.white);break; case5:g.setColor(Color.white);break; case6:g.setColor(Color.white);break; case7:g.setColor(Color.white);break;case8:g.setColor(Color.white);break; case9:g.setColor(Color.white);break; case10:g.setColor(Color.black);break; case11:g.setColor(Color.black);break; case12:g.setColor(Color.black);break; case13:g.setColor(Color.black);break;}}if(op==4){g.setColor(Color.yellow);g.fillRect(x,y,40,40);switch(color%6){case0:g.setColor(Color.blue);break; case1:g.setColor(Color.yellow);break; case2:g.setColor(Color.red);break; case3:g.setColor(Color.orange);break; case4:g.setColor(Color.green);break; case5: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+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){case0:g.setColor(Color.white);break; case1:g.setColor(Color.white);break; case2:g.setColor(Color.white);break; case3:g.setColor(Color.white);break; case4:g.setColor(Color.white);break; case5:g.setColor(Color.white);break; case6:g.setColor(Color.white);break;case7:g.setColor(Color.white);break; case8:g.setColor(Color.white);break; case9:g.setColor(Color.white);break; case10:g.setColor(Color.black);break; case11:g.setColor(Color.black);break; case12:g.setColor(Color.black);break;}}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(inti=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]+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]+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]+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]+5,yf[i]+35,10,10); g.fillOval(xf[i]+15,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);}}publicvoidkeyTyped(KeyEvente){}//键盘控制坦克的移动,发弹publicvoidkeyPressed(KeyEvente){ color++;if(e.getKeyCode()==KeyEvent.VK_UP){}}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;}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;}}}}dy3=dy3+tankbullet;dx4=dx4-tankbullet;for(inti=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(inti=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];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(inti=0;i<num;i++){S("1击中");fenshu=fenshu+100;xf[i]=(int)(Math.random()*560);}}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){ ("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;}switch(opf[i]){case1:{yf[i]--;dyf[i]--;for(ints=0;s<num;s++){ if(yf[i]<=0){yf[i]++;dyf[i]++;}}break;}case2:{xf[i]++;dxf[i]++;for(ints=0;s<num;s++){if(xf[i]>=560){xf[i]--;dxf[i]--;}}break;}}}break;}case4:{xf[i]--;dxf[i]--;for(ints=0;s<num;s++){ if(xf[i]<=0){xf[i]++;dxf[i]++;}}break;}}try{Thread.sleep(20);}catch(Exceptione){e.printStackTrace();}//坦克的开火if(a%50==5){if(Math.random()>0.5){for(inti=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(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(inti=4;i<6;i++){if(opf[i]==1){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(inti=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(Math.random()>0.5){for(inti=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(inti=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){//坦克的随机移动}}else{opf[i]=4;}}}}if(a%50==21){//坦克的随机移动for(inti=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(inti=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{}}}}//opf[i]=1;}else{opf[i]=2;}}else{if(Math.random()>0.5){ opf[i]=3;}else{opf[i]=4;}}}}//重画//弹出player1胜利对话框JOptionPane.showMessageDialog(null, "你结束了!!!","GameOver!",JOptionPane.ERROR_MESSAGE); //结束游戏System.exit(0);}this.repaint();}}}。
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];/*后来加上的。
坦克大战游戏编程实现

坦克大战游戏编程实现游戏编程实现坦克大战坦克大战是一款经典的电子游戏,在游戏中,玩家将控制一个坦克,通过操作坦克的移动和攻击,与其他玩家或电脑进行战斗。
本文将介绍如何使用编程语言实现坦克大战游戏。
设计思路在实现坦克大战游戏之前,首先需要明确游戏的基本要素和规则。
玩家将操作一个坦克,通过键盘或操纵杆控制坦克的移动和攻击。
游戏画面由地图、坦克、子弹等元素构成。
坦克可以向前、向后、向左、向右移动,可以发射子弹进行攻击。
玩家需要躲避敌方坦克的攻击,同时尽可能击败敌方坦克。
编程实现坦克的移动和攻击可以通过编程语言来实现。
以下是使用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的主窗口,并在窗口中添加了一个玩家坦克、敌方坦克和子弹的列表。
Python3+pygame实现的90坦克大战代码完整有演示效果

Python3+pygame实现的90坦克⼤战代码完整有演⽰效果我是⼀个典型的80后,年轻时玩过了特别多的游戏,所以这⼏天⽤Python3+pygame实现了⼀个另外⼩游戏”坦克⼤战“(其他的游戏,请翻阅我的博客)本实例代码量有些多,完整的版本在1000⾏左右(当然了如果再次优化的话会减少⼀部分)分享出来,希望能帮助到⼤家,毕竟⾃⼰做教育⾏业做了这么多年,还是教育情怀的,哈哈哈哈哈⼀、显⽰效果⼆、代码下⾯代码⽤到了⼀些素材(游戏背景⾳乐、图⽚等等),可以到我的⽹站下载,谢谢⼤家的⽀持完整代码如下(注意:为了⽅便下载以及编写更简单,没有采⽤多模块的⽅式,全部代码全部放到main.py⽂件中) """作者:it项⽬实例⽹⽹站:"""import randomimport sysimport pygame# 屏幕的宽、⾼WIDTH = 630HEIGHT = 630# 边界值BORDER_LEN = 3# 字体FONTPATH = 'resources/font/font.ttf'class Iron(pygame.sprite.Sprite):"""铁墙类"""# 定义精灵组,将所有的砖墙实例对象添加到⾥⾯group = pygame.sprite.Group()def__init__(self, position):# 调⽤⽗类的初始化⽅法,这样才能够实现必要的初始化操作super().__init__()self.image = pygame.image.load("resources/images/scene/iron.png")# 当使⽤碰撞判断⽅法时,pygame就需要知道当前要检测的物体的位置,所以这个rect属性⼀定要设置self.rect = self.image.get_rect()self.rect.topleft = position# 添加到精灵组self.group.add(self)@classmethoddef show(cls, screen):for temp in cls.group:screen.blit(temp.image, temp.rect)class Ice(pygame.sprite.Sprite):"""冰类"""# 定义精灵组,将所有的实例对象添加到⾥⾯group = pygame.sprite.Group()def__init__(self, position):# 调⽤⽗类的初始化⽅法,这样才能够实现必要的初始化操作super().__init__()# 因为是12x12的⼩图⽚,所以需要制作⼀个24x24的imageimage = pygame.Surface((24, 24))for i in range(2):for j in range(2):image.blit(pygame.image.load("resources/images/scene/ice.png"), (12 * i, 12 * j))self.image = image# 当使⽤碰撞判断⽅法时,pygame就需要知道当前要检测的物体的位置,所以这个rect属性⼀定要设置 self.rect = self.image.get_rect()self.rect.topleft = position# 添加到精灵组self.group.add(self)@classmethoddef show(cls, screen):for temp in cls.group:screen.blit(temp.image, temp.rect)class River(pygame.sprite.Sprite):"""河流类"""# 定义精灵组,将所有的实例对象添加到⾥⾯group = pygame.sprite.Group()def__init__(self, position):# 调⽤⽗类的初始化⽅法,这样才能够实现必要的初始化操作super().__init__()# 因为是12x12的⼩图⽚,所以需要制作⼀个24x24的imageimage = pygame.Surface((24, 24))for i in range(2):for j in range(2):image.blit(pygame.image.load("resources/images/scene/river1.png"), (12 * i, 12 * j))self.image = image# 当使⽤碰撞判断⽅法时,pygame就需要知道当前要检测的物体的位置,所以这个rect属性⼀定要设置 self.rect = self.image.get_rect()self.rect.topleft = position# 添加到精灵组self.group.add(self)@classmethoddef show(cls, screen):for temp in cls.group:screen.blit(temp.image, temp.rect)class Tree(pygame.sprite.Sprite):"""树类"""# 定义精灵组,将所有的实例对象添加到⾥⾯group = pygame.sprite.Group()def__init__(self, position):# 调⽤⽗类的初始化⽅法,这样才能够实现必要的初始化操作super().__init__()# 因为是12x12的⼩图⽚,所以需要制作⼀个24x24的imageimage = pygame.Surface((24, 24))for i in range(2):for j in range(2):image.blit(pygame.image.load("resources/images/scene/tree.png"), (12 * i, 12 * j))self.image = image# 当使⽤碰撞判断⽅法时,pygame就需要知道当前要检测的物体的位置,所以这个rect属性⼀定要设置 self.rect = self.image.get_rect()self.rect.topleft = position# 添加到精灵组self.group.add(self)@classmethoddef show(cls, screen):for temp in cls.group:screen.blit(temp.image, temp.rect)class Brick(pygame.sprite.Sprite):"""砖墙类"""# 定义精灵组,将所有的砖墙实例对象添加到⾥⾯group = pygame.sprite.Group()def__init__(self, position):# 调⽤⽗类的初始化⽅法,这样才能够实现必要的初始化操作super().__init__()self.image = pygame.image.load("resources/images/scene/brick.png")# 当使⽤碰撞判断⽅法时,pygame就需要知道当前要检测的物体的位置,所以这个rect属性⼀定要设置self.rect = self.image.get_rect()self.rect.topleft = position# 添加到精灵组self.group.add(self)@classmethoddef show(cls, screen):for temp in cls.group:screen.blit(temp.image, temp.rect)class Bullet(pygame.sprite.Sprite):"""⼦弹类"""# 定义精灵组,将所有的砖墙实例对象添加到⾥⾯group = pygame.sprite.Group()group_enemy = pygame.sprite.Group()def__init__(self, _type, direction, position):super().__init__()# ⼦弹图⽚if direction == "up":image_path = "resources/images/bullet/bullet_up.png"elif direction == "down":image_path = "resources/images/bullet/bullet_down.png"elif direction == "left":image_path = "resources/images/bullet/bullet_left.png"elif direction == "right":image_path = "resources/images/bullet/bullet_right.png"self.image = pygame.image.load(image_path)# ⼦弹位置self.rect = self.image.get_rect()self.rect.center = position # 设置⼦弹的初始位置的中⼼点# ⼦弹⽅向self.direction = direction# ⼦弹移动速度self.speed = 8# 将⼦弹添加到精灵组if _type == "player":self.group.add(self)else:self.group_enemy.add(self)@classmethoddef auto_move(cls):for temp in cls.group:if temp.rect.x < BORDER_LEN or temp.rect.x > WIDTH - BORDER_LEN or temp.rect.y < BORDER_LEN or temp.rect.y > HEIGHT - BORDER_LEN: cls.group.remove(temp)print("⼦弹超出边界,移除⼦弹")continueif temp.direction == "up":temp.rect = temp.rect.move((0, -temp.speed))elif temp.direction == "down":temp.rect = temp.rect.move((0, temp.speed))elif temp.direction == "left":temp.rect = temp.rect.move((-temp.speed, 0))elif temp.direction == "right":temp.rect = temp.rect.move((temp.speed, 0))for temp in cls.group_enemy:if temp.rect.x < BORDER_LEN or temp.rect.x > WIDTH - BORDER_LEN or temp.rect.y < BORDER_LEN or temp.rect.y > HEIGHT - BORDER_LEN: cls.group_enemy.remove(temp)print("⼦弹超出边界,移除⼦弹")continueif temp.direction == "up":temp.rect = temp.rect.move((0, -temp.speed))elif temp.direction == "down":temp.rect = temp.rect.move((0, temp.speed))elif temp.direction == "left":temp.rect = temp.rect.move((-temp.speed, 0))elif temp.direction == "right":temp.rect = temp.rect.move((temp.speed, 0))# ⼦弹碰砖墙(如果相碰,那么就移除当前⼦弹以及砖墙)pygame.sprite.groupcollide(cls.group, Brick.group, True, True)pygame.sprite.groupcollide(cls.group_enemy, Brick.group, True, True)# ⼦弹碰铁墙(如果相碰,那么只移除⼦弹)for bullet in cls.group:if pygame.sprite.spritecollide(bullet, Iron.group, False, None):cls.group.remove(bullet)for bullet in cls.group_enemy:if pygame.sprite.spritecollide(bullet, Iron.group, False, None):cls.group_enemy.remove(bullet)@classmethoddef show(cls, screen):"""显⽰⼦弹"""for temp in cls.group:screen.blit(temp.image, temp.rect)for temp in cls.group_enemy:screen.blit(temp.image, temp.rect)@classmethoddef move_and_show(cls, screen):"""移动、显⽰⼦弹"""cls.auto_move()cls.show(screen)class PlayerTank(pygame.sprite.Sprite):"""我⽅坦克类"""# 定义类属性,存储我⽅坦克(如果是单⼈模式就只有1个,如果是双⼈模式就有2个)player_group = list()# 定义精灵组,⽤来碰撞等判断group = pygame.sprite.Group()def__init__(self, player, top_left):"""实现初始化功能"""# 调⽤⽗类的初始化⽅法,这样才能够实现必要的初始化操作super().__init__()# 坦克的图⽚image_path = "resources/images/playerTank/tank_T1_0.png"if player == "player1"else"resources/images/playerTank/tank_T2_0.png" self.tank_all_image = pygame.image.load(image_path).convert_alpha()self.image = self.tank_all_image.subsurface((0, 0), (48, 48))# 当使⽤碰撞判断⽅法时,pygame就需要知道当前要检测的物体的位置,所以这个rect属性⼀定要设置self.rect = self.image.get_rect()self.rect.topleft = top_left# 记录初始位置,以便在被击中后能够重新在默认位置出现self.origin_position = top_left# 定义移动的步长self.step_length = 8# 坦克的默认⽅向self.direction = "up"# 默认朝上# 移动缓冲, ⽤于避免坦克连续移动过快导致不⽅便调整位置self.move_cache_time = 4self.move_cache_count = 0# 坦克轮⼦转动效果self.switch_count = 0self.switch_time = 2self.switch_image_index = Falseself.image_postion_index = 0# 发射⼦弹的间隔self.is_bullet_cooling = False # 如果是第⼀次发射⼦弹,则不在冷却时间内,可以正常发射self.bullet_cooling_count = 0self.bullet_cooling_time = 30# 我⽅坦克⽣命次数self.life_num = 3# 标记此坦克是否显⽰self.is_show_flag = True# 将当前对象添加到类属性中,这样就可以通过类对象访问到我⽅坦克self.__class__.player_group.append(self) # 或者self.player_group.append(self)也是可以的# 添加到精灵组self.group.add(self)def update_direction(self):"""更新坦克的朝向"""if self.direction == 'up':self.image = self.tank_all_image.subsurface((0, 0), (48, 48))self.image_postion_index = 0elif self.direction == 'down':self.image = self.tank_all_image.subsurface((0, 48), (48, 48))self.image_postion_index = 48elif self.direction == 'left':self.image = self.tank_all_image.subsurface((0, 96), (48, 48))self.image_postion_index = 96elif self.direction == 'right':self.image = self.tank_all_image.subsurface((0, 144), (48, 48))self.image_postion_index = 144def move(self, direction, group_list):"""根据键盘调整坦克⽅向,然后移动"""# 如果要移动的⽅向与当前坦克的朝向不同,则先调整朝向if self.direction != direction:self.direction = directionself.update_direction()return# 移动缓冲self.move_cache_count += 1if self.move_cache_count < self.move_cache_time:returnelse:self.move_cache_count = 0# 移动坦克# 复制⼀份当前玩家坦克的坐标,如果碰到障碍物之后,可以进⾏恢复rect_ori = self.rectif direction == "up":self.rect = self.rect.move((0, -self.step_length))elif direction == "down":self.rect = self.rect.move((0, self.step_length))elif direction == "left":self.rect = self.rect.move((-self.step_length, 0))elif direction == "right":self.rect = self.rect.move((self.step_length, 0))# 检测碰撞"砖墙"、"铁墙"、"冰"、"河流"。
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()。
坦克大战源码

坦克大战源码根据韩顺平老师视频所作/**坦克大战* 防重叠*/package ;import .*;import .*;import class MyTankGame5 extends JFrame implements ActionListener{quals("newgame")){quals("exit")){quals("saveExit")){quals("continue")){etImage"/"));image2=().getImage"/"));image3=().getImage"/"));etNodesAndEnemy();etSpeed();etSpeed(0);etSpeed();etSpeed(0);边的矩形(x, y, 5, 30,false);边的矩形(x, y, 5, 30,false);etSpeed();etSpeed(0);etSpeed(esp1);;import Node{int x;int y;int direct;public Node(int x,int y,int direct){=x;=y;=direct;}}//记录坦克信息的类class Recorder{//记录敌人和我的坦克数量private static int enlife=20;private static int mylife=10;private static int deadenemy=0;private static FileWriter fw=null;private static BufferedWriter bw=null;private static FileReader fr=null;private static BufferedReader br=null;private static Vector<EnemyTank> ets=new Vector<EnemyTank>();//从文件恢复记录static Vector<Node> nodes=new Vector<Node>();//完成读取public Vector<Node> getNodesAndEnemy(){try {//创建fr=new FileReader("d:\\chen\\");br=new BufferedReader(fr);String n="";//先读取第一行n=();deadenemy=(n);//用split分割从第二行开始取while((n=())!=null){//字符串str中从第一个字符起,//每遇到一个空格则切割为一个元素,//放入[]xyd数组中String []xyd=(" ");//这里的空格数与keepRecAndEnemyTank()中//写入(String record=+" "++" "+;)//!!!!!!!!!!!!!! //的空格数要对应,否则会报错!Node node1=new Node(xyd[0]),(xyd[1]),(xyd[2]));(node1);}} catch (IOException e) {// TODO Auto-generated catch block();}finally{//关闭文件//谁先开,谁后关!try {();();} catch (IOException e) {// TODO Auto-generated catch block();}}return nodes;}public static Vector<EnemyTank> getEts() {return ets;}public static void setEts(Vector<EnemyTank> ets) { = ets;}//保存击毁敌人的数目和敌人坐标,存盘退出public static void keepRecAndEnemyTank(){try {//创建fw=new FileWriter("d:\\chen\\");bw=new BufferedWriter(fw);(deadenemy+"\r\n");//保存当前敌人的数目和坐标for(int i=0;i<();i++){//取出第一个坦克EnemyTank et=(i);//保存活的if{String record=+" "++" "+;//写入(record+"\r\n");}}} catch (IOException e) {// TODO Auto-generated catch block();}finally{//关闭文件//谁先开,谁后关!try {();();} catch (IOException e) {// TODO Auto-generated catch block();}}}//保存击毁的敌人数目public static void keepRecording(){try {//创建fw=new FileWriter("d:\\chen\\");bw=new BufferedWriter(fw);(deadenemy+"\r\n");} catch (IOException e) {// TODO Auto-generated catch block();}finally{//关闭文件//谁先开,谁后关!try {();();} catch (IOException e) {// TODO Auto-generated catch block();}}}//读取出上一局击毁的敌人数目public static void getRecording(){try {//创建fr=new FileReader("d:\\chen\\");br=new BufferedReader(fr);String n=();deadenemy=(n);} catch (IOException e) {// TODO Auto-generated catch block();}finally{//关闭文件//谁先开,谁后关!try {();();} catch (IOException e) {// TODO Auto-generated catch block();}}}public static int getEnlife() {return enlife;}public static void setEnlife(int enlife) {= enlife;}public static int getMylife() {return mylife;}public static void setMylife(int mylife) {= mylife;}//减少数量public static void reduceMylife() {;}public static void reduceEnlife() {;}public static void deadenemy() {++;public static int getDeadenemy() {return deadenemy;}}class Tank{//坦克的横坐标int x=0;//纵坐标int y=0;//暂停速度int tempspeed;public int getTempspeed() {return tempspeed;}public void setTempspeed(int tempspeed) { = tempspeed;}//颜色int color;boolean isLive=true;public boolean isLive() {return isLive;}public void setLive(boolean isLive) {= isLive;}public int getColor() {return color;}public void setColor(int color) {= color;public int getX() {return x;}public void setX(int x) {= x;}public int getY() {return y;}public void setY(int y) {= y;}public Tank (int x,int y){=x;=y;}//坦克方向//0上,1右,2下,3左int direct=0;public int getDirect() {return direct;}public void setDirect(int direct) {= direct;}//坦克的速度int speed=3;public int getSpeed() {return speed;}public void setSpeed(int speed) {= speed;}}//敌方坦克class EnemyTank extends Tank implements Runnable{//设敌人可以复活10次static int newlife=10;//计数器static int counter=0;//让坦克随机产生步数//每次走多少步int steps=(int)()*50+10);int sleeptime=200; //睡眠时间//定义一个向量存放敌人子弹Vector<Shot> ss1=new Vector<Shot>();//在敌人创建和子弹死亡后在创建子弹public EnemyTank(int x,int y){super(x,y);}//定义一个向量,访问MyPanel的所有敌人坦克Vector<EnemyTank> ets=new Vector<EnemyTank>();//得到MyPanel的所有敌人坦克public void setEts(Vector<EnemyTank> vv){=vv;}//判断是否撞到了别的敌人坦克public boolean isTouchotherEnemy(){boolean b=false;//判断switch{case 0://向上//取出敌人所有坦克for(int i=0;i<();i++){//取出第一个坦克EnemyTank et=(i);//如果不是自己if(et!=this){//如果敌人方向是向上或者向下if==0||==2){if>=&&<=+20&&>=&&<=+30){return true;}if+20>=&&+20<=+20&&>=&&<=+30){return true;}}//如果敌人方向是向左或者向右if==1||==3){if>=&&<=+30&&>=&&<=+20){return true;}if+20>=&&+20<=+30&&>=&&<=+20){return true;}}}}break;case 1://向右//取出敌人所有坦克for(int i=0;i<();i++){//取出第一个坦克EnemyTank et=(i);//如果不是自己if(et!=this){//如果敌人方向是向上或者向下if==0||==2){if+30>=&&+30<=+20&&>=&&<=+30){return true;}if+30>=&&+30<=+20&&+20>=&&+20<=+30){return true;}}//如果敌人方向是向左或者向右if==1||==3){if>=&&<=+30&&>=&&<=+20){return true;}if+30>=&&+30<=+30&&+20>=&&+20<=+20){return true;}}}}break;case 2://向下//取出敌人所有坦克for(int i=0;i<();i++){//取出第一个坦克EnemyTank et=(i);//如果不是自己if(et!=this){//如果敌人方向是向上或者向下if==0||==2){if>=&&<=+20&&+30>=&&+30<=+30){return true;}if+20>=&&+20<=+20&&+30>=&&+30<=+30){return true;}}//如果敌人方向是向左或者向右if==1||==3){if>=&&<=+30&&+30>=&&+30<=+20){return true;}if+20>=&&+20<=+30&&+30>=&&+30<=+20){return true;}}}}break;case 3://向左//取出敌人所有坦克for(int i=0;i<();i++){//取出第一个坦克EnemyTank et=(i);//如果不是自己if(et!=this){//如果敌人方向是向上或者向下if==0||==2){if>=&&<=+20&&>=&&<=+30){return true;}if>=&&<=+20&&+20>=&&+20<=+30){return true;}}//如果敌人方向是向左或者向右if==1||==3){if>=&&<=+30&&>=&&<=+20){return true;}if>=&&<=+30&&+20>=&&+20<=+20){return true;}}}}break;}return b;}public void run() {// TODO Auto-generated method stubwhile(true){switch{case 0://继续让他再走几步for(int i=0;i<steps;i++){if(y>0&&!isTouchotherEnemy()){y-=speed;}// //撞到墙或者队友就转弯||isTouchotherEnemy()// else if(y<=0)// {// //让坦克变向// =(direct+1)%4;// }try {(sleeptime);} catch (InterruptedException e) {// TODO Auto-generated catch block();}}break;case 1://继续让他再走几步for(int i=0;i<steps;i++){if(x<&&!isTouchotherEnemy()){x+=speed;}// //撞到墙或者队友就转弯// else if(x>=// {// //让坦克变向// =(direct+1)%4;// }try {(sleeptime);} catch (InterruptedException e) {// TODO Auto-generated catch block();}}break;case 2://继续让他再走几步for(int i=0;i<steps;i++){if(y<&&!isTouchotherEnemy()){y+=speed;}//撞到墙或者队友就转弯// else if(y>=// {// //让坦克变向// =(direct+1)%4;// }try {(sleeptime);} catch (InterruptedException e) {// TODO Auto-generated catch block();}}break;case 3://继续让他再走几步for(int i=0;i<steps;i++){if(x>0&&!isTouchotherEnemy()){x-=speed;}// //撞到墙或者队友就转弯// else if(x<=0)// {// //让坦克变向// =(direct+1)%4;// }try {(sleeptime);} catch (InterruptedException e) {// TODO Auto-generated catch block();}}break;}//判断是否死亡,是否暂停if==false||=={//退出线程break;}//让坦克随机产生方向=(int)()*4);}}}//我的坦克class Hero extends Tank{//设我可以复活3次static int newlife=10;//计数器static int counter=0;Vector<Shot> ss=new Vector<Shot>();//子弹Shot s=null;public Hero(int x,int y){super(x,y);}//开火public void shotEnemy(){switch{case 0:s=new Shot(x+9,y-10,0);(s);break;case 1:s=new Shot(x+35,y+9,1);(s);break;case 2:s=new Shot(x+10,y+35,2);(s);break;case 3:s=new Shot(x-9,y+9,3);(s);break;}//创建线程对象Thread t1=new Thread(s);//启动();}//坦克向上移动public void moveUp(){if(y>0&&{y-=speed;}}//坦克向右移动public void moveRight(){if(x<&&{x+=speed;}}//坦克向下移动public void moveDown(){if(y<&&{y+=speed;}}//坦克向左移动public void moveLeft(){if(x>0&&{x-=speed;}}}//炸弹类class Bomb{//定义炸弹坐标int x,y;//炸弹生命int life=3;boolean isLive=true;public Bomb(int x,int y){=x;=y;}//减少生命值public void lifeDown(){if(life>0){life--;}else{=false;}}}//子弹类class Shot implements Runnable{//坐标int x;int y;int direct;int speed=5;public int getDirect() {return direct;}public void setDirect(int direct) {= direct;}public int getSpeed() {return speed;}public void setSpeed(int speed) {= speed;}//是否还活着boolean isLive=true;public Shot(int x,int y,int direct){=x;=y;=direct;}public void run(){while(true){try {(50);} catch (InterruptedException e) {// TODO Auto-generated catch block();}switch(direct){case 0://上方向y-=speed;break;case 1://向右x+=speed;break;case 2://向下y+=speed;break;case 3://向左x-=speed;break;}//"子弹坐标:"+"("+x+","+y+")");//子弹何时死亡?//判断该子弹是否碰到窗口边缘if(x<0||x>||y<0||y>{=false;break;}}}}//播放声音的类class AePlayWave extends Thread {private String filename;public AePlayWave(String wavfile){filename = wavfile;}public void run() {File soundFile = new File(filename);AudioInputStream audioInputStream = null;try {audioInputStream = (soundFile);} catch (Exception e1) {();return;}AudioFormat format = ();SourceDataLine auline = null;info = new , format);try {auline = (SourceDataLine) (info);(format);} catch (Exception e) {();return;}();int nBytesRead = 0;//这是缓冲byte[] abData = new byte[512];try {while (nBytesRead != -1){nBytesRead = (abData, 0, ;if (nBytesRead >= 0)(abData, 0, nBytesRead);}} catch (IOException e) {();return;} finally {();();}}}。
坦克大战的游戏代码

using System;using System.Collections.Generic;using System.Text;using System.Drawing; //addusing System.Collections;//addnamespace 坦克{class Tank{private int width; //坦克的宽度private int height; //坦克的高度private int top; //坦克位置的纵坐标private int left; //坦克位置的横坐标private int type; //坦克的类型(2---5敌方,6己方)private int direct; //0--上,1--下,2--左,3--右public ArrayList bList=new ArrayList();//子弹序列public Tank(int tank_type)//构造函数{Random r = new Random();this.direct = r.Next(0, 4);//产生0—3的数this.width = 32;this.height = 32;this.left = r.Next(0, 1);//产生0—9的数this.top = r.Next(0, 1);//产生0—9的数this.type = tank_type;}public int Top//Top属性{get{return top;}set{if (top >= 0 && top <= 9){top = value;//if (top == 0 || top == 9) newDirect();}}}public int Type//坦克的类型属性{get{return type;}set{if (top >= 1 && top <= 5){type = value;}}}public int Left//Left属性{get{return left;}set{if (left >= 0 && left <= 9){left = value;//if (left == 0 || left == 9) newDirect();}}}public int Direct//Direct属性(坦克方向){get{return direct;}set{direct = value;}}public void newDirect()//改变方向{Random r = new Random();int new_Direct=r.Next(0, 4);//产生0—3的数while(this.direct == new_Direct)new_Direct = r.Next(0, 4);//产生0—3的数this.direct = new_Direct;}public void Draw(Graphics g,int type)//根据坦克类型选择不同图片{Image tankImage = Image.FromFile("BMP/ETANK1.BMP");if (type == 2) tankImage = Image.FromFile("BMP/ETANK2.BMP");if (type == 3) tankImage = Image.FromFile("BMP/ETANK3.BMP");if (type == 4) tankImage = Image.FromFile("BMP/ETANK4.BMP");if (type == 5) tankImage = Image.FromFile("BMP/ETANK1.BMP");if (type == 6) tankImage = Image.FromFile("BMP/MYTANK.BMP");//得到绘制这个坦克图形的在游戏面板中的矩形区域Rectangle destRect = new Rectangle(this.left * width, this.top * height, width,height);Rectangle srcRect = new Rectangle(direct * width, 0, width, height);g.DrawImage(tankImage,destRect,srcRect,GraphicsUnit.Pixel );}public void Explore(Graphics g)//坦克爆炸动画{//得到绘制这个坦克图形的在游戏面板中的矩形区域Rectangle destRect = new Rectangle(this.left * width, this.top * height, width, height);Rectangle srcRect = new Rectangle(0, 0, width, height);Image tankImage = Image.FromFile("BMP/explode1.bmp");g.DrawImage(tankImage, destRect, srcRect, GraphicsUnit.Pixel);tankImage = Image.FromFile("BMP/explode1.bmp");g.DrawImage(tankImage, destRect, srcRect, GraphicsUnit.Pixel);tankImage = Image.FromFile("BMP/explode2.bmp");g.DrawImage(tankImage, destRect, srcRect, GraphicsUnit.Pixel);PlaySound.Play("Sound/Explode.wav");}public void fire(){bullet b = new bullet(this.type);//根据坦克产生不同子弹b.Direct = this.Direct;//坦克的朝向b.Top = this.Top;b.Left = this.Left;//b.move();bList.Add(b);if(this.type==6) PlaySound.Play("Sound/Shoot.wav");//己方发射出声}public void MoveBullet(ref int [,]Map){for (int i = bList.Count-1; i>=0; i--)//遍历子弹序列//for (int i = 0; i < bList.Count;i++ ){bullet t = ((bullet)bList[i]);//移动以前if (t.Left < 0 || t.Left > 9 || t.Top < 0 || t.Top > 9)//超出边界{bList.RemoveAt(i); continue;//删除此颗子弹}if (Map[t.Left, t.Top] != 0 && Map[t.Left, t.Top]!= this.type )//已遇到坦克和墙等障碍物{bList.RemoveAt(i);//删除此颗子弹if (t.hitE(Map[t.Left, t.Top]))//击中对方坦克Map[t.Left, t.Top] = -1;//此处坦克被打中continue;}t.move();//移动以后if (t.Left < 0 || t.Left > 9 || t.Top < 0 ||t.Top > 9)//超出边界{bList.RemoveAt(i);continue;//删除此颗子弹}if (Map[t.Left, t.Top] != 0)//已遇到物体{bList.RemoveAt(i);//删除此颗子弹if (t.hitE(Map[t.Left, t.Top]))//击中对方坦克Map[t.Left, t.Top] = -1;//此处坦克被打中continue;}}}public void DrawBullet(Graphics g,int [,]Map)//画子弹{MoveBullet(ref Map);foreach (bullet t in bList)//遍历子弹序列t.Draw(g);}//public void NewPosition()//产生新坐标//{// Random r = new Random();// this.left = r.Next(0, 10);//产生0—9的数// this.top = r.Next(0, 10);//产生0—9的数//}//public bool ComparePosition(Tank s)//比较坦克位置//{// if (this.left == s.left && this.top == s.top)// return true;// else// return false;//}}}。
Java游戏开发之坦克大战代码

Java游戏开发之坦克大战代码标题:Java游戏开发之坦克大战代码关键词:Java坦克大战,坦克大战Java代码这是一个Java坦克大战的源码,实现了大部分功能,是学习Java绘图技术的好例子主类:package com.qq.TankGame;import java.awt.Color;import java.awt.Font;import java.awt.Graphics;import java.awt.Image;import java.awt.Paint;import java.awt.Panel;import java.awt.Toolkit;import java.awt.event.ActionEvent;import java.awt.event.ActionListener;import java.awt.event.KeyEvent;import java.awt.event.KeyListener;import java.io.BufferedReader;import java.io.BufferedWriter;import java.io.FileNotFoundException;import java.io.FileReader;import java.io.FileWriter;import java.io.IOException;import java.util.Vector;import javax.swing.JFrame;import javax.swing.JMenu;import javax.swing.JMenuBar;import javax.swing.JMenuItem;import javax.swing.JPanel;import javax.swing.JTextArea;/////**// * 功能:java绘图// * @author Administrator// *// */public class TankGame extends JFrame implements ActionListener{MyPanel mp = null;myStartPanel msp = null;EnemyTask em = null;JMenuBar jmb = null;JMenu jm = null;JMenuItem jmi1 = null;JMenuItem jmi2 = null;JMenuItem jmi3 = null;public static void main(String[] args) {TankGame tankGame = new TankGame();}public TankGame(){jmb = new JMenuBar();jm = new JMenu("游戏(G)");jm.setMnemonic('G');jmi1 = new JMenuItem("开始游戏(S)");jmi1.setMnemonic('S');jmi1.addActionListener(this);jmi1.setActionCommand("newGame");jmi2 = new JMenuItem("继续游戏(O)");jmi2.setMnemonic('O');jmi3 = new JMenuItem("退出游戏(X)");jmi3.setMnemonic('X');jmi3.addActionListener(this);jmi3.setActionCommand("exit");//启动mp线程//em = new EnemyTask();//mp = new MyPanel();msp = new myStartPanel();this.setJMenuBar(jmb);this.add(msp);//this.add(mp);jmb.add(jm);jm.add(jmi1);jm.add(jmi2);jm.add(jmi3);this.setSize(600,500);//this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); this.setVisible(true);//this.addKeyListener(mp);Thread t1 = new Thread(msp);t1.start();// Thread t = new Thread(mp);// t.start();}@Overridepublic void actionPerformed(ActionEvent arg0) {if(arg0.getActionCommand().equals("newGame")){mp = new MyPanel();Thread t = new Thread(mp);t.start();this.remove(msp);this.remove(mp);this.add(mp);this.setVisible(true);this.addKeyListener(mp);//Recoder.getRecording();}else if(arg0.getActionCommand()== "exit"){//Recoder.KeepRecording();Recoder.KeepExit();//KeepExit();System.exit(0);}}}class myStartPanel extends JPanel implements Runnable{ int times = 0;public void paint(Graphics g ){super.paint(g);g.fillRect(0, 0, 400, 300);if(times%2 ==0){g.setColor(Color.BLUE);Font f = new Font("华文新魏", Font.BOLD, 30);g.setFont(f);g.drawString("stage:1", 150, 150);}}@Overridepublic void run() {while(true){try {Thread.sleep(300);} catch (InterruptedException e) {e.printStackTrace();}this.repaint();times ++;}}}class MyPanel extends JPanel implements KeyListener,Runnable{ int [] TanksX = new int[20];int [] TanksY = new int[20];int [] ShotsX = new int[100];int [] ShotsY = new int[100];// int [][]Tanks = new int[20][2];// int [][]Shots = new int[20][2];int [] ETdirects = new int[20];int [] HeroShotsX = new int[10];int [] HeroShotsY = new int[10];static Hero hero = null;EnemyTask et = null;shot s = null;boolean isPaintShot = true;int a = 0, b = 0 , c = 0;int [] directs = new int [10];static //敌人坦克集合Vector<EnemyTask> ets = new Vector<EnemyTask>();int enSize = 3; //敌人坦克初始数量int enSizes = 5; //敌人坦克画面总数量int hintEnemyTanks = 0;//击中敌人坦克数量public void showInfo(Graphics g ){//画提示信息//画出提出坦克this.drawTank(80, 330, g, 0, 1);this.drawTank(160, 330, g, 0, 0);g.setColor(Color.BLACK);g.drawString(Recoder.getEnNum() + "", 105, 350);g.drawString(Recoder.getMyLife() + "", 185, 350);//画出成绩g.setColor(Color.BLACK);Font f = new Font("宋体", Font.BOLD, 15);g.setFont(f);g.drawString("你的总成绩:", 400, 20);this.drawTank(410, 30, g, 0, 1);g.drawString((20 - Recoder.getEnNum()) + "", 435, 50);}public void paint(Graphics g){super.paint(g);g.fillRect(0, 0, 400, 300);this.showInfo(g);//画出提示信息//自己坦克if(hero.isLive == true){this.drawTank(hero.getX(), hero.getY(), g, hero.direct, hero.type); }else{if(Recoder.getMyLife() > 0){hero = new Hero(30, 270 ,0,0,10 , true);hero.isLive = true;}}//画出敌人坦克for(int i = 0; i <ets.size(); i++){EnemyTask et = ets.get(i);if(!et.isLive){ets.remove(i);if(Recoder.getEnNum() >0){this.drawTank(50, 0, g, 1, 1);ets.add(et);//et.isLive = true;Thread t = new Thread(et);t.start();}// if(Recoder.getEnNum() > 0){// et.isLive = true;// }}if(et.isLive){this.drawTank(et.getX(), et.getY(),g, et.direct, et.type);System.out.println("et.ss.size()"+et.ss.size());for(int j = 0; j < et.ss.size(); j++){//敌人坦克子弹s = et.ss.get(j);if(s.isLive){if(isPaintShot){g.fill3DRect(s.x, s.y, 5, 10, false);}}else{et.ss.remove(j);}}}// if(!et.isLive){// ets.remove(i);// }}//画出子弹for(int i = 0; i< hero.ss.size(); i++){if(hero.ss.get(i)!= null && hero.ss.get(i).isLive == true){ g.fill3DRect(hero.ss.get(i).x, hero.ss.get(i).y, 5, 10, false); }if(hero.ss.get(i).isLive == false){hero.ss.remove(hero.ss.get(i));}}}// public void hintTank2(shot s , Hero et){// switch (et.direct) {// case 0:// case 1:// if(s.x < et.x + 20 && s.x > et.x// && s.y < et.y + 30 && s.y > et.y){// s.isLive = false;// et.isLive = false;// }// //break;// case 2:// case 3:// if(s.x < et.x + 30 && s.x > et.x// && s.y < et.y + 20 && s.y > et.y){// s.isLive = false;// et.isLive = false;// }// //break;////// default://// break;// }//// }public boolean hintTank(shot s , Tank et){boolean b = false;switch (et.direct) {case 0:case 1:if(s.x < et.x + 20 && s.x > et.x&& s.y < et.y + 30 && s.y > et.y){s.isLive = false;et.isLive = false;b = true;}break;case 2:case 3:if(s.x < et.x + 30 && s.x > et.x&& s.y < et.y + 20 && s.y > et.y){s.isLive = false;et.isLive = false;b = true;}break;// default:// break;}return b;}public void drawTank (int x , int y , Graphics g , int direct , int type){ switch(type){//坦克类型case 0:g.setColor(Color.RED);break;case 1:g.setColor(Color.BLUE);break;}switch (direct) {case 0://向上g.fill3DRect(x, y, 5, 30, false );g.fill3DRect(x + 15, y, 5, 30, false );g.fill3DRect(x + 5, y + 5, 10, 20, false );g.fillOval(x + 5, y + 10, 10, 10);g.drawLine(x + 10, y,x + 10, y + 15);break;case 1://向下g.fill3DRect(x, y, 5, 30, false );g.fill3DRect(x + 15, y, 5, 30, false );g.fill3DRect(x + 5, y + 5, 10, 20, false );g.fillOval(x + 5, y + 10, 10, 10);g.drawLine(x + 10, y + 15,x + 10,y + 30 ); break;case 2://向左g.fill3DRect(x, y, 30, 5, false );g.fill3DRect(x , y + 15, 30, 5, false );g.fill3DRect(x + 5, y + 5, 20, 10, false );g.fillOval(x + 10, y + 5, 10, 10);g.drawLine(x , y + 10,x + 15,y + 10 );break;case 3://向右g.fill3DRect(x, y, 30, 5, false );g.fill3DRect(x , y + 15, 30, 5, false );g.fill3DRect(x + 5, y + 5, 20, 10, false );g.fillOval(x + 10, y + 5, 10, 10);g.drawLine(x + 15,y + 10, x + 30 , y + 10); break;default:break;}}public MyPanel (){hero = new Hero(30, 270 ,0,0,10 , true);//tanks = new tank(100,100, 2 ,1);//初始化敌人坦克Recoder.setHero(hero);for(int i = 0; i < enSize; i++){//创建敌人坦克的对象Recoder.getRecording();EnemyTask et = new EnemyTask((i + 1)*50, 0, 1, 1, 5 ,true); et.setEts(ets);Recoder.setEtss(ets);//传ets到RecoderThread t = new Thread(et);t.start();shot s = new shot(et.x + 10 , et.y + 30, et.direct);et.ss.add(s);Thread t2 = new Thread(s);t2.start();ets.add(et);//加入到集合中//et.setColor(1);}Recoder.setEnSize(enSize);}@Overridepublic void keyPressed(KeyEvent arg0) {// TODO Auto-generated method stubif(arg0.getKeyCode() == KeyEvent.VK_S){//hero.setX(hero.getX() ++ 1);// int i= hero.getY();// i += hero.speed;// hero.setY(i);this.hero.MoveDown();hero.setD(1);}if(arg0.getKeyCode() == KeyEvent.VK_W){//hero.setX(hero.getX() ++ 1);// int i= hero.getY();// i -= hero.speed;// hero.setY(i);hero.MoveUp();hero.setD(0);}if(arg0.getKeyCode() == KeyEvent.VK_D){//hero.setX(hero.getX() ++ 1);// int i= hero.getX();// i += hero.speed;// hero.setX(i);hero.MoveRight();hero.setD(3);}if(arg0.getKeyCode() == KeyEvent.VK_A){//hero.setX(hero.getX() ++ 1);// int i= hero.getX();// i -= hero.speed;// hero.setX(i);hero.MoveLeft();hero.setD(2);}//判断是否按下Jif(arg0.getKeyCode() == KeyEvent.VK_J){if(hero.ss.size() <= 4){this.hero.shotEnemy();//System.out.println("j");}}if(arg0.getKeyCode() == KeyEvent.VK_SPACE){//空格暂停 if(hero.speed != 0){a = hero.speed ;hero.speed = 0;for(int i = 0; i < ets.size(); i ++){//System.out.println("aaaaaaaaaaaaaa");EnemyTask et = ets.get(i);//System.out.println("speed" + et.speed);b = et.speed;et.speed = 0;directs[i] = et.direct;//System.out.println(et.direct);//System.out.println(directs[i]);//et.direct = 0;et.isdirects = false;for(int j = 0 ; j < et.ss.size(); j ++){shot s = et.ss.get(j);c = s.speed;s.speed = 0;System.out.println("aa");}}//System.out.println("b1 =" + b);isPaintShot = false;}else{hero.speed = a;//System.out.println("a2 =" + a);for(int i = 0; i < ets.size(); i ++){//System.out.println("bbbbbbbbbbbbbbbbbbb");EnemyTask et = ets.get(i);et.isdirects = true;et.speed = b;et.direct = directs[i];for(int j = 0 ; j < et.ss.size(); j ++){shot s = et.ss.get(j);s.speed = c;isPaintShot = true;}}s.isShot = true;}}if(arg0.getKeyCode() == KeyEvent.VK_K){this.KeepExit();System.exit(0);}if(arg0.getKeyCode() == KeyEvent.VK_L){this.GetKeeper();}this.repaint();}@Overridepublic void keyReleased(KeyEvent arg0) {// TODO Auto-generated method stub}@Overridepublic void keyTyped(KeyEvent arg0) {// TODO Auto-generated method stub}@Overridepublic void run() {//每隔100mswhile(true){try {Thread.sleep(100);} catch (InterruptedException e) {// TODO Auto-generated catch blocke.printStackTrace();}this.hintEnemyTank();this.hintMyTank();// for(int i = 0; i < et.ss.size(); i ++){// shot myshot = et.ss.get(i);// if(et.isLive == true){//// if(hero.isLive = true){// this.hintTank2(myshot, hero);// }//// }// }this.repaint();}}private void hintMyTank() {for(int i = 0; i < ets.size(); i++){EnemyTask et = ets.get(i);for(int j = 0; j < et.ss.size(); j++ ){shot s = et.ss.get(j);if(s != null){if(hero.isLive){this.hintTank(s, hero);if(this.hintTank(s, hero)){//判断是否击中,返回true则hero数量减一Recoder.setMyLife(Recoder.getMyLife() - 1 );}}}}}}private void hintEnemyTank() {for(int i = 0; i < hero.ss.size(); i ++){shot myshot = hero.ss.get(i);if(myshot.isLive == true){for(int j = 0; j < ets.size(); j ++){EnemyTask et = ets.get(j);if(et.isLive = true){this.hintTank(myshot, et);if(this.hintTank(myshot, et)){hintEnemyTanks ++;Recoder.setEnNum(Recoder.getEnNum() - 1);}}}}}}private void KeepExit(){int [] heros = new int[]{hero.getX(),hero.getY(),hero.direct,};for(int i = 0 ; i < ets.size(); i ++){EnemyTask et = ets.get(i);TanksX[i] = et.getX();TanksY[i] = et.getY();ETdirects [i] = et.direct;for(int j = 1 ; j < et.ss.size(); j++){shot s = et.ss.get(j);ShotsX[j] = s.x;ShotsY[j] = s.y;}}for(int i = 0 ; i < hero.ss.size(); i++ ){shot s = hero.ss.get(i);HeroShotsX[i] = s.x ;HeroShotsY[i] = s.y;}BufferedWriter bw = null;try {bw = new BufferedWriter(new FileWriter("d:\\aa\\TanksX.txt")); for(int i = 0 ; i < enSize ; i ++){bw.write(TanksX[i] + "\r\n");bw.write(TanksY[i] + "\r\n");}} catch (Exception e) {// TODO Auto-generated catch blocke.printStackTrace();}finally {try {bw.close();} catch (IOException e) {// TODO Auto-generated catch blocke.printStackTrace();}}}public void GetKeeper (){//继续游戏时还原数据BufferedReader br = null ;try {br = new BufferedReader(new FileReader("d:\\aa\\TanksX.txt")); for(int i = 0; i < enSize*2 ; i ++){if(i % 2 !=0){TanksY[i] = Integer.parseInt(br.readLine());System.out.println("TanksY" + TanksY[i]);}else{TanksX[i] = Integer.parseInt(br.readLine());System.out.println("TanksX" + TanksX[i]);}}} catch (Exception e) {// TODO Auto-generated catch blocke.printStackTrace();}finally {try {br.close();} catch (IOException e) {// TODO Auto-generated catch blocke.printStackTrace();}}}}//class tank extends Tank{//// public tank(int x, int y, int direct,int type) {// super(x, y, direct,type);// // TODO Auto-generated constructor stub// }////}下面是工具类:package com.qq.TankGame;import java.io.BufferedReader;import java.io.BufferedWriter;import java.io.FileNotFoundException;import java.io.FileReader;import java.io.FileWriter;import java.io.IOException;import java.util.Vector;class Recoder{/****/private static Vector<EnemyTask> ets = new Vector<EnemyTask>(); public static Vector<EnemyTask> getEts() {return ets;}public static void setEtss(Vector<EnemyTask> ets) {Recoder.ets = ets;}private static int enSize ;public static int getEnSize() {return enSize;}public static void setEnSize(int enSize) {Recoder.enSize = enSize;}private static Hero hero ;public static Hero getHero() {return hero;}public static void setHero(Hero hero) { Recoder.hero = hero;}public static void KeepExit(){//System.out.println(hero.getX());int [] TanksX = new int[20];int [] TanksY = new int[20];int [] ShotsX = new int[100];int [] ShotsY = new int[100];int [] ETdirects = new int[20];int [] HeroShotsX = new int[10];int [] HeroShotsY = new int[10];int [] heros = new int[]{hero.getX(),hero.getY(),hero.direct};for(int i = 0 ; i < ets.size(); i ++){EnemyTask et = ets.get(i);TanksX[i] = et.getX();TanksY[i] = et.getY();ETdirects [i] = et.direct;for(int j = 1 ; j < et.ss.size(); j++){shot s = et.ss.get(j);ShotsX[j] = s.x;ShotsY[j] = s.y;}}for(int i = 0 ; i < hero.ss.size(); i++ ){ shot s = hero.ss.get(i);HeroShotsX[i] = s.x ;HeroShotsY[i] = s.y;}BufferedWriter bw = null;BufferedWriter bw1 = null ;try {bw = new BufferedWriter(new FileWriter("d:\\aa\\TanksX.txt"));for(int i = 0 ; i < enSize ; i ++){bw.write(TanksX[i] + "\r\n");bw.write(TanksY[i] + "\r\n");}bw1 = new BufferedWriter(new FileWriter("d:\\aa\\KeepRecoding.txt")); bw1.write((20 - getEnNum()) + "\r\n" );} catch (Exception e) {// TODO Auto-generated catch blocke.printStackTrace();}finally {try {bw1.close();bw.close();} catch (IOException e) {// TODO Auto-generated catch blocke.printStackTrace();}}}private static int enNum = 5;public static int getEnNum() {return enNum;}public static void setEnNum(int enNum) {Recoder.enNum = enNum;}public static int getMyLife() {return myLife;}public static void setMyLife(int myLife) {Recoder.myLife = myLife;}private static int myLife = 3;private static BufferedReader br = null;public static void getRecording(){try {br = new BufferedReader(new FileReader("d:\\aa\\KeepRecoding.txt")); String n ;while((n = br.readLine()) != null ){String a = n;enNum = 20 - Integer.parseInt(n);}} catch (Exception e) {// TODO Auto-generated catch blocke.printStackTrace();}finally {try {br.close();} catch (IOException e) {// TODO Auto-generated catch blocke.printStackTrace();}}}private static BufferedWriter bw = null;public static void KeepRecording (){try {bw = new BufferedWriter(new FileWriter("d:\\aa\\KeepRecoding.txt")); bw.write((20 - getEnNum()) + "\r\n" );} catch (IOException e) {// TODO Auto-generated catch blocke.printStackTrace();}finally{try {bw.close();//先开后关//new FileWriter("d:\\aa\\KeepRecoding.txt").close();} catch (IOException e) {// TODO Auto-generated catch blocke.printStackTrace();}}}public class Tank {int x = 0 ;int y = 0;int direct = 0; //方向int type = 0 ;//类型int speed = 30;//速度int color;boolean isLive;public int getColor() {return color;}public void setColor(int color) {this.color = color;}public int getS() {return speed;}public void setS(int speed) {this.speed = speed;}public Tank(int x , int y , int direct , int type, int speed, boolean isLive){ this.x = x;this.y = y;this.direct = direct;this.type= type;this.speed = speed;this.isLive = isLive;}public int getX() {return x;}public void setX(int x) {this.x = x;}public int getY() {return y;}public void setY(int y) {this.y = y;}public int getD() {return direct;}public void setD(int direct) {this.direct = direct;}public int getT() {return type;}public void setT(int type) {this.type = type;}}class EnemyTask extends Tank implements Runnable{Vector<shot> ss = new Vector<shot>();Vector<EnemyTask> ets = new Vector<EnemyTask>();boolean isdirects = true;public EnemyTask(int x, int y, int direct, int type, int speed ,boolean isLive) {super(x, y, direct, type, speed, isLive);// TODO Auto-generated constructor stub}public boolean isTouchOhterTank (){boolean b = false;switch (this.direct) {case 0://此坦克向上for(int i = 0; i < ets.size(); i++){EnemyTask et = ets.get(i);if(et != this){if(et.direct == 0 || et.direct == 1){//上或下if((this.x>=et.x && this.x <= et.x + 20//第一个点x在内&& this.y>=et.y && this.y <= et.y + 30)//第一个点y在内||(this.x + 20>=et.x && this.x+ 20 <= et.x + 20//第二个点x在内&& this.y >=et.y && this.y <= et.y + 30)//第二个点y在内){b = true;}}if(et.direct == 2 || et.direct == 3){//左或右if((this.x>=et.x && this.x <= et.x + 30//第一个点x在内&& this.y>=et.y && this.y <= et.y + 20)//第一个点y在内||(this.x + 20>=et.x && this.x+ 20 <= et.x + 30//第二个点x在内&& this.y >=et.y && this.y <= et.y + 20)//第二个点y在内){b = true;}}}}break;case 1://向下for(int i = 0; i < ets.size(); i++){EnemyTask et = ets.get(i);if(et != this){if(et.direct == 0 || et.direct == 1){//上或下if((this.x>=et.x && this.x <= et.x + 20//第一个点x在内&& this.y + 30>=et.y && this.y + 30 <= et.y + 30)//第一个点y在内||(this.x + 20>=et.x && this.x+ 20 <= et.x + 20//第二个点x在内&& this.y + 30>=et.y && this.y + 30 <= et.y + 30)//第二个点y在内){b = true;}}if(et.direct == 2 || et.direct == 3){//左或右if((this.x>=et.x && this.x <= et.x + 30//第一个点x在内&& this.y + 30 >=et.y && this.y + 30 <= et.y + 20)//第一个点y在内||(this.x + 20 >=et.x && this.x+ 20 <= et.x + 30//第二个点x在内&& this.y + 30 >=et.y && this.y + 30 <= et.y + 20)//第二个点y在内){b = true;}}}}break;case 2:for(int i = 0; i < ets.size(); i++){EnemyTask et = ets.get(i);if(et != this){if(et.direct == 0 || et.direct == 1){//上或下if((this.x>=et.x && this.x <= et.x + 20//第一个点x在内&& this.y>=et.y && this.y <= et.y + 30)//第一个点y在内||(this.x >=et.x && this.x<= et.x + 20//第二个点x在内&& this.y + 20 >=et.y && this.y + 20 <= et.y + 30)//第二个点y在内){b = true;}}if(et.direct == 2 || et.direct == 3){//左或右if((this.x>=et.x && this.x <= et.x + 30//第一个点x在内&& this.y>=et.y && this.y <= et.y + 20)//第一个点y在内||(this.x >=et.x && this.x<= et.x + 30//第二个点x在内&& this.y + 20>=et.y && this.y + 20 <= et.y + 20)//第二个点y在内){b = true;}}}}break;case 3:for(int i = 0; i < ets.size(); i++){EnemyTask et = ets.get(i);if(et != this){if(et.direct == 0 || et.direct == 1){//上或下if((this.x + 30>=et.x && this.x + 30 <= et.x + 20//第一个点x在内&& this.y>=et.y && this.y <= et.y + 30)//第一个点y在内||(this.x + 30 >=et.x && this.x+ 30 <= et.x + 20//第二个点x在内&& this.y + 20 >=et.y && this.y + 20 <= et.y + 30)//第二个点y在内){b = true;}}if(et.direct == 2 || et.direct == 3){//左或右if((this.x + 30>=et.x && this.x + 30 <= et.x + 30//第一个点x在内&& this.y>=et.y && this.y <= et.y + 20)//第一个点y在内||(this.x + 30>=et.x && this.x+ 30 <= et.x + 30//第二个点x在内&& this.y + 20>=et.y && this.y + 20 <= et.y + 20)//第二个点y在内){b = true;}}}}break;default:break;}return b ;}@Overridepublic void run() {int a = (int) (Math.random() * 10 + 2);//连动步数int times = 0;while(true){try {Thread.sleep(300);} catch (InterruptedException e) {// TODO Auto-generated catch blocke.printStackTrace();}//if(x > 0 && x < 400 - 30 & y > 0 && y < 300 - 30){ //if(!this.isTouchOhterTank()){switch(this.direct){case 0://System.out.println(isTouchOhterTank());for(int i = 0 ;i < a ; i++){if(y - this.speed > 0 && !this.isTouchOhterTank()){y -= this.speed;}try {Thread.sleep(50);} catch (InterruptedException e) {// TODO Auto-generated catch blocke.printStackTrace();}}break;case 1:for(int i = 0 ;i < a ; i++){if(y + speed < 300 - 30 && !this.isTouchOhterTank()){ y += this.speed;}try {Thread.sleep(50);} catch (InterruptedException e) {// TODO Auto-generated catch blocke.printStackTrace();}}break;case 2:for(int i = 0 ;i < a ; i++){if(x - speed > 0 && !this.isTouchOhterTank()){x -= this.speed;}try {Thread.sleep(50);} catch (InterruptedException e) {// TODO Auto-generated catch blocke.printStackTrace();}}break;case 3:for(int i = 0 ;i < a ; i++){if(x + speed < 400 - 30 && !this.isTouchOhterTank()){ x += this.speed;}try {Thread.sleep(50);} catch (InterruptedException e) {// TODO Auto-generated catch blocke.printStackTrace();}}break;}//}times ++;if(times % 2 == 0){if(isLive){if(ss.size() < 3){shot s = null;switch (direct) {case 0://向上s = new shot(x + 10 , y ,0);ss.add(s);break;case 1://向下s = new shot(x + 10 , y + 30 , 1);ss.add(s);break;case 2://向左s = new shot(x , y + 10 , 2);ss.add(s);break;case 3://右s = new shot(x + 30 , y + 10 , 3);ss.add(s);break;default:break;}Thread t = new Thread(s);t.start();}}}//}// //随机改变方向// public void changeDirect(){//// }if(isdirects){this.direct = (int) (Math.random() * 4); }if(this.isLive == false){break;}if(ss.size() < 3){}}}public void setEts(Vector<EnemyTask> ets) { this.ets = ets;}// @Override// public void run() {// while(true){// try {// Thread.sleep(50);// } catch (InterruptedException e) {// // TODO Auto-generated catch block// e.printStackTrace();// }//// y ++ ;// System.out.println(y);// }//// }}class Hero extends Tank{//public Hero(int x , int y, int direct, int type,int speed, boolean isLive){super(x, y, direct, type,speed , isLive);}Vector<shot> ss = new Vector<shot>();shot s = null;//开火public void shotEnemy(){//System.out.println("shotEnemy");if(Recoder.getMyLife() > 0){//生命没有了,不能发子弹 switch (this.direct) {case 0://向上s = new shot(x + 10 , y ,0);ss.add(s);break;case 3://右s = new shot(x + 30 , y + 10 , 3);ss.add(s);break;case 1://向下s = new shot(x + 10 , y + 30 , 1);ss.add(s);break;case 2://向左s = new shot(x , y + 10 , 2);ss.add(s);break;default:break;}Thread t = new Thread(s);t.start();}}//向上,下,左,右public void MoveUp(){if(y - this.speed > 0){y -= speed;}}public void MoveDown(){if(y + this.speed < 300 -30){y += speed;}}public void MoveLeft(){if(x - this.speed > 0){x -= speed;}}public void MoveRight(){if(x + this.speed < 400 -30){x += speed;}}}class shot implements Runnable{int x ,y;int direct;int speed = 20; //子弹速度boolean isShot = true;boolean isLive = true;//子弹是否活着 public shot(int x,int y, int direct){this.x = x;this.y = y;this.direct = direct;}@Overridepublic void run() {while(true){try {Thread.sleep(50);} catch (InterruptedException e) {// TODO Auto-generated catch blocke.printStackTrace();}if(isShot){switch (direct) {case 0://向上y -= speed;break;case 1://下y += speed;break;case 2://右x -= speed;break;case 3://左x += speed;break;default:break;}}//System.out.println(x + " " + y);if(x < 0 || x > 400 || y < 0 || y > 300){ //System.out.println("this.islive = false");this.isLive = false;break;}}} }。
百度之星坦克大战代码

#include "Tank.h"#include <string.h>#include "main.cpp"//请勿修改以上头文件/* 您可以在这里添加您所需头文件*/#include "stdio.h"#include <vector>#include <set>using namespace std;/* 您可以在这里添加您的自定义函数*//* A*寻路算法*/// 所需结构定义typedef struct node // aStar 算法需要的动态表节点{int id;int father; // 父节点编号int cost; // 从初始位置到达此次的花费g(x)}node;static vector<node> openT; // open表static vector<node> closedT; // closed表static vector<int> path[MAX_TANK_NUM]; // 路径存储位置static set<int> targeted; // 标记目标矿点是否被己方锁定,存在则锁定int point2id(int row, int col) // 节点编号{int id = row * (MAP_WIDTH + 2) + col;return id;}Point id2point(int id) // 节点反编号{Point po;po.row = id / (MAP_WIDTH + 2);po.col = id % (MAP_WIDTH + 2);return po;}// 查找某vector表中是否有一节点int find(int id, vector<node> vet){if (vet.empty()){return -1;}for (int i = 0; i < vet.size(); i ++){if (id == vet[i].id){return i;}}return -1;}// 查找当然位置在path[myID]中的indexint findPathIdx(int id, vector<int> pathT){if (pathT.empty()){return -1;}for (int i = 0; i < pathT.size(); i ++){if (id == pathT[i]){return i;}}return -1;}// 返回从一节点到邻近节点的花费(坦克要走的步数)// 可通过PERVIOUS为1,BRICK为2,BREAKBRICK为3 int addcost(CellType type){switch(type) {case PERVIOUS:return 1;break;case BRICK:return 2;break;default:return 3;}}// 对给定扩展点进行检测添加void addExtNode(node tmpNode, int extid, CellType type){Point extPo;node extNode;extPo = id2point(extid);if ((-1 == find(extid, closedT)) && (STONE != type)) // 要扩展点不在closed表中,且不为石头则扩展{int idx = find(extid, openT); // 在open表中的索引if (-1 == idx) // 如果不在open表中则添加{extNode.id = extid;extNode.father = tmpNode.id;extNode.cost = tmpNode.cost + addcost(type);openT.push_back(extNode);}else // 如果在open表中,看新路径是否更近,近则修改{if (tmpNode.cost + addcost(type) < openT[idx].cost){openT[idx].father = tmpNode.id;openT[idx].cost = tmpNode.cost + addcost(type);}}}}// 得到本坦克的路径void getPath(int myID, int goalIdx){// id为myID的坦克路径存于path[myID]中path[myID].clear();node tmpNode = openT[goalIdx];path[myID].insert(path[myID].begin(), tmpNode.id);/*Point debug_po = id2point(tmpNode.id);printf("Path Star!\nGoal (%d, %d)\n", debug_po.row, debug_po.col);*/while (-1 != tmpNode.father){int tmpIdx = find(tmpNode.father, closedT);//printf("%d ", tmpIdx);if (-1 != tmpIdx){tmpNode = closedT[tmpIdx];/*Point debug_po = id2point(tmpNode.id);printf("(%d, %d)\n", debug_po.row, debug_po.col);*/path[myID].insert(path[myID].begin(), tmpNode.id);}else{path[myID].clear();return;}}}// 根据下一步目标返回:方向运动指令OrderType getOrder(FlagType myFlag, Point mySite, Point nextStep){int rowD = nextStep.row - mySite.row;printf("%d ",rowD);int colD = nextStep.col - mySite.col;printf("%d ",colD);switch(rowD){case -1:return GOUP;break;case 1:return GODOWN;break;default:;}switch(colD){case -1:return GOLEFT;break;case 1:return GORIGHT;break;default:;}return STOP;}// A*寻路算法,路径存储在path[myID]中void aStar(int myID, Point start, Point goal, MapCell map[][MAP_WIDTH +2]) {openT.clear();closedT.clear();path[myID].clear();// 1. 把初始节点放入openTnode tmpNode;tmpNode.id = point2id(start.row, start.col);tmpNode.father = -1; // 初始节点无父节点tmpNode.cost = 0;openT.push_back(tmpNode);// 2. 如果openT为空,搜索失败退出bool findGoal = false;while (! openT.empty() && ! findGoal){tmpNode = openT[0];int no = 0; // 记录最小f(x)的索引//3. 移除openT中f(x)值最小的Point p1 = id2point(tmpNode.id); // 当前考察点位置int hx1 = abs(goal.row - p1.row) + abs(goal.col - p1.col); // 当前路径costint fx1 = hx1 + tmpNode.cost;// 寻找f(x)最小的节点for (int i = 0; i < openT.size(); i ++){node tmpNode2 = openT[i];Point p2 = id2point(tmpNode2.id);int hx2 = abs(goal.row - p2.row) + abs(goal.col - p2.col);int fx2 = hx2 + tmpNode2.cost;if (fx1 > fx2){tmpNode = openT[i];no = i;}}// 如果节点为目标节点,则路径找到,返回路径if (point2id(goal.row, goal.col) == tmpNode.id){// 存储路径getPath(myID, no); // 当目标在open中,得到的最小f(x)的点是目标节点索引为no return;}// 从openT移节点如closedT中openT.erase(openT.begin() + no);closedT.push_back(tmpNode);//4. 从四个方向扩展节点Point tmpPo;tmpPo = id2point(tmpNode.id);int extid;CellType type;// 上extid = point2id(tmpPo.row - 1, tmpPo.col);type = (map[tmpPo.row - 1][tmpPo.col]).type;addExtNode(tmpNode, extid, type);// 下extid = point2id(tmpPo.row + 1, tmpPo.col);type = (map[tmpPo.row + 1][tmpPo.col]).type;addExtNode(tmpNode, extid, type);// 左extid = point2id(tmpPo.row, tmpPo.col - 1);type = (map[tmpPo.row][tmpPo.col - 1]).type;addExtNode(tmpNode, extid, type);// 右extid = point2id(tmpPo.row, tmpPo.col + 1);type = (map[tmpPo.row][tmpPo.col + 1]).type;addExtNode(tmpNode, extid, type);}}//平台0回合时调用此函数获取AI名称及坦克类型信息,请勿修改此函数声明。
java 坦克大战游戏教程完整代码

项目:用java做的坦克大战效果图:进入《坦克大战》游戏主界面点击开始菜单,即可进入游戏:使用W/A/S/D控制坦克移动,使用J发射子弹消灭所有坦克游戏获得胜利,被击中后,游戏将会结束:完整代码见下文,需要准备一个进入坦克大战的音乐声音,放在TankVs.java代码文件的同路径的shengyin文件夹下。
(没有也可以)代码运行方法:1,在以及配置好java JDK的情况下,将下面的完整的代码复制到并粘贴到记事本内,并将后缀.txt改为.java,文件命名为TankVs.java。
2,运行cmd,使用javac TankVs.java命令编译该java文件,编译成功后,使用java TankVs 命令即可运行游戏。
//以下为完整的坦克游戏代码import java.awt.*;import javax.swing.*;import java.awt.event.*;import java.util.*;import java.io.*;import javax.sound.sampled.*;//导入声音类包public class TankVs extends JFrame implements ActionListener,Runnable{OverPanel op=null;WinPanel wp=null;FirstPanel fmp=null;MyPanel mp=null;JMenuBar jmb=null;JMenu jm=null;JMenuItem jmi=null;public static void main(String[] args){TankVs tk1=new TankVs();}public TankVs(){fmp=new FirstPanel();jmb=new JMenuBar();jm=new JMenu("开始");jmi=new JMenuItem("开始游戏");jm.add(jmi);jmb.add(jm);this.setJMenuBar(jmb);this.add(fmp);jmi.addActionListener(this);//添加单击事件监听this.setSize(1000,800);this.setLocation(200,100);this.setTitle("坦克大战");//文件的路径自己改一下this.setIconImage(new ImageIcon("D:\\JAVA\\高级\\坦克大战\\image\\tank.jpg").getImage());this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);this.setResizable(false);this.setVisible(true);Thread t=new Thread(fmp);t.start();}public void actionPerformed(ActionEvent e){if(fmp!=null){this.remove(fmp);}if(op!=null){this.remove(op);}if(wp!=null){this.remove(wp);}mp=new MyPanel();mp.repaint();this.addKeyListener(mp);//添加键盘事件监听this.add(mp);Thread t=new Thread(mp);t.start();this.setVisible(true);Thread t1=new Thread(this);t1.start();shengyin sy=new shengyin(".\\shengyin\\tank.wav");sy.start();}public void run(){while(true){try{Thread.sleep(50);}catch(Exception e){}if(this.mp.dtk.size()==0){try{Thread.sleep(1000);}catch(Exception e){}this.wp=new WinPanel();this.add(wp);this.remove(mp);this.setVisible(true);}if(this.mp.mt.shengming==false){try{Thread.sleep(1000);}catch(Exception e){}this.op=new OverPanel();this.add(op);this.remove(mp);this.setVisible(true);}}}}class FirstPanel extends JPanel implements Runnable{int times=0;public void paint(Graphics g){super.paint(g);g.fillRect(0,0,800,600);if(times%2==0){g.setColor(Color.yellow);Font myFont=new Font("华文行楷",Font.BOLD,80);g.setFont(myFont);g.drawString("坦克大战",230,300);}}public void run(){while(true){try{Thread.sleep(500);}catch(Exception e){}times++;this.repaint();}}}class OverPanel extends JPanel{public void paint(Graphics g){super.paint(g);g.fillRect(0,0,800,600);g.setColor(Color.yellow);g.setFont(new Font("Cambria",Font.BOLD,80));g.drawString("GAME OVER",200,300);}}class WinPanel extends JPanel{public void paint(Graphics g){super.paint(g);g.fillRect(0,0,800,600);g.setColor(Color.yellow);g.setFont(new Font("Cambria",Font.BOLD,80));g.drawString("YOU WIN",200,300);}}class MyPanel extends JPanel implements KeyListener,Runnable{WoTank mt=null;Vector<DiTank> dtk=new Vector<DiTank>();//集合类+泛型,Vector适用与多线程,int tks=12;public MyPanel(){mt=new WoTank(260,500);mt.setSudu(8);for(int i=0;i<tks;i++){DiTank dt=new DiTank((750/(tks-1))*i,20);dt.setSudu(2);dtk.add(dt);Thread t=new Thread(dt);//启动敌人坦克线程t.start();}}public void paint(Graphics g){super.paint(g);g.fillRect(0,0,800,600);if(mt.shengming==true){this.drawTank(mt.getX(),mt.getY(),g,mt.getFangxiang(),0);//绘制我方坦克}for(int i=0;i<dtk.size();i++){DiTank dt=dtk.get(i);this.drawTank(dt.getX(),dt.getY(),g,dt.getFangxiang(),1);if(dt.zd.shengming==true){g.setColor(Color.white);g.fill3DRect(dt.zd.x,dt.zd.y,3,3,false);//绘制敌方坦克}}for(int i=0;i<mt.aa.size();i++)//绘制子弹{Zidan zd=mt.aa.get(i);if(zd.shengming==true && mt.shengming==true){g.setColor(Color.red);g.fill3DRect(zd.x,zd.y,3,3,false);}if(zd.shengming==false){mt.aa.remove(zd);}}}public void drawTank(int x,int y,Graphics g,int fangxiang,int leixing){switch(leixing){case 0://我的坦克g.setColor(Color.yellow);break;case 1://敌人的坦克g.setColor(Color.green);break;}switch(fangxiang){case 0://上方向g.fill3DRect(x,y,5,30,false);g.fill3DRect(x+15,y,5,30,false);g.fill3DRect(x+5,y+5,10,20,false);g.fillOval(x+5,y+10,10,10);g.drawLine(x+10,y+15,x+10,y-3);break;case 1://左方向g.fill3DRect(x,y,30,5,false);g.fill3DRect(x,y+15,30,5,false);g.fill3DRect(x+5,y+5,20,10,false);g.fillOval(x+10,y+5,10,10);g.drawLine(x+15,y+10,x-3,y+10);break;case 2://下方向g.fill3DRect(x,y,5,30,false);g.fill3DRect(x+15,y,5,30,false);g.fill3DRect(x+5,y+5,10,20,false);g.fillOval(x+5,y+10,10,10);g.drawLine(x+10,y+15,x+10,y+33);break;case 3://右方向g.fill3DRect(x,y,30,5,false);g.fill3DRect(x,y+15,30,5,false);g.fill3DRect(x+5,y+5,20,10,false);g.fillOval(x+10,y+5,10,10);g.drawLine(x+15,y+10,x+33,y+10);break;}}public void keyTyped(KeyEvent e){}public void keyReleased(KeyEvent e){}public void keyPressed(KeyEvent e){if(mt.shengming==true){if(e.getKeyCode()==KeyEvent.VK_W){this.mt.setFangxiang(0);this.mt.xiangshang();}else if(e.getKeyCode()==KeyEvent.VK_A)this.mt.setFangxiang(1);this.mt.xiangzuo();}else if(e.getKeyCode()==KeyEvent.VK_S){this.mt.setFangxiang(2);this.mt.xiangxia();}else if(e.getKeyCode()==KeyEvent.VK_D){this.mt.setFangxiang(3);this.mt.xiangyou();}if(e.getKeyCode()==KeyEvent.VK_J){if(mt.aa.size()<8)//允许我的坦克同时存在8颗子弹{this.mt.fszd();Thread t=new Thread(this);//启动画板线程t.start();}}}this.repaint();}public void run(){while(mt.zd.shengming==true ||dtk.size()>0){try{Thread.sleep(50);}catch(Exception e){}for(int i=0;i<mt.aa.size();i++){Zidan zd=mt.aa.get(i);for(int j=0;j<dtk.size();j++){DiTank dt=dtk.get(j);this.jzdf(zd,dt);}for(int i=0;i<dtk.size();i++){DiTank dt=dtk.get(i);this.jzwf(dt.zd,mt);}this.repaint();//System.out.println("线程1");}}public void jzdf(Zidan zd,DiTank dt)//击中敌方{switch(dt.fangxiang){case 0:case 2:if(zd.x>dt.getX() && zd.x<dt.getX()+20 && zd.y>dt.getY() && zd.y<dt.getY()+30){zd.shengming=false;dt.shengming=false;mt.aa.remove(zd);dtk.remove(dt);}break;case 1:case 3:if(zd.x>dt.getX() && zd.x<dt.getX()+30 && zd.y>dt.getY() && zd.y<dt.getY()+20){zd.shengming=false;dt.shengming=false;mt.aa.remove(zd);dtk.remove(dt);}break;}}public void jzwf(Zidan zd,WoTank mt)//击中我方{if(mt.shengming==true){switch(mt.fangxiang){case 0:case 2:if(zd.x>mt.getX() && zd.x<mt.getX()+20 && zd.y>mt.getY() && zd.y<mt.getY()+30){zd.shengming=false;mt.shengming=false;}break;case 1:case 3:if(zd.x>mt.getX() && zd.x<mt.getX()+30 && zd.y>mt.getY() && zd.y<mt.getY()+20){zd.shengming=false;mt.shengming=false;}break;}}}}class Tank{private int x=0,y=0;int fangxiang=0;int sudu=1;boolean shengming=true;public int getSudu(){return sudu;}public void setSudu(int sudu){this.sudu=sudu;}public int getFangxiang(){return fangxiang;}public void setFangxiang(int fangxiang){this.fangxiang=fangxiang;}public int getX(){return x;}public int getY(){return y;}public void setX(int x){this.x=x;}public void setY(int y){this.y=y;}public Tank(int x,int y){this.x=x;this.y=y;}}class WoTank extends Tank{Zidan zd=new Zidan();Vector<Zidan> aa=new Vector<Zidan>();public WoTank(int x,int y){super(x,y);}public void xiangshang(){if(getY()-sudu>0){this.setY(this.getY()-sudu);}}public void xiangzuo(){if(getX()-sudu>0){this.setX(this.getX()-sudu);}}public void xiangxia(){if(getY()+sudu<520){this.setY(this.getY()+sudu);}}public void xiangyou(){if(getX()+sudu<750){this.setX(this.getX()+sudu);}}public void fszd(){switch(this.fangxiang){case 0:zd=new Zidan(super.getX()+10,super.getY(),super.getFangxiang(),true);break;case 1:zd=new Zidan(super.getX(),super.getY()+10,super.getFangxiang(),true);break;case 2:zd=new Zidan(super.getX()+10,super.getY()+30,super.getFangxiang(),true);break;case 3:zd=new Zidan(super.getX()+30,super.getY()+10,super.getFangxiang(),true);break;}aa.add(zd);Thread t=new Thread(zd);//启动子弹线程t.start();}}class Zidan implements Runnable{int x;int y;int fangxiang;int sudu=8;public boolean shengming=false;public Zidan(){}public Zidan(int x,int y,int fangxiang,boolean shengming){this.x=x;this.y=y;this.fangxiang=fangxiang;this.shengming=shengming;}public void run(){while(true){try{Thread.sleep(50);//凡是线程下的死循环,都要有个睡眠}catch(Exception e){}switch(fangxiang){case 0:y-=sudu;break;case 1:x-=sudu;break;case 2:y+=sudu;break;case 3:x+=sudu;break;}if(x<0 ||y<0 ||x>800 ||y>600){this.shengming=false;break;}//System.out.println("线程2");}}}class DiTank extends Tank implements Runnable{Zidan zd=new Zidan();public DiTank(int x,int y){super(x,y);}public void run(){while(this.shengming=true){try{Thread.sleep(50);}catch(Exception e){}this.fangxiang=(int)(Math.random()*4);switch(this.fangxiang){case 0:for(int i=0;i<30;i++){if(getY()-sudu<0) {break;}this.setY(this.getY()-sudu);try{Thread.sleep(50);}catch(Exception e){}}break;case 1:for(int i=0;i<30;i++)if(getX()-sudu<0) {break;}this.setX(this.getX()-sudu);try{Thread.sleep(50);}catch(Exception e){}}break;case 2:for(int i=0;i<30;i++){if(getY()+sudu>520) {break;}this.setY(this.getY()+sudu);try{Thread.sleep(50);}catch(Exception e){}}break;case 3:for(int i=0;i<30;i++){if(getX()+sudu>750) {break;}this.setX(this.getX()+sudu);try{Thread.sleep(50);}catch(Exception e){}}break;}if(this.zd.shengming==false){switch(fangxiang){case 0:zd=new Zidan(super.getX()+10,super.getY(),super.getFangxiang(),true);break;zd=new Zidan(super.getX(),super.getY()+10,super.getFangxiang(),true);break;case 2:zd=newZidan(super.getX()+10,super.getY()+30,super.getFangxiang(),true);break;case 3:zd=newZidan(super.getX()+30,super.getY()+10,super.getFangxiang(),true);break;}Thread t=new Thread(zd);t.start();}}}}class shengyin extends Thread//播放声音的类{private String wjm;public shengyin(String ypwj){wjm=ypwj;}public void run(){File wjl=new File(wjm);AudioInputStream ypsrl=null;//AudioInputStream类:音频输入流try{ypsrl=AudioSystem.getAudioInputStream(wjl);}catch(Exception e){}AudioFormat format=ypsrl.getFormat();SourceDataLine aqsj=null; info=new (SourceDataLine.class,format);try{aqsj=(SourceDataLine)AudioSystem.getLine(info);aqsj.open(format);}catch(Exception e){}aqsj.start();int zjtj=0;byte[] hczj=new byte[1024];try{while(zjtj!=1){zjtj=ypsrl.read(hczj,0,hczj.length);if(zjtj>=0){aqsj.write(hczj,0,zjtj);}}}catch(Exception e){}finally{aqsj.drain();aqsj.close();}}}。
坦克大战程序代码

坦克大战程序代码This model paper was revised by the Standardization Office on December 10, 2020class 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 4: ; 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 0: ; break; 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 16: ; 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 4: ; 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] - 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坦克大战源码

import java.awt.Color; import java.awt.Graphics;
public class Bullet { Tank t = new Tank(null); int x = -20; int y = -20; int width = 10; int height = 10; int speed = 15; int dir = 3; Color bColor = new Color(0, 0, 0);
} }
public void AI() { long l = System.currentTimeMillis(); if (l - AiTime >= 2000 || x - barrelHeight <= 0 || y - barrelHeight <= 30 || x + width + barrelHeight >= 800 || y + height + barrelHeight >= 600) { int i = r.nextInt() % 5 + 4; switch (i) { case LEFT: bareelDir = LEFT; dir = LEFT; AiTime = System.currentTimeMillis(); break; case UP: bareelDir = UP; dir = UP; AiTime = System.currentTimeMillis(); break; case RIGHT: bareelDir = RIGHT; dir = RIGHT; AiTime = System.currentTimeMillis(); break; case DOWN: bareelDir = DOWN; dir = DOWN; AiTime = System.currentTimeMillis(); break; } }
c语言编写坦克大战源代码

#include "tank.h"#include "ConOperator.h"#include <time.h>#include <windows.h>#include <conio.h>#include <iostream>using namespace std;TankGame::TankGame(int w, int h){// 设定当前关数no = 1;// 设定游戏整体高宽wide = w;high = h;HANDLE hStdOut = GetStdHandle(STD_OUTPUT_HANDLE);COORD sizePos = {2 * wide, high};SetConsoleScreenBufferSize(hStdOut, sizePos);// 分配游戏空间状态表gameSpace = new GameSpace*[high];for (int i = 0; i != high; i++)gameSpace[i] = new GameSpace[wide];// 添加围墙wall = new Wall(gameSpace, wide, high);wall->draw();}void TankGame::load_init(){// 初始化游戏空间for (int y = 1; y != high-1; y++) {for (int x = 1; x != wide-1; x++) {gameSpace[y][x].have = false;gameSpace[y][x].kind = 0;gameSpace[y][x].no = 0;}}// 添加地图map.load(gameSpace, no);// 初始化自己坦克me.init_xy();me.trans_direction(1);me.set_no(0);me.init_move(gameSpace, wide / 2 - 2, high - 5);// 按顺序诞生敌人坦克creatPlace = 0;for (int i = 0; i != 3; i++) {freezeTime[i] = REBIRTHTIME;enemy[i].init_xy();enemy[i].set_kind(2);enemy[i].set_no(i+1);reset(enemy[i]);}// 数目初始化leftCount = 17;existCount = 3;// 显示图片me.draw_tank();for (int i = 0; i != 3; i++)enemy[i].draw_tank();map.draw();}TankGame::~TankGame(){if (wall)delete wall;if (gameSpace) {for (int i = 0; i != high; i++)delete[] gameSpace[i];delete[] gameSpace;}}void TankGame::reset(Tank& tank){bool success = false;int t = 3;while (t && !success) {creatPlace++;if (creatPlace == 4)creatPlace = 1;// 诞生地点选择switch (creatPlace) {case 1:tank.trans_direction(3); //朝下if (tank.reset(gameSpace,1,1))success = true;break;case 2:tank.trans_direction(3);if (tank.reset(gameSpace,wide / 2 - 2, 1))success = true;break;case 3:tank.trans_direction(3);if (tank.reset(gameSpace,wide - 4, 1))success = true;break;}if (!success)t--;}}void TankGame::start(){char command;enter_picture(command);if (command != ENTER)return;while (me.blood > 0) {// init data for runingload_init();// run a taskruning_a_task();// determine why returnif (me.blood > 0) {no++;if (no > map.total) {success_gameover();break;}char command;turn_to_next_task(command);if (command != ENTER)break;}else game_over();}}//voidvoid TankGame::runing_a_task(){while ((leftCount || existCount) && me.blood) {clock_t now = clock();char command = -1; // 主人命令while (clock() - now < TIME_UNIT) // 小于一个时间片,暂停update_keyBoard_char(command);/*更新敌人坦克*/for (int i = 0; i != 3; i++) {if (enemy[i].blood == 0)continue;if (enemy[i].freezeTime == 0) {enemy[i].rand_direction(gameSpace); // 产生随机方向}else {if (enemy[i].speed == 0) {enemy[i].move(gameSpace);if (bullet[i+1].disapper) {int shot = -1;bullet[i+1] = enemy[i].rand_shot(gameSpace,i+1, shot);if (shot == 0)me.be_shot(gameSpace);bullet[i+1].registration(gameSpace);}enemy[i].freezeTime--;} else {enemy[i].speed--;}}}/*更新自己坦克*/if (command >=0 && command < 4) {me.trans_to_direction(command);me.move(gameSpace);}/*更新子弹*/for (int i = 0; i !=4; i++) {if (!bullet[i].disapper) { // 存在的子弹int shot;bullet[i].move(gameSpace, shot); // 运行,是否射中if (shot == 0)me.be_shot(gameSpace);else if (shot >= 1 && shot <= 3) {enemy[shot-1].be_shot(gameSpace);existCount--;} else if (shot >= 7 && shot <= 10) {bullet[shot-7].unregistration(gameSpace);bullet[shot-7].clear();bullet[shot-7].init(bullet[shot-7].kind);}}}/*自己产生子弹*/if (bullet[0].disapper) {if (command == 32) {int shot;bullet[0] = me.make_bullet(gameSpace,0, shot);if (shot >= 1 && shot <= 3) {enemy[shot-1].be_shot(gameSpace);existCount--;}bullet[0].registration(gameSpace);}}/*诞生缺损敌人*/if (leftCount > 0) {for (int i = 0; i != 3; i++) {if (enemy[i].blood == 0) {if (freezeTime[i] == 0) {freezeTime[i] = REBIRTHTIME;reset(enemy[i]);existCount++;leftCount--;}else freezeTime[i]--;}}}}}void TankGame::update_keyBoard_char(char& c){if (_kbhit()) {c = getch();if (c == -32) {c = getch();if (c != UP && c != DOWN && c != LEFT && c != RIGHT)c = -1;else if (c == RIGHT)c = 0;else if (c == UP)c = 1;else if (c == LEFT)c = 2;elsec = 3;}elsec = 32;}}void TankGame::enter_picture(char &command){string captions[6];captions[0] = "◥◣◢◤■■■■■◥◣◢◤";captions[1] = " ◥◣◢◤◢◤◥◣◢◤";captions[2] = " ◥◣◢◤◢◤◥◣◢◤";captions[3] = " ◢◤◢◤◢◤◥◣";captions[4] = " ◢◤◢◤◢◤◥◣";captions[5] = " ◢◤■■■■■◢◤◥◣";string s = " ";color(0x0e);for (int i = 0; i != 6; i++)grid(7, 6 + i, captions[i]);Frame frame(30,15);frame.draw_frame(4,19,0x09);string sentence[3];sentence[0] = "This small game is made by yzx in 2010.";sentence[1] = "Wlecome to play it.";sentence[2] = "All Rights Reserved.";color(0x0e);for (int i = 0; i != 3; i++) {for (int k = 0; k != sentence[i].size(); k++) {grid(14+k,21+2*i,sentence[i][k]);sleep(50);}sleep(1000);}grid(7, 28,"Enter : 开始ESC : 退出");while (true) {if (_kbhit()) {command = getch();if (command == ENTER || command == ESC)break;}}// clear screen picture in wallclear_picture();}void TankGame::turn_to_next_task(char& command){clear_picture();color(0x0e);grid(18, 20, "第");grid(20, 20, no);grid(22, 20, "关");while (true) {if (_kbhit()) {command = getch();if (command == ENTER || command == ESC)break;}}grid(18, 20," ");}void TankGame::success_gameover(){clear_picture();Frame frame(30,15);frame.draw_frame(4,10,0x09);string sentence[3];sentence[0] = "Congratulations for Successfully finishing all tasks";sentence[1] = "Thank you for using it deeply.";sentence[2] = "And welcome to use it next time.";color(0x0e);for (int i = 0; i != 3; i++) {for (int k = 0; k != sentence[i].size(); k++) {grid(12+k,14+2*i,sentence[i][k]);sleep(50);}sleep(1000);}while (true) {if (_kbhit()) {char command = getch();if (command == ENTER || command == ESC)break;}}}void TankGame::game_over(){clear_picture();Frame frame(30,15);frame.draw_frame(4,15,0x09);string sentence[4];sentence[0] = "Game over, but you can try it again.";sentence[1] = "Thank you for using it deeply.";sentence[2] = "And welcome to use it next time.";sentence[3] = "All rights reserved.(Violators will be prosecuted.) .";color(0x0e);for (int i = 0; i != 4; i++) {for (int k = 0; k != sentence[i].size(); k++) {grid(13+k,18+2*i,sentence[i][k]);sleep(50);}sleep(1000);}while (true) {if (_kbhit()) {char command = getch();if (command == ENTER || command == ESC)break;}}}void TankGame::clear_picture(){int cirX = wide / 2;int cirY = high / 2;int depth = cirY > cirX ? cirY + 2 : cirX + 2;int lx, rx, uy, by;int l, r, u, b;for (int i = 0; i != depth; i++) {lx = cirX - i;rx = cirX + i;uy = cirY - i;by = cirY + i;uy <= 0 ? u = 1 : u = uy;by >= high - 1 ? b = high - 2 : b = by;lx <= 0 ? l = 1 : l = lx;rx >= wide -1 ? r = wide - 2 : r = rx;if (rx < wide - 1) {for (int k = u; k <= b; k++)grid(rx, k, " ");}if (lx > 0) {for (int k = u; k <= b; k++)grid(lx, k, " ");}if (by < high - 1) {for (int k = l; k <= r; k++)grid(k, by, " ");}if (uy > 0) {for (int k = l; k <= r; k++)grid(k, uy, " ");}}}void TankGame::test(){for (int y = 0; y != 40; y++) {for (int x = 0; x != 40; x++) {if (gameSpace[y][x].have)// && gameSpace[y][x].kind == 3)grid(x, 42+y, (char)gameSpace[y][x].no);elsegrid(x, 42+y, " ");}}}。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
return true;
}
}
}
}
break;
}
return b;
}
public void run() {
while(true)
{
switch(this.direct)
{
case 0:
for(int i=0;i<30;i++)
{
if(y>0&&this.isTouch()==false)y-=this.speed;
if(et!=this)
{
if(et.direct==0||et.direct==2)
{
if(this.x+30>=et.x&&this.x+30<=et.x+20&&this.y<=et.y+30&&this.y>et.y)
{
return true;
}
if(this.x+30>=et.x&&this.x+30<=et.x+20&&this.y+20<=et.y+30&&this.y+20>et.y)
shotm.add(shot);
break;
case 2:
shot=new Shot(this.x+10,this.y+30,2);
shotm.add(shot);
break;
case 3:
shot=new Shot(this.x,this.y+10,3);
shotm.add(shot);
break;
{
return true;
}
if(this.x+20>=et.x&&this.x+20<=et.x+20&&this.y<=et.y+30&&this.y>et.y)
{
return true;
}
}
if(et.direct==1||et.direct==3)
{
if(this.x>=et.x&&this.x<=et.x+30&&this.y<=et.y+20&&this.y>et.y)
{
return true;
}
if(this.x+20>=et.x&&this.x+20<=et.x+30&&this.y+30<=et.y+20&&this.y+30>et.y)
{
return true;
}
}
}
}
break;
case 3:
for(int i=0;i<ets.size();i++)
{
et=ets.get(i);
try {
Thread.sleep(50);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
break;
}
this.direct=(int)(Math.random()*4);
{
return true;
}
if(this.x+20>=et.x&&this.x+20<=et.x+20&&this.y+30<=et.y+30&&this.y+30>et.y)
{
return true;
}
}
if(et.direct==1||et.direct==3)
{
if(this.x>=et.x&&this.x<=et.x+30&&this.y+30<=et.y+20&&this.y+30>et.y)
if(this.isLive==false)
{
break;
}
if(ensh.size()<5)
{
Shot es=null;
switch(this.direct)
{
case 0:
es=new Shot(this.getX()+10,this.getY(),0);
ensh.add(es);
break;
case 1:
{
boolean b=false;
EnemyTank et=null;
switch(direct)
{
case 0:
for(int i=0;i<ets.size();i++)
{
et=ets.get(i);
if(et!=this)
{
if(et.direct==0||et.direct==2)
{
if(this.x>=et.x&&this.x<=et.x+20&&this.y<=et.y+30&&this.y>et.y)
{
return true;
}
}
if(et.direct==1||et.direct==3)
{
if(this.x+30>=et.x&&this.x+30<=et.x+30&&this.y<=et.y+20&&this.y>et.y)
{
return true;
}
if(this.x+30>=et.x&&this.x+30<=et.x+30&&this.y+20<=et.y+20&&this.y+20>et.y)
if(et!=this)
{
if(et.direct==0||et.direct==2)
{
if(this.x+30>=et.x&&this.x+30<=et.x+20&&this.y<=et.y+30&&this.y>et.y)
{
return true;
}
if(this.x+30>=et.x&&this.x+30<=et.x+20&&this.y+20<=et.y+30&&this.y+20>et.y)
boolean isLive=true;
public Shot(int x,int y,int direct)
{
this.shotX=x;
{
this.x=x;
this.y=y;
}
public int getX() {
return x;
}
public void setX(int x) {
this.x = x;
}
public int getY() {
return y;
}
public void setY(int y) {
this.y = y;
this.color = color;
}
}
//MY TANK
class Hero extends Tank
{
Shot shot=null;
Vector<Shot> shotm=new Vector<Shot>();
public Hero(int x,int y)
{
super(x,y);
this.color=5;
}
public int getDirect() {
return direct;
}
public void setDirect(int direct) {
this.direct = direct;
}
public int getColor() {
return color;
}
public void setColor(int color) {
{
x-=speed;
}
}
//敌人的坦克
class EnemyTank extends Tank implements Runnable
{
Vector<Shot>ensh=new Vector<Shot>();
Vector<EnemyTank>ets=new Vector<EnemyTank>();
public EnemyTank(int x, int y)
}
Thread th=new Thread(shot);
th.start();
}
//调整速度
public void moveup()
{
y-=speed;
}
public void moveright()
{
x+=speed;
}
public void movedown()