자바 언어로 컬렉션, 스윙, 스레드 및 기타 지식 포인트를 사용하여 탱크 전쟁 게임을 작성하십시오.
(1) 적과 미국 탱크의 원리를 그리십시오.
탱크 클래스에는 부울 유형 변수가 있습니다. 탱크 캠프를 판단하는 데 사용됩니다. 탱크 객체를 만들 때 탱크 클래스 구조 방법에서 좋은 가치가 전달됩니다. 탱크를 그릴 때 선의 가치를 판단하고 적과 미국의 색을 구별하십시오.
(2) 탱크 운동의 원리 :
Monitor Keyb 그런 다음 탱크의 이동을 달성하기 위해 각 방향으로 탱크의 값을 조정 할 수 있습니다. 적 탱크는 자동으로 움직여 적차의 움직임 방향을 무작위로 무작위로 순환시키고 각 움직임의 횟수를 무작위로 출력합니다. 두 가지 임의의 값의 조합은 적 탱크의 움직임을 가능하게합니다.
(3) 탱크 발사 총알의 원리 :
키보드 모니터링을 통해 총알 사령부를 감지 한 후 총알 클래스를 메인 클래스의 총알 클래스 컬렉션에 추가하십시오. 총 배럴의 방향, 탱크의 위치 및 탱크 캠프를 총알로 옮깁니다. 메인 페인트 드로잉 방법에서는 총알 컬렉션이 순환됩니다. 세트에 총알이 있으면 그려냅니다. 이것은 총알을 출시 할 수 있습니다.
(4) 탱크, 총알 및 벽의 충돌 원리 :
탱크 유형의 총알 형 벽 클래스에서는 자체 범위를 얻기 위해 GetRect 방법을 얻은 다음 탱크와 총알이 그려 질 때마다 해당 충돌 감지를 수행합니다 (탱크의 탱크 외부 탱크와 탱크와 충돌하는 방법이 있으며, 총과 탱크와 충돌하는 방법이 있습니다). 자신의 범위와 충돌하지 말아야 할 대상이 있으면 두 객체가 충돌 함을 의미합니다.
(5) 탱크 혈액 순환의 원리 :
혈전이 우리 탱크와 충돌하면 혈전이 죽고 혈전이 완전히 회복됩니다.
(6) 탱크 부활의 원리 :
키보드 모니터링으로 탱크의 부활 순서를 감지 한 후, 탱크가 죽은 상태 인 경우 탱크 재고 상태가 살아남고 탱크의 혈액량이 완전한 건강으로 복원됩니다.
프로그래밍 아이디어 :
Tank War의 프로그래밍 아이디어는 메인 클래스에서 스레드를 열고 50 밀리 초로 순환하여 방법을 그립니다 (전체 인터페이스에 모든 것을 그립니다). 그려진 것은 적 탱크 (색상 구별), 총알, 벽, 혈전 및 폭발을 포함합니다. 따라서 전체적으로 탱크 탱크, 미사일 총알, 벽 벽, 혈전 및 탱크 클라이언트 주요 등급의 여러 범주가 작성되었습니다. 각 클래스에는이 클래스의 속성의 드로잉 기능을 실현하기위한 그리기 메소드가 있습니다. 메인 클래스에는이 탱크 클래스의 키보드 청취 이벤트라는 키보드 청취 이벤트가 있습니다. 키보드 모니터링을 통해 적의 탱크는 무작위로 움직이는 반면 해당 탱크의 이동이 이루어지는 것으로 결정됩니다. 새로 고침이 새로 고침 될 때마다 충돌해서는 안되는 일부 객체의 상황을 결정하기 위해 다양한 충돌 방법이 호출됩니다. 총알과 같은 각 물체의 생성은 트리거 된 후 총알 클래스 컬렉션에 새로운 총알 수업을 추가하는 것입니다. 그리기시 세트의 숫자를 그리십시오. 탱크가 경계를 벗어나거나 탱크를 죽이면 세트에서 삭제됩니다. 다른 범주도 비슷하므로 자세한 내용은 없습니다.
코드의 각 단계에는 해당 설명이 있습니다.
TankClient.java
import java.awt.color; import java.awt.font; import java.awt.graphics; import java.awt.image; import java.awt.event.keyadapter; import java.awt.event.keyevent; import java.awt.event.windowadapter; java.awt.event java.util.arraylist; import java.util.list; import javax.swing.jframe; public class 탱크 클라이언트는 jframe { / ** * @param args * / image offscrennimage = null; // 이중 버퍼 메모리 이미지 저장소/*게임 크기*/public static final int game_width = 800; // 너비 인터페이스 공개 정적 최종 int game_heigth = 600; // 하이 인터페이스 탱크 MyTank = 새로운 탱크 (500,400, true, color.red, 탱크.direction.stop, this); // 우리의 탱크 클래스 목록 <미사일> 미사일 = 새 배열리스트 <미사일> (); // 총알 목록 <Excrodod> exploit = new ArrayList <ExcrayList <ExcrayList <Excrode> (); // 폭발 세트 목록 <ANK> 탱크 = new ArrayList <Tank> (); // 탱크 세트 벽 벽 1 = 새로운 벽 (150,200,20,300, this); // 벽 1 벽 벽 2 = 새로운 벽 (250,500,300,20, this); // 벽 2 벽 벽 3 = 새로운 벽 (650,200,20,300, this); // 벽 2 벽 벽 4 = 새로운 벽 (250,300,300,20, this); // 벽 2 벽 wb = 새로운 벽 (750,550,40,40, this); // Wall2 Blood B = 새로운 혈액 (); // 혈액 클래스 public static void main (String [] args) {// todo 자동 생성 메소드 스터브 탱크 클라이언트 tc = new TankClient (); tc.lauchframe (); } private void lauchframe () {// todo 자동 생성 메소드 스터브 (int i = 0; i <10; i ++) {tanks.add (새 탱크 (50+40*(i+1), 50, false, color.blue, tank.direction.d, this); } this.setLocation (100, 100); // 창 초기 좌표 지점 this.SetSize (game_width, game_heigth); // 창 초기 크기 this.setitle ( "탱크와 르"); // Window Name/*창 듣기*/this.addwindowlistener (새 WindowAdapter () {@override/*run after point를 종료합니다. this.addkeylistener (new keymoniton ()); // 키보드를 들으려면이를 듣도록 설정합니다. // window를 표시하도록 창을 설정합니다 .setResizable (false); // 크기를 변경하지 않도록 창을 설정 this.getContentPane (). setbackground (color.green); // 창 전경을 녹색 새 스레드로 설정합니다 (new PaintThread ()). start (); // Paintthread 클래스 런을 시작합니다} @override public void paint (그래픽 g) {// todo 자동 생성 메소드 스텁 // 그래픽은 브러시 클래스 Super.paint (g); myTank.draw (g); Wall1.Draw (G); Wall2.Draw (g); Wall3.Draw (g); Wall4.Draw (g); WB.Draw (G); B. Draw (G); myTank.eatblood (b); myTank.hitwall (Wall1); myTank.hitwall (Wall2); myTank.hitwall (Wall3); myTank.hitwall (Wall4); /*Cycle Bullet Collection*/ for (int i = 0; i <missiles.size (); i ++) {Missile M = Missiles.get (i); // 현재 총알을 가져옵니다. M.Hittanks (탱크); // 자신의 총알이 적의 탱크를 죽인다. M.HitWall (Wall1); // 총알과 벽 m.hitwall (Wall2); M.Hitwall (Wall3); M.Hitwall (Wall4); M.Hittank (MyTank); // 적의 총알이 자체 탱크에 부딪칩니다. M.Draw (G); // (int i = 0; i <explore.size (); i ++) {exploit.get (i) .Draw (g); // for (int i = 0; i <tanks.size (); i ++) {탱크 t = 탱크 (i); T.Draw (g); // 적의 탱크를 그리는 T.HITTANKS (탱크); T.hitwall (Wall1); // 탱크와 벽 T.HITWALL (WALL2); T.hitwall (Wall3); T.hitwall (Wall4); } //g.setfont(new font ( "宋体", font.bold, 20); G.DrawString ( "미사일 수 :"+미사일.size (), 10, 50); // Show G.DrawString ( "폭발 수 :"+Explode.size (), 10, 80); // G.DrawString 표시 ( "탱크 수 :"+탱크. Size (), 10, 110); G.DrawString ( "MyTank Life :"+MyTank.getLife (), 10, 130); G.DrawString ( "혈액 회수 :", 750, 540); G.DrawString ( "디렉토리 키 운동 방향; e : 빠른 움직임 혈액 릴리스", 10, 590); G.DrawString ( "Z : Dongfeng-31을 시작합니다. G. drawString ( "F2 : 부활; F3 : 적의 부활 (최대 20 개)", 10, 550); G. drawString ( "R : 위치 복원; Q : 혈액이 가득한", 10, 530); } @override /*Refaint-> update-> Paint* / public void update (그래픽 g) {// todo 자동 생성 메소드 스터브 super.update (g); if (offscrennimage == null) offscrennimage = this.createimage (game_width, game_heigth); 그래픽 Goffscrenn = offscrennimage.getGraphics (); // 메모리 브러시 색상을 전경 이미지로 설정하면 이미지 색상 색상 C = Goffscrenn.getColor (); // 전경 색상을 먼저 저장, Goffscrenn.setColor (color.green); // 메모리 브러시의 색상을 Green Goffscrenn.fillRect (0, 0, Game_width, Game_heigth)로 설정합니다. // 이미지를 게임 크기의 크기로 그립니다. Goffscrenn.setColor (c); // 색상 G.DrawImage (offscrennimage, 0, 0, null)를 복원합니다. // 인터페이스 페인트에 저장된 이미지를 그립니다 (Goffscrenn); // 메모리 브러시를 페인트로 호출} 개인 클래스 페인트 스레드는 runnable {@override public void run () {// todo 자동 생성 메소드 스터브 while (true) {refaint (); // 순서 실행 순서 repaint-> update-> 페인트 try {thread.sleep (50); // 50 밀리 초마다 화면을 새로 고침} catch (예외 e) {e.printstacktrace (); }}}} /*키보드 응답* / 개인 클래스 Keymoniton 확장 KeyAdapter { /*키보드 응답을 누릅니다* / @override public void keypressed (keyevent e) {// todo 자동 생성 메소드 stub super.keypressed (e); myTank.keypressed (e); } /*키보드 응답 상승* / @override public void kyyReleased (keyevent e) {// todo 자동 생성 메소드 스터브 super.keyReleased (e); myTank.keyReleased (e); }}}탱크. 자바
import java.awt.color; import java.awt.graphics; import java.awt.image; import java.awt.rectangle; import java.awt.event.keyevent; import java.util.list; import java.util.random; import javax.swing.swing. 개인 int Oldx, Oldy 조정; // 탱크 이전 좌표 공개 정적 최종 int whith = 30; // 탱크 너비 공개 정적 최종 int higth = 30; // 탱크 높은 공개 정적 최종 최종 int xspeed = 5; // 길이 방향 이동 속도 공개 정적 최종 int yspeed = 5; // Longarogue Movement Speed Private Color Color; // 탱크 색상 개인 부울 bl = false, bu = false, br = false, bd = false; // 4 개의 방향 제어 값 열거 방향 {l, lu, u, ru, r, rd, d, ld, stop}; // 8 방향의 움직임은 4 방향 값으로 구성됩니다. 개인 방향 dir = direction.stop; // 출력 방향 개인 방향 ptdir = Direction.d; // 대포 개인 부울의 원래 방향; // 탱크의 캠프 판사 개인 부울 라이브 = true; // 탱크가 살아 있는지 여부를 판단하십시오. 개인 정적 임의 R = New Random (); // 임의의 값 변수 개인 정적 int step = r.nextint (12) +3; // 적 탱크 임의 움직임 단계 3-14 개인 int life = 100; // 건강 볼륨 개인 Bloodbar BB = New Bloodbar (); // cleck // imageicon icon = new ImageIcon ( "res // mytank.jpg"); // imageicon icon2 = new ImageIcon ( "res // apemytank.jpg"); // image image = icon.getimage (); // image image2 = icon2.getimage (); 개인 탱크 클라이언트 TC; // 메인 클래스 권한 공개 탱크 (int x, int y, boolean good, color color) {super (); this.x = x; this.y = y; this.color = 색상; this.good = 좋습니다. } 공공 탱크 (int x, int y, boolean good, color color, direction dir, tankclient tc) {this (x, y, good, color); this.dir = dir; this.tc = tc; } /*get 탱크 건강* / public int getLife () {return life; } /*SET TANK HEALD* / Public Void SetLife (int life) {this.life = Life; } /*탱크 캠프 받기* / public boolean isgood () {return good; } /*세트 탱크 캠프* / public void setgood (부울 좋은) {this.good = good; } /*탱크 생존 상태를 얻습니다* / public boolean islive () {return live; } /*탱크의 생존 상태 설정* / public void setLive (boolean live) {this.live = live; } /*드로우 탱크* / public void draw (그래픽 g) {if (! live) {if (! good) {tc.tanks.remove (this); // 적의 탱크가 죽을 때 세트에서 삭제하십시오. // tc.tanks.add (새 탱크 (R.NextInt (700), R.NextInt (500), False, Color.blue, Direction.d, this.tc)); } 반품; } /*먼저 이전 브러시 색상을 저장하고 그리기 후 브러시 색상을 복원하십시오* / 색상 c = g.getColor (); // 현재 브러시 색상 G.SetColor (Color)를 가져옵니다. // 브러시 색상을 빨간색으로 설정/*드로우 탱크*/g.filloval (x, y, whith, high); /*적 탱크를 그리는 두 가지 방법, 이전에 추가 된 그림이나 색상을 사용하여*/// if (good) // g.drawimage (image, x, y, whith, high, null); // else // g.drawImage (image2, x, y, whith, high, null); if (양호) bb.draw (g); // 우리 탱크는 혈액 바 G.SetColor (color.black)를 그립니다. /*건 배럴의 방향*/스위치 (ptdir)를 통해 건 배럴을 그립니다. 부서지다; CASE LU : G.DrawLine (X+Tank.Whith.Whith/2, y+tank.Higth/2, X, y); 부서지다; CASE RU : G.DrawLine (X+Tank.Whith/2, Y+Tank.Higth/2, X+Tank.whith/2, y); 부서지다; CASE R : G.DrawLine (x+탱크/2, y+tank.Higth/2, X+Tank.Whith, y+tank.Higth/2); 부서지다; CASE RD : G.DrawLine (X+Tank.Whith.Whith.whith.Higth.Higth/2, X+Tank.Whith, Y+Tank.Higth); 부서지다; CASE D : G.DrawLine (X+Tank.Whith.whith/2, y+tank.Higth/2, X, Y+Tank.Higth); 부서지다; } g.setColor (c); // 브러시 색상 복원 색상 이동 (); // move}/*키보드 모니터링; 키*/ public void keypressed (keyEvent e) {int key = e.getKeyCode (); // 키보드에서 듣는 키를 정수/*키보드 모바일 탱크*/스위치 (키) {/*이동 키*/case keyEvent.vk_up : bu = true; 부서지다; case keyEvent.vk_down : bd = true; 부서지다; case keyevent.vk_right : br = true; 부서지다; case keyevent.vk_left : bl = true; 부서지다; } locietirection (); } /*키보드 모니터링; 키를 들어 올리십시오*/ public void kyyReled (keyEvent e) {int key = e.getKeyCode (); // 키보드에서 듣는 키를 정수/*키보드 이동 탱크*/스위치 (키) {case keyEvent.vk_up : bu = false; 부서지다; case keyEvent.vk_down : bd = false; 부서지다; case keyevent.vk_right : br = false; 부서지다; case keyevent.vk_left : bl = false; 부서지다; case keyevent.vk_z : // 단일 총알 if (live) fire (); 부서지다; case keyevent.vk_f2 : // 우리의 부활 if (! this.live) {this.live = true; this.setLife (100); } 부서지다; case keyEvent.vk_f3 : // Enemesis Resurrection fuhuo (); 부서지다; CASE keyEvent.VK_A : // Invincible Missile Superfire (); 부서지다; case keyevent.vk_q : // if (this.live) this.life = 100; 부서지다; CASE KEYEVENT.VK_E : // 릴리스 혈전 TC.B.FH (); 부서지다; /*위치 키*/ case keyEvent.vk_r : x = 50; y = 50; 부서지다; } locietirection (); // 구성 방향}/*구성 이동 방향*/void locietirection () {if (bl &&! bu &&! br &&! bd) dir = direction.l; else if (bl && bu &&! br &&! bd) dir = direction.lu; else if (! bl && bu &&! bd) dir = direction.u; else if (! bl && bu && br &&! bd) dir = direction.ru; else if (! bl &&! bu && br &&! bd) dir = direction.r; else if (! bl &&! bu && br && bd) dir = direction.rd; else if (! bl &&! bu &&! br && bd) dir = direction.d; else if (! bl &&! bu &&! br && bd) dir = direction.ld; else if (! bl &&! bu &&! bd) dir = direction.stop; } void move () {// move/*이전 단계의 위치를 기록*/Oldx = x; oldy = y; 스위치 (DIR) {CASE L : X- = XSPEED; 부서지다; CASE LU : X- = XSPEED; y- = yspeed; 부서지다; 사례 U : y- = yspeed; 부서지다; CASE RU : X+= XSPEED; y- = yspeed; 부서지다; 사례 R : x+= xspeed; 부서지다; CASE RD : X+= XSPEED; y+= yspeed; 부서지다; 사례 D : y+= yspeed; 부서지다; 사례 LD : X- = Xspeed; y+= yspeed; 부서지다; 사례 LD : X- = Xspeed; y+= yspeed; 부서지다; 사례 정지 : 브레이크; } /*경계 밖으로 탱크 이동 (게임 경계)* / if (x <5) x = 5; if (y <25) y = 25; if (x+whith> tc.game_width-5) x = tc.game_width-whith-5; if (y+higth> tc.game_heigth-5) y = tc.game_heigth-higth-5; if (dir! = direction.stop) // 탱크가 고정되지 않은 경우 배럴의 방향을 변경하십시오. ptdir = dir; /*적 탱크가 자동으로 움직입니다*/ if (! good) {direction [] dirs = direction.values (); // 방향 변수를 배열로 설정하면 (step == 0) {step = r.nextInt (12) +3; // 랜덤 움직임 단계 int randomnumber = r.nextInt (dirs.length); // 임의의 움직임 방향 DIR = DIRS [RandomNumber]; } 단계--; if (r.nextint (40)> 30) this.fire (); // 쉘이 무작위로 발사 되나요}}/*적 탱크 부활*/public void fuhuo () {if (tc.tanks.size () <20) while (true) {int x = r.nextint (700); int y = R.NextInt (500); 탱크 t = 새로운 탱크 (x, y, false, color.blue, direction.d, tc); /*탱크가 벽과 일치하는 경우 새 탱크가 겹치지 않을 때까지 다시 랜덤 위치는 세트*/ if (t.getRect (). intersects (tc.wall1.getRect ()) || t.getRect (). InterSect (tc.wall2.wall2.) || t.getRect ()). || t.getRect (). intersects (tc.wall4.getRect ())) {계속; } else {tc.tanks.add (t); 부서지다; }}}/*Bullet Launch*/public void fire () {int x = this.x + whith/2- 미사일 .whith/2; // 탱크 중간에 총알 방향을 제어 int y = this.y + higth/2 -Missile.higth/2; tc.missiles.add (새로운 미사일 (Ptdir, 컬러, x, y, good, tc)); // Bullet Collection에 가입하기 위해 새로운 총알 클래스를 만듭니다} /*Collision; 탱크의 범위를 가져옵니다*/ public Rectangle getRect () {return new Rectangle (x, y, whith, higth); } /*영수증의 이전 단계 위치* / private void Stay () {x = OldX; y = oldy; } /*벽에 부딪히면 체류 방법을 호출하고 이전 단계 위치로 돌아갑니다* / public boolean hitwall (Wall W) {if (this.live && this.getRect (). intersects (w.getRect ())) {this.stay (); 진실을 반환하십시오. } false를 반환합니다. } /*탱크 충돌 이벤트* / public boolean hittanks (list <탱크> 탱크) {for (int i = 0; i <tanks.size (); i ++) {탱크 t = tanks.get (i); if (this! = t) {// 자신과 충돌 할 수 없습니다/*충돌하면 이전 위치로 돌아갑니다*/if (this.live && t.islive () && this.getRect (). intersects (t.getRect ())) {this.stay (); t.stay (); 진실을 반환하십시오. }} 거짓을 반환합니다. } /*화재 방향이있는 배출 기능* / 공공 미사일 화재 (Direction dir) {if (! live) return null; int x = this.x+whith/2- 미사일 .whith/2; int y = this.y+higth/2-missile.higth/2; 미사일 M = 새로운 미사일 (Dir, Color, X, Y, Good, this.tc); tc.missiles.add (m); 반환 m; } /*Superfire Missile* / Private void superfire () {Direction [] dirs = direction.values (); for (int i = 0; i <8; i ++) {fire (dirs [i]); // 8 개의 방향}}/*추가 혈액 응고 클래스*/개인 클래스 블러드 바 {/*혈액 막대*/public void draw (그래픽 g) {color c = g.getColor (); g.setcolor (color.red); G.DrawRect (X, Y-10, Whith, 10); int w = whith*life/100; G.FillRect (X, Y-10, W, 10); G. 세트 콜러 (c); }} /*혈액 먹는 방법* / public boolean eatblood (혈액 b) {if (this.live && b.islive () && this.isgood () && this.getRect (). intersects (b.getRect ())) {this.setLife (100); B. 세트 리브 (false); 진실을 반환하십시오. } if (this.getRect (). intersects (tc.wb.getRect ()))) this.life = 100; 거짓을 반환합니다. }}미사일. 자바
import java.awt.color; import java.awt.graphics; import java.awt.rectangle; import java.util.list; public class 미사일 { /*Bullet Data* / tank.direction dir; // 총알 방향 색상 C; // 총알 색상 int X, Y; // 총알 위치 public static final int xspeed = 15; // 길이 이동 속도 공개 정적 최종 int yspeed = 15; // 길이 이동 속도 공개 정적 최종 int whith = 10; // 총알 너비 공개 정적 최종 int higth = 10; // Bullet High Private Boolean Live = true; // 총알 개인 부울의 생존을 판단합니다. // 총알 및 캠프 개인 탱크 클라이언트 TC; // 메인 클래스 권한 공개 미사일 (탱크 방향, 색상 C, int X, int y) {super (); this.dir = dir; this.x = x; this.y = y; this.c = c; } 공개 미사일 (Tank. 방향 Dir, Color C, Int X, Int Y, Boolean Good, TankClient Tc) {this (Dir, C, X, Y); this.good = 좋습니다. this.tc = tc; } /*총알의 생존을 얻으십시오* / public boolean islive () {return live; } /*총알의 생존을 설정* / public void setLive (boolean live) {this.live = live; } public void draw (그래픽 g) { /*총알이 죽으면 총알 컬렉션에서 총알을 삭제* / if (! live) {tc.missiles.remove (this); // 컬렉션의 리턴을 삭제합니다. } /*먼저 이전 브러시 색상을 저장하고 그리기 후 브러시 색상을 복원하십시오* / 색상 d = g.getColor (); // 현재 브러시 색상 G.SetColor (C)를 가져옵니다. // 브러시 색상을 빨간색으로 설정/*글 머리 기호*/g.filloval (x, y, whith, high); G. 세트 콜러 (d); // 브러시 색상 복원 (); // move} public void move () {/*탱크의 움직임 방향과 위치 판단*/스위치 (dir) {case l : x- = xspeed; 부서지다; CASE LU : X- = XSPEED; y- = yspeed; 부서지다; 사례 U : y- = yspeed; 부서지다; CASE RU : X+= XSPEED; y- = yspeed; 부서지다; 사례 R : x+= xspeed; 부서지다; CASE RD : X+= XSPEED; y+= yspeed; 부서지다; 사례 D : y+= yspeed; 부서지다; 사례 LD : X- = Xspeed; y+= yspeed; 부서지다; 사례 정지 : 브레이크; } /*총알의 아웃 바운드 상황을 판단하십시오. 아웃 바운드가 있으면 총알이 죽고 총알 컬렉션에서 삭제*/ if (x <0 || y <0 || x> 탱크 클리어. } /*충돌; Bullet의 범위를 가져옵니다*/ public Rectangle getRect () {return new Rectangle (x, y, whith, higth); } /*총알과 탱크 사이의 충돌 과정* /public boolean hittank (탱크 t) { /*총알과 탱크가 같은 범위에 있으면 총알과 탱크가 동시에 죽습니다. 총알은 상대방의 탱크 만 죽일 수 있습니다*/if (this.live && this.getRect (). Intersects (t.getRect ()) && t.isLive () && this. this. good! = t.isgood ()) {if (t.isgood ()) {// 좋은 탱크/*탱크가 총알에 닿을 때의 건강 지점이 줄어들 것입니다. T.setLife (T.getLife () -20); if (t.getLife () <= 0) t.setLive (false); } else {// 잘못된 탱크 t.setLive (false); // death} this.live = false; // Bullet Death Tc.explode.add (new Explode (x, y, tc)); // 새로운 폭발 ADD SET Return true; } false를 반환합니다. } /*총알 충돌을 판단하기위한 붕괴 탱크 세트* / public boolean hittanks (list <tank> 탱크) {for (int i = 0; i <탱크S.size (); i ++) {if (hittank (wanks.get (i))) true; } false를 반환합니다. } /*총알과 벽 사이의 충돌 과정* / public boolean hitwall (벽 w) { /*총알과 벽의 범위가 총알 죽음과 겹치는 경우* / if (this.live && this.getRect (). // 총알 죽음의 반환 true; } false를 반환합니다. }} wall.java
import java.awt.graphics; import java.awt.rectangle; public class Wall { /*벽 데이터* / int x, y, w, h; // 위치 및 너비 및 높이 비공개 탱크 클라이언트 TC; // 메인 클래스 권한 공개 벽 (int x, int y, int w, int h, tankclient tc) {super (); this.x = x; this.y = y; this.w = w; this.h = h; this.tc = tc; } /*벽의 범위를 가져옵니다* / public lectangle getRect () {return new Rectangle (x, y, w, h); } /*드로우 벽* / public void draw (그래픽 g) {g.fillRect (X, y, w, h); }}폭발. 자바
import java.awt.color; import java.awt.graphics; 공개 클래스 폭발 { /*탱크 폭발 속성* / int x, y; // 폭발 위치 Private Boolean Live = true; // 폭발 int step = 0; // 폭발 시간 제어 int [] 직경 = new int [] {4, 7, 12, 18, 26, 32, 49, 56, 65, 77, 80, 50, 40, 30, 14, 6}; // 폭발 범위 개인 탱크 클리어 TC; // 메인 클래스 권한 공개 폭발 (int x, int y, tankclient tc) {super (); this.x = x; this.y = y; this.tc = tc; } /*드로우 폭발* / public void draw (그래픽 g) {if (! live) return; // 폭발 사망 상태가 종료되지 않으면/*폭발 시간이 끝나면 폭발이 존재하지 않고 세트에서 삭제*/if (step == 직경 .length) {live = false; // 폭발 사망 단계 = 0; // 단계 시간은 0 tc.explode.remove (this)입니다. // 세트에서 리턴을 삭제합니다. } /*DRAW DRAW EXPOSION* / COLOR C = G.GETCOLOR (); g.setcolor (color.orange); g.filloval (x, y, 직경 [단계], 직경 [단계]); G. 세트 콜러 (c); 단계 ++; }}Blood.java
import java.awt.color; import java.awt.graphics; import java.awt.rectangle; import java.util.random; public class blood {/* 혈액 응고 데이터*/ int x, y, w, h; 혈액 응고 위치 및 크기 개인 탱크 클라이언트 tc; // 메인 클래스 권한 개인 부울 라이브 = true; // 혈액 응고 생존 비공개 정적 무작위 r = new random (); // 랜덤 값 변수 설정/* 혈액 응고의 생존 상태를 얻으십시오*/ public boolean islive () {return live; } /* 혈액 응고의 생존 상태를 설정* / public void setLive (boolean live) {this.live = live; } /*혈액 응고 위치의 초기 값은 무작위로 값* / public blood () {x = R.NextInt (600) +100; y = r.nextint (400) +100; w = h = 15; } /*혈액 응고 그리기* / public void draw (그래픽 g) {if (! live) return; 색상 c = g.getColor (); g.setcolor (color.magenta); G.FillRect (X, Y, W, H); G. 세트 콜러 (c); } /*해제 혈액 응고* / public void fh () {if (! live) {x = R.NextInt (600) +100; y = r.nextint (400) +100; 라이브 = 참으로; }} /*혈액 응고 범위를 가져옵니다* / public Rectangle getRect () {return new Rectangle (x, y, w, h); }}위는이 기사의 모든 내용입니다. 모든 사람의 학습에 도움이되기를 바랍니다. 모든 사람이 wulin.com을 더 지원하기를 바랍니다.