탱크 전투 데모

WBOY
풀어 주다: 2016-07-25 09:08:16
원래의
1684명이 탐색했습니다.
기본 기능이 구현되었습니다.... 로컬 탱크의 경로 탐색이 상대적으로 약합니다. 각 탱크는 동시에 최대 5발을 발사할 수 있습니다.... 적은 세 가지 유형의 병력을 가지고 있으며 메뉴 표시줄이 응답하지 않습니다. . 이것은 매우 간단합니다. 필요한 경우 직접 추가하세요. 학습 참조용으로만 모든 코드를 업로드하세요. 탱크 전투 데모
  1. package.tank.common;
  2. 추상 공용 클래스 Bullet은 Runnable, Common을 구현합니다. {
  3. private int x, y;
  4. private int speed;
  5. 개인 int 방향;
  6. 개인 부울 살아있음;
  7. 보호된 int 전력;
  8. public Bullet(int x, int y, int 속도, int 방향) {
  9. this.x = x;
  10. this.y = y;
  11. this.speed = 속도;
  12. this.direction = 방향;
  13. Alive = true;
  14. }
  15. public void die() {
  16. 살아있는 = false;
  17. }
  18. public int getPower() {
  19. return power;
  20. }
  21. public int getX() {
  22. return x ;
  23. }
  24. public int getY() {
  25. return y;
  26. }
  27. public boolean isAlive() {
  28. return Alive;
  29. }
  30. public void run() {
  31. while (true) {
  32. try {
  33. Thread.sleep(15);
  34. } catch (InterruptedException e) {
  35. // TODO 자동 생성된 캐치 블록
  36. e.printStackTrace();
  37. }
  38. 스위치(방향) {
  39. 케이스 UP:
  40. y -= 속도;
  41. 중단;
  42. 케이스 DOWN :
  43. y = 속도;
  44. 중단;
  45. 사례 RIGHT:
  46. x = 속도;
  47. 중단;
  48. 사례 LEFT:
  49. x -= 속도;
  50. 중단;
  51. }
  52. if (x WIDTH || y > HEIGHT || y Alive = false;
  53. return;
  54. }
  55. }
  56. }
  57. }
코드 복사
  1. 패키지 Tank.common;
  2. 공용 인터페이스 공통 {
  3. public static final int UP = 0;
  4. public static final int DOWN = 1;
  5. public static final int RIGHT = 2;
  6. public static final int LEFT = 3;
  7. public static final int WIDTH = 600;
  8. public static final int HEIGHT = 400;
  9. public static final int WATER = 0;
  10. public static final int WALLS = 1;
  11. public static final int STEELS = 2;
  12. public static final int GRASS = 3;
  13. }
코드 복사
  1. package.tank.common;
  2. import java.awt.Color;
  3. import java.awt.Point;
  4. 공개 추상 클래스 EnemyTank extends Tank {
  5. private class AutoFire Implements Runnable {
  6. @Override
  7. public void run() {
  8. // TODO 자동 생성 메서드 스텁
  9. while (isAlive()) {
  10. try {
  11. Thread.sleep(500);
  12. } catch (InterruptedException e) {
  13. // TODO 자동 생성된 catch 블록
  14. e.printStackTrace();
  15. }
  16. if (Math.random() > ShotKey) {
  17. Shot();
  18. }
  19. }
  20. }
  21. }
  22. 비공개 클래스 AutoMove 구현 Runnable {
  23. @Override
  24. public void run() {
  25. // TODO 자동 생성 메서드 스텁
  26. int move[] = new int[4];
  27. while (isAlive()) {
  28. try {
  29. Thread.sleep(110);
  30. } catch (InterruptedException e) {
  31. // TODO 자동 생성된 catch 블록
  32. e.printStackTrace( );
  33. }
  34. for (int i = 0; i < 4; i) {
  35. 이동[i] = JudgeHero(i);
  36. }
  37. int 방향 = 0;
  38. int max = Integer.MIN_VALUE;
  39. for (int i = 0; 나는 < 4; i) {
  40. if (이동[i] >= max) {
  41. max = 이동[i];
  42. 방향 = i;
  43. }
  44. }
  45. 이동(방향) ;
  46. }
  47. }
  48. }
  49. 개인 더블 샷키;
  50. 개인 포인트 영웅 위치;
  51. 개인 탱크 영웅;
  52. public EnemyTank(int x, int y, Tank Hero, int life, int ID) {
  53. super(x, y, Color.yan);
  54. this.lifes = life;
  55. this.hero = Hero;
  56. super.setImageID(ID);
  57. }
  58. private int JudgeHero(int 방향) {
  59. HeroPosition = new Point(hero.getX() 9, Hero.getY( ) 9);
  60. int 결과 = 0;
  61. int x = this.getX();
  62. int y = this.getY();
  63. int speed = this.getSpeed();
  64. double distance1 = Math.abs((this.getX() - HeroPosition.x)
  65. * (this.getX() - HeroPosition.x)
  66. (this.getY() - HeroPosition.y)
  67. * (this.getY() - HeroPosition.y));
  68. 스위치(방향) {
  69. 케이스 UP:
  70. y -= 속도;
  71. 브레이크;
  72. 케이스 DOWN:
  73. y = 속도;
  74. 중단;
  75. 사례 RIGHT:
  76. x = 속도;
  77. 중단;
  78. 사례 LEFT:
  79. x -= 속도;
  80. 중단;
  81. }
  82. if (getDirection() == 방향) {
  83. 결과 = 5000;
  84. }
  85. if (!canMove(x, y)) {
  86. 결과 -= Integer.MAX_VALUE;
  87. }
  88. double distance2 = Math.abs((x - HeroPosition.x) * (x - HeroPosition.x)
  89. (y - HeroPosition.y) * (y - HeroPosition.y)) ;
  90. if (Math.random() > 0.8) {
  91. 결과 = Math.random() * 20000;
  92. }
  93. 결과 = (거리1 - 거리2) * 10;
  94. 결과 반환;
  95. }
  96. 공개 void setPosition(int x, int y) {
  97. super.x = x;
  98. super.y = y;
  99. }
  100. public void setShotSpeed(double ShotSpeed) {
  101. this .shotKey = ShotSpeed;
  102. }
  103. public void startFire() {
  104. new Thread(new AutoFire()).start();
  105. }
  106. public void startMove () {
  107. new Thread(new AutoMove()).start();
  108. }
  109. }
复system代码
  1. package.common;
  2. import java.awt.Color;
  3. import java.util.ArrayList;
  4. import Tank.entity .NormalBullet;
  5. public 추상 클래스 탱크 구현 Common {
  6. protected int x;
  7. protected int y;
  8. private Color color;
  9. private int 속도;
  10. private int 방향;
  11. private ArrayList bullets;
  12. private ArrayList 탱크;
  13. 개인 총알 총알;
  14. 개인 int maxBulletNum;
  15. 개인 부울 살아 있음;
  16. 보호된 int 생명;
  17. ArrayList< 벽> wall;
  18. private int TankImageID;
  19. {
  20. 속도 = 2;
  21. 방향 = UP;
  22. 살아있는 = true;
  23. }
  24. public Tank() {
  25. this.x = 0;
  26. this.y = 0;
  27. color = Color.black;
  28. }
  29. public Tank(int x, int y , Color color) {
  30. this.x = x;
  31. this.y = y;
  32. this.color = color;
  33. maxBulletNum = 5;
  34. bullets = new ArrayList( );
  35. wall = new ArrayList();
  36. }
  37. protected boolean canMove(int x, int y) {
  38. if (x < 0 || x > WIDTH - 20 || y < 0 || y > HEIGHT - 20) {
  39. return false;
  40. }
  41. if (tanks == null) {
  42. true 반환 🎜> }
  43. if (tanks.size() == 1) {
  44. return true;
  45. }
  46. for (int i = 0; i < wall.size (); i) {
  47. Wall tempWall = walls.get(i);
  48. if (tempWall.isAlive()) {
  49. if (x >= tempWall.getX() && y >= tempWall.getY()) {
  50. if (x <= tempWall.getX() 20 && y <= tempWall.getY() 20) {
  51. return tempWall.canBeWalk();
  52. }
  53. } else if (x >= tempWall.getX() && y <= tempWall.getY()) {
  54. if (x <= tempWall.getX() 20
  55. && (y 20) >= tempWall.getY()) {
  56. return tempWall.canBeWalk();
  57. }
  58. } else if (x <= tempWall.getX() && y >= tempWall.getY() ) {
  59. if ((x 20) >= tempWall.getX()
  60. && y <= tempWall.getY() 20) {
  61. return tempWall.canBeWalk();
  62. }
  63. } else if (x <= tempWall.getX() && y <= tempWall.getY()) {
  64. if ((x 20) >= tempWall.getX()
  65. && (y 20) >= tempWall.getY()) {
  66. return tempWall.canBeWalk();
  67. }
  68. }
  69. }
  70. }
  71. for (int i = 0 ; 나는 < 탱크.크기(); i) {
  72. 탱크 tempTank = Tanks.get(i);
  73. if (tempTank == this)
  74. break;
  75. if (tempTank.isAlive()) {
  76. if (x > ;= tempTank.getX() && y >= tempTank.getY()) {
  77. if (x <= tempTank.getX() 20 && y <= tempTank.getY() 20) {
  78. return false;
  79. }
  80. } else if (x >= tempTank.getX() && y <= tempTank.getY()) {
  81. if (x <= tempTank.getX() 20
  82. && (y 20) >= tempTank.getY()) {
  83. return false;
  84. }
  85. } else if (x <= tempTank.getX() && y >= tempTank .getY()) {
  86. if ((x 20) >= tempTank.getX()
  87. && y <= tempTank.getY() 20) {
  88. return false;
  89. }
  90. } else if (x <= tempTank.getX() && y <= tempTank.getY()) {
  91. if ((x 20) >= tempTank.getX()
  92. && (y 20) >= tempTank.getY()) {
  93. false 반환;
  94. }
  95. }
  96. }
  97. }
  98. true 반환;
  99. }
  100. public void Damage(int power) {
  101. lifes -= power;
  102. if (lifes <= 0) {
  103. Alive = false;
  104. }
  105. }
  106. public 배열목록 getBullet() {
  107. 글머리 기호 반환;
  108. }
  109. public Color getColor() {
  110. 반환 색상;
  111. }
  112. public int getDirection() {
  113. 복귀 방향;
  114. }
  115. public int getImageID() {
  116. return TankImageID;
  117. }
  118. public int getSpeed() {
  119. 복귀 속도;
  120. }
  121. 공개 ArrayList getWalls() {
  122. return this.walls;
  123. }
  124. public int getX() {
  125. return x;
  126. }
  127. public int getY() {
  128. return y;
  129. }
  130. public boolean isAlive() {
  131. return Alive;
  132. }
  133. public void move(int 방향) {
  134. setDirection (방향);
  135. int x = this.x;
  136. int y = this.y;
  137. 스위치(방향) {
  138. case UP:
  139. y -= 속도;
  140. break ;
  141. 케이스 DOWN:
  142. y = 속도;
  143. 중단;
  144. 케이스 RIGHT:
  145. x = 속도;
  146. 중단;
  147. 케이스 LEFT:
  148. x -= 속도 ;
  149. break;
  150. }
  151. if (canMove(x, y)) {
  152. this.x = x;
  153. this.y = y;
  154. }
  155. }
  156. public void setAllTanks(ArrayList 탱크) {
  157. this.tanks = 탱크;
  158. }
  159. public void setDirection(int 방향) {
  160. this.direction = 방향;
  161. }
  162. final protected void setImageID(int ID) {
  163. this.tankImageID = ID;
  164. }
  165. public void setSpeed(int speed) {
  166. this.speed = speed ;
  167. }
  168. public void setWalls(ArrayList wallList) {
  169. this.walls = wallList;
  170. }
  171. public void Shot() {
  172. 스위치(방향) {
  173. 케이스 UP:
  174. bullet = new NormalBullet(x 10, y, UP);
  175. break;
  176. 케이스 DOWN:
  177. bullet = new NormalBullet(x 10, y 20, DOWN);
  178. break;
  179. case RIGHT:
  180. bullet = new NormalBullet(x 20, y 10, RIGHT);
  181. break;
  182. case LEFT:
  183. bullet = new NormalBullet(x, y 10, LEFT);
  184. break;
  185. }
  186. for (int i = 0; i < bullets.size(); i) {
  187. Bullet temp = bullets.get (i);
  188. if (!temp.isAlive()) {
  189. bullets.remove(temp);
  190. }
  191. }
  192. if (bullets.size() >= maxBulletNum) {
  193. } else {
  194. new Thread(bullet).start();
  195. bullets.add(bullet);
  196. }
  197. }
  198. }
复代码
  1. package Tank.common;
  2. public abstract class Wall {
  3. private int x, y;
  4. private int wallImageID;
  5. private boolean canWalk;
  6. private boolean canFly;
  7. private boolean living;
  8. private boolean canHit;
  9. public Wall(int x, int y, int ID, 부울 워크, 부울 플라이, 부울 히트) {
  10. this.x = x;
  11. this.y = y;
  12. this.wallImageID = ID;
  13. this.canWalk = 걷기 ;
  14. this.canFly = fly;
  15. this.alive = true;
  16. this.canHit = Hit;
  17. }
  18. public boolean canBeFly() {
  19. return canFly;
  20. }
  21. public boolean canBeHit() {
  22. return this.canHit;
  23. }
  24. public boolean canBeWalk() {
  25. return canWalk;
  26. }
  27. public void die() {
  28. Alive = false;
  29. }
  30. public int getImageID() {
  31. return wallImageID;
  32. }
  33. public int getX() {
  34. return x;
  35. }
  36. public int getY() {
  37. return y;
  38. }
  39. public boolean isAlive() {
  40. 살아서 돌아옴;
  41. }
  42. }
复代码
  1. package.entity;
  2. public class Bomb {
  3. private int x;
  4. private int y;
  5. private int life = 9;
  6. private boolean live;
  7. public Bomb(int x, int y) {
  8. this.x = x;
  9. this.y = y;
  10. Alive = true;
  11. }
  12. public void decrese() {
  13. if (life > 0) {
  14. life--;
  15. } else {
  16. Alive = false ;
  17. }
  18. }
  19. public int getLife() {
  20. return life;
  21. }
  22. public int getX() {
  23. return x;
  24. }
  25. public int getY() {
  26. return y;
  27. }
  28. public boolean isAlive() {
  29. return Alive;
  30. }
  31. }
复主代码
  1. package.entity;
  2. import Tank.common.EnemyTank;
  3. import Tank.common.Tank;
  4. 공개 클래스 EnemyTank1 확장 EnemyTank {
  5. public EnemyTank1(int x, int y, Tank Hero) {
  6. super(x, y, Hero, 3, 1);
  7. setSpeed(2);
  8. setShotSpeed( 0.8);
  9. }
  10. }
复代码
  1. package.entity;
  2. import Tank.common.EnemyTank;
  3. import Tank.common.Tank;
  4. 공개 클래스 EnemyTank2 확장 EnemyTank {
  5. public EnemyTank2(int x, int y, Tank Hero) {
  6. super(x, y, Hero, 5, 2);
  7. setSpeed(3);
  8. setShotSpeed(0.5);
  9. }
  10. }
复제대码
  1. package.entity;
  2. import Tank.common.EnemyTank;
  3. import Tank.common.Tank;
  4. 공개 클래스 EnemyTank3 확장 EnemyTank {
  5. public EnemyTank3(int x, int y, Tank Hero) {
  6. super(x, y, Hero, 10, 3);
  7. setSpeed(5);
  8. setShotSpeed(0.2);
  9. }
  10. }
复제대码
  1. package Tank.entity;
  2. import Tank.common.Wall;
  3. public 클래스 Grass 확장 Wall {
  4. public Grass(int x , int y) {
  5. super(x, y, 3, true, true, false);
  6. }
  7. }
复system代码
  1. package.entity;
  2. import java.awt.Color;
  3. import Tank.common.Tank;
  4. 공개 class MyTank 확장 탱크 {
  5. public MyTank(int x, int y) {
  6. super(x, y, Color.yellow);
  7. lifes = 5;
  8. super.setImageID(0);
  9. }
  10. public int getLife() {
  11. return lifes;
  12. }
  13. }
复主代码
  1. package Tank.entity;
  2. import Tank.common.Bullet;
  3. public class NormalBullet은 Bullet을 확장합니다. {
  4. public NormalBullet (int x, int y, int 방향) {
  5. super(x, y, 2, 방향);
  6. power = 1;
  7. }
  8. }
제제대码
  1. package.entity;
  2. import java.util.ArrayList;
  3. import Tank.common.EnemyTank;
  4. 공개 class Stage {
  5. private int totalEnemyNum;
  6. private int LeaveEnemyNum;
  7. private int totalHeroLife;
  8. private int LeaveHeroLife;
  9. private int level;
  10. private WallContainer wallContainer;
  11. private ArrayList< ;적탱크> enemeyTanks;
  12. private int activeEnemyTankNum;
  13. private EnemyTank activeEnemyTanks[];
  14. private MyTank Hero;
  15. public Stage(int totalEnemyNum, int totalHeroLife, int level,
  16. int activeEnemyTankNum) {
  17. this.totalEnemyNum = totalEnemyNum;
  18. this.totalHeroLife = totalHeroLife;
  19. this.level = level;
  20. this.activeEnemyTankNum = activeEnemyTankNum;
  21. this.leaveEnemyNum = this.totalEnemyNum;
  22. this.leaveHeroLife = this.totalHeroLife;
  23. this.enemeyTanks = new ArrayList();
  24. this.activeEnemyTanks = new EnemyTank[this.activeEnemyTankNum];
  25. this.hero = new MyTank(290, 370);
  26. this.wallContainer = new WallContainer();
  27. }
  28. public void addEnemyTank(EnemyTank 탱크) {
  29. enemeyTanks.add(tank);
  30. }
  31. public void autoCreateEnemyTank() {
  32. for (int i = 0; i < totalEnemyNum; i) {
  33. double key = Math.random();
  34. if (key <= 0.33) {
  35. this.enemeyTanks.add(new EnemyTank1(0, 0, 영웅));
  36. } else if (key >= 0.66) {
  37. this.enemeyTanks.add(new EnemyTank2(0, 0 , 영웅));
  38. } else {
  39. this.enemeyTanks.add(new EnemyTank3(0, 0, 영웅));
  40. }
  41. }
  42. }
  43. 공개 int getActiveEnemyTankNum() {
  44. return this.activeEnemyTankNum;
  45. }
  46. public EnemyTank[] getEnemyTank() {
  47. return this.activeEnemyTanks;
  48. }
  49. 공개 MyTank getHeroTank() {
  50. return this.hero;
  51. }
  52. public int getLeaveEnemyNum() {
  53. return this.leaveEnemyNum;
  54. }
  55. public int getLeaveHeroLife () {
  56. return this.leaveHeroLife;
  57. }
  58. public int getLevel() {
  59. return this.level;
  60. }
  61. public WallContainer getWallContainer() {
  62. return this.wallContainer;
  63. }
  64. public boolean isHeroDead() {
  65. if (this.leaveHeroLife <= 0) {
  66. return true;
  67. } else
  68. false 반환;
  69. }
  70. public EnemyTank popEnemyTank() {
  71. if (leaveEnemyNum > 0) {
  72. this.leaveEnemyNum--;
  73. EnemyTank temp = enemeyTanks.get(enemeyTanks.size() - 1);
  74. enemeyTanks.remove(temp);
  75. return temp;
  76. } else
  77. return null;
  78. }
  79. public MyTank popHero() {
  80. LeaveHeroLife--;
  81. MyTank temp = new MyTank(290, 370);
  82. temp. setWalls(wallContainer.getWallList());
  83. return temp;
  84. }
  85. public void setHeroTank(MyTank 탱크) {
  86. this.hero = 탱크;
  87. }
  88. }
复代码
  1. 패키지 탱크.entity;
  2. import Tank.common.Wall;
  3. public 클래스 Steels 확장 Wall {
  4. public Steels(int x , int y) {
  5. super(x, y, 2, false, false, false);
  6. }
  7. }
复system代码
  1. package.entity;
  2. import java.util.ArrayList;
  3. import Tank.common.Common;
  4. import Tank.common .Wall;
  5. 공용 클래스 WallContainer는 Common {
  6. private ArrayList을 구현합니다. data;
  7. public WallContainer() {
  8. data = new ArrayList();
  9. for (int i = 0; i < 28; i) {
  10. this.addWall (10 i * 20, 100, WATER);
  11. if (i == 11) {
  12. i = 4;
  13. }
  14. }
  15. for (int i = 0; i < 28; i) {
  16. this.addWall(10 i * 20, 160, WALLS);
  17. if (i == 12) {
  18. i = 4;
  19. }
  20. }
  21. for (int i = 0; i < 28; i) {
  22. this.addWall(10 i * 20, 220, STEELS);
  23. if (i == 11) {
  24. i = 4;
  25. }
  26. }
  27. for (int i = 0; i this.addWall(10 i * 20, 280, GRASS);
  28. if (i == 12) {
  29. i = 4;
  30. }
  31. }
  32. }
  33. public void addWall(int x, int y, int 종류) {
  34. 스위치(종류) {
  35. 케이스 WATER:
  36. data.add(new Water(x, y));
  37. break;
  38. 케이스 WALLS:
  39. data.add (new Walls(x, y));
  40. break;
  41. case STEELS:
  42. data.add(new Steels(x, y));
  43. break;
  44. case GRASS:
  45. data.add(new Grass(x, y));
  46. break;
  47. }
  48. }
  49. public ArrayList getWallList() {
  50. ArrayList temp = data;
  51. return temp;
  52. }
  53. public boolean isEmpty() {
  54. return data.isEmpty();
  55. }
  56. public void RemoveDead( ) {
  57. for (int i = 0; i < data.size(); i) {
  58. Wall temp = data.get(i);
  59. if (!temp.isAlive())
  60. data.remove(temp);
  61. }
  62. }
  63. }
复代码
  1. package.tank.entity;
  2. import Tank.common.Wall;
  3. public 클래스 Walls는 Wall을 확장합니다. {
  4. public Walls(int x , int y) {
  5. super(x, y, 1, false, false, true);
  6. }
  7. }
复system代码
  1. 패키지 Tank.entity;
  2. import Tank.common.Wall;
  3. public class Water 확장 Wall {
  4. public Water(int x , int y) {
  5. super(x, y, 0, false, true, false);
  6. }
  7. }
复system代码
  1. 탱크.gui 패키지;
  2. import javax.swing.JFrame;
  3. import javax.swing.JMenu;
  4. import javax.swing.JMenuBar;
  5. import javax.swing.JMenuItem;
  6. 공용 클래스 TankFrame은 JFrame을 확장합니다. {
  7. /**
  8. *
  9. */
  10. private static final long serialVersionUID = 1L;
  11. private TankPanel gamePanel;
  12. public TankFrame() {
  13. super("坦克大战————玄雨제작");
  14. this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
  15. //添加游戏主面板
  16. gamePanel = new TankPanel();
  17. this.add(gamePanel);
  18. gamePanel.addMouseListener(gamePanel);
  19. this.addKeyListener(gamePanel);
  20. // 添加菜单栏
  21. JMenuBar menuBar = new JMenuBar();
  22. // ///////////////////////////// //
  23. JMenu menu1 = new JMenu("菜单");
  24. menuBar.add(menu1);
  25. JMenuItem itemNewGame = new JMenuItem("新游戏");
  26. menu1.add(itemNewGame) ;
  27. menu1.addSeparator();
  28. JMenuItem itemList = new JMenuItem("排行榜");
  29. menu1.add(itemList);
  30. menu1.addSeparator();
  31. JMenuItem itemExit = new JMenuItem("退출");
  32. menu1.add(itemExit);
  33. //////////////////////////// ///////
  34. JMenu menu2 = new JMenu("设置");
  35. JMenuItem itemSet = new JMenuItem("设置");
  36. menu2.add(itemSet);
  37. menuBar. add(menu2);
  38. // /////////////////////////////////
  39. JMenu 메뉴3 = 신규 JMenu("帮助");
  40. menuBar.add(menu3);
  41. JMenuItem itemInfo = new JMenuItem("关于");
  42. menu3.add(itemInfo);
  43. JMenuItem itemHelp = new JMenuItem( "帮助");
  44. menu3.add(itemHelp);
  45. this.setJMenuBar(menuBar);
  46. this.setRessible(false);
  47. this.pack();
  48. this.setVisible(true);
  49. }
  50. }
复代码
  1. package.tank.start;
  2. import Tank.gui.TankFrame;
  3. public class TankStart {
  4. /**
  5. * @param args
  6. */
  7. public static void main(String[] args) {
  8. // TODO 자동 생성 메서드 스텁
  9. new TankFrame().setLocation(250, 150);
  10. }
  11. }
复代码


관련 라벨:
원천:php.cn
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿
회사 소개 부인 성명 Sitemap
PHP 중국어 웹사이트:공공복지 온라인 PHP 교육,PHP 학습자의 빠른 성장을 도와주세요!