From 6be6f8330156b6f6f6c4927c78825ed0e3e1282b Mon Sep 17 00:00:00 2001 From: kohler Date: Sun, 14 May 2023 14:14:25 +0000 Subject: [PATCH] =?UTF-8?q?=E4=B8=8A=E4=BC=A0=E6=BA=90=E4=BB=A3=E7=A0=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- 源代码/client/bin/Actor.class | Bin 0 -> 173 bytes 源代码/client/bin/ClientControler$1.class | Bin 0 -> 1648 bytes 源代码/client/bin/ClientControler$2.class | Bin 0 -> 1092 bytes 源代码/client/bin/ClientControler$3.class | Bin 0 -> 1086 bytes 源代码/client/bin/ClientControler$4.class | Bin 0 -> 1220 bytes 源代码/client/bin/ClientControler$5.class | Bin 0 -> 714 bytes 源代码/client/bin/ClientControler$6.class | Bin 0 -> 1782 bytes 源代码/client/bin/ClientControler$7.class | Bin 0 -> 2413 bytes 源代码/client/bin/ClientControler.class | Bin 0 -> 1526 bytes 源代码/client/bin/ClientModel.class | Bin 0 -> 6392 bytes 源代码/client/bin/ClientView.class | Bin 0 -> 2632 bytes 源代码/client/bin/Steelwall.class | Bin 0 -> 1784 bytes 源代码/client/bin/Ticker.class | Bin 0 -> 2214 bytes 源代码/client/bin/bomb.class | Bin 0 -> 1344 bytes 源代码/client/bin/bullet.class | Bin 0 -> 1263 bytes 源代码/client/bin/drawingPanel.class | Bin 0 -> 3414 bytes 源代码/client/bin/instructionHandler.class | Bin 0 -> 6237 bytes 源代码/client/bin/level.class | Bin 0 -> 24312 bytes 源代码/client/bin/normalObject.class | Bin 0 -> 1878 bytes 源代码/client/bin/shield.class | Bin 0 -> 1145 bytes 源代码/client/bin/wall.class | Bin 0 -> 2563 bytes 源代码/client/image/1.jpg | Bin 0 -> 514 bytes 源代码/client/image/10.jpg | Bin 0 -> 519 bytes 源代码/client/image/11.jpg | Bin 0 -> 518 bytes 源代码/client/image/12.jpg | Bin 0 -> 528 bytes 源代码/client/image/13.jpg | Bin 0 -> 523 bytes 源代码/client/image/14.jpg | Bin 0 -> 526 bytes 源代码/client/image/15.jpg | Bin 0 -> 523 bytes 源代码/client/image/16.jpg | Bin 0 -> 519 bytes 源代码/client/image/17.jpg | Bin 0 -> 525 bytes 源代码/client/image/18.jpg | Bin 0 -> 527 bytes 源代码/client/image/19.jpg | Bin 0 -> 519 bytes 源代码/client/image/2.jpg | Bin 0 -> 526 bytes 源代码/client/image/20.jpg | Bin 0 -> 529 bytes 源代码/client/image/21.jpg | Bin 0 -> 520 bytes 源代码/client/image/22.jpg | Bin 0 -> 531 bytes 源代码/client/image/23.jpg | Bin 0 -> 530 bytes 源代码/client/image/24.jpg | Bin 0 -> 530 bytes 源代码/client/image/25.jpg | Bin 0 -> 515 bytes 源代码/client/image/26.jpg | Bin 0 -> 529 bytes 源代码/client/image/27.jpg | Bin 0 -> 601 bytes 源代码/client/image/28.jpg | Bin 0 -> 604 bytes 源代码/client/image/29.jpg | Bin 0 -> 590 bytes 源代码/client/image/3.jpg | Bin 0 -> 534 bytes 源代码/client/image/30.jpg | Bin 0 -> 605 bytes 源代码/client/image/31.jpg | Bin 0 -> 554 bytes 源代码/client/image/32.jpg | Bin 0 -> 547 bytes 源代码/client/image/33.jpg | Bin 0 -> 554 bytes 源代码/client/image/34.jpg | Bin 0 -> 555 bytes 源代码/client/image/35.jpg | Bin 0 -> 532 bytes 源代码/client/image/36.jpg | Bin 0 -> 527 bytes 源代码/client/image/37.jpg | Bin 0 -> 530 bytes 源代码/client/image/38.jpg | Bin 0 -> 540 bytes 源代码/client/image/39.jpg | Bin 0 -> 537 bytes 源代码/client/image/4.jpg | Bin 0 -> 531 bytes 源代码/client/image/40.jpg | Bin 0 -> 525 bytes 源代码/client/image/41.jpg | Bin 0 -> 528 bytes 源代码/client/image/42.jpg | Bin 0 -> 529 bytes 源代码/client/image/43.jpg | Bin 0 -> 520 bytes 源代码/client/image/44.jpg | Bin 0 -> 514 bytes 源代码/client/image/45.jpg | Bin 0 -> 526 bytes 源代码/client/image/46.jpg | Bin 0 -> 519 bytes 源代码/client/image/47.jpg | Bin 0 -> 556 bytes 源代码/client/image/48.jpg | Bin 0 -> 575 bytes 源代码/client/image/49.jpg | Bin 0 -> 525 bytes 源代码/client/image/5.jpg | Bin 0 -> 539 bytes 源代码/client/image/50.jpg | Bin 0 -> 464 bytes 源代码/client/image/51.jpg | Bin 0 -> 593 bytes 源代码/client/image/52.jpg | Bin 0 -> 495 bytes 源代码/client/image/53.jpg | Bin 0 -> 571 bytes 源代码/client/image/54.jpg | Bin 0 -> 509 bytes 源代码/client/image/55.jpg | Bin 0 -> 567 bytes 源代码/client/image/56.jpg | Bin 0 -> 563 bytes 源代码/client/image/57.jpg | Bin 0 -> 564 bytes 源代码/client/image/58.jpg | Bin 0 -> 570 bytes 源代码/client/image/59.jpg | Bin 0 -> 568 bytes 源代码/client/image/6.jpg | Bin 0 -> 538 bytes 源代码/client/image/60.jpg | Bin 0 -> 572 bytes 源代码/client/image/61.jpg | Bin 0 -> 558 bytes 源代码/client/image/62.jpg | Bin 0 -> 574 bytes 源代码/client/image/63.jpg | Bin 0 -> 579 bytes 源代码/client/image/64.jpg | Bin 0 -> 585 bytes 源代码/client/image/65.jpg | Bin 0 -> 572 bytes 源代码/client/image/66.jpg | Bin 0 -> 577 bytes 源代码/client/image/67.jpg | Bin 0 -> 584 bytes 源代码/client/image/68.jpg | Bin 0 -> 582 bytes 源代码/client/image/69.jpg | Bin 0 -> 584 bytes 源代码/client/image/7.jpg | Bin 0 -> 520 bytes 源代码/client/image/70.jpg | Bin 0 -> 573 bytes 源代码/client/image/71.jpg | Bin 0 -> 468 bytes 源代码/client/image/72.jpg | Bin 0 -> 405 bytes 源代码/client/image/73.JPG | Bin 0 -> 931 bytes 源代码/client/image/74.JPG | Bin 0 -> 940 bytes 源代码/client/image/75.JPG | Bin 0 -> 921 bytes 源代码/client/image/76.JPG | Bin 0 -> 928 bytes 源代码/client/image/77.JPG | Bin 0 -> 908 bytes 源代码/client/image/78.JPG | Bin 0 -> 911 bytes 源代码/client/image/79.JPG | Bin 0 -> 900 bytes 源代码/client/image/8.jpg | Bin 0 -> 521 bytes 源代码/client/image/80.JPG | Bin 0 -> 920 bytes 源代码/client/image/81.JPG | Bin 0 -> 946 bytes 源代码/client/image/82.JPG | Bin 0 -> 916 bytes 源代码/client/image/83.JPG | Bin 0 -> 916 bytes 源代码/client/image/84.JPG | Bin 0 -> 921 bytes 源代码/client/image/85.JPG | Bin 0 -> 969 bytes 源代码/client/image/86.JPG | Bin 0 -> 944 bytes 源代码/client/image/87.JPG | Bin 0 -> 952 bytes 源代码/client/image/88.JPG | Bin 0 -> 951 bytes 源代码/client/image/9.jpg | Bin 0 -> 521 bytes 源代码/client/image/Thumbs.db | Bin 0 -> 120320 bytes 源代码/client/src/Actor.java | 7 + 源代码/client/src/ClientControler.java | 172 +++ 源代码/client/src/ClientModel.java | 256 ++++ 源代码/client/src/ClientView.java | 89 ++ 源代码/client/src/Steelwall.java | 70 ++ 源代码/client/src/Ticker.java | 75 ++ 源代码/client/src/bomb.java | 40 + 源代码/client/src/bullet.java | 38 + 源代码/client/src/drawingPanel.java | 105 ++ 源代码/client/src/instructionHandler.java | 352 ++++++ 源代码/client/src/level.java | 266 ++++ 源代码/client/src/normalObject.java | 50 + 源代码/client/src/shield.java | 32 + 源代码/client/src/wall.java | 100 ++ .../server/.settings/org.eclipse.jdt.core.prefs | 11 + 源代码/server/bin/Actor.class | Bin 0 -> 322 bytes 源代码/server/bin/ServerControler$1.class | Bin 0 -> 1649 bytes 源代码/server/bin/ServerControler$2.class | Bin 0 -> 855 bytes 源代码/server/bin/ServerControler$3.class | Bin 0 -> 1086 bytes 源代码/server/bin/ServerControler$4.class | Bin 0 -> 1224 bytes 源代码/server/bin/ServerControler$5.class | Bin 0 -> 714 bytes 源代码/server/bin/ServerControler$6.class | Bin 0 -> 1786 bytes 源代码/server/bin/ServerControler$7.class | Bin 0 -> 2566 bytes 源代码/server/bin/ServerControler.class | Bin 0 -> 1452 bytes 源代码/server/bin/ServerModel.class | Bin 0 -> 7658 bytes 源代码/server/bin/ServerView.class | Bin 0 -> 2374 bytes 源代码/server/bin/Steelwall.class | Bin 0 -> 3818 bytes 源代码/server/bin/Ticker.class | Bin 0 -> 2210 bytes 源代码/server/bin/base.class | Bin 0 -> 3186 bytes 源代码/server/bin/bomb.class | Bin 0 -> 2617 bytes 源代码/server/bin/bullet.class | Bin 0 -> 4527 bytes 源代码/server/bin/drawingPanel.class | Bin 0 -> 2384 bytes 源代码/server/bin/enemy.class | Bin 0 -> 6947 bytes 源代码/server/bin/feedbackHandler.class | Bin 0 -> 1902 bytes 源代码/server/bin/grass.class | Bin 0 -> 1517 bytes 源代码/server/bin/level.class | Bin 0 -> 26025 bytes 源代码/server/bin/player.class | Bin 0 -> 9673 bytes 源代码/server/bin/powerUp.class | Bin 0 -> 2426 bytes 源代码/server/bin/river.class | Bin 0 -> 1521 bytes 源代码/server/bin/wall.class | Bin 0 -> 17154 bytes 源代码/server/image/1(1).jpg | Bin 0 -> 514 bytes 源代码/server/image/1.jpg | Bin 0 -> 514 bytes 源代码/server/image/10.jpg | Bin 0 -> 519 bytes 源代码/server/image/11.jpg | Bin 0 -> 518 bytes 源代码/server/image/12.jpg | Bin 0 -> 528 bytes 源代码/server/image/13.jpg | Bin 0 -> 523 bytes 源代码/server/image/14.jpg | Bin 0 -> 526 bytes 源代码/server/image/15.jpg | Bin 0 -> 523 bytes 源代码/server/image/16.jpg | Bin 0 -> 519 bytes 源代码/server/image/17.jpg | Bin 0 -> 525 bytes 源代码/server/image/18.jpg | Bin 0 -> 527 bytes 源代码/server/image/19.jpg | Bin 0 -> 519 bytes 源代码/server/image/2.jpg | Bin 0 -> 526 bytes 源代码/server/image/20.jpg | Bin 0 -> 529 bytes 源代码/server/image/21.jpg | Bin 0 -> 520 bytes 源代码/server/image/22.jpg | Bin 0 -> 531 bytes 源代码/server/image/23.jpg | Bin 0 -> 530 bytes 源代码/server/image/24.jpg | Bin 0 -> 530 bytes 源代码/server/image/25.jpg | Bin 0 -> 515 bytes 源代码/server/image/26.jpg | Bin 0 -> 529 bytes 源代码/server/image/27.jpg | Bin 0 -> 601 bytes 源代码/server/image/28.jpg | Bin 0 -> 604 bytes 源代码/server/image/29.jpg | Bin 0 -> 590 bytes 源代码/server/image/3.jpg | Bin 0 -> 534 bytes 源代码/server/image/30.jpg | Bin 0 -> 605 bytes 源代码/server/image/31.jpg | Bin 0 -> 554 bytes 源代码/server/image/32.jpg | Bin 0 -> 547 bytes 源代码/server/image/33.jpg | Bin 0 -> 554 bytes 源代码/server/image/34.jpg | Bin 0 -> 555 bytes 源代码/server/image/35.jpg | Bin 0 -> 532 bytes 源代码/server/image/36.jpg | Bin 0 -> 527 bytes 源代码/server/image/37.jpg | Bin 0 -> 530 bytes 源代码/server/image/38.jpg | Bin 0 -> 540 bytes 源代码/server/image/39.jpg | Bin 0 -> 537 bytes 源代码/server/image/4.jpg | Bin 0 -> 531 bytes 源代码/server/image/40.jpg | Bin 0 -> 525 bytes 源代码/server/image/41.jpg | Bin 0 -> 528 bytes 源代码/server/image/42.jpg | Bin 0 -> 529 bytes 源代码/server/image/43.jpg | Bin 0 -> 520 bytes 源代码/server/image/44.jpg | Bin 0 -> 514 bytes 源代码/server/image/45.jpg | Bin 0 -> 526 bytes 源代码/server/image/46.jpg | Bin 0 -> 519 bytes 源代码/server/image/47.jpg | Bin 0 -> 556 bytes 源代码/server/image/48.jpg | Bin 0 -> 575 bytes 源代码/server/image/49.jpg | Bin 0 -> 525 bytes 源代码/server/image/5.jpg | Bin 0 -> 539 bytes 源代码/server/image/50.jpg | Bin 0 -> 464 bytes 源代码/server/image/51.jpg | Bin 0 -> 593 bytes 源代码/server/image/52.jpg | Bin 0 -> 495 bytes 源代码/server/image/53.jpg | Bin 0 -> 571 bytes 源代码/server/image/54.jpg | Bin 0 -> 509 bytes 源代码/server/image/55.jpg | Bin 0 -> 567 bytes 源代码/server/image/56.jpg | Bin 0 -> 563 bytes 源代码/server/image/57.jpg | Bin 0 -> 564 bytes 源代码/server/image/58.jpg | Bin 0 -> 570 bytes 源代码/server/image/59.jpg | Bin 0 -> 568 bytes 源代码/server/image/6.jpg | Bin 0 -> 538 bytes 源代码/server/image/60.jpg | Bin 0 -> 572 bytes 源代码/server/image/61.jpg | Bin 0 -> 558 bytes 源代码/server/image/62.jpg | Bin 0 -> 574 bytes 源代码/server/image/63.jpg | Bin 0 -> 579 bytes 源代码/server/image/64.jpg | Bin 0 -> 585 bytes 源代码/server/image/65.jpg | Bin 0 -> 572 bytes 源代码/server/image/66.jpg | Bin 0 -> 577 bytes 源代码/server/image/67.jpg | Bin 0 -> 584 bytes 源代码/server/image/68.jpg | Bin 0 -> 582 bytes 源代码/server/image/69.jpg | Bin 0 -> 584 bytes 源代码/server/image/7.jpg | Bin 0 -> 520 bytes 源代码/server/image/70.jpg | Bin 0 -> 573 bytes 源代码/server/image/71.jpg | Bin 0 -> 468 bytes 源代码/server/image/72.jpg | Bin 0 -> 405 bytes 源代码/server/image/73.JPG | Bin 0 -> 931 bytes 源代码/server/image/74.JPG | Bin 0 -> 940 bytes 源代码/server/image/75.JPG | Bin 0 -> 921 bytes 源代码/server/image/76.JPG | Bin 0 -> 928 bytes 源代码/server/image/77.JPG | Bin 0 -> 908 bytes 源代码/server/image/78.JPG | Bin 0 -> 911 bytes 源代码/server/image/79.JPG | Bin 0 -> 900 bytes 源代码/server/image/8.jpg | Bin 0 -> 521 bytes 源代码/server/image/80.JPG | Bin 0 -> 920 bytes 源代码/server/image/81.JPG | Bin 0 -> 946 bytes 源代码/server/image/82.JPG | Bin 0 -> 916 bytes 源代码/server/image/83.JPG | Bin 0 -> 916 bytes 源代码/server/image/84.JPG | Bin 0 -> 921 bytes 源代码/server/image/85.JPG | Bin 0 -> 969 bytes 源代码/server/image/86.JPG | Bin 0 -> 944 bytes 源代码/server/image/87.JPG | Bin 0 -> 952 bytes 源代码/server/image/88.JPG | Bin 0 -> 951 bytes 源代码/server/image/9.jpg | Bin 0 -> 521 bytes 源代码/server/image/Thumbs.db | Bin 0 -> 120320 bytes 源代码/server/src/Actor.java | 11 + 源代码/server/src/ServerControler.java | 169 +++ 源代码/server/src/ServerModel.java | 343 ++++++ 源代码/server/src/ServerView.java | 87 ++ 源代码/server/src/Steelwall.java | 133 ++ 源代码/server/src/Ticker.java | 78 ++ 源代码/server/src/base.java | 99 ++ 源代码/server/src/bomb.java | 69 ++ 源代码/server/src/bullet.java | 166 +++ 源代码/server/src/drawingPanel.java | 81 ++ 源代码/server/src/enemy.java | 330 +++++ 源代码/server/src/feedbackHandler.java | 69 ++ 源代码/server/src/grass.java | 40 + 源代码/server/src/level.java | 316 +++++ 源代码/server/src/player.java | 460 +++++++ 源代码/server/src/powerUp.java | 70 ++ 源代码/server/src/river.java | 46 + 源代码/server/src/wall.java | 1095 +++++++++++++++++ 258 files changed, 5325 insertions(+) create mode 100644 源代码/client/bin/Actor.class create mode 100644 源代码/client/bin/ClientControler$1.class create mode 100644 源代码/client/bin/ClientControler$2.class create mode 100644 源代码/client/bin/ClientControler$3.class create mode 100644 源代码/client/bin/ClientControler$4.class create mode 100644 源代码/client/bin/ClientControler$5.class create mode 100644 源代码/client/bin/ClientControler$6.class create mode 100644 源代码/client/bin/ClientControler$7.class create mode 100644 源代码/client/bin/ClientControler.class create mode 100644 源代码/client/bin/ClientModel.class create mode 100644 源代码/client/bin/ClientView.class create mode 100644 源代码/client/bin/Steelwall.class create mode 100644 源代码/client/bin/Ticker.class create mode 100644 源代码/client/bin/bomb.class create mode 100644 源代码/client/bin/bullet.class create mode 100644 源代码/client/bin/drawingPanel.class create mode 100644 源代码/client/bin/instructionHandler.class create mode 100644 源代码/client/bin/level.class create mode 100644 源代码/client/bin/normalObject.class create mode 100644 源代码/client/bin/shield.class create mode 100644 源代码/client/bin/wall.class create mode 100644 源代码/client/image/1.jpg create mode 100644 源代码/client/image/10.jpg create mode 100644 源代码/client/image/11.jpg create mode 100644 源代码/client/image/12.jpg create mode 100644 源代码/client/image/13.jpg create mode 100644 源代码/client/image/14.jpg create mode 100644 源代码/client/image/15.jpg create mode 100644 源代码/client/image/16.jpg create mode 100644 源代码/client/image/17.jpg create mode 100644 源代码/client/image/18.jpg create mode 100644 源代码/client/image/19.jpg create mode 100644 源代码/client/image/2.jpg create mode 100644 源代码/client/image/20.jpg create mode 100644 源代码/client/image/21.jpg create mode 100644 源代码/client/image/22.jpg create mode 100644 源代码/client/image/23.jpg create mode 100644 源代码/client/image/24.jpg create mode 100644 源代码/client/image/25.jpg create mode 100644 源代码/client/image/26.jpg create mode 100644 源代码/client/image/27.jpg create mode 100644 源代码/client/image/28.jpg create mode 100644 源代码/client/image/29.jpg create mode 100644 源代码/client/image/3.jpg create mode 100644 源代码/client/image/30.jpg create mode 100644 源代码/client/image/31.jpg create mode 100644 源代码/client/image/32.jpg create mode 100644 源代码/client/image/33.jpg create mode 100644 源代码/client/image/34.jpg create mode 100644 源代码/client/image/35.jpg create mode 100644 源代码/client/image/36.jpg create mode 100644 源代码/client/image/37.jpg create mode 100644 源代码/client/image/38.jpg create mode 100644 源代码/client/image/39.jpg create mode 100644 源代码/client/image/4.jpg create mode 100644 源代码/client/image/40.jpg create mode 100644 源代码/client/image/41.jpg create mode 100644 源代码/client/image/42.jpg create mode 100644 源代码/client/image/43.jpg create mode 100644 源代码/client/image/44.jpg create mode 100644 源代码/client/image/45.jpg create mode 100644 源代码/client/image/46.jpg create mode 100644 源代码/client/image/47.jpg create mode 100644 源代码/client/image/48.jpg create mode 100644 源代码/client/image/49.jpg create mode 100644 源代码/client/image/5.jpg create mode 100644 源代码/client/image/50.jpg create mode 100644 源代码/client/image/51.jpg create mode 100644 源代码/client/image/52.jpg create mode 100644 源代码/client/image/53.jpg create mode 100644 源代码/client/image/54.jpg create mode 100644 源代码/client/image/55.jpg create mode 100644 源代码/client/image/56.jpg create mode 100644 源代码/client/image/57.jpg create mode 100644 源代码/client/image/58.jpg create mode 100644 源代码/client/image/59.jpg create mode 100644 源代码/client/image/6.jpg create mode 100644 源代码/client/image/60.jpg create mode 100644 源代码/client/image/61.jpg create mode 100644 源代码/client/image/62.jpg create mode 100644 源代码/client/image/63.jpg create mode 100644 源代码/client/image/64.jpg create mode 100644 源代码/client/image/65.jpg create mode 100644 源代码/client/image/66.jpg create mode 100644 源代码/client/image/67.jpg create mode 100644 源代码/client/image/68.jpg create mode 100644 源代码/client/image/69.jpg create mode 100644 源代码/client/image/7.jpg create mode 100644 源代码/client/image/70.jpg create mode 100644 源代码/client/image/71.jpg create mode 100644 源代码/client/image/72.jpg create mode 100644 源代码/client/image/73.JPG create mode 100644 源代码/client/image/74.JPG create mode 100644 源代码/client/image/75.JPG create mode 100644 源代码/client/image/76.JPG create mode 100644 源代码/client/image/77.JPG create mode 100644 源代码/client/image/78.JPG create mode 100644 源代码/client/image/79.JPG create mode 100644 源代码/client/image/8.jpg create mode 100644 源代码/client/image/80.JPG create mode 100644 源代码/client/image/81.JPG create mode 100644 源代码/client/image/82.JPG create mode 100644 源代码/client/image/83.JPG create mode 100644 源代码/client/image/84.JPG create mode 100644 源代码/client/image/85.JPG create mode 100644 源代码/client/image/86.JPG create mode 100644 源代码/client/image/87.JPG create mode 100644 源代码/client/image/88.JPG create mode 100644 源代码/client/image/9.jpg create mode 100644 源代码/client/image/Thumbs.db create mode 100644 源代码/client/src/Actor.java create mode 100644 源代码/client/src/ClientControler.java create mode 100644 源代码/client/src/ClientModel.java create mode 100644 源代码/client/src/ClientView.java create mode 100644 源代码/client/src/Steelwall.java create mode 100644 源代码/client/src/Ticker.java create mode 100644 源代码/client/src/bomb.java create mode 100644 源代码/client/src/bullet.java create mode 100644 源代码/client/src/drawingPanel.java create mode 100644 源代码/client/src/instructionHandler.java create mode 100644 源代码/client/src/level.java create mode 100644 源代码/client/src/normalObject.java create mode 100644 源代码/client/src/shield.java create mode 100644 源代码/client/src/wall.java create mode 100644 源代码/server/.settings/org.eclipse.jdt.core.prefs create mode 100644 源代码/server/bin/Actor.class create mode 100644 源代码/server/bin/ServerControler$1.class create mode 100644 源代码/server/bin/ServerControler$2.class create mode 100644 源代码/server/bin/ServerControler$3.class create mode 100644 源代码/server/bin/ServerControler$4.class create mode 100644 源代码/server/bin/ServerControler$5.class create mode 100644 源代码/server/bin/ServerControler$6.class create mode 100644 源代码/server/bin/ServerControler$7.class create mode 100644 源代码/server/bin/ServerControler.class create mode 100644 源代码/server/bin/ServerModel.class create mode 100644 源代码/server/bin/ServerView.class create mode 100644 源代码/server/bin/Steelwall.class create mode 100644 源代码/server/bin/Ticker.class create mode 100644 源代码/server/bin/base.class create mode 100644 源代码/server/bin/bomb.class create mode 100644 源代码/server/bin/bullet.class create mode 100644 源代码/server/bin/drawingPanel.class create mode 100644 源代码/server/bin/enemy.class create mode 100644 源代码/server/bin/feedbackHandler.class create mode 100644 源代码/server/bin/grass.class create mode 100644 源代码/server/bin/level.class create mode 100644 源代码/server/bin/player.class create mode 100644 源代码/server/bin/powerUp.class create mode 100644 源代码/server/bin/river.class create mode 100644 源代码/server/bin/wall.class create mode 100644 源代码/server/image/1(1).jpg create mode 100644 源代码/server/image/1.jpg create mode 100644 源代码/server/image/10.jpg create mode 100644 源代码/server/image/11.jpg create mode 100644 源代码/server/image/12.jpg create mode 100644 源代码/server/image/13.jpg create mode 100644 源代码/server/image/14.jpg create mode 100644 源代码/server/image/15.jpg create mode 100644 源代码/server/image/16.jpg create mode 100644 源代码/server/image/17.jpg create mode 100644 源代码/server/image/18.jpg create mode 100644 源代码/server/image/19.jpg create mode 100644 源代码/server/image/2.jpg create mode 100644 源代码/server/image/20.jpg create mode 100644 源代码/server/image/21.jpg create mode 100644 源代码/server/image/22.jpg create mode 100644 源代码/server/image/23.jpg create mode 100644 源代码/server/image/24.jpg create mode 100644 源代码/server/image/25.jpg create mode 100644 源代码/server/image/26.jpg create mode 100644 源代码/server/image/27.jpg create mode 100644 源代码/server/image/28.jpg create mode 100644 源代码/server/image/29.jpg create mode 100644 源代码/server/image/3.jpg create mode 100644 源代码/server/image/30.jpg create mode 100644 源代码/server/image/31.jpg create mode 100644 源代码/server/image/32.jpg create mode 100644 源代码/server/image/33.jpg create mode 100644 源代码/server/image/34.jpg create mode 100644 源代码/server/image/35.jpg create mode 100644 源代码/server/image/36.jpg create mode 100644 源代码/server/image/37.jpg create mode 100644 源代码/server/image/38.jpg create mode 100644 源代码/server/image/39.jpg create mode 100644 源代码/server/image/4.jpg create mode 100644 源代码/server/image/40.jpg create mode 100644 源代码/server/image/41.jpg create mode 100644 源代码/server/image/42.jpg create mode 100644 源代码/server/image/43.jpg create mode 100644 源代码/server/image/44.jpg create mode 100644 源代码/server/image/45.jpg create mode 100644 源代码/server/image/46.jpg create mode 100644 源代码/server/image/47.jpg create mode 100644 源代码/server/image/48.jpg create mode 100644 源代码/server/image/49.jpg create mode 100644 源代码/server/image/5.jpg create mode 100644 源代码/server/image/50.jpg create mode 100644 源代码/server/image/51.jpg create mode 100644 源代码/server/image/52.jpg create mode 100644 源代码/server/image/53.jpg create mode 100644 源代码/server/image/54.jpg create mode 100644 源代码/server/image/55.jpg create mode 100644 源代码/server/image/56.jpg create mode 100644 源代码/server/image/57.jpg create mode 100644 源代码/server/image/58.jpg create mode 100644 源代码/server/image/59.jpg create mode 100644 源代码/server/image/6.jpg create mode 100644 源代码/server/image/60.jpg create mode 100644 源代码/server/image/61.jpg create mode 100644 源代码/server/image/62.jpg create mode 100644 源代码/server/image/63.jpg create mode 100644 源代码/server/image/64.jpg create mode 100644 源代码/server/image/65.jpg create mode 100644 源代码/server/image/66.jpg create mode 100644 源代码/server/image/67.jpg create mode 100644 源代码/server/image/68.jpg create mode 100644 源代码/server/image/69.jpg create mode 100644 源代码/server/image/7.jpg create mode 100644 源代码/server/image/70.jpg create mode 100644 源代码/server/image/71.jpg create mode 100644 源代码/server/image/72.jpg create mode 100644 源代码/server/image/73.JPG create mode 100644 源代码/server/image/74.JPG create mode 100644 源代码/server/image/75.JPG create mode 100644 源代码/server/image/76.JPG create mode 100644 源代码/server/image/77.JPG create mode 100644 源代码/server/image/78.JPG create mode 100644 源代码/server/image/79.JPG create mode 100644 源代码/server/image/8.jpg create mode 100644 源代码/server/image/80.JPG create mode 100644 源代码/server/image/81.JPG create mode 100644 源代码/server/image/82.JPG create mode 100644 源代码/server/image/83.JPG create mode 100644 源代码/server/image/84.JPG create mode 100644 源代码/server/image/85.JPG create mode 100644 源代码/server/image/86.JPG create mode 100644 源代码/server/image/87.JPG create mode 100644 源代码/server/image/88.JPG create mode 100644 源代码/server/image/9.jpg create mode 100644 源代码/server/image/Thumbs.db create mode 100644 源代码/server/src/Actor.java create mode 100644 源代码/server/src/ServerControler.java create mode 100644 源代码/server/src/ServerModel.java create mode 100644 源代码/server/src/ServerView.java create mode 100644 源代码/server/src/Steelwall.java create mode 100644 源代码/server/src/Ticker.java create mode 100644 源代码/server/src/base.java create mode 100644 源代码/server/src/bomb.java create mode 100644 源代码/server/src/bullet.java create mode 100644 源代码/server/src/drawingPanel.java create mode 100644 源代码/server/src/enemy.java create mode 100644 源代码/server/src/feedbackHandler.java create mode 100644 源代码/server/src/grass.java create mode 100644 源代码/server/src/level.java create mode 100644 源代码/server/src/player.java create mode 100644 源代码/server/src/powerUp.java create mode 100644 源代码/server/src/river.java create mode 100644 源代码/server/src/wall.java diff --git a/源代码/client/bin/Actor.class b/源代码/client/bin/Actor.class new file mode 100644 index 0000000000000000000000000000000000000000..33cd36733c91e523594eaef63e6678e6d993f39f GIT binary patch literal 173 zcmX^0Z`VEs1_l!b9(D#MMg~^L$c}1~vwe-Ruk;V44#|166PVNhStv0QTY|#sB~S literal 0 HcmV?d00001 diff --git a/源代码/client/bin/ClientControler$1.class b/源代码/client/bin/ClientControler$1.class new file mode 100644 index 0000000000000000000000000000000000000000..cc427e88ec3332a27c05ae55dd918f91a74b8571 GIT binary patch literal 1648 zcmZux?Q;`l5dS?*;F55dkd_u|YpYgF!b_-%qN!+!t%6C5wgg*Lye3b>;pHw|E-ic$ z9U0#p9UPqw%;+aA&d@)d46YMoU}0|zN;swr%O4u@1-wT>`!L|RUx83u3C$ZK-<3aQ=Y$;IQ8l~-Cm=Hc8H-7!5{^eJHzjvv=bbEd2T7d4^Bja&I7y?Qzm*%CClBe42baB}|oUlw) z&%0=1GWKF06?{(R^9-_^cZMWN`v49~h*K~pZK0Jhh$qOf;KUwPxkhR4vg>vsUYe)S z@#B;Hf@Pm10z|H-B^+Yt6qRkYkns!-Ge~)E2`|BjsMCadll9>_1_UsKBNCq9L`esZ zj2G}C@rs`>D;jlt6Jm$8iRiS1qYPaebas4?mQ^jsO&?w&zqKnrH9lJ2DE3n2pWhY& z7{;jJUqpPpBI6j2(`8Dr$aO-$|9<6d0pVUlB^gFaMq0r3S%#B?pvbt46L^i7T-20{ z#OsSizR|*POFRlRgb5jwI7#)JQ?xQ4pJmu{Z!&k0w>tZ9irB_|n4*{6rqeRs6wHxI zPAhzPn;PpdtA6>z`ijH|ObxG-Z8$>)%?{x=9Ism#+c*-pP5+3X8z=mh$cGSkAW+5# z5eUn6LbDrP=%#<1HrPq@;8XNsf!KHreOROwC92TrAa$z%T*oP#p*p-nXA(T!|Kj~^ Z6j~v%4Kv8n+e@o5hgtd(Wfw)H-~YM7yr=*G literal 0 HcmV?d00001 diff --git a/源代码/client/bin/ClientControler$2.class b/源代码/client/bin/ClientControler$2.class new file mode 100644 index 0000000000000000000000000000000000000000..9c37dc41dc9a18102327c0a7e4bb5497811ff27b GIT binary patch literal 1092 zcmaJ=?M@Rx6g@)=OUoeTLqr8ZtD}dduGSl)ykOaBQz` zYnScVndBw}2HT5dOVmW49ksln^lqS!)Q-S-uJ+HVR(Zm5zMjGeu35NBxotB^T*s(D z=MnYoQQL9BbvDZ>+`xo|aetrSFV3JnRaMg)` zj1lW(5nv7l3weQb3y{4M)0h#ksvEnm@(5=n8s@YZp14Ha>n(L^*7&BJ#w_M66a|KP z+=~$s^C%J2o-&-pH04{HiBzy@G$BS~ElAwQ1A*?=6x9tT;SPJa7M_qIS{{j~Omb&vY)yfJh#mbOC$#EKV>^fI_WPLf^k#6Z9ku4ND2Cc- zn&sAL=c~Ts1tATwuFQV0!_s<5m41pbTJm2MvgTx!DAEY@}^1xk2^ g6{`C@$`tdIUZK|xyud1*Ns{FnUeOzm$PLr)2ZiYQv;Y7A literal 0 HcmV?d00001 diff --git a/源代码/client/bin/ClientControler$3.class b/源代码/client/bin/ClientControler$3.class new file mode 100644 index 0000000000000000000000000000000000000000..e46a9609bbc3e3f2dc7911b53abe9ff316e0df1d GIT binary patch literal 1086 zcmaJ=O-~b16g{sk^n+2#hp5PxTCgojfeHu(6VqTqG8Ga`jqVc7@JJy-E-c(bMCpf-+mr`0dNyDVFVaj@`f%< zH*cA)Z5hH&WWxwC#8>z_&lub+XXckyM9B@Kk)hi|`G%Vj>y(taQ*w37RCUJ{rmz_r z-DTZL3{zFLu56CTY2DP_+YIf=Q*5fp5XxJch=Spaf-oX61ktP@ia0|sDK9jux+(6h zRhEQ(pD!7Lp;fg?+$eHem$46qqzHz#`i~^CB%+ynk{5*i*s?1^W9Ut)|Lkg3c9=^Q zqqu<1FfLMVT~7)wp^KrRLb?r-?SHT!!(0?S=nJElq3JlygB4uH6^2NeSH%3fw2VEH zHxml_CD9~_MVH&I&?J6MK~mz%DqnNNf-M~9m`E!altfG>EJ#v|;08m_(aU$W&HbYf zpN?L|GkW$HbG z?CFx#tyi_ZOXozlLBA$XB1ns*6fnFtIH|2*ZDdm=RtPQnkB<> zNJ&As%a$g0fhO4XdwYty*vS3mxm*%u&ZJe$8=RbS&`0YOq^AKa9+z81n;)PjiWs3y zbh<^cL}KZ|T`1{&oc-+GX_1)6$m|icQmjypMBC6#Z!!%XewD9&6)n93We4YX(7la^ zC&AU%Q2ijZi-8k7wTqSq7{{-sELO6r9I-3vYYHK@Q$E>qLQGZ zQjJ6b9~3VL;`QC%;n~8UFwSmk#A-;~nlVi^ zbuGp9V1pYjhCrv>BS%uQ+7UU|-pLcD8$}FT9jV-FMtBc7MUE#-MN{L7VRDu03`OQ; z#R%@FsPVk8QBpQ4s$w2vD6jrYThqqiifKvi1;biD-0=8Nh!Q`%2rv{@+Xf|ZMdfF^ zyV|*aQEpFhhO)SpkW+24uGoA|=(0gDtj|vpY#w zXib|Jn^5V-X7bIe$&W3lVp!8fxKji>m$21lqaJKyXbG+QiS(2hxGtVfTZ7}$s+J)i zBtzr7NGKQhiv;jLk@< z+-~O|yk?C|N*;t54(EdP&4`Ja@1MVtm6%;znoVc!+*nReQpjv(G59KrC@T+pP{(k7 z_2&J*mVr?#t5%x~YWoGPTTk#)iam@I$ZJDF7y-%Qwct82r()B2(o8|=-xhMm(Z0kI>|Dt!Vp!cqzYgW*; zME_1)i6TmHk`gx43Y|g_r?DSr(1;cXNQDEeDF*~-!ajrvN+BZTS3tH0=ys8BJ^ih0 K$n+|7)Ati3RbX-e literal 0 HcmV?d00001 diff --git a/源代码/client/bin/ClientControler$5.class b/源代码/client/bin/ClientControler$5.class new file mode 100644 index 0000000000000000000000000000000000000000..66b9a890c6975a0115d5557aaa6fb34830109e3b GIT binary patch literal 714 zcmaJ<(M}UV6g|^jSi7#aKt)6lfvN=)>jNYvRTI)+Lb4zP)A#B20zLfL}(udn*kIW#zGJ~aDXU`jMcW-D< z(OG9S_cptkvVMVROY`69rZUed$7^=j<243RuREjpF;sX}5ipF literal 0 HcmV?d00001 diff --git a/源代码/client/bin/ClientControler$6.class b/源代码/client/bin/ClientControler$6.class new file mode 100644 index 0000000000000000000000000000000000000000..322aec4c48f5983a14da6d0ad8b5d818d5aec93d GIT binary patch literal 1782 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 A#sB~S literal 0 HcmV?d00001 diff --git a/源代码/client/bin/ClientControler.class b/源代码/client/bin/ClientControler.class new file mode 100644 index 0000000000000000000000000000000000000000..e2d650c0ec33faaa25c1c9db8a60a6518c97bd29 GIT binary patch literal 1526 zcmZux*>clJ6g}-2goUy|!mthy2uxxY5g-X*mT}C4BsdFM%r;xcZh}CTQ<9uyp5}2r z0KS4Zs*+3@)t*~yQ!EfWV zI1iP$S%Gm(bfDKlH~IuR28T)+2>f876J7f6n1u{X{ddB`L0B1_!f69P3YfbLEu6tw z9xG5@C1E3Qq^Q%eX$Kn)6EZzs55t<5GjLAe(0ADz7&g(50Zrn9K;QqQo7v3`l}!AE zAp?T~y=}r;$l?;?%1R|)4xO4;bb?TM$`?2{81b;>Mrf;b*353TU~GM+D;BQmGjx{Y zQY}VxGjOd9+v_H53}~+#7CVAoU2D30d9Sjdf_haM7;WQr!^BAJcH6=o?UvT%GjO+! z@l6xC*!Y2kpCe4XNx+Zd0S$j8RNSeU>g_D?l#iU~)#?5bm}wOCS{VYI?>uwC|) zW7NbX222z&YhZ@$(30||w}m;(^YG02WA)c=%Fpac`8Uf+z85SkVo4xVm5w(rJ>A`1 z#fmR=w?sO*u|@ZA8#A%2xjon1I7^3HxFwOgi;kye>(v$IFUb{G(X3c2OSdF_N9zfg z4qrO~_ecg~x8DQ~=%siTGx|3fz;vjpYi!Zhe8zk^5{tFEUse;2-m&kyCcmnQvNBV= z3jBgAgFprBdJY}$mHm|a_ywhr$ODPw{6#pYFOr~Nh(^Ym$gKu)8oAd*?l+Lv zNTG>5Y+zC&(>r(^M}9JUrGaIQJ>9{xkK~oYOMXXrtAOm&yh$=--$nktd@tZ4#xRU2 zjMHuwRXoMtc#D7F;vGKVS9)dR^WiuAPK_tUAIyu0{{CcUQnc=b#0vA7LYa696)4I( Y%xFKQe(YFq5aTD8$b2Fv6S*AAug`R7+5i9m literal 0 HcmV?d00001 diff --git a/源代码/client/bin/ClientModel.class b/源代码/client/bin/ClientModel.class new file mode 100644 index 0000000000000000000000000000000000000000..fdc1b1306558a081ba75cec03b4ddc805ed0fb3a GIT binary patch literal 6392 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 N;{@#r?`Y(^{{n?Eiu3>g literal 0 HcmV?d00001 diff --git a/源代码/client/bin/Steelwall.class b/源代码/client/bin/Steelwall.class new file mode 100644 index 0000000000000000000000000000000000000000..f7b394f9a3708e3a89612bfb5431b08f2c8496eb GIT binary patch literal 1784 zcmZuw-%}e^7(F+;$wF8l1WJLBwp2@#P{Bf}trTdD7GwEQfuY*YIJ1OnSX>g^ECt?t z@X1%7+9!RnFP+iO6gs00_Syf$e?dpwXlU-?sK%Wf@P0H%G zVWU-9XKb{E);Sv;NGjiX8|_Fm<82IDxFFDSti6qk$OtqAayQuaB`4^3aB?_RBWELm z7J>Fzw=CzkH&>;-mZM=tTgjf~ObO?+cs}eFq zVC#vl;w)rtVYMp#hti+O-na0+KwCX1U-2q_9M^F}!9Gcv6g%NfrfuBBEy7lnfsRw$ zHR@|u?b3N0AL1j1e(8GNB6TNVsY0wowUn6H$U7QHiB1W3O;)K+SFSOV8WJvZOEL(R zMio$NY9Go?S)q!%GTE@ER(oB?@ukYPUzE39#adgPm|-A=X%Y3 zoXuIka~a^~Io?W)kM1LzevFRXa|}eyWwpf2<+S-j=rTf=NmsPyqJ0zDR2an-#CY8=k>ezPWosKaD;bw{mZ=iHF~GfO~Ov&4tki^hkHoj3-m+c3^s5U zU*jBhaUPdg@k%%#^M|?Ps2U)lEd^0TTO+g#Z7G;cyi5BO%vWp`wIKMh_%xABCW+i- zjMngT$%M(!m*%7~^#omN(Dc}2G#Qgm(EhC<(#muAjgi!Mff|t0B86p_LAwEWdtBEu|(G)1)JJI|vEFoGWf1}C#2Q#Tu z55wmW5z!KgY3GFQX@>!|o&s}kOirIno_=HUJV(_JhULP}Ml$}( QiN5(`sYbo;T^;r5|1w8Ii2wiq literal 0 HcmV?d00001 diff --git a/源代码/client/bin/Ticker.class b/源代码/client/bin/Ticker.class new file mode 100644 index 0000000000000000000000000000000000000000..4f8464ae81002ab5cf898ecf28d79d41de6f7fd0 GIT binary patch literal 2214 zcma)8T~kw66kR6?xsY4|`4$iZ2!^0UTdWnVE#*UFBT}GP?B^vp;>B>o+}v1s=wtsx z{{Sz2(J9*2nLf5N{U!YYeXd>SoJ&YLIPEaGALs0|*4lfoeTP5({^eHy)A-s#L?FKI z79LCALQJ52$9dvpOOCgly|=X^3xS2WK*#awYSr_ct&$XoI3^%j zLg1FYyjuyRC;eH07Pq4CU2j`JJm4=No;jsy)*t!ODKfCBC`-;h19Fsf!}Z+Yrod=A z_a6)s8v?QUa#1D_MW>B6bO}V$6B{iM=&@m;Sv~dHIE7XV{S7%9@&wLcP@Oz0(3`H) zc9iU_K|5z730p-E+Za(iO_jj$1BHLyMhg-GZF$#|%hla2>93nQb>zzhr?lbtu6hp_ zW5FZ0BG8;SwP*Um6=-#I^-5v&m{>Ze@;mJmi;aa97zu^GvGhuF7FR4>Zb*4;pRL)o z@fO}@oyt|VquZqHma{9q>ji58JF+|5jH?2d@6W9+=az5Hq#F5CPD!iz$rYw>+FT~qKi~Bw2RnW z`Y2Wj%6qI}MFtDTIL+I&M~2Wvoey1K8r>_>e^~Z+WzoW-K>vxRT~r26U;($37j6rr z>&2OIm<{cyty|NZ#2w@N z9?JZPp%+MHqK6oL#?T1HcpV~*0*ev8g#@kqaP;#!Oz?5Sk8?L=pm70dzL5kIj1c-M zLy-|JWiphqL#zn*Mzoawr=lNmp6KAoPO9iaH~$9FLlwPRL61SKDHsVA2wcRakavqQ zinou6cK?oKW|CDnK=L`JI;LOX9hGxb=d5_ZEG-PE&mcL5>R9?}EPYVf3EW^bb855r z{2p$Gd|BRA4VuU|`U4+KLF0OHSOeN7AOz%BjH#J^O*2{@j%Q*G?MUbp#^`|YI)r!) z;r$a38XIa5CWw$Z5#a+IHR>k0RKeofD#w;E2$zU3r4dZ=k2Em8R{S}980J%7jNX42 z<4T>7rZAO=n$_@dg;Yw&nCjebNT`B-kJz(USlG-&#Y-&Z)z0M4$VG76#vUF6uF{Iv z*v9K@=nT$dwoda{NY+nt-@^*&!d7yC1U{|_cp6q>fR6-6) zZZ<6j#~OCM?nsBb?kmT2yJ`D31$qnRa{0gD;u6DWm^O(pj_OF^m_WEtTuMOTxDFk0 zi3W5e(IL^04lVFybR+_FLPuwShIMoW=%kKr#09!5cGG&a-l$sMQ?n{n9jUlA(^)b- zTiR`B#9y&laI7L5#FB)`x5`qV_-5_pyt%4)8qNxI>?@w)>z=tO&{wFahMJpxY1T7W zSM1u_l&oS5;~FjqbnShfaUIvwaS;=&)U)cG#lKkfaVm++xT0ZFpl2^^H>-}TxF!%^ zvwTICT|F3IT#^~C>$m}SJ^tKwoP`aOlhfn?%7L!iI;N$DnCo#1EGczH$6e*xvK+_V zOkx!GbC8J?saOkHBb8_&XQaAX$bUe8Ci0#kQTahrexCVH z%oWBdo(6Xk)E42Lpt5dm>rrmv08xetO4Kk(4YTx~CUYXtff1acMMWr3uTZE+6jDgm z7FI}B8{uDoUWEQ&98va!kH)burNB9yZx{I!F%`Z&`WdAiTpBgLu(&VC*LkEBh{|&% zICn5b;;nte+%7R!mz10$=2imYoqfdYE-|Z!Sw+lBBE$NP9o&-*3aJL=)i{oGjQuFG zEn^tOV+`RL(s+X`-r|I6OkbdVuQA&w;{huZc!)~7!jiH9sc!J&-Y;Tw19_E3S2)^E UBQSqxaQa~I$f3cH)GrqP0*0OEVgLXD literal 0 HcmV?d00001 diff --git a/源代码/client/bin/bullet.class b/源代码/client/bin/bullet.class new file mode 100644 index 0000000000000000000000000000000000000000..03e92d756d848e87418e5f3353040c5e5e01b8f1 GIT binary patch literal 1263 zcmZuv*-{fh6g{0xGFb)!0m3SaxFmxR7hDir5XDMWP)i{1lVl8oLxvg#kYDf*e9{ll zDzyw&`QQimQI@BB!XibbGJS9Nx#ym{{Q3LqH-K3z>xc-%tGlji2Rbx?u1#ytD!Nv) zQG8k5v}?SL3&a*{f#(Zo?_PO30-{9oK$*#gwPmk(b=wu_C@;B=-3*jFFOaM|J{cUZ zN%-2qwk?n?pYX2+zSC?F7hiCiPVi8mCtoW4$5AR&7`jCI6r$)ckU_6NG+(GB5J^Iy z-#`aCr8Q_kM?zY|29lw5!9WUWc{gUjKtdo>cAEB!-L0zauUS=BDe`KTTd{mc`t3_C z*l<{9q8xUH8nwD_?F;1cVFA{DP<-xN+Z#@8XTDHL;wlO{@&cWzKKZ=lxt?#p#1uQ> zI*pBh0SD~x34?;nr!bA8jv0aOoW!YlI=(ngF03NtM+!q z+HUttZ`eV&8k`N6L;B%h!2djLJRh?V|o)Vcs7r))~-Xp>rVBGwPteNd=A!iP^Fkp_fFl0`*Fk<#; zEsTC6CW3K(N0|p)8jY+nLxyY9%M}|W`xw0mzRrf6xQI!5WLMgRvZT6*vSf5rSyG`! zMVD~7t?LUJBx-%?JFXn!n)w5xACQ)Z_6fNu8UtFL-yyvo?@AuxrhJNh3?cC&h^`=7 zy(<|HAtUA??#N=I6m?WgmhyU#V;KeXVUAWA{aC|*Dkc{SIWA@$3wS`84;deamdj?c z^d8}HTY8bFEHx%Iex?!jEv_zy6{QgZ+LQu|=LQd*4IVo;_z9LsCx>}DbMEVz%#-H^ JKUJt_{{V5N)}H_X literal 0 HcmV?d00001 diff --git a/源代码/client/bin/drawingPanel.class b/源代码/client/bin/drawingPanel.class new file mode 100644 index 0000000000000000000000000000000000000000..70fc3ad2506bde02d3d87188189ff0d5ff4a6cf7 GIT binary patch literal 3414 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 literal 0 HcmV?d00001 diff --git a/源代码/client/bin/level.class b/源代码/client/bin/level.class new file mode 100644 index 0000000000000000000000000000000000000000..48d483fcb1ab8e05beedf79c3b96de3a301a5c83 GIT binary patch literal 24312 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 Yx5Hdomh`J7w@7jWWt_X9Bpd(#0K5VQWdHyG literal 0 HcmV?d00001 diff --git a/源代码/client/bin/normalObject.class b/源代码/client/bin/normalObject.class new file mode 100644 index 0000000000000000000000000000000000000000..2563a7ff0fd6a8097d906f9af8cbf7d0413c92d3 GIT binary patch literal 1878 zcmb7EOK%%h7(LgovB%RiFFT3jCT$*IJ4sVgDA2Tp5@<0vNlSuD+XbE2BX@!yVLVCG z4PwEPUx1LW*K)0wKz|cl>IIgphUT`|kao_dDnMr@w!E z4B%DV)Zh~^sx_x#mRC16t%9o|Ake#M?wIpsvs#*OorVO07YlC95eTf`-LeGwa~-cW z*RiXmMf%tkvqWRBXEg7)^I3U9Q(*T>tu7$4RPQP^QZg&na;<2U1&-vF%C=Q?)t26& zb9U8sF9=Mhve_4G|1O(N=b3YfiFEieXrLD{0e>o;k3e9^Koo}5MhqPBv{3^+I4aMM z8PE`pU>qkj92baowP9calLBGa+I6=bi_Q1lJa{jeW7z#UA0!WD;t)xZf=y- zjA{k5oHrd??wf}J_qNSkJ-P0=^UAuKUA9`Zb~%qV*DQRtY;LI_4RbG`;?0|vE;{BN zfq1IZ)@8@sx@{Ngi|M?MS8!Ux0{d1_Ni36{^ffUl*v6y^rY(Q$VIiJ#Gdw!+K ziv*OGp*2V^AO`WA2}2r$5E{lc%*q4;Co%8cMf}DxOduvR4>0uvV>426#e0n+#W01~ z$Ej<3_;uzH&RqBR;hFy--q^>YGDnN&_mGfLG9u~8TgiRA^_4Fux6E+s-t%Y5&~$Dd zD{pD;I5UTIZdLlSyOREYDm9(|vl81%_Al+@y>B2VknGPYeMspaDm_X)k=e&`2g4O2 z1`LusG2%Id1q|~Mj^HZgr$}HEqxgdIYb5b4j$sdDctrV>2>*iP_?_|({s$&7B_=T4 z!COqW@TPVZ9}%Rpw67_=OKt65Tl=}KNxb_Jo%jn05s$^Ex&DMc!wl>A*aKUEE(s9i ymE!lQ_!K2WG=qgD?L3MFn{5c>4-FnZ7(9Du@HKpLNaf`B2P&UBH2Avmy73Rb-)si} literal 0 HcmV?d00001 diff --git a/源代码/client/bin/shield.class b/源代码/client/bin/shield.class new file mode 100644 index 0000000000000000000000000000000000000000..5a7d67d6374cdb339b70fd25f6e8f31411a5ae1f GIT binary patch literal 1145 zcmZuv+fEZv6kVsZon8hg1zO8Z@!AeTRq)!1B8jF+y+laghxVil89HP-fV}xZKB%#n z_}~ZlQO0%76pEw|GyA^x+IyWpe}DZ3u!dI#A_DR5t|Q%+fv7-c&pxutuH9*u-|y_n zW?&#L5Zh=5o-Yvn^ug;2h#J)sttQ*{zI^Moq$@C5-*g?>3A9;Z%J#{D6v);GJ+}hi z>9iS(SDlU%tTS4y)&8q1HCVaHjwy^FYhnzO0wcvzBY{W~0yz^VMwNEOgn@+8W=teQ zZO%jrX@T*&(~<8E_jjbfZSS}mhS#*+hV47b?mMHwuET{A_3#7=bj!DoIi(n)wvU7I z8{aqU+#NH zvd>|vSl1f2A(L&68=yVI#5)*m8H8-}_T*dHA>~R7nVl+@hH;zP@(%r`eC?>Sr^Cyx zsJ*dBu15I95aplb@f8Y1ot7j{OVUdjV`L2D{AXw#A;KD9#`=i~D?8Q0v^Cp9-kR&7 zU@iAB`;E~E=2Z^j{3n285oZ#FaIS{ZlDO3&I68P@detU0%%|GYJA(@MQ`B0D1>`l(*_)bPw% zO9l;{9v7&Xw$9sw*(p2CfCIg0$IiIkBVDyUPR4Qf3e>gr_xG29$uWlOrCSsVo-$B} z6#`0Ia;yRZD-Gy~NG)!_Kul^a2C95*m4O=6%Cj{Fs$o`O9X9A#FHjjsZ(t+Z1R}0| z$(_yFtf1!f(&A){lz|W`1*!*}jD39e{DhqwwIq5a}Dre0JG`5wp_vNe$XPwEJ?&Me$+p$x}4qnge zkYv698+Zo0$gm9Hbwi*l5XEm0c`Z6RvSohbh9+k0+(kRrogCM}dsY>Vdb8hnrx1Lll=w`;90UZW4oT6Y+Wh7ca*>MK?8?yn5Hi|>GUwiPC%D|7>PVg)3M}N zD2VrnN#3UH84jmoPtlSiq)*$fKV%#Lj+uP+CrxVp0N1xA{dnG>7e_cclAX;>+J_z4 zunHNwT^5Sf?5x87Ff3({8NAO*o;V@@C|fnOF)&Gsy|qK7+&VQ zisuQ9PU$Y2J~Z;>1YoA~_}R}UmphayLftl z@))TcMkB^4r?3JJnvkXS9OV@><2A(bCgr{i^$yN(blg$o!S_d`7(`3U{?BK1o@GOj> zqL${({j*n#XE%!4=SA(uqV`8o+sf2CQNPIYH64N<9qV|BXe{~&+P{d3Xk}3|$~9iL z6J7r7DSezgl{46>_9%OAqFzo?qU$;$O3zJHUsXgxp4^{b{4IVB>a9(DO7g$iG^QvL z6ygrHo!WE{yI-im6?4CG7klntpY&3?uAxbK1guTn)bF5I!fFZD3c&(!m~f-#olg|N zw1DfGCthO z{(~+=Ec6Hw^&j-LG`F<0#9QO>rg&>>yp^uUFyJp0Dd5|OPGK_I{4te~$B^b7j(hnH t-yok~U~pOI#8T%Mmvuf)TD?~Z!}*z&+UTcC@=gR?3qM~1Cp@c@{{y#O*kJ$w literal 0 HcmV?d00001 diff --git a/源代码/client/image/1.jpg b/源代码/client/image/1.jpg new file mode 100644 index 0000000000000000000000000000000000000000..bb1823d53fb7863f38c66cb085520b170c5a8de6 GIT binary patch literal 514 zcmex=Ms=g{8!#jAdkub3AN4a!3aMk1!N6FfcJOLmUkuS=ktv zm|55b7?>EDfq)ez#|Tu$BB*E>$SUN>mRKk(qO|b?BLg!dBTNC9W@Kh!6$BcIVkjdM z12c=DkfNdE#Q(P#c$gW1p};K2V9)R@?Au#o22+)XA$iBUtoBXa@8Gg6kArdJ+{PRK z8MqE!p3Euf+}z-{YpqQz|mvzN@A>J`khUOax(=9g;_rGNL!VZnqY zZ7l!Pzd9HCnrDjVq^W2uWvgDw=lQ9GSzcs!sf4%@<5_RL#z58@3C%lqUS9WF{bkOB z-p$WCIaQMtn*wFhOWz-Jm;17HZq{p^?nS#95152cIkCsKrf1#nws(1pyA&reG9RDC c_Q}{XdFQH0o+@)@P1RnX?RO?2tN#B@0E9T0+W-In literal 0 HcmV?d00001 diff --git a/源代码/client/image/10.jpg b/源代码/client/image/10.jpg new file mode 100644 index 0000000000000000000000000000000000000000..d446085a4a0c18ac30dc00297ca41ac2431927f8 GIT binary patch literal 519 zcmex=Ms=g{8!#jAdkub3AN4a!3aMk1&)nFfuSRLL3btSs9pF z*aR3DnVFfG*;!#Sj7-de3@nPQLWzwFl?)vN3nv~DF>2a)5u_VMJ0mj-1FIkdBMTD~ zlDSMk^8{HEg$#ui8w3B}V&DPFF$n^Vv}ZV)b#B&f7tJF(VwAVe@vGS{x3zHlrQ)r8 zKaNa3W@nqRY3XvWLf^j!=0ym*sy%yLaqDx-IkrdXQzJWDMJ^iJ*PE}^?mi}Z>hJr! z``yb+dsWP~vg}e2;`w#__*(9$JE14H#C@C1o-yy{XBlnP;^IXTOA`538XRy~k^d^` z;%@!LZm*9lO%V#dJLmBNnOBeQ%~R8#l$6|G|DpQBf~+u}n+_4~%N+Y0vxKVrY_83V iDpdNZB2Z(S{AGR>-%>A^%OdAb>~=bN@8sM1|2F}ZVWZpt literal 0 HcmV?d00001 diff --git a/源代码/client/image/11.jpg b/源代码/client/image/11.jpg new file mode 100644 index 0000000000000000000000000000000000000000..4a7a633ea070469de6d0ae5ce4798486cd3b8bf3 GIT binary patch literal 518 zcmex=Ms=g{8!#jAdkub3AN4a!3aMk1*sjFfuSPLmUku*%(-v zSl9&^7@3(^nVDH(QjAQ@f($IILc)rMB94V@N)ttmOac=bfdHlgOfxdE2!aemHj|Nw zfmu+|kVV+>|1Aa{W}tGq{V^*?N`t&*aWad1Ri?n01u< z)s)+(qC}^8dic1@Z{91pY}(I#or%-UALdW9I5jVQd+&?b#Jx@rghO?rJ-goMzg=T+ zyZlac%8L~&3#vOOZd@fkxp8+z{EK%1Q?(5<`BapT3$Zsp()L;^_f6L2!txz^_jsNA hbtUtq@sdl&W*zv}C@A8z)T@2NzML%%vnT(*2>`VOox}hD literal 0 HcmV?d00001 diff --git a/源代码/client/image/12.jpg b/源代码/client/image/12.jpg new file mode 100644 index 0000000000000000000000000000000000000000..8dd249b948723e56ac3c1008becfeb649008c146 GIT binary patch literal 528 zcmex=Ms=g{8!#jAdkub3AN4a!3aMk1!N5FfuT*LL3bt*%+9Z zSyfRPg>$H>Gi$iTuXq-ZGOn8>DL;uKg|G;!fYMh0d^m=Z9}$jrhd2s8tP z;DC{dfmx8nP|-2)|1Aa{pbjQMplS9DtFH6r*Y<4Z%-Qm4R#5ZgO+EdlE2~bO>^_|J zEV5Ms=g{8!#jAdkub3AN4a!3aMk1*sjFfuSRLL3bt*%(+@ znFN4dVP$4wgG(_oF*C3T3K_BrD;hbniHIr%COQ=^{D7{RfsvVoNsxh&m5~w2P(}tO zWaEqc zSZ4V7jPS)}rqgOpZTXp^TV3~f(!@`!mG&{mB$%2z?!;ARy!g>_>ERuJQ%OxtPSqWM z*6j7t_25>RT72U1Uk^?3fH#NtiBG*BbY+U&k}VMs=g{8!#jAdkub3AN4a!3aMk1!N4FfuSRLL3bt*%(+@ znFJUZnSp?j6DGsR#LU9LDk!ArXqY&WO;kxaFu1U&@dG0Wz|??fW=19!K?WwEkw~U8 zf<%N^gcT?Lzs0}mz)WnSl#e>TO=T7lQ=oS3q1e2Fwn neYotoqqAo)4;xb#L-AdP+@9p4!YhONy}w0udKC!I|9=wzK}n#~ literal 0 HcmV?d00001 diff --git a/源代码/client/image/15.jpg b/源代码/client/image/15.jpg new file mode 100644 index 0000000000000000000000000000000000000000..3ced3c9ec345342517f93f9b13126828c40ccf20 GIT binary patch literal 523 zcmex=Ms=g{8!#jAdkub3AN4a!3aMk1$j+FoFQY)nJm9fsKhp zfPs;jnTds&6DGmP#4O0bqR1*FZ0K0X7MLg^s%&J^IC0|#Mg}Hkm?ALE$il?TD#*aZ z1T=vaF2l&gz$_@FXviWg;+VK_T+B1BzPtPft?W(Hj+{LoeGi1eg z5#u%6=7ui&u|xA@pS#8Lzov`o%XjLim*g56%IEE$b*w>os;R5#x5J`$p1A342o0KK zJgLsmv?_J#M*fdZF*e4m={fTLQDXBxe0!e~clW;U+>NKK&imb5kZr$qZFa#5vp+os zOo!N|Yu)1ur@Ywavg68IBjL}<=PehC<|Zun`e(p$?gC5Q>shPpQX8H6Sfq*;`aP(2 p|I)5|O1^c=l(rsrh9i}n$E%oDty;Z4yKmVu;b}?7uhsv*2>_UiooE06 literal 0 HcmV?d00001 diff --git a/源代码/client/image/16.jpg b/源代码/client/image/16.jpg new file mode 100644 index 0000000000000000000000000000000000000000..38235792594d5181797a3da8456b255d73ace9fe GIT binary patch literal 519 zcmex=Ms=g{8!#jAdkub3AN4a!3aMk1&)mFfuYSFhg7oCRy1S zn3!1v7#NwESeaPZVKR&$Q9)KAMMFo?LM4^Pg+?ZcMH3HR1Zro5sR7e0%uIp|OiYX{ zjI3~RMkWSkK^CCag~EXw4?g^Vi-Ct3XrLgoAcH-_XMcD9i!YuCOtXD!KIuP$_%79B zy_06#4RdbX_@VCIoEdz*E;)M9D^EDu?OE}FbsN{oWouuDDOYr_`;ryJ=Ba*U?V%N! z^KLb&s3qO#WO(2kG?6?2g>bLQL_651xCwHa>>`i|c n^x(7Ov<0RQ7r2xZZ_0eRKZWbG(%s^iqC2N#rs-7A|9=wzWdNkV literal 0 HcmV?d00001 diff --git a/源代码/client/image/17.jpg b/源代码/client/image/17.jpg new file mode 100644 index 0000000000000000000000000000000000000000..019794413703fbf753a4b2bd4f476c866d1aec3a GIT binary patch literal 525 zcmex=Ms=g{8!#jAdkub3AN4a!3aMk1$j)FfcJQLL3bxS(#Ya zm<51-VP$4wVTVaEG6^y;vj{1&3L82Wiij#11tvC5+<5RIBf5TO7LZm!1|}v(7A9tx zcAyxuAOlc;qOf7%!4Lm$G4KGbWfBAm+B2+lwQ9JyRBI8}j44xAy6m2O@XsTi_nFh} zr!8GqR@Zy{zTw=-MthCYa!-0n6kjPmmRP~qrnn-Z|Jc&jd3}Z|7hM>&JZ-OE%Ub9ABiK$v)9~GSt?@iddsIpjcZCBm)i== zew1o+Wa^Z=6Yg3+v#J!ez4k7sdTkl+;r)4YAMyyU__|)ICGhyWO@}>LnU5bh{@G;7 mEZ2TvMNOX#8}!l+CjR+(h(n>l-*D!3^F7nfMs=g{8!#jAdkub3AN4a!3aMk1$j+FfcJOLmUkyS((`w znOFpXo?&HXX5@s)F)}bQv#<&p3Mo2@G)`0!7F9M13_keq10w@7BTNm1W@cd$1e(go z#D*}Kk%@s>kVR2Q$*{2TVqoIJ|F;-;fclsOnFSf_8J`1N-Q*}}28@A&MZ#n(;0-Tr&mcg+&^rwaV{4O_4J zYgl~#s8jMQqh^jqQyRBV@D9CW#b5re=~CIr@OtVUlLtlhGD|!n*T;Na;VR8{Z?VN1 uW`?&n+%LX#URvyOg{`gW;j0Z_-sb&L(Qumgy7%mns>3>d5zp%X-vj{mj;V|Q literal 0 HcmV?d00001 diff --git a/源代码/client/image/19.jpg b/源代码/client/image/19.jpg new file mode 100644 index 0000000000000000000000000000000000000000..7b903ad6ec83faef9b1e2903aa298d2cc9d5d2c3 GIT binary patch literal 519 zcmex=Ms=g{8!#jAdkub3AN4a!3aMk1&)nFfg(*LL3btSr{0Z zS=pEb7?_wCnVFb5VRDR2%z_LotU|(yj=>W}3{9L9iyJ3xWMp7Q(apfb%)%fd2@&>W21{KChkJrcruG(^W&eX~CtXHa3Op}_k zB8(yUs{FEmlUoj?B+I?%Xql&Z=c63+{qE>bcBdZPSQITT>SH4Kv~sQ9)Ge>24lmU{ m%AeYEx9nWe^t>N0{xjGgZccQn=J~yN`(oXbhhOjde-i*=u%FBT literal 0 HcmV?d00001 diff --git a/源代码/client/image/2.jpg b/源代码/client/image/2.jpg new file mode 100644 index 0000000000000000000000000000000000000000..a837deab2f0e79726b326ae3cb4ac392dfe1a41d GIT binary patch literal 526 zcmex=Ms=g{8!#jAdkub3AN4a!3aMk1%92FfcJQLL3bt+1MFa zSeXSFm>8K@SXfzMQjE+@41z4ILWYV;j)82#MvWU2CoVjAkr4!7YQQuj6VQKXf{Z|K z|G&k+1GI@rkXewyo`LyMs=g{8!#jAdkub3AN4a!3aMk1*6TFfcJQLL3btnOPZG z*q8(u7@3(^m{|B>QjAQ@f($IILWYhaio&AB2bGMBO-!9#f)fiHnS1r zhfTV7>E?>UDJmxg*2_=H{kibNo9b!*83JP-Y%rL%g~4L)<6^g^oAP??W))9X^Q-vm z8oVNtVaJ9EP6;a-y%zJoKCha6;lnS7)3eP_N37buZ}CRopl|Cp@9XKDSzQyf*G^`= z>6+AQVN4Q19G(Kw$`d-?EewjWK0o`{e+J&Lm3gk46~8Rox>)z5(%bE`{@(-uZgHza literal 0 HcmV?d00001 diff --git a/源代码/client/image/21.jpg b/源代码/client/image/21.jpg new file mode 100644 index 0000000000000000000000000000000000000000..00557b37c4e7c13ebcb45b240ba5b07582afa1c3 GIT binary patch literal 520 zcmex=Ms=g{8!#jAdkub3AN4a!3aMk1$j-Ffg(*LL3btSs56a zS=g8a7?>EDnV4C)VRDR2%nU4oLW-;+j>1ZYMWV(gfx(F>jguB_WMlwJAp;gxpkhIg z0nA8dGcqwS3mUR0E>udKc=6%K|F;-;n1Naafhz48s?{UkCKoI$JH}MKa^Aa>k`vcG z2$N)yVd4#ZIB&|+;0 zwvDYfdP)}9+`sJjBj~}qXV*K9#dax`hs>Q`{J<(SYuc{dit`S0*?yl@ZSl>|lrmfE zkn&j8*XfShkx9oS*@_Be8te{SzFn;o=lEx(cA&!(3FDXDmPy68-@Li4baQq@$fB1T ii<$Gba8KCvBYwl;&^fEDSk8UeE33AQW50a*|C<2ZJ)a-| literal 0 HcmV?d00001 diff --git a/源代码/client/image/22.jpg b/源代码/client/image/22.jpg new file mode 100644 index 0000000000000000000000000000000000000000..2ff4934eb0000a7c8605afc646607ef88312d8ec GIT binary patch literal 531 zcmex=Ms=g{8!#jAdkub3AN4a!3aMk1*6TFfcJQLL3btnOT`w z*cb&E7@3)vnK?OOQj9=#EP_Icjv}JLtZc%{hQ=m|ivmMZiW(h!Nb68s94AnIPu~`Rzab}jsI^k@BlS32{H>Z*fYEpzHO_M&&zx28qYV4 zw_D_X`mbC3Yx1X-{{Gn)5~^o+IbBaQ+i_lL6=P!JjRh{8dS!1TueTYO7Ja%sH7l(+ zsrQlqM~2=uewF6z9~pK>GeWNCb==(jYoi}Sy^pb&B2jkV^cn7@^a v&I;68FG$d3-NCS7!|9U>H?(%dEtsqGC}i!l1J$85vMZw{`es+I|9=wzZvvu~ literal 0 HcmV?d00001 diff --git a/源代码/client/image/23.jpg b/源代码/client/image/23.jpg new file mode 100644 index 0000000000000000000000000000000000000000..4219feb6e5b330bb156d4c8b23edd5166c8f91f8 GIT binary patch literal 530 zcmex=Ms=g{8!#jAdkub3AN4a!3aMk1*6QFfcPRLL3btnORtw z*aR4u7@3(EIk;gmj7-c7EP|{;iozmFhK`AalT=Nd1A{|~8z*kO2-MGvY6LJKSOpn? zfx*I#kYEIgFbgYwU=cD5Ok8;I;{RI=JV1R+g3N*p_6*85qwl!weiYZWLPEOs@wy4S zFFoiF+tA|PI(^ECdle7(Ue$d)m1*wR+ZN%-8u3KVzH9o~+!s`*ZwA2 zXxgt+8(x02K_BMbAF?A^B66*_2wDoi<|WfzysLs4&jwI&05osu#NE zfMKUfr^4-mQ=(VhRE}{xK744w$z{h<^1LG>9-q9`IODBs^SbuxH+Ef@uH;XcDy|We uZ8h6{TS$a1*ITy}5$6gF?>ny8RleT+`(LT3t?e}%e!qXy&N=1z|C;~^6RWBK literal 0 HcmV?d00001 diff --git a/源代码/client/image/24.jpg b/源代码/client/image/24.jpg new file mode 100644 index 0000000000000000000000000000000000000000..9e2249017411ee715d4ffb2a3e794e0aa4765818 GIT binary patch literal 530 zcmex=Ms=g{8!#jAdkub3AN4a!3aMk1*6TFoFQY)nJl^m6?G} z0O%DKW@c7Fm;@seGXsmD5UZl0h;g8>sFJFYiK(NrOHgoPVR2*A#7PS`9%N(yszC;f zKrKKMn3xz@kR%wH7zCMx6bmmJe)#zR76T76P@f>PAcH-_#gmeiEo$G6yJ|8u-7UJN zxZAeb?A7g?^I}&iJy|1AoA9AK`0w-CXYy=beQab9nlPn-;RNG@o=Xosb@U&+GwiMi z4*YZ}Xw8Jz8lEdf!gGRdU8zm@Z7tWje~a4;2d{!FjV?><9!TC|OS95Rke)qp#snU( zdCs~`uMTMmdY_Q-@qBf!?#`(qYqKe0cgr_NIV`Vn-|54BYM=ib4UKJ&R~(CGp7})26VZvOGFgo#X!VK?(d?&K?3&;Q>903n#9M*si- literal 0 HcmV?d00001 diff --git a/源代码/client/image/25.jpg b/源代码/client/image/25.jpg new file mode 100644 index 0000000000000000000000000000000000000000..90a4f3d0d0ebcc05292ffeb7227397f7a1fdfdab GIT binary patch literal 515 zcmex=Ms=g{8!#jAdkub3AN4a!3aMk1&)mFfcJQLL3btnb{av zSeXPE7@3)wm|3`CQj9_w z6E7_+a1>McSEJQ7`DLEyJ{jl3vu-}ETl7~W;P+(tT)WWO#kZor>~mGm;9U2*cai0U zIbsux#qyJMAHG}qPXFPIzZ$cmu0>sqI`J*HNuc}9yyOcNp<0_>E*BQsQMlMQHE`j! z*7OPDPq(khZq1zV-NM7;&P}}uth;V7Z)Gzt&3+*l;^laGUW|5xoQu_>1x|*NP7~&M gXNrkQ$4%eC8F%`Z=vMEk;>RC9FDw*_n*aYM0DxMXHUIzs literal 0 HcmV?d00001 diff --git a/源代码/client/image/26.jpg b/源代码/client/image/26.jpg new file mode 100644 index 0000000000000000000000000000000000000000..36b5b236f76937ca56e9a676bd096ef832e1fbad GIT binary patch literal 529 zcmex=Ms=g{8!#jAdkub3AN4a!3aMk1&)oFfcPRLL3btnOWIb zm;@LYnVA_`*g0V`j7-de3@nO5timFWq9(zKg^i2YlnqmgCN11}kP!%A>cBKJ6RRLl zh>@9v87|Jq#K0`5sAM?tqGMp;|62?^%#6UW02*q~pxSh?Fyq#jr4~%g#UDPHp4@x$ z;`OyV|JA(IyHI-U@9gBVt;)fxytd4k;CS%e+6632R23Ku7@kIM+a$8ye%?l@S1CV^ z^-nRnbXSwzL#y{n(fgI>^qwR14b=2y-}j@` x=~LSDoA;u%?lO8#d3QMs=g{8!#jAdkub3AN4a!3aMk1$j*FfuYi+zcgI*;oV^ z7@3)wm|3`CGK@^jf($H*tU_$Uh9Zs=Cn+hLI5`Ifha?s^Ze(O&Ml%7ZlT{FG1UtfH zMxf7`g%uqSvKR&~y!hec|62?^%wR!52789kDBq=DH>VyG*4=hOS|CcjFes_mQsGRR z#_xa9iF50{w(=axv%F;av=Z3iWRSBKV1D?syORn)}d z+U>WuK5;#6w_K-I)pz(*k*9#|sTJEU>b#NX_U61dy}4k^^aEd0V;O|6lqYG}ojZOp z|CDB*Tv3UdcelXot4l<81u$?1Fc+L)U|??*kJ=HCdhq7cUEH0ga?5oLlLV_42)y=T znEvf;kYk{-@QVXIO~tdOR(oy>ey7=|kUGt))7fE1nOecjo&!fy_WqDxYC3D##oS}2 zp_^ok)^B+|TO#YcucqJi?Muau$S$7d9@;p^bN>9wg&MKew`c$R&(O9x_>$6;iRMs=g{8!#jAdkub3AN4a!3aMk1*6SFaiO@(GZfAjfGtR z=o3~(RwjO!3?maW1B;-LA}gD)h@qoVpqP@fiIcNSaAIL`W7DLK2Z2T~!_nK^CQt|8Fty0CfR{1R3lZ0;61(eAd-G)*78VrJ+S^ zb)m9a+s99k+}T_AGOk(5DSVD+M>I3nmv#*^lZwSR54_%zr{{0`x TCR&Cr9{b~iO_m&4|NkZc;d8)7 literal 0 HcmV?d00001 diff --git a/源代码/client/image/29.jpg b/源代码/client/image/29.jpg new file mode 100644 index 0000000000000000000000000000000000000000..c98a9bb2ffec8537d217b46a73c950406da6b3fb GIT binary patch literal 590 zcmex=Ms=g{8!#jAdkub3AN4a!3aMk1$j+FoFQY)nJm9jhTT( zfPs;jnTeT|6DGmP#4O0b!YZUFV(2KUY|^-qO*k+(rKot)A~fv`49rZdf(%SR4RFm2 z42(b#W)@*ZAtl4ai3<;2eE9zs0}nGJFf@S1+B1anMD9DjnbBIPT)KIC5U=aUdY|Jj zjR|4-|>F(4JncWAXcPI9xYKwEmu$DXSZEj&O zS1b2;p`w(-i|v5jMCRfbw1GB7ydMs=g{8!#jAdkub3AN4a!3aMk1!N6FoFQY)nJm1ftiI> zfPs;jiIs_&6DGmP#4O0b!pdgo*r<3=NGVZRM8(KCsBq&UMg}Hkm?AI@&mxn^ZDy4G2eO1w`bjteze{yRy}$uKBBaJ%CxKBmIyKYse5v6OVq7p z#qEbTyss{0Q`&z>H%I5b1LM)QLrquLoV>g~+3n@B1cS2&W=wPUyuR}5n~H^{?G~IT z{%G|l`3Sw8?PEJVu0)k1YKh;6vbhz{cCHhgmZyLAcIVEila_Ad{IF)`r1JYoChLV( v?RpcnTwA$m^)>Ay8@aP@OSeaqpMKMzFvD0q^G(Lm(4hDA1uy-D|K9`v2`H^Y literal 0 HcmV?d00001 diff --git a/源代码/client/image/30.jpg b/源代码/client/image/30.jpg new file mode 100644 index 0000000000000000000000000000000000000000..d34e9bb10b424e0e8c44179143bccc470138b9ab GIT binary patch literal 605 zcmex=Ms=g{8!#jAdkub3AN4a!3aMk1$j-FoFQY)nJm1m6?%A zfPs;jnTd&=gBdEr$iytjz#_z|Xz0i$ETW_wm?$b{;uPGtXk$vzBs3Ek7?_w@1sNF_ zSs0nv;U+UOF)#}%ItESzYEN8v@!|hl3_Q$?!0-SXY|pTIu~`0=Z*z3F+&rpz)U36* z@qXjnCq9kFG3LJnJ>{-$5E4^~p1aA|rn2bM;;82Lh8Ma0mR{X{Eyk+#!6GA1Cdbcm zQ#UYba(XcEHpr}23rrFUuQfcj%jEi%Baf!Uv+3L{da~_Om+Bqfi4GmdtdHcX)SkJ} zcl}SA{n6N+d#{FGoSimx@uLG9Ilb>LRaf~@`zFbqar^qEqG#_f{u!!sD5Y%fInCQs zD&@}FTzD(9_0pxIr}O4aHfXrXs&}AyqOpoQ|J{o3^`5!x2d^{*O_iN5%_0$g_SBNw zHQMnP>Q;L#pE~KuG~>6woji6g5&w2-=cd@n9y`1?n!WIvbWQVy7MqION%<`98+!Yu YKhe4>v-rU@AL}2#S4V|gtp9%#0FSK9ng9R* literal 0 HcmV?d00001 diff --git a/源代码/client/image/31.jpg b/源代码/client/image/31.jpg new file mode 100644 index 0000000000000000000000000000000000000000..091234dbe35a4ebaa14ea8276809c60591361a9d GIT binary patch literal 554 zcmex=Ms=g{8!#jAdkub3AN4a!3aMk1&)oFfcJQLL3btSy-9a z*qH?w7@3)v*_qg3QjAQ@f($IILW*p{N`{V!je!$IOq_#@Cv9Y8U}i)yfPtBXkx3A! zpM{ATrkjC*5$JOkVG%`UC85BB|8Fty0BvOw1e$5jU|3PQ_O`}7qnS?9%v#N;ZzRYZCK4-E_e4VC*=%d>)x?(RBJqspHQor%-W#rp%Z}$nF z0?M!M9d}qO*rRpr?41`W>3k`VSZ_R3-@fA8(*1nLZ{~j$@jJUCbn~@Sg~j|DUUM`X zgdBt~`)W`1c*ZvAzQ-r^%i?SnJ*uu{ literal 0 HcmV?d00001 diff --git a/源代码/client/image/32.jpg b/源代码/client/image/32.jpg new file mode 100644 index 0000000000000000000000000000000000000000..f1c859ad1e4ed3068e953395297f65e01823a4a5 GIT binary patch literal 547 zcmex=Ms=g{8!#jAdkub3AN4a!3aMk1$j-FoFQY)nJm9g^ihA z0O%DKCU$0Cm;@seGXsmD5UU}Zu!y3PV_@OLgJLR1CeALwiN%dglQuFkFr%2lz{JeL zz$nPT1O&`5Lm0p!EQ-v+LV=0@Z!z#NGXledS&+e=VQodumfIeBCKduW7&Wh6Thj9< z+3w3XmecP{H~Hut6}i*i=(VDleTjXCKuKLyi@ceix7O>sHzhdM3v=z%owCobIe9_I z7fBy8zgW-8X%|+lVOaaFNk?t*+AQk@f9Li$-G8OjE1{6_WTOh>`mj%%8Yezep5vLt zH90=GQh3M2nR$^d)9-A0vNdl*gSk*;(cRn3uMOsFyu10Ntaj40+XqX3{<6IMl=a+i z{zWso@9pQ8@OY-vDpBDiT&{0&_^9rwwW8h)EgRf9Hgs_{US1;3^zh!E`}cn&W$^tq LMs=g{8!#jAdkub3AN4a!3aMk1$j+FfcJOLmUkuS=bm@ znV8uHfSzGtW@F-p$uRMs=g{8!#jAdkub3AN4a!3aMk1$j-Ffaol5@2CvV`63( z0Q!Z6nT3rTCd0_Y%)lZj#Hwh>CgPYVtP~hrxJXpl$k@awrKoYzMn({TsRhx@ER3vz z3`|T+jI0P@MxY3@B8!NU;ek-9S_V_+ z*XE}tHVKvat=VtnPu%47mg>8-@OFCPk~=%A0)y5ry)xTdlT~9;5nEGB8OOvsYP;7P RvMs=g{8!#jAdkub3AN4a!3aMk1*6SFfuYi+zcgInOOuF z7@3)wn3;KD5{yjDf($G|tct=)h9ZH%%0?!RPR@yi#f=juZDeF%Vuq=M&_LBJf(%TI zOf0Oda2cQ=gCL8LVxn+h;lzU?N{$yl{=db*!wl3e2sGTDq4%-QiftmdlKF#@lzM8H zvHo4b@znCf{oT(!UZr#w1tqkF?y$AYkQ1(xsu%e&@u<|a=*gF7F1yj%Cc>KMw|BpKBZBmB0$K)zd^Xu1YZH x?<)3l&WI8^DY4LyQ{iY_>*c+c`}cpimgV26Q#^5d{w+DBPhvLh$D{t=1ON(IqSOEY literal 0 HcmV?d00001 diff --git a/源代码/client/image/36.jpg b/源代码/client/image/36.jpg new file mode 100644 index 0000000000000000000000000000000000000000..1951f745f80b9e86d6fb103b2a3d0be6fdf60ce0 GIT binary patch literal 527 zcmex=Ms=g{8!#jAdkub3AN4a!3aMk1*6RFfaol5@2RwWn^L# zU|?isWMSiiOECgn4wMoSRx~tmbSf4RRdRL-E^KU?v}of&Mj${kfq{XEnNg5|iIJI! zg&i)=$i&PbsK_FuWEgnRF>&I;iw{5izs11A3^rJh!JdJ4Q?GdH)+@6mOq`Px-D`Kf z%RXHcmvE$U!9TC9uQyvy`uq9N!bT>xC9;z&F1J0ozdYFWD=$xA>oZ5YXX_#~14L)N z%E__Z#N(yzzVONAUoBftGfmZXVEFs-Nbt&C>;7q!`jjWJL-w_IBEx0|8cO^fq+mE-ek&F$(w@1QvChkxB{qm|w;BtL(*u4PHajDs(qWiQbV-@`>l=_hzf~oK#GzVXyjs696NPr6K?T literal 0 HcmV?d00001 diff --git a/源代码/client/image/37.jpg b/源代码/client/image/37.jpg new file mode 100644 index 0000000000000000000000000000000000000000..976111510ddf0bf9cef2d3d7d0be3ab69e8f2ee2 GIT binary patch literal 530 zcmex=Ms=g{8!#jAdkub3AN4a!3aMk1$j+FoFQY)nJmDm4%H- zfPs;jnTeT=9VWrZz{JcVC?u@NDq?7C5?HkHp<{5$q(v7$qUmN}U;+A%fr*isiIo+m z85l0i41$R)LW+)og%5?5j22$}e~W>K8EB{=P_aFOgx03zy@%8oJLJT+f2=GQY!SNj zf>E3$%RJReu6k;k(tQ5bPy2)4ZFIe{`IPA7%U!0q+tv5`eJy3v2=(au{<yl@qoBG0n zH@2>|X3DGa{JY3TarRuXzU7%R?5i&O-c9<%@6ySw{FeLBVYzIvY0hu61q`1xPT@~c t6LULecB5NvcJ<0Rt>LHsG;P^=q}F?y!v5?0w{DqF{O3~i^x6LZHvyL_qC@}y literal 0 HcmV?d00001 diff --git a/源代码/client/image/38.jpg b/源代码/client/image/38.jpg new file mode 100644 index 0000000000000000000000000000000000000000..91f26d8784c451bd67ea14b63b0fee93057994d1 GIT binary patch literal 540 zcmex=Ms=g{8!#jAdkub3AN4a!3aMk1#YaFfcJQLL3btnOPZG z*q8(u7@3(F*jcz?Qj9=#EP_J9BBF|hj=@TSi!QPnn>Yuh6g5uT_>qwT)eMkYMnMK9 zMkW?kR+tIE&|zj!WDzWUD5Mma_`%R|;=zmmZ!z!ywK54Z3o_U<@Q6kRAA2awaD?x5 z^pBml0%}VB{CyoX>$~N?wr+93@`xKBWtRx(=vXME_nF4|oP1Z6?c6a*Bf7q@?%ZQe3sG7ha>t6JGwaLBH;uq{aI;P%l;ZCv6 z58g6K+RR;VaTVWEwVopq$C?b^%#+?TX|L1jrH?o-ol{AQ*~$8TdE0!MNgkd_cINB< G-vj_#2&pIl literal 0 HcmV?d00001 diff --git a/源代码/client/image/39.jpg b/源代码/client/image/39.jpg new file mode 100644 index 0000000000000000000000000000000000000000..0e3655f1f61fd3315d5b876c976132a8585b1bfa GIT binary patch literal 537 zcmex=Ms=g{8!#jAdkub3AN4a!3aMk1!N5FfuSPLmUku*%(-v znArswm>8LvSeQ9sQj9=VEP|{;!it8DB7uc$qDn@I6AvD`$jHFV2vY;58JSoZ1VLsZ z8_USVz%0lD()<4w0}oIKlOVGogFVBs`|fT38T_|JR22Fi){8Dw`7Cen_S%;Ho5i_n zMdZ|M_T>FMcwA}mx7BC4%Uidcds7fCdCaPB?!T|+Q+Lg)UR-0?q{%i-KpyISk~sem9g)&$n;BV)ymQ)c{`m8VVo4|dH(XH zmXPf$Vwi%x#V#f7=Kh_{Yj&?v&Zt6%X~B=q6Hl_HJ&Tol9%BAJvvALjvL2(HB*QDo z`z(LWTDQ`9?>?uD;CBY!*REU2Sa4EWC4Z;tGk2fl-_EZ>mQ-^;JMO~0)BgWW05-#_ A4gdfE literal 0 HcmV?d00001 diff --git a/源代码/client/image/4.jpg b/源代码/client/image/4.jpg new file mode 100644 index 0000000000000000000000000000000000000000..efcf8d5e34217757164bc8157a53e5ce53c0da3a GIT binary patch literal 531 zcmex=Ms=g{8!#jAdkub3AN4a!3aMk1*sjFoFQY)nJm1ftiU# zfPs-2NU^ZPBp8{P1sPaa6%Bw1q1dhXR|&um$G zH$_0f<%QpYmm5vreYp5DJLUYHz|L|)Yf++m;9bE~DyeQg{PXEz$^^s3kT?@zwedX4Xa zns;GHnaZKq&6)kF*XMFNiLDeq$FF&RdDPWA&onD%S1)Sv&e<_f>HZ3#VEJ?UH~(DB tT4BAgk-cNr(Mp}xt#5k|ud#mlsX<|evHFy6CPAxK>ep9%S-#}|O#mqWsKx*Q literal 0 HcmV?d00001 diff --git a/源代码/client/image/40.jpg b/源代码/client/image/40.jpg new file mode 100644 index 0000000000000000000000000000000000000000..1d8280d5a384b7b52ae6919e6cf344e34946805f GIT binary patch literal 525 zcmex=Ms=g{8!#jAdkub3AN4a!3aMk1*sgFfuSPLmUku*%(-v zSl9&^7@3(_7+K&_j7-de3@ofd!itU}N``@nMuig@8JHQ7bppN5!XOAV4k&>TXJlev z7BplLcKm;ffd?qXBnULfp5fGW-u&90?VLGVUd;+>o_wgMf7hCF$((a85tfrO%~d@; z+;06n<8CP1<=)7Ae5--Vrj!>7^W1B%+mu-D+WTScUH7>Cr^AbF&vN}K-Ml%n`ud5x zdzi&?H0=5nkD6`rc%Y`lE4J*y!=sTu8K&3x$35bjy4owPj{oLDQ{7kM3{x&0-7;g@ zWwm40(pjG#rfdrmnyzxDZ`WG$;u+tK-o~z$nzUtMkcVer$YReK-v#Qox(2oH-RG1U od}F8OG$W5l=1kvhJGqN}`s{4~GlaM;^>W{^FQ>#|_vHUK0d@(W+5i9m literal 0 HcmV?d00001 diff --git a/源代码/client/image/41.jpg b/源代码/client/image/41.jpg new file mode 100644 index 0000000000000000000000000000000000000000..9123956d77927387db0f33545b8fd8e0557fc972 GIT binary patch literal 528 zcmex=Ms=g{8!#jAdkub3AN4a!3aMk1%92FaiO@(GZf2m4Qis zfsvV+nT3fNCc((W%)%fjB&=x2%H|j-k|?VDfsuh3MITTLPzeJgD~dQH0~52L5R0&) z(f?ZvJU|^xg3N*p_6*M#8S>TCiX6?3+#=I;^3LQX^-EZDm_qT z87y>Y*)HEL_f%pD>jbaucXIz`X@)L}~TlcM~&APHvesjr;V+o<_|K9`vU`VFQ literal 0 HcmV?d00001 diff --git a/源代码/client/image/42.jpg b/源代码/client/image/42.jpg new file mode 100644 index 0000000000000000000000000000000000000000..c17ea64b51b2a869b740f27eb5dd15f8772a7d3e GIT binary patch literal 529 zcmex=Ms=g{8!#jAdkub3AN4a!3aMk1*siFoFQY)nJm1ft86x zfPs;jnT3&=6(+;T#4O0bBE%}JXz0i$lBlF?6j(Tsk%1W|4>5p|nT0`+fr%N#NJfx| zkT8qU|62?^Kn+ZSK%?v#UOR8wv~RPM>uRpj#ow8(rN;iLw?B13O4&f|+?^RdbNUS` zKR)Zr^t)%AUiY*iawqR%hL)6iLmS7BCN);i-u-*Dz39BwY*@8O9#E~g3w>a@9*-2bvP zVtTm9uhMO6-Uj^$)++qRsqdydkE6fqTYpj<|8Hs8OF?^{TBi6H_a|?5%32)zlY>LI q-*vKhcBkLc493D~SFU-pm$}Qh$JGQ%ty=oB?sVXk<%*X7Zvp@#3Zysy literal 0 HcmV?d00001 diff --git a/源代码/client/image/43.jpg b/源代码/client/image/43.jpg new file mode 100644 index 0000000000000000000000000000000000000000..2270b56fc19a9e39e030cbd2d3445e038cd16357 GIT binary patch literal 520 zcmex=Ms=g{8!#jAdkub3AN4a!3aMk1!N6FoFQY)nJm9je(g( zfPsmTnVE%&879NXBnT815>{k&3`{gC6g6y|$jAVfg=lADW?>X$U;+XLcDR9zObpD5 zhAcvYB1(>d8$bTP#lQp9#w5rr$Y9U#DgN*=TXn&yp?U_YGovE@cG+$WNm0t%BAWd1 zgZuuHvw!1T4$KW)a^y(8^?!z~3bAv)OLi8YTldv9CM#;g8Ds70pjlIA2zlE5XAoMv zEHPQIzC`!%wuGIR*{|;sTVcg*{rGNWQnXyenu_i>Z7*OY+TwJ16d0Z}ORXN#VNH6}h4V3*B1I^LsciobjK*b9dr( k#op5i+%88CsQ1hK`+GrjbuhHibm|;Ecjo_10N<6NZU6uP literal 0 HcmV?d00001 diff --git a/源代码/client/image/44.jpg b/源代码/client/image/44.jpg new file mode 100644 index 0000000000000000000000000000000000000000..cca42086cc452f6146e842c39c0fd21843658c35 GIT binary patch literal 514 zcmex=Ms=g{8!#jAdkub3AN4a!3aMk1!N5FaiO@(GZfAfrU+g zfsq*mSYZ;3Ow57|EJCcpilT;&iH!@50t+X8WMp7shA9Bk%q+kV5M*FtVq`&*VPs-p z7Gx1pG!%ARxbfltTMRtRK%Ig>1ML~k{GGeseRF|Pz}6+FCx5NEnB}`l{$}W@=1DBM zfB(K*-tgj@8_SeW1q$=)O^>gTv}~R}^Sw#Q<&dx1f@jih*O+QEPV)RQH*IQi&Xzmu zlKLWBJk&eBzIVKQOG54L*@Id)o~wvT_BX$FxK#D(+V)$`%pcrj7?T;V%Lm?WpXJw` zI_Y@wq40@+D;72`~MdB0f^GhxGw ej1OBM{{0gm8tS;~+m3g2PlY18g-_1^e-i+7l%)y) literal 0 HcmV?d00001 diff --git a/源代码/client/image/45.jpg b/源代码/client/image/45.jpg new file mode 100644 index 0000000000000000000000000000000000000000..318c5072bf1e128092683423b47e9ba55d0662f2 GIT binary patch literal 526 zcmex=Ms=g{8!#jAdkub3AN4a!3aMk1&)lFfcPRLL3bxnORxb z1Q-~Zfq;<{Cd0_YEXcqj#Hwg0>{uuwsuY;mIC0~_i;U>H8JSs_SOpoFK!6#h85k}M z%z{EJhKh-fg&+RkV&GwB1O^1qM0{&{QW>&%({n}a2N z{4*ZE-|MznpT)9Cz@;zD{rJQc~qKb zyKLFrlpAVQ70pwsZ@>TgH$*F$yYj42+=+P$j!Zn!6oSXYJwH*H#6FSxVS0t0`Mo*LAn%`C2CZ_`ObY2TXY%zwmya nnOJsOYgYMs=g{8!#jAdkub3AN4a!3aMk1!N7FfuSPLmUkuSs7TE znArpv7@2{9i5(`z$iytjz``n|Xy_O?QP@aCR5@tj#)piI49tu$B_Nsw7zRLvOiYZd zKsgv-WMW_zWC7|eOuYF276T7Z50fBJnLWeWq;J*_Zt+E^W;_0B58pjs)+X%1J1dsQ zmweQGKC{=GXobAei4Qh@#WbVQ_QeFB*OOPz4c_y8-LI6DuUMzgn4P<74qK4t@6K!c z{+a6N#_RiYG1o2c7ZHsp4QD&bn!Cu;XVPM0_9dZJd|N|xZ|!w4TD6gTPVFbl{$s5- zw>;RHs(N{c*5i5A_1TJTDJv{rMQ2%s8mM{x?c2iZb+zjGS|@$y^Cy{aurU`t=)aTn kHF}NoHWyayyWigaoW-=%%l5nU?CNrjX-VEPGymTN09E>&L;wH) literal 0 HcmV?d00001 diff --git a/源代码/client/image/47.jpg b/源代码/client/image/47.jpg new file mode 100644 index 0000000000000000000000000000000000000000..54d9bd179daa158b50d2737b14011398b1062d2c GIT binary patch literal 556 zcmex=Ms=g{8!#jAdkub3AN4a!3aMk1*shFaiO@(GZfEiGfXk zfsvV+nTeGZCc((W%)-DbD5Pj8EW##cRM@EOlsNGqP$M&nUM8SE7C{CkCMIT>P7uw= zB*?5NBpmqv76T7Z1CS@kV9zl7=(P~dM>d7Bx=W{Zuo-7r>Mogks;FFT<;?Q*ob&#& z`vev?-rTyY?(vInf2DRB<-UpUuNSef(#b3?Uj9-cZyv{w^PiV^^DOM^igJoND8=M9 zN3LvL#nF>{XK!0HtuN?ev#MPjD+0$?N+kNQ`M?5mUPt3R_ z_CU(v(6Ix2eq|>`L^j4Ms=g{8!#jAdkub3AN4a!3aMk1*shFfcPh+zcZbnOOuF z7@3)wnAurjQjAQ@EDWrILW*o6hQgvs%0`KeVvd1H6Bjaq08A&C1}YU~WMD!u703tb zHT-{zfd?qgB*-ktV9&7m++F#7<+^}M^{GG95 zS;$Ali7iXDyvjdSP1^X!#3-#c?L$k)tAg8tlYVzO1sTfMbA@=mFnoVK>jLY8La7?F zqjoF!c$Zi&)qERu=V#@)0t4G$$#tdcs?M%cOM4Q#uuygr%h%g+F3Z`Rc~pLsE)giY zRQ2k2omR**&gR}XYWbRL)?^CaiQ4v7`t?f9{|v@nYb%yadttOGu(Gv2v;OAhUeQM%*B_D3L*6f$r2_j7OhAUH~xPU0A1$2fdBvi literal 0 HcmV?d00001 diff --git a/源代码/client/image/49.jpg b/源代码/client/image/49.jpg new file mode 100644 index 0000000000000000000000000000000000000000..a234e4fb6a32a2fc2c322210dcccb4460798369d GIT binary patch literal 525 zcmex=Ms=g{8!#jAdkub3AN4a!3aMk1!N4FfcPRLL3btnORsF z*aR4u7+DxtSlD4Qj7-c7EUbcTLW+jMqRJ{FVn&XM7cVh_089ypW(H~#WMp7sVq!*! zGcpM>Fe@6e2u-~B{}uxeP=-m6S&+e=K`dF{cA7)9)3p<;dE9;Tg=J@4nLBCsJ6|=6 zrtd3_qKo?eU6X&-e&od3xqc1rB(`7Pzi6uD&!$uEp*oI#N|#=LbUayLR{X2Nk856N z^haJ!D&Bl2ZOz-I)oz~Y9(V2J6g+eo<^5j#UNJ+(e~#hfiKUNS?(X}i@H*^;S=B3+ zIPb&rD`cK&D;7@@KHR@!mNARXx(S<^Uusw>1lhSxxhNN0zWDy_?XOlzUGcHpeac)h sv^%ljrpD)OMkjlAxq3dWz=>Px# literal 0 HcmV?d00001 diff --git a/源代码/client/image/5.jpg b/源代码/client/image/5.jpg new file mode 100644 index 0000000000000000000000000000000000000000..cf31c449282c8872e6803fb4d414a4d45cda8230 GIT binary patch literal 539 zcmex=Ms=g{8!#jAdkub3AN4a!3aMk1*sjFfuSRLL3bt*%+8v zSp*muSeaPZn3!QQj7-cdf()#RhK`ABLc&TD7a9c?HEv`?*UZGg2vo<&z{Jc5l!E~f zpG8nevGD&b1|FboOoGgU4E7AGu4iZcoEW0y9`Hb*?gNLJm0!Gk=?xp3KAW|n*Hj(u znf|H0YNJ-(n)i4?6FXnQM5{xwW*Qf7Prddjy6I@q%R^j^yC*9(1x-(2klDZUv3GdH zxq^qkW#3J6?3j1+=9ZjArxq;aU@)+Cn428)&+f(D+==CW77DAZ4dzsRaGr7Jm|?o1 z;EY-@j!wAJzZA2>_M{ BrN;mO literal 0 HcmV?d00001 diff --git a/源代码/client/image/50.jpg b/源代码/client/image/50.jpg new file mode 100644 index 0000000000000000000000000000000000000000..6efa7217e8da251bf31a0065917c724f83c7907b GIT binary patch literal 464 zcmex=Ms=g{8!#jAdkub3AN4a!3aMk1*siFfcJQLL3bxS(#Ya z*aaAv7@3(^nOR{{j7-c7EP_Ictipy97b*t^C2lVbGDqcgYE!&qI50qcktL`(`fBL1Epi2Tr-_9~)Uf29XWZm4hzK1CpS9)A0 z`58ETJF5Fs{rFjveI=#yCTe@P#wdR|_qEDsks?RM31z9DEew3d+w<;w`MMg a_d=hsj7#1QmCE0tQW|T$8FlRc-vj`DMs=g{8!#jAdkub3AN4a!3aMk1&)lFfcPRLL3btnORsF z7zG%Z7@3)wSlF1MQjAQ@3@n1ILW;tMN{)evY@#MkL4^x99%Mw<&d9{Vz%0lBRL%s% zFu=$J6l5_JQgm$m@c$MA4>Kb$Ab`s38Is<;dMEv^NAO6pz|qUD+j=$|y6AX|*iS2} z%{Zp(ziQ?6?Xjn#UnnUS_Ho{_eE!4qglBA3nc(hut($&$NIP~`S}OlFxqJFlp3-)I zCePCz{sndy-_@^qyj^M*bJH3BBE53U7p3dA%4XibU&x((d;jcPx6jIW@!l!)=*{Ki zTT|U6P$d<$;%>vOdsB{y1x??mwNsggljZUJ#5*Cc99ku(%srVDqrXy@*~IBy^s5W6 zyQ|Ze$DEaR;Ms=g{8!#jAdkub3AN4a!3aMk1&)nFfuSRLL3bxnORub z1b|*)VP@iGg~I|LqQXjMu7RP2r7e>;9lWS)j6hQa85x*R z&1Pg0RCE;je~WNGx z`R3_8wG(fqt|QCMMnJFy1~@-;G*-vKTmj@z4B7^ov}do(j?Cdv1V_# zr>^l1pRvYZ`<8N!D6dH~CkL!~y5v8DXwk$=`aiA|8Cz!0j=tP<=W5)V$|u^7q-U+Z z+HccZ<0|2N>+W`~J5v_?=#OXG?NVTIxJ8lU{{Nc* DE%le2 literal 0 HcmV?d00001 diff --git a/源代码/client/image/53.jpg b/源代码/client/image/53.jpg new file mode 100644 index 0000000000000000000000000000000000000000..084a2a5ec318ba28bb72ad867fbaa290cad8f2be GIT binary patch literal 571 zcmex=Ms=g{8!#jAdkub3AN4a!3aMk1!N6FfcPRLL3bxnV4A^ z1sE8anVDFaIbkx4Kv4!(K{iDpVZ%UCr9=_6g|LL}IjP0)PWaa9fY!9> z*;fkU3)^OQz4;=-7Jh76#Wb7cr{?fX?%mCIb8oO@aSE9i$DFan?Gx-$gkS&%_laj-7LQ++HmO}TV0>b iqkB3Y%u#iCY_sJMs=g{8!#jAdkub3AN4a!3aMk1(V#FfuYSFhg7oCfOO7 znOIl_7?>DY7@61@S)o#lOw0@{tb#(qifkgH%7%eT#)*YR#X!AiKoCRZ|1Aa{W=5dL znFSf_8NL?$SQB|LIdY@L_q5H8Gv{40)A7mjR9SaYG+ce4^(zcpSCM|QK?*`z192mn`0Qx@C&Yg+>?3h zkmIdKaawyLcF)hRzSq|N{^Pob_jVjhx^yc%#?HiOp~6p%ef!t42dBKAZQvn)$w}0v zV_x3j_@_=Kd=@Jo`iSYqrG$x@{bp^jU$S+Qui!^}LoE@BmyCJN&iC3{UM(owwX<<; UDpSQt4F|^dt1MST+5g`J086c&{Qv*} literal 0 HcmV?d00001 diff --git a/源代码/client/image/55.jpg b/源代码/client/image/55.jpg new file mode 100644 index 0000000000000000000000000000000000000000..67e22594dbb97c952094da6ecfbad769652dbba4 GIT binary patch literal 567 zcmex=Ms=g{8!#jAdkub3AN4a!3aMk1!N5FfuSRLL3bt*%(;a zSp*munL&Vs87jrd#LU9LD##{esOVUzWE3c@V%C_LJP}XMLYCeX% zi+R&#?swlt zaj0{88DEfHyv+K?F`IndLiMQc8wx*0g-?uKv_?5IqvLWoXOP(Plr2q5bT>H#HqI%1 zZu`lm=EAFsx#u+Bvg%&v2)Zt^(mh{g`}L#gA#T3Sx3xa*o^Yx-b@y$_i))TeH08CB z(G03}b-oh%mbs_=Z>Z;vmtQTv^0;&Typy!p{@p9fpnlQGQzQ=Fs<`^@%39sROd%(+ hWmBeX*$}j5VgrLD`xigMs=g{8!#jAdkub3AN4a!3aMk1$j)FfcPRLL3bxS=m_F z1%O^*VPR(BhRHB8F*C5R3bF|)8VWlGiYXZ_6cKd_O)PAjIA!A{Mh2iPG5~TJSp^xG zfB;E?k%>W&Sy9L^@!*I5w-|Vsf!YL_1sUuauKOIG^7D++o!6~L&aBOPzqC3lh%I*Q z`Sr()z9q%q6%y= zu-qun(eaXb@V-vo`nAj}ZqYZwUuWD&nOJmfX4G=e2WhtopR7vc4yw@nIC;j3THW*C zN?KN}+x*(?*Ms=g{8!#jAdkub3AN4a!3aMk1!N5FfuSRLL3bt*%(+@ z*##IFnVFeb*qE51QjAQ@fQYX*r9? z8ovt@mE0L+_>W&WUQ?2v8a6N=3Op@H&$7?gzwgRW2S3(N$f{R^3}r9$+@$qdpcd%+VaN3Sf=s} zv+ch0z|*`MpHBDPkJQcT44QINegDAmh?0d_mY@Rmier1D}iD|8D{SR4}(6 literal 0 HcmV?d00001 diff --git a/源代码/client/image/58.jpg b/源代码/client/image/58.jpg new file mode 100644 index 0000000000000000000000000000000000000000..d2916f416ef11301c958eb1307c1c601cbd577f8 GIT binary patch literal 570 zcmex=Ms=g{8!#jAdkub3AN4a!3aMk1&)oFfcPRLL3bxS=m_F z1%O^*WoBaLgvl^6F*C5R3L3HrDLMw46iyTt5mhn@N-WyQ2m&xwAexzpfmM(J7!WM% z2w_Gh20>;;!;M11N{t6Ee*Axnfrpt97#7Te4E7ASmuZ%0?o!|5Z}93KpC(seP{ZCv zhFpt{ug|{ct>a$u{^9lPzweT-sc)IzGVkxLe|kozPhH@f5cB5ri>wVySGeL8FFc66 z{VBe0uHkvfK3Sn-C$I2qzJ8=8Tq}9kTWjx=7w;A>yW?`G?ONGdm#II6vy=YSp6FOn zz9M!`SzL&Z*R}&*b8gjcdwWOihrih4YeLS8jPwKdJ$Nh5+swb|yr)uMm(^9{pv>ua z3Z^df=2W`x@!V4F@%~4WTy>NA*;&4HM1&qXG<)yo`iSQNj-NKGegAHFnC0g5sJ^(C nzmi$5kxT6k+`Hi2=(6Iend}?Om-9Yyvj}F)VOqLk<^P)iby~lO literal 0 HcmV?d00001 diff --git a/源代码/client/image/59.jpg b/源代码/client/image/59.jpg new file mode 100644 index 0000000000000000000000000000000000000000..ba972df442199109d4e69f0314ac30024d921c31 GIT binary patch literal 568 zcmex=Ms=g{8!#jAdkub3AN4a!3aMk1!N5FfcPh+zcbx*jWV_ z7@3)wnOIq2QjAQ@f($IILW+iL!XiqJiH)LSM#c*dG6FTjlz_DZ)iJONG5|>?Acg@( zCI)6fpkBwoNgw{-V&DPV$Rr3f(4OI%giq>mzX;z=L7#43z2o#{#f&SZ!f*JEKYCxU znCE+9aQMHK(6tmAdslIWRNpT<;W>*c)3fTYS9}yX{i7pn|8mUz6E0 z&M%KNV;=1a*(LtfoXO!2vv%{p{|wn;T_tNLOj_gi$LFec<&+rFbDCnUV%yKI<=MPQ hY|^9&lY9=|v$^v-`+~cgI5?KdS$K69DrXyQTmD literal 0 HcmV?d00001 diff --git a/源代码/client/image/6.jpg b/源代码/client/image/6.jpg new file mode 100644 index 0000000000000000000000000000000000000000..34ec3cd93900ac538f6ba4528f335de59cb7bb16 GIT binary patch literal 538 zcmex=Ms=g{8!#jAdkub3AN4a!3aMk1!N4FoFQY)nJm1frXh> zfPs;jiG_uY879HV%p%CZ#H#3+$R=dCP*};RuyLYsU=bq&GqPTwY9^pUuqYE;F9Rdc z*UT(J!is_aZ!z!ybpW}74E799TOa1e8*TL#+UtFw`_BW{n=fr`ZC@uod{X>0Yu!dI z-pBFJ_a+{?Qqa%ysLS-vwobMrmNdt|jp~p37k4KeE%~GVZhi2KqT7#ROJ<&M+jr%k ze)s3gKE~gIzHLmovG5(=*~O`1p{zO^nAwjAugSiC`Cjj(c?!Wo`87 zr^4@|Ms=g{8!#jAdkub3AN4a!3aMk1&)mFfcPRLL3btS=rbb zm<51dVPRor<%G#FGBGo-2r9C&2^k7II*BNm1Qr^ZnmM~PHcdRp2m&yLAexzpg;kIN zsDp_aAEWWAOof*Re!cPj zd6t9GwGh6x-zE1JX$J)Q-@9<>{^5$!_I6v7pI*<;i5KkI-|Ca1`pECptJy;Dbu5nr z?DATX8C4{B;LH`{qH5;jFYA@#zO#l&9o(QJTJ$>DXQzQo#tPj_yh5I0OWQZ)>DNAF z)0pXh=hHPgURl#uF@BFe)~w+y+^o`;%Hel%<1~Zkax+sHjxvR8DwVbJSg?0>Rb^4D z>&_O-89%!7d^X;E<93!BKeO-jIq-Z*eCpG! lMh6~lahf!BrBx88YV7OFdtc^0DwHyjtK_+5=o<3>CIIEvx#|D_ literal 0 HcmV?d00001 diff --git a/源代码/client/image/61.jpg b/源代码/client/image/61.jpg new file mode 100644 index 0000000000000000000000000000000000000000..ef20698b558a7116ebc19bbc2afef07b010f249d GIT binary patch literal 558 zcmex=Ms=g{8!#jAdkub3AN4a!3aMk1!N4FfcJQLL3btS=kv_ z*q8-?eqm){Vq}F$F)|4zD+Y1sUuabQ8oXzj?CUUZPj!G+|GJ%8I;@S9u*ee}8q~ zh>U-0((@-(`{VDP)*1I$8BJC$4q}|U>C=h%J*ltT@(WAD{_3pN%L+A{amQCK_0_qw zJpRYiElVyQs@k#rboDRk->-~swy!ALDi&F`YE^5rX2Y}wyE!tGH{8`bfA}l+4bu!` zzUK936;$-%Sjvq5?O|Ms=g{8!#jAdkub3AN4a!3aMk1$j*FfcPRGD2JpAz9g( zS=a;^7+9HD8JT%uGK@^jtbzy_aRe6V%Sio!avFp7-msl_{+b2f}BiGMZ26Y510M|4?>~+3i+6iQKD2 zL09z7&JN%&QIYpZ&N(RUnqc)x=j!Kp*8R(@iao#0`1M8NLVj#&)Y=1FGkX{$Q$868 zsLr^b`7h+#?3HEDYHVhP=1)0xW8vC$a)qTTys}kqAA5XW{i!}{y}Q3buHE^Hv&BMx zpK|k?ELtY%X)Mdi^x)CL1CP`+as{^(ZuovSPa<)bZQ%a?mb|)Gb1w#eICW+E9QBB8 uPi2qJHJ$ZN$m+y$ju~7D22++cr`>ZYoAAfiPh-){)$tP3+l4m&zX<@Ms=g{8!#jAdkub3AN4a!3aMk1&)oFfcPh+zcbx*jWV_ z7@3)wnONAEp@NJ|%z_LoLac0tib^7)j)}rzM#d(Mfg2ApGBBa)XJTexWMLHq5{%5O zFe4clK*si!>eb?Z&ppy(fRgyx8dpT zITe?{ZDnL zZcv%TBGRB1RPp-#AEi+C^hs+qmkKRfoHohdZ|}QeQ@f>yD=mb!xaCAG;O-X5oog8` z-n(hS5f49CcOH($Gon?6BI`=#ZiwOf9NNHs`Qdf;ziX;A9w#r}6XW_}<%O+xPqlBq tcj?xaAl>!13wbs+a(jAuc&a7L?E5i4YhIwM$KwN&%QJ3WxI6v-O#slby$S#T literal 0 HcmV?d00001 diff --git a/源代码/client/image/64.jpg b/源代码/client/image/64.jpg new file mode 100644 index 0000000000000000000000000000000000000000..09ca67b733386769e61136899e4e65f491483801 GIT binary patch literal 585 zcmex=Ms=g{8!#jAdkub3AN4a!3aMk1$j*FfcJQLL3bt+1MGF zSy=>teqm)|V&jHMF)}eTum}n%vKq2E3X3Q?1r~~m85x_HCMFk6+{g$5FqI&hnT3f} zkb#kfiIEi{%m}nfP|=V@$T9KY#s9Y$cz_l&2{H>Z*fU)HqBm)u?8L&Kr3;R3s^(&e(BOZ_T;xC)-xUsrGPpF!yzkK($@efJJo zMrayW)a7{|lZ!4Edb~KLRgpW$DTp)l?wZTnpZ5M_z2h-arLaVJ?(*!+`u{fp6L+@% literal 0 HcmV?d00001 diff --git a/源代码/client/image/65.jpg b/源代码/client/image/65.jpg new file mode 100644 index 0000000000000000000000000000000000000000..3abeb62f5f24e50b5406f96b4e0ea509e50ad75d GIT binary patch literal 572 zcmex=Ms=g{8!#jAdkub3AN4a!3aMk1!N7FfcPRGD2JpAz9hk zm{|lE7@0wU6(+;T#4O0b!YZU_$mW0}oIalOWJMdxp&BFv&ZrJ1wrs)Tnw!1o%vvdunNbg~E~V zALGte*ww0CpJ%%9NL^_2#vS`yH+bvCww&IrbXHq>0rQ?e#UIReD*9(F+EeKtHbM-v4H9hweaDyPglzJb_~dzK+V%aFzhBk5s-0%?$ZC1aduNe-Q{o=k or>jJB4#_x$aH(>7vP?AcyL|rL@{&ORUar{LJ5KF#_5Xhp0327kr~m)} literal 0 HcmV?d00001 diff --git a/源代码/client/image/66.jpg b/源代码/client/image/66.jpg new file mode 100644 index 0000000000000000000000000000000000000000..ea9d8c9e34e000e5b5b276e4f31fbaed75d79dca GIT binary patch literal 577 zcmex=Ms=g{8!#jAdkub3AN4a!3aMk1$j*FfcJQGD2JpA=#N( z*%(;_fSzGtVP@roNii}pGqA7<3JEJZvKa=7C^;oA6a~61sIh7CMMef@6eECU0+li_ zvM@2S!t^sRFam`Ig%w$Z3>O}}`2Q9I4^R`6AhRHYJ;Szz)v~9U`Pa?XdvsyVcEc%m zR^1KFtNHn|I#+H%#+YG^{nI$DvZg@hS_I3twZ9UsU;22fq@8ztv$&zb&ca}x zT@E29xsPyd_+D7ayS2y0sk_tmwbS2aCl#|-=<3{B;p<`dddkWIX0M(c_s1&jm);*de~s&h58jU3`|Slc1$uTm zF5dK=$K=wS!~?%)t~%y5$zOW1rBj9*c-obiHZm$0Sn*ac!yWIc) literal 0 HcmV?d00001 diff --git a/源代码/client/image/67.jpg b/源代码/client/image/67.jpg new file mode 100644 index 0000000000000000000000000000000000000000..0c63b54ba73aa4431e811799ee9568ec5a66c5a4 GIT binary patch literal 584 zcmex=Ms=g{8!#jAdkub3AN4a!3aMk1*6QFfcPh+zcgISlO5b zfIeYnWoF}t$pE;Bp8_(m<5FtSqvBczs0}{qxDHQUR>|Wg`?0!OWQzxD(}E=@Crw&aHhHQ=^+S{1 z>yu|~o>_UabMEpB?c%QLOI%C7%{cW@Uu0#v!Md;wtpcyvPHpb_z;7V4LM12>%&f=A7SjbkL_l3UNSFdvva@>iP=s701O|m(T?Us(|-XMWn zH*c7F_Ms=g{8!#jAdkub3AN4a!3aMk1*6QFfaol5@2CvV_;?% zU|?ckVP;|FWrRvGGBGf-2(k((vKcxiiYkRnz9^z>T^;@KX=tfQyQ`C4-v0e-7~9^miK=rin{KqC zZMvr5pWCx#cCXKKQ+&jp_DcQ9%{k5C0e5FDUzBw--`{WT977%vAsx0iM|z7LZRMSB zJSlfRB=$z@ma9hU&t+#?_sI#o6UN#OndCh~-=g`l_YrnE= z<)n(g9}G3wCfXWlx{}r5?26ZU`+0AFy?f5=K(Ould-gXrFFYpn=hr*=kOhptue^x1 x4)*vlL+F(XcN(MUUB(^vxU*k<{!^&DM58*T?@PrIkrcmN1Dj*4O!fb70sy=QyHfxF literal 0 HcmV?d00001 diff --git a/源代码/client/image/69.jpg b/源代码/client/image/69.jpg new file mode 100644 index 0000000000000000000000000000000000000000..25d19f78c3e970c52206dfca4b2468b76047610e GIT binary patch literal 584 zcmex=Ms=g{8!#jAdkub3AN4a!3aMk1*6QFfcJQLL3btnb{av zSlI;_7@3)vSlRetQjAQ@fXOR{308l^ZxFCHnYU* z+_~4hwa3@qu8l4-y_+Li8vOdP>8U4$ViRI}RCnCCu_)iX&m=YgHeO00oRVk zJZ0nP^6i7Xy{fy3uHGK6HwUApvgsvT%zK|I?Y@UI|84EDEvtfymFE~sGRvoO z*UFaeb~U)2xb0dadxq#WE{{{}6_>6XJgU?ED*Su7*K?ColJh+bE~Gcr|GxMs=g{8!#jAdkub3AN4a!3aMk1&)nFfuSRLL3btSs7T^ zm<1RZnVDEvSXp5*j0{Z7EP|{`fd>^06C2rtgcoj9R&x%T2-1zBoq>@RsE~mP1ejsE zfdRuT$iO0`Xy~XE`0@WO1|FcDOoBi$dxoW~rq&+l@OSOn{ZG`czh3(7-DXi^5AFF1m7fidn7m+&ofWmwS9H_&pHoC9ChI)< z7hl(!)@K!!*cNJinf0w?%;V$R1wRD5e9^mM*1_u7J?qckPrk{t?7h;GJs|Jm&Ifj9zr8E=D~kP0O39ob6K5Uy&mb-;DEDUKdRAtkFMB*TmiIa9 jq;ss{ow`Kq-?eW$erTAAMEDxc+-W|CcbZP^^Zz#iM8~6j literal 0 HcmV?d00001 diff --git a/源代码/client/image/70.jpg b/源代码/client/image/70.jpg new file mode 100644 index 0000000000000000000000000000000000000000..7d6190c253d4eeb71a3bab28485773fb892531b0 GIT binary patch literal 573 zcmex=Ms=g{8!#jAdkub3AN4a!3aMk1&)nFfaol5@2CvV`63( zU|?ckVPR%xWrRvGGBGf-2(k((DzOjlaJwX+C1G7AYSE}Z!P76T76BQPYG1sUuaa@~6u9DezXE2@++?BSHgYS9f$zjD=Y z8N{hAu?&rB?Ym$uJzM_z`iSXA?oMuf`DtVHuIA)3ad{J-cN+YXwBU6)Su#o0;N)Ia z4dsHpizF_2_ue$?dE;nyBssKCVZn;DB@^y@b~Ws5PBXjq?N#p6dXDzq+>j_w=Z-M5 zGYh%iTCdOFJw4vOLfZc6%(o&XFT9xVw@F=P?00!#a>q94MoL%tG{pY@bvL}1@b@s<0HmzPN`hvehgP>*; n!^8Dc8_l0y_kZ8EF|fL`EH!-5e+D*%#jeJAY)ajn|8D{Szc;qE literal 0 HcmV?d00001 diff --git a/源代码/client/image/71.jpg b/源代码/client/image/71.jpg new file mode 100644 index 0000000000000000000000000000000000000000..641240cf64aef8201a5f2e3a76e23ad44f8765cf GIT binary patch literal 468 zcmex=Ms=g{8!#jAdkub3AN4a!3aMk1%92FfcPRLL3bx8JU?_ z1Q>uMGYcmxOoj<4z#=H5cu80!B#~7~H8`nh;^ZZ!PQ@EHF#-Wh8H8qJ6+{!yrzR|(xoUBD&1_Ca;jd0VEq+w4+sgc_$G*$| bhQ{*Ur;qu*kP6%|y=V3XlhukE|8D{SAM}nh literal 0 HcmV?d00001 diff --git a/源代码/client/image/72.jpg b/源代码/client/image/72.jpg new file mode 100644 index 0000000000000000000000000000000000000000..96edb9126eaae5df33ea2f3b15421b6c1ed05225 GIT binary patch literal 405 zcmex=Ms=g{8!#jAdkub3AN4a!3aMk1(V$FfcPRLL3bt8JU8K@SXp5*j7)+IiiXTW!p2IDfsK=lf|3d+G6Dfi9zrv*3StNf3K{;t#lXW1 zG*OUQkinkeN%(}83GP+Lr!>26{CZhIe6L(+Xyp{?iEc+L)Al5}E;f^~jW`-(>+w%s zrrR!Kxxs9+%bk}W)*k;ZaAHaHrS^iOH5zMgZcV6;`|;_m+|4Y`MdB)#z06Nu`77UN PvakL7lq1XK|K9`v&3$a| literal 0 HcmV?d00001 diff --git a/源代码/client/image/73.JPG b/源代码/client/image/73.JPG new file mode 100644 index 0000000000000000000000000000000000000000..63ccfcb2895222225f9ecbee822513766dc91694 GIT binary patch literal 931 zcmex=Hq-)3-T;9z58XJh4H zXJ_Z+|EI`$@KzRlhK~^C}Lq|5@z(jVX zLJ_0Ji3>TDoi-j64Z8S2#W<;`iIYoATtZSxRZU$(Q_IBE%-q7#%Gt%$&E3P(D>x)H zEIcAIDmf)JEj=SMtGJ}Jth}PKs=1}Lt-YhOYtrN?Q>RUzF>}_U#Y>hhTfSoDs!f}> zY~8kf$Ie}c4j(ys?D&b3r!HN-a`oEv8#iw~eDwIq(`V0LynOZX)8{W=zkUDl^B2fp zj10^WZ^3kup-7Ki62q;4&!2wHyRl*mV{h4g`M32i)Ru0a zckT7zOK~w-lj<|yOuf>*wr`2>r&Z4z%K8ld8h$#p<>i&4=&0NAk(w(1!fa&XGJBSG zukemZI!!?j}^|J((h-lcXiRN zx7}x-nRVx-$OFaB=OzVul_Z*%|7y*XK6Guh*5)beep^@mTYA^)Kf`agr)m*4OI^(PF6}rMnOeST|r4lSw=>~TvNxu(8R<ECr+Na zbot8FYu9hwy!G(W<0ns_J%91?)yGetzkL1n{m0K=Ab&A3Fhjfr_ZgbM1cClyVqsxs zVF&q(k*OSrnFU!`6%E;h90S=C3x$=88aYIqCNA7~kW<+>=!0ld(M2vX6_bamA38O{%dq`CgP9)|%2YZR(M3HNT5JpKsr8ev$noU32HB zqu*ZEzW?WbKDn4Dr!Z8}Z_T8jt&^VJJ$*J(yG|wio6*b7YmB$#c;%fE?n(JwKTm7> zwEqmB&-tJK&#-YVZ~U3~H~$%oE2cyq-(7!?ea`cHD{AI7e>PnrUFbXC@$lBwNh{8U zE-x=S+Is!QR*82kiCsKz?ryh~IG63Y$3Z%z>GzxE8EqbAoz~Nw|K2H)+uFCkNdJ4v zqWZ78{~2QA|1&s>uGK1eZhmHc$%W7pA4;`$O;s*8PhWj=@0RU9r)|x?yef{wpCThO$|P|<3Gc^Y4+d$1bO~j|L^C&(uF~@7qgz+c)RI9(1FWO7jJ%f^(PF6}rMnOeST|r4lSw=>~TvNxu(8R<ECr+Na zbot8FYu9hwy!G(W<0ns_J%91?)yGetzkL1n{m0K=Ab&A3Fhjfr_ZgbM1cClyVqsxs zVF&q(k*OSrnFU!`6%E;h90S=C3x$=88aYIqCNA7~kW<+>=!0ld(M2vX6_bamA3-afMCws-F1#yO?7Sr;yp2JEgo zW%%z?eXqS!_QG1ljcscAI?vC~=;>MiJ)}P>y1P~>Th{H-zl{08;j^DkDl*$}?rPw~ zsS*>iV=@ zU8ea?`oiz4u5MpvJXhZ%lTF3o&*2LXizBA2ID3xE|JRl8JM#8M{fP8iGrQ(&>C4we zPvg-&6lH zTsUiJ_wtwg%dnSDr{2rXz>65 literal 0 HcmV?d00001 diff --git a/源代码/client/image/76.JPG b/源代码/client/image/76.JPG new file mode 100644 index 0000000000000000000000000000000000000000..876b883b7c22fcfd1b9c74362a78a55e1143dbba GIT binary patch literal 928 zcmex=^(PF6}rMnOeST|r4lSw=>~TvNxu(8R<ECr+Na zbot8FYu9hwy!G(W<0ns_J%91?)yGetzkL1n{m0K=Ab&A3Fhjfr_ZgbM1cClyVqsxs zVF&q(k*OSrnFU!`6%E;h90S=C3x$=88aYIqCNA7~kW<+>=!0ld(M2vX6_bamA3glT*MyoyN-tn-(cIWFatJ@u~`v2Ko z|HSn_gVe@{G5;B|y#F)A_Etv6ZsPkAnP z_mz(4e+JvsKSy&anzCQoozYwSU>n0m);#X#Q{Qf=t>-%OY0-a%c`yGn)SQehNe-Uq zmmB-->GW6U7o1pqWg2hDTJ4kf_e}eCaoP39JChFmi#2<=tTnV-?f#sU^(PF6}rMnOeST|r4lSw=>~TvNxu(8R<ECr+Na zbot8FYu9hwy!G(W<0ns_J%91?)yGetzkL1n{m0K=Ab&A3Fhjfr_ZgbM1cClyVqsxs zVF&q(k*OSrnFU!`6%E;h90S=C3x$=88aYIqCNA7~kW<+>=!0ld(M2vX6_bamA3G^Zd#@*+gwEwuI_Mh#a?b6mI_q0Z?xH4U9>YA2q8GogC>D&`wNmR+ zQB~d2+1mRzo=N%i{dvCRardzQ3^xmZTy@`cX_i}JZb`!=r?saZRP!v$yb^XL`|5(* zOV!rzoq3t3scX*i^V%oBl>KKgy8851jFP*EoKNBWspanu-0EVhe;~g$bWzt)ZP}T1 Vk^YQlR&Kkz?O*uo&-VXs0sv1wWS#&3 literal 0 HcmV?d00001 diff --git a/源代码/client/image/78.JPG b/源代码/client/image/78.JPG new file mode 100644 index 0000000000000000000000000000000000000000..8eb3102085bf6cb434f032fe2349fd8af5ba17c5 GIT binary patch literal 911 zcmex=^(PF6}rMnOeST|r4lSw=>~TvNxu(8R<ECr+Na zbot8FYu9hwy!G(W<0ns_J%91?)yGetzkL1n{m0K=Ab&A3Fhjfr_ZgbM1cClyVqsxs zVF&q(k*OSrnFU!`6%E;h90S=C3x$=88aYIqCNA7~kW<+>=!0ld(M2vX6_bamA38(?WjAZ?; zOjVIxttj8f*&HRM{-@6T@8{ckXp3&N-fYcdg7RoKq(HAn}^~ zy=jW4uJ?rNZlC&nzc2sXY1vUzJy%|t)HTWL+TFXa>z%e}Di}zWRFqPtzOwJMn*oc>~u~o0j~F`Cd^h7`1Dq)~2GWx}~$VCuSQaN%L+Ii%Bhb zbyM=e{AqK(TcylX%#5>)GuwVTuSw|W>95KXf2yu}t+9Wi@t@)A(fTjSu@(`pgFJ73 z+J9kZ!8iH2XHVV>zjeBP^1oeDx2C?j=lMxevV1zf8neu*K8MFYvZjiJ>m)7O8TcY~ WXROWsStheHZ`W)8XPBS-|0VzkWnLQq literal 0 HcmV?d00001 diff --git a/源代码/client/image/79.JPG b/源代码/client/image/79.JPG new file mode 100644 index 0000000000000000000000000000000000000000..8c7b06d71f2e8f988b6c0baca3a3eb661726d9da GIT binary patch literal 900 zcmex=^(PF6}rMnOeST|r4lSw=>~TvNxu(8R<ECr+Na zbot8FYu9hwy!G(W<0ns_J%91?)yGetzkL1n{m0K=Ab&A3Fhjfr_ZgbM1cClyVqsxs zVF&q(k*OSrnFU!`6%E;h90S=C3x$=88aYIqCNA7~kW<+>=!0ld(M2vX6_bamA3_;<`rpX#Ph-w(|{@^j9ywI0b@ZpM>hu3ZjWzi!v+I@RdinmXSq+pRzM zPrSbT_bJ<~t!5|hZqY6{905jBJE&u=k literal 0 HcmV?d00001 diff --git a/源代码/client/image/8.jpg b/源代码/client/image/8.jpg new file mode 100644 index 0000000000000000000000000000000000000000..e9be67bc26a54579c89a39d2f48607c384ae7e24 GIT binary patch literal 521 zcmex=Ms=g{8!#jAdkub3AN4a!3aMk1&)mFaiO@(GZfAg@H|g zfsvVsg@uJ3Cc((WEXcsZs@Ql?NXalzIC0@dHW4-Fpu!?X1}0_{?My5{y{v)^OpGkZ zGC%_uSOkR>0}UM$AO63^zys99BnULro}sflyY#`rqh^yHMn0RDclXhzU`9j#(Dnr zR;HJ>XXhB4URsf`R(YzI<;xl0Ol)l~_NaaE@v8EVkL{bnTbw^JC^jS^a0j=t#>ZJ% zcaQM5UlMubVo{`ZtL)l>ptolqXFqmn(Y6!5Q(5=Q>#EYeNvanejz(E4y|O-QaeD0> ir4OoCCItU^(PF6}rMnOeST|r4lSw=>~TvNxu(8R<ECr+Na zbot8FYu9hwy!G(W<0ns_J%91?)yGetzkL1n{m0K=Ab&A3Fhjfr_ZgbM1cClyVqsxs zVF&q(k*OSrnFU!`6%E;h90S=C3x$=88aYIqCNA7~kW<+>=!0ld(M2vX6_bamA3nvY-nox2cXhgH`7or&6r?z~KPe3VqHBM+_{9a!x^IVGyt^m&Wa01QGI-)+&pbJH`6F?mPcEf4qD<&p>Q zES^&wy6W!PcZ>Bp=H<;hv&`ehnLLr{c0rH(b}G+5E;{{NcmK~%^}pZNADdH9y4Cl% z|NFy#&M$cQ(l_zRtKFx*-TSS2>t+7yt!JgJ*KazhESeVXEUj_-gstP9CCMLF?z^7+ zpTXh9e}?xR^*^o#F4{S*@8#`hZtCr!RhQOk%{qPhA7|P3pz0%vjK~U-r^1-1mNV-TD*%Zvp@Y32xy4 literal 0 HcmV?d00001 diff --git a/源代码/client/image/81.JPG b/源代码/client/image/81.JPG new file mode 100644 index 0000000000000000000000000000000000000000..fc4d646185533b3f299700c35a50b14aa8729d59 GIT binary patch literal 946 zcmex=Hq-)3-T;9z58XJh4H zXJ_Z+|EI`$@KzRlhK~^C}Lq|5@z(jVX zLJ_0Ji3>TDoi-j64Z8S2#W<;`iIYoATtZSxRZU$(Q_IBE%-q7#%Gt%$&E3P(D>x)H zEIcAIDmf)JEj=SMtGJ}Jth}PKs=1}Lt-YhOYtrN?Q>RUzF>}_U#Y>hhTfSoDs!f}> zY~8kf$Ie}c4j(ys?D&b3r!HN-a`oEv8#iw~eDwIq(`V0LynOZX)8{W=zkUDl^B2fp zj10^WZ^3M3OE`xtwqWk#zu<_Mp&=KA@@wA3wl%I(ctO1#V0{%7Dn@^fce=*rL) zt3syh{tUW!^VGXvzf3>hNL!e+EtShBHB8m-#hIKX2@jgz99ntx_wmY-+mb42<*8w5 z$&)xvi zhumcXDh-d-x!&K+oTVZ8pP`{{Ygm_-kY}Xq%(6&-#xpBVZh5aVYN{@(-u%Smew literal 0 HcmV?d00001 diff --git a/源代码/client/image/82.JPG b/源代码/client/image/82.JPG new file mode 100644 index 0000000000000000000000000000000000000000..f03255c180255d45ee1dc85986917db7153d80b3 GIT binary patch literal 916 zcmex=^(PF6}rMnOeST|r4lSw=>~TvNxu(8R<ECr+Na zbot8FYu9hwy!G(W<0ns_J%91?)yGetzkL1n{m0K=Ab&A3Fhjfr_ZgbM1cClyVqsxs zVF&q(k*OSrnFU!`6%E;h90S=C3x$=88aYIqCNA7~kW<+>=!0ld(M2vX6_bamA3tde8--=h= z6h9#u^tAFnLx$e{>s@;n)gOOcf7|}Aw5;p$`lR|pLjTIY)!+Wpxp9B`?A^NC*IT~q zKeR7vmfySZs-;VJ-4EZ_b^P3E!=u3~O_pnGs-`}#E!{V(P9;1nKTBk$(!_{|QD!IX zwYE8aIn1>_Jg@$V@bdo*JNExllUf=meLMK>!!xc~|E^x0Jo$3{%zVF{eb*k&3RFAB zkk>CgrHzNx2Ky3NkD&VO3}+5Z1c03A7H;{X5v literal 0 HcmV?d00001 diff --git a/源代码/client/image/83.JPG b/源代码/client/image/83.JPG new file mode 100644 index 0000000000000000000000000000000000000000..ffbee39d76966b7b58cc291310a34490626e818b GIT binary patch literal 916 zcmex=^(PF6}rMnOeST|r4lSw=>~TvNxu(8R<ECr+Na zbot8FYu9hwy!G(W<0ns_J%91?)yGetzkL1n{m0K=Ab&A3Fhjfr_ZgbM1cClyVqsxs zVF&q(k*OSrnFU!`6%E;h90S=C3x$=88aYIqCNA7~kW<+>=!0ld(M2vX6_bamA3zlXTDXh36gbFU`o97AL*ulH!i5YTL~>iD&w3 zPmP#+e3CiejrH@^w@np!u6Z|BzclvkwQqL$MpLswSNYG2*>g+vy=~~%t9pOqouqeb z>U^tgxBlEe@%r-Lr);yfs!l$0Pj-_~+l|dWN~az_{mC!4-!T7^W|lg;pC9kNv+Ixi z%9HQ8D*5^J%$26!>!M%9Y`nrd%cqrFr&U_(Mygg3#|h;x%lAH=vdLsp=8JbnHXEy` zOsbkxvudGh>PhL(y60-#c~@Os8hPcK-|zZ^y0LfH9tk)qlV^(PF6}rMnOeST|r4lSw=>~TvNxu(8R<ECr+Na zbot8FYu9hwy!G(W<0ns_J%91?)yGetzkL1n{m0K=Ab&A3Fhjfr_ZgbM1cClyVqsxs zVF&q(k*OSrnFU!`6%E;h90S=C3x$=88aYIqCNA7~kW<+>=!0ld(M2vX6_bamA3nwj#pdL)S7~<)>o-j(TUQtKO8P&8?Dxj!Z(Y0o_P^u%<+H5!oSpf5 z_payLw4Y72UYB-n-7W1ecVDg9YFBPJ)vIFVQcKmdsi}46W5Z_s?A>{J+13`XGizr5 z+1zj{bmJU>19DS?W~yFWXf~@YdiM9Ql%%)|x$387-oNs*H#}dpd|&;~*MRij5 z_2=$=HStgViSM5*PfeAqjx6^2D>tj^cKi>vy>qYMOqnn>EmGNVQ}3SUE3&8D?761D zHIx6s+yC$H;r|TBR!tQ>cxru7p^W9**IuhvubH3!L#_4QihSKO(Gq#n&z6<3Ox~jL if`M7?>U>ubH^Z(i{@z-r!{U7}_pF<}@7mwU|2F|Of@^aC literal 0 HcmV?d00001 diff --git a/源代码/client/image/85.JPG b/源代码/client/image/85.JPG new file mode 100644 index 0000000000000000000000000000000000000000..1f2330852b61de48e20f663d87164595305df772 GIT binary patch literal 969 zcmex=Hq-)3-T;9z58XJh4H zXJ_Z+|EI`$@KzRlhK~^C}Lq|5@z(jVX zLJ_0Ji3>TDoi-j64Z8S2#W<;`iIYoATtZSxRZU$(Q_IBE%-q7#%Gt%$&E3P(D>x)H zEIcAIDmf)JEj=SMtGJ}Jth}PKs=1}Lt-YhOYtrN?Q>RUzF>}_U#Y>hhTfSoDs!f}> zY~8kf$Ie}c4j(ys?D&b3r!HN-a`oEv8#iw~eDwIq(`V0LynOZX)8{W=zkUDl^B2fp zj10^WZ^3Nd7p%~@z(w&l-R&1VwV!?Ko!moDpFyDtB*?%pkhCi~Nw zPj^hIn90(xq^tPg-S0bd60Rk89^SD1x{ty0?}a*(1-fs#%eIRKb?wT$oV$Gg;y)MP zKlo9^CwK8md7am-syi=|r(Ftbvk<%Cwp1`N;$C3GCYh-U!l$c0pIlcqt!sw!)a})G Xx@t@o#|4DOoqV-^@1H;Y|8D{SxB7IA literal 0 HcmV?d00001 diff --git a/源代码/client/image/86.JPG b/源代码/client/image/86.JPG new file mode 100644 index 0000000000000000000000000000000000000000..f6c472e0eb98a16dd61db2d5644263285355f366 GIT binary patch literal 944 zcmex=^(PF6}rMnOeST|r4lSw=>~TvNxu(8R<ECr+Na zbot8FYu9hwy!G(W<0ns_J%91?)yGetzkL1n{m0K=Ab&A3Fhjfr_ZgbM1cClyVqsxs zVF&q(k*OSrnFU!`6%E;h90S=C3x$=88aYIqCNA7~kW<+>=!0ld(M2vX6_bamA3*Lm@=VMCt|7Tc#;y=T;s4qpY0)r-h`E!2RGip+AmPrW#qVYeP4bPvA`Kl}W{LrknV;3G~i9GqK_I7#x5BZ7z GZvp`DgmdZu literal 0 HcmV?d00001 diff --git a/源代码/client/image/87.JPG b/源代码/client/image/87.JPG new file mode 100644 index 0000000000000000000000000000000000000000..f13e29ff08c0d3c538b246bb49b2a526fdf9fe30 GIT binary patch literal 952 zcmex=^(PF6}rMnOeST|r4lSw=>~TvNxu(8R<ECr+Na zbot8FYu9hwy!G(W<0ns_J%91?)yGetzkL1n{m0K=Ab&A3Fhjfr_ZgbM1cClyVqsxs zVF&q(k*OSrnFU!`6%E;h90S=C3x$=88aYIqCNA7~kW<+>=!0ld(M2vX6_bamA3|9s{HtR(?ikse)`UT+Z(4pL*{7y|$ z%7B%-a+kgT&%iVDON@DQb8C2TcTC)w_--M!nlZ_e{y*H}flM3vPoyv~06&(LmHFYmYd*wq!w)62Gm zyX9@@tN=5d%n7D<@KJdW5Qv( Ns#d?Rf3N)iCIH7MbEE(O literal 0 HcmV?d00001 diff --git a/源代码/client/image/88.JPG b/源代码/client/image/88.JPG new file mode 100644 index 0000000000000000000000000000000000000000..2780490e8c62e3f664f2308491804fd0af10e794 GIT binary patch literal 951 zcmex=^(PF6}rMnOeST|r4lSw=>~TvNxu(8R<ECr+Na zbot8FYu9hwy!G(W<0ns_J%91?)yGetzkL1n{m0K=Ab&A3Fhjfr_ZgbM1cClyVqsxs zVF&q(k*OSrnFU!`6%E;h90S=C3x$=88aYIqCNA7~kW<+>=!0ld(M2vX6_bamA3iPoU4O6nO7L$V z``uiQx{%cl3m!Qg5pbU8c8PsyQkd!4A5-T4n44|<=Yh(yych{hBMOnRWZiANez1WQ{D7w)Tdpl}*?snsN1N^Qvuj zKmLib&yNW)d|8&Tq;q-mk-XiDRRoT6Pe^-LEq`pI#(FD*m0~~Dv%mdkXtzt-Yjy8d zQSj#6d$&sK>OUO&x8ZY4w8%J`ofB(W`S3aS N%es5<9|Zs31OU9ocYOc= literal 0 HcmV?d00001 diff --git a/源代码/client/image/9.jpg b/源代码/client/image/9.jpg new file mode 100644 index 0000000000000000000000000000000000000000..6d7912891a6b9a6ded79f0013f6f666cda5a28df GIT binary patch literal 521 zcmex=Ms=g{8!#jAdkub3AN4a!3aMk1&)nFoFQY)nJm9nSq5( zfPs;jnTeU56(+&Rz{JcVsK_ehn7B|x$uO{R;-SW-jTav>GBBg)W?*1s1uA4<0s&^2 zZeYML3o@_>83raQZv62776T76&_F?;m_5UzrR~18%CgESMuPXw>Ce~SzG~z0OT}9! zecXETd47LLuHlT}@5zbM=e$omuvA*UVwJFkr}B;0PZu6x*lk*}XqIa7{r8cM(@Y)S zL_hn>zvj!PgG)N@J-F%GsBr(`AHYPoxOep0zJaYubf$lV*)ESZ+~SgcsI z-Tj=Qr>uB#+N)z*p9n=iobz~rd}y-VJpHU^v*Ygksdv6Vi8V#-&5DKL3wvz3G$XEA lnnYE0xph68;P~)${^8mS**Y6$rOo)1_c2;HC*S`6O#s;ds7?R? literal 0 HcmV?d00001 diff --git a/源代码/client/image/Thumbs.db b/源代码/client/image/Thumbs.db new file mode 100644 index 0000000000000000000000000000000000000000..b1b2db9d5d9d6d5f2b78e488ee12a6c51f5d7950 GIT binary patch literal 120320 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 0){ + model.addMessage("提示:用\"tab\"键可以自由切换于控制界面和对话界面"); + model.addMessage("提示:按回车键可以直接发送您的对话"); + helpMessageCount--; + } + + if(e.getKeyCode()==e.VK_ENTER){ + if(!view.messageField.getText().equals("")){ + model.addMessage("用户端玩家说:" + view.messageField.getText()); + model.playerTypedMessage += "e" + view.messageField.getText() + ";"; + view.messageField.setText(""); + }else{ + model.addMessage("对话内容不能为空"); + } + } + } + }); + + JPanel temp = view.mainPanel; + temp.addKeyListener( new KeyAdapter(){ + public void keyPressed(KeyEvent e){ + if(e.getKeyCode() == KeyEvent.VK_UP){ + model.moveUp = true; + model.moveDown = false; + model.moveLeft = false; + model.moveRight = false; + } + if(e.getKeyCode() == KeyEvent.VK_DOWN ){ + model.moveDown = true; + model.moveUp = false; + model.moveLeft = false; + model.moveRight = false; + } + if(e.getKeyCode() == KeyEvent.VK_LEFT ){ + model.moveLeft = true; + model.moveUp = false; + model.moveDown = false; + model.moveRight = false; + } + if(e.getKeyCode() == KeyEvent.VK_RIGHT ){ + model.moveLeft = false; + model.moveUp = false; + model.moveDown = false; + model.moveRight = true; + } + + if(e.getKeyChar() == 's') + model.fire = true; + + if(e.getKeyCode()==e.VK_ENTER){ + if(!view.messageField.getText().equals("")){ + model.addMessage("用户端玩家说:" + view.messageField.getText()); + model.playerTypedMessage += "e" + view.messageField.getText() + ";"; + view.messageField.setText(""); + } + } + + if(e.getKeyChar() == 'y' && model.gameOver && !model.clientVoteYes){ + model.clientVoteYes = true; + model.addMessage("等待主机端玩家回应..."); + } + + if(e.getKeyChar() == 'n' && model.gameOver) + model.clientVoteNo = true; + } + + public void keyReleased(KeyEvent e){ + if(e.getKeyCode() == KeyEvent.VK_UP) + model.moveUp = false; + if(e.getKeyCode() == KeyEvent.VK_DOWN ) + model.moveDown = false; + if(e.getKeyCode() == KeyEvent.VK_LEFT ) + model.moveLeft = false; + if(e.getKeyCode() == KeyEvent.VK_RIGHT ) + model.moveRight = false; + if(e.getKeyChar() == 's') + model.fire = false; + } + } + ); + + } +} + diff --git a/源代码/client/src/ClientModel.java b/源代码/client/src/ClientModel.java new file mode 100644 index 0000000..e2b8de3 --- /dev/null +++ b/源代码/client/src/ClientModel.java @@ -0,0 +1,256 @@ +import java.net.*; +import java.io.*; +import java.awt.event.*; +import java.awt.*; + +public class ClientModel implements ActionListener{ + public ClientView view; + + //连接变量 + public Socket clientSocket; + public PrintWriter out; + public BufferedReader in; + public String fromServer, fromUser; + public String serverIP; + + //客户端状态 + public boolean serverConnected; + public boolean gameStarted; + public boolean gamePaused; + public boolean gameOver; + public boolean serverVoteYes, serverVoteNo; + public boolean clientVoteYes, clientVoteNo; + public boolean pausePressed; + + //图像信息 + public String[] messageQueue; + public int messageIndex; + public String playerTypedMessage = ""; + + + //textures + public Image[] textures; + + //实际的游戏运行在这个线程,而主线程听用户的输入 + public Ticker t; + + //游戏变量 + public static int gameFlow; + public Actor[] drawingList; + public boolean moveUp; + public boolean moveDown; + public boolean moveLeft; + public boolean moveRight; + public boolean fire; + + + public ClientModel(ClientView thisview){ + view = thisview; + messageQueue = new String[8]; + view.mainPanel.messageQueue = messageQueue; + addMessage("欢迎来到坦克大战用户端!请输入主机IP地址然后点击\"连接主机\"按钮开始游戏"); + + t = new Ticker(1000); + t.addActionListener(this); + + } + + public void connectServer(){ + addMessage("正在连接主机"); + + try{ + serverIP = view.IPfield.getText(); + InetAddress addr = InetAddress.getByName(serverIP); + clientSocket = new Socket(addr, 9999); + + out = new PrintWriter(clientSocket.getOutputStream(), true); + in = new BufferedReader(new InputStreamReader(clientSocket.getInputStream())); + + }catch(Exception e){ + t.stop(); + System.out.println(e); + addMessage("连接中出现错误, 请确认 1. 输入的IP是否正确, 2. 主机端已存在"); + return; + } + + serverConnected = true; + addMessage("已成功连接到主机,开始载入游戏"); + view.IPfield.setFocusable(false); + view.IPfield.setEnabled(false); + + //加载游戏 texture + textures = new Image[88]; + for(int i = 1; i < textures.length+1; i++) + textures[i-1] = Toolkit.getDefaultToolkit().getImage("image\\" + i + ".jpg"); + + + drawingList = new Actor[400]; + + gameStarted = true; + view.mainPanel.gameStarted = gameStarted;; + view.mainPanel.drawingList = drawingList; + view.messageField.setEnabled(true); + addMessage("载入完毕,游戏开始了!"); + } + + public void actionPerformed(ActionEvent e){ + connectServer(); + + //如果程序不能连接到服务器然后什么都不做 + if(!serverConnected) + return; + + //游戏逻辑循环,客户端程序实际不执行任何逻辑计算,它只接受drawing-instructions + try{ + while ((fromServer = in.readLine()) != null) { + fromUser = ""; + + gameFlow++; + + if(pausePressed){ + fromUser+= "x;"; + pausePressed = false; + } + + if(gameOver){ + if(clientVoteNo) + System.exit(0); + + if(clientVoteYes){ + fromUser+="j;"; + if(serverVoteYes){ + addMessage("主机端玩家决定再玩一次,游戏重新开始了..."); + gameOver = false; + clientVoteYes = false; + serverVoteYes = false; + } + } + } + + //指令字符串做出反馈,告诉服务器客户端在做什么 + fromUser +="m"; + if(moveUp) + fromUser+= "1"; + else + fromUser+= "0"; + if(moveDown) + fromUser+="1"; + else + fromUser+= "0"; + if(moveLeft) + fromUser+="1"; + else + fromUser+= "0"; + if(moveRight) + fromUser+="1"; + else + fromUser+= "0"; + if(fire) + fromUser+="1"; + else + fromUser+= "0"; + fromUser+=";"; + + //来自服务器的进程指令 + instructionHandler.handleInstruction(this, fromServer); + + //从消息队列中删除一个消息每10秒,(如果有) + if(gameFlow%300 == 0) + removeMessage(); + + //输出玩家坦克信息 + if(!playerTypedMessage.equals("")){ + fromUser+=playerTypedMessage; + playerTypedMessage = ""; + } + + //发送反馈指令 + out.println(fromUser); + + //调用视图重新绘制它自己 + view.mainPanel.repaint(); + + //如果切换到对话模式的玩家,那么停止所有坦克行动 + if(!view.mainPanel.hasFocus()){ + moveLeft = false; + moveUp = false; + moveDown = false; + moveRight = false; + fire = false; + } + } + }catch(Exception ex){ + ex.printStackTrace(); + t.stop(); + view.messageField.setEnabled(false); + serverConnected = false; + gameStarted = false; + view.mainPanel.gameStarted = false; + gameOver = false; + addMessage("主机端退出了"); + view.IPfield.setFocusable(true); + view.IPfield.setEnabled(true); + + //当有错误发生时,关闭创建的任何事情 + try{ + out.close(); + in.close(); + clientSocket.close(); + }catch(Exception exc){ + System.out.println(exc); + } + } + } + + //在屏幕上显示一条消息 + public void addMessage(String message){ + if(messageIndex < 8){ + messageQueue[messageIndex] = message; + messageIndex++; + } + else{ + for(int i = 0; i < 7; i++) + messageQueue[i] = messageQueue[i+1]; + messageQueue[7] = message; + } + + //调用视图来重新绘制屏幕,如果没有开始游戏 + if(!gameStarted) + view.mainPanel.repaint(); + } + + //删除最早的消息在屏幕上 + public void removeMessage(){ + if(messageIndex == 0) + return; + + messageIndex--; + for(int i = 0; i < messageIndex; i++) + messageQueue[i] = messageQueue[i+1]; + messageQueue[messageIndex] = null; + + //调用视图来重新绘制屏幕如果没有开始游戏 + if(!gameStarted) + view.mainPanel.repaint(); + } + + //添加一个游戏对象(如坦克、子弹等)图纸清单 + public void addActor(Actor actor){ + for(int i = 0; i < drawingList.length; i ++ ) + if(drawingList[i] == null){ + drawingList[i] = actor; + break; + } + } + + //删除一个游戏对象从图纸清单 + public void removeActor(Actor actor){ + for(int i = 0; i < drawingList.length; i ++ ) + if(drawingList[i] == actor){ + drawingList[i] = null; + break; + } + } + + +} diff --git a/源代码/client/src/ClientView.java b/源代码/client/src/ClientView.java new file mode 100644 index 0000000..da14016 --- /dev/null +++ b/源代码/client/src/ClientView.java @@ -0,0 +1,89 @@ +// 坦克大战连线版用户端 +import javax.swing.*; +import java.awt.*; + +//这个类代表服务器的图形界面 +public class ClientView extends JFrame{ + public drawingPanel mainPanel; + public JButton sendMessage, connectServer, exit, pauseAndResume, help; + public JTextField messageField, IPfield; + public JLabel enterIP; + public Image offScreenImage; + + public ClientControler controler; + public ClientModel model; + + + public ClientView(){ + super("坦克大战"); + + try { + UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName()); + } catch (Exception e) { } + + getContentPane().setLayout(null); + + //设置动画绘制主面板 + mainPanel = new drawingPanel(); + mainPanel.setLayout(null); + mainPanel.setBounds(0, 22, 679, 605); + mainPanel.setBackground(new Color(128, 64, 0)); + + messageField = new JTextField(); + messageField.setBounds(0,519, 560,22); + messageField.setEnabled(false); + sendMessage = new JButton("发送"); + sendMessage.setBounds(570,518, 62,24); + sendMessage.setFocusable(false); + mainPanel.add(messageField); + mainPanel.add(sendMessage); + getContentPane().add(mainPanel); + mainPanel.setFocusable(true); + + //设置选项按钮和IP文本字段 + enterIP = new JLabel("输入主机IP"); + enterIP.setBounds(10, 0,60,22); + getContentPane().add(enterIP); + + IPfield = new JTextField(); + IPfield.setBounds(65, 0,90,22); + getContentPane().add(IPfield); + + connectServer = new JButton("连接主机"); + connectServer.setBounds(160, 0,100,22); + getContentPane().add(connectServer); + connectServer.setFocusable(false); + + pauseAndResume = new JButton("暂停/继续"); + pauseAndResume.setBounds(260, 0,100,22); + getContentPane().add(pauseAndResume); + pauseAndResume.setFocusable(false); + + help = new JButton("帮助"); + help.setBounds(360, 0,100,22); + getContentPane().add(help); + help.setFocusable(false); + + exit = new JButton("退出"); + exit.setBounds(460, 0,100,22); + getContentPane().add(exit); + exit.setFocusable(false); + + //设置面框架 + setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); + setBounds(150, 130, 640, 590); + setVisible(true); + setResizable( false ); + + //设置客户端模型 + model = new ClientModel(this); + + //设置客户端控制器 + controler = new ClientControler(this, model); + } + + public static void main(String[] args){ + new ClientView(); + } + +} \ No newline at end of file diff --git a/源代码/client/src/Steelwall.java b/源代码/client/src/Steelwall.java new file mode 100644 index 0000000..2d877d3 --- /dev/null +++ b/源代码/client/src/Steelwall.java @@ -0,0 +1,70 @@ +import java.awt.*; + +public class Steelwall implements Actor{ + public final String Type = "Steelwall"; + public Image Steelwall; + public int xPos; + public int yPos; + public boolean[] shape; + public ClientModel gameModel; + + public Steelwall(int xPos, int yPos, int orientation, ClientModel gameModel){ + this.xPos = xPos; + this.yPos = yPos; + this.gameModel = gameModel; + shape = new boolean[4]; + Steelwall = gameModel.textures[53]; + + if(orientation == 0){ + shape[2] = true; + shape[3] = true; + } + if(orientation == 1){ + shape[0] = true; + shape[1] = true; + } + if(orientation == 2){ + shape[1] = true; + shape[3] = true; + } + if(orientation == 3){ + shape[0] = true; + shape[2] = true; + } + } + + public void draw(Graphics g){ + boolean walldestoried = true; + for(int i = 0; i < shape.length; i++) + if(!shape[i]){ + walldestoried = false; + break; + } + if(walldestoried) + return; + + g.drawImage(Steelwall, xPos - 12, yPos - 12, null); + g.setColor(new Color(128, 64, 0)); + if(shape[0]) + g.fillRect(xPos - 12, yPos - 12, 13, 13); + if(shape[1]) + g.fillRect(xPos, yPos - 12, 13, 13); + if(shape[2]) + g.fillRect(xPos - 12, yPos, 13, 13); + if(shape[3]) + g.fillRect(xPos, yPos, 13, 13); + } + + public int getxPos(){ + return xPos; + } + + public int getyPos(){ + return yPos; + } + + public String getType(){ + return Type; + } + +} \ No newline at end of file diff --git a/源代码/client/src/Ticker.java b/源代码/client/src/Ticker.java new file mode 100644 index 0000000..ec0c82f --- /dev/null +++ b/源代码/client/src/Ticker.java @@ -0,0 +1,75 @@ +import java.awt.event.ActionEvent; +import java.awt.event.ActionListener; +import java.io.PrintStream; + +public class Ticker implements Runnable{ + ActionListener al; + private boolean isTicking; + Thread t; + int delay; + public Ticker(int i, ActionListener actionlistener){ + al = actionlistener; + delay = i; + t = new Thread(this); + t.start(); + isTicking = false; + } + + public Ticker(int i){ + delay = i; + t = new Thread(this); + t.start(); + isTicking = false; + } + + public void addActionListener(ActionListener actionlistener){ + if(al == null) + al = actionlistener; + else + System.out.println("WARNING: ActionListener already added to Ticker."); + } + + public boolean isRunning(){ + return isTicking; + } + + public void start(){ + isTicking = true; + } + + public void stop(){ + isTicking = false; + } + + public void setDelay(int i){ + delay = i; + } + + public int getDelay(){ + return delay; + } + + private void fireActionPerformed(){ + if(al == null || !isTicking) + { + return; + } else{ + ActionEvent actionevent = new ActionEvent(this, 0, null); + al.actionPerformed(actionevent); + return; + } + } + + public void run(){ + do{ + fireActionPerformed(); + try{ + Thread.sleep(delay); + } + catch(InterruptedException interruptedexception){ + System.out.println("WARNING: Ticker thread interrupted."); + } + } while(true); + } +} + diff --git a/源代码/client/src/bomb.java b/源代码/client/src/bomb.java new file mode 100644 index 0000000..d628e33 --- /dev/null +++ b/源代码/client/src/bomb.java @@ -0,0 +1,40 @@ +import java.awt.*; + +public class bomb implements Actor{ + public int xPos, yPos; + public ClientModel gameModel; + public int size; + public int inner, middle, outer; + + public bomb(int a, int b, int size, ClientModel gameModel){ + this.size = size; + this.gameModel = gameModel; + xPos = a; + yPos = b; + + if(size == 0 ){ + inner = 6; middle = 9; outer = 14; + }else if(size == 1){ + inner = 2; middle = 4; outer = 7; + } + } + + public void draw(Graphics g){ + g.setColor(Color.red); + g.fillOval(xPos-outer, yPos-outer, 2*outer, 2*outer); + g.setColor(Color.orange); + g.fillOval(xPos-middle, yPos-middle, 2*middle, 2*middle); + g.setColor(Color.yellow); + g.fillOval(xPos-inner, yPos-inner, 2*inner, 2*inner); + + gameModel.removeActor(this); + } + + public int getxPos(){ + return xPos; + } + + public int getyPos(){ + return yPos; + } +} \ No newline at end of file diff --git a/源代码/client/src/bullet.java b/源代码/client/src/bullet.java new file mode 100644 index 0000000..c60047e --- /dev/null +++ b/源代码/client/src/bullet.java @@ -0,0 +1,38 @@ +import java.awt.*; + +public class bullet implements Actor{ + public int xPos; + public int yPos; + public ClientModel gameModel; + public int direction; + public String Type = "bullet"; + + public bullet(int xPos, int yPos, ClientModel gameModel, int direction){ + this.xPos = xPos; + this.yPos = yPos; + this.gameModel = gameModel; + this.direction = direction; + } + + public void draw(Graphics g){ + g.setColor(Color.lightGray); + if(direction == 0 || direction == 1) + g.fillRect(xPos - 1,yPos - 4, 3, 9); + if(direction == 2 || direction == 3) + g.fillRect(xPos - 4, yPos - 1, 9, 3); + gameModel.removeActor(this); + } + + public int getxPos(){ + return xPos; + } + + public int getyPos(){ + return yPos; + } + + public String getType(){ + return Type; + } +} + diff --git a/源代码/client/src/drawingPanel.java b/源代码/client/src/drawingPanel.java new file mode 100644 index 0000000..8085e26 --- /dev/null +++ b/源代码/client/src/drawingPanel.java @@ -0,0 +1,105 @@ +import java.awt.*; +import javax.swing.*; + +//绘图面板类属于客户端程序 +public class drawingPanel extends JPanel{ + public Image offScreenImage; + + public String[] messageQueue; + public Actor[] drawingList; + public boolean gameStarted; + public int green, red, blue; + public int P1Life, P2Life, P1Score, P2Score, EnemyLeft, LevelIndex; + public Image P1Image, P2Image; + + public drawingPanel() { + P1Image = Toolkit.getDefaultToolkit().getImage("image\\" + 55 + ".jpg"); + P2Image = Toolkit.getDefaultToolkit().getImage("image\\" + 73 + ".jpg"); + } + + + + public void paintComponent(Graphics g) { + Graphics offScreenGraphics; + if (offScreenImage == null) { + offScreenImage = createImage(640, 550); + } + offScreenGraphics = offScreenImage.getGraphics(); + myPaint(offScreenGraphics); + g.drawImage(offScreenImage, 0, 0, this); + } + + public void myPaint(Graphics g) { + super.paintComponent(g); + + if(gameStarted){ + //画游戏信息 + g.setColor(new Color(81,111, 230)); + g.drawString("第 " + LevelIndex + " 关", 527, 39); + g.drawString("敌人数 = " + EnemyLeft, 527, 79); + + g.setColor(Color.yellow); + g.drawImage(P1Image, 520, 380, null ); + g.drawString("x", 555, 395); + g.drawString(P1Life + "", 565, 396); + String SCORE = "000000000" + P1Score; + g.drawString("P1" +" 得分:" + "", 515, 370); + g.drawString(SCORE.substring(SCORE.length() - 7, SCORE.length()) + "", 566, 370); + + g.setColor(Color.green); + g.drawImage(P2Image, 520, 460, null ); + g.drawString("x", 555, 475); + g.drawString(P2Life + "", 565, 476); + SCORE = "000000000" + P2Score; + g.drawString("P2" +" 得分:" + "", 515, 450); + g.drawString(SCORE.substring(SCORE.length() - 7, SCORE.length()) + "", 566, 450); + + + + //绘制背景 + g.setColor(Color.blue); + g.drawRect(10, 10, 501, 501); + + //绘制坦克等等 + if(drawingList != null) + for(int i = 0; i < drawingList.length; i++) + if(drawingList[i] != null) + drawingList[i].draw(g); + + //绘制获胜场景 + if(level.winningCount > 150){ + int temp = level.winningCount - 150; + if(temp*10 > 300) + temp = 30; + if(level.winningCount > 470) + temp = 500 - level.winningCount; + g.setColor(Color.gray); + g.fillRect(11,11, 500, temp*10); + g.fillRect(11, 500 - temp*10, 500, (1+temp)*10 + 2); + + if(level.winningCount > 190 &&level.winningCount < 470){ + if(level.winningCount > 400 ){ + red+=(int)((128-red)*0.2); + green+=(int)((128-green)*0.2); + } + g.setColor(new Color(red, green, blue)); + g.drawString("过 关 了 !", 240, 250); + } + }else{ + green = 23; red = 34; blue = 128; + } + } + + //消息 + g.setColor(new Color(255, 255, 255)); + if(messageQueue != null){ + for(int i = 0 ; i < 8; i++){ + if(messageQueue[i] != null) + g.drawString(messageQueue[i] , 5, 12 +i*16); + else + break; + } + } + + } +} \ No newline at end of file diff --git a/源代码/client/src/instructionHandler.java b/源代码/client/src/instructionHandler.java new file mode 100644 index 0000000..4332702 --- /dev/null +++ b/源代码/client/src/instructionHandler.java @@ -0,0 +1,352 @@ +//该类从服务器程序解码指令字符串,然后将字符串转换为真正的指令 + +//由客户端程序可读 +public class instructionHandler{ + public static void handleInstruction(ClientModel gameModel, String instruction){ + if(instruction.length() == 0) + return; + + int i = 0; + while(i < instruction.length()){ + String perInstruction = ""; + + //指令由”;“开头在instruction-string分离 + while(!instruction.substring(i, i+1).equals(";")){ + perInstruction+=instruction.substring(i, i+1); + i++; + } + + //指令“L”开头是负载水平,其次是“L”数量水平指数 + if(perInstruction.substring(0,1).equals("L")){ + level.loadLevel(gameModel, Integer.parseInt(perInstruction.substring(1,2))); + return; + } + + //指令“w”开头意味着一些事情改变了在墙上的对象 + if(perInstruction.substring(0,1).equals("w")){ + int xPos = 0; int yPos = 0; boolean[] shape = new boolean[16]; + String temp = ""; + int j = 1; + //得到x的位置 + while(!perInstruction. substring(j, j+1).equals(",")){ + temp+=perInstruction. substring(j, j+1); + j++; + } + j++; + xPos = Integer.parseInt(temp); + + //得到y的位置 + temp = ""; + while(!perInstruction. substring(j, j+1).equals(",")){ + temp+=perInstruction. substring(j, j+1); + j++; + } + j++; + yPos = Integer.parseInt(temp); + + //墙的详细的边界 + for(int k = 0; k < 16; k++){ + if(perInstruction. substring(j, j+1).equals("1")) + shape[k] = true; + else + shape[k] = false; + j++; + } + + //执行指令 + for(int k = 0; k < gameModel.drawingList.length; k++){ + if(gameModel.drawingList[k] != null){ + if(gameModel.drawingList[k].getxPos() == xPos && gameModel.drawingList[k].getyPos() == yPos){ + wall tempWall = new wall(xPos, yPos, 4, gameModel); + tempWall.shape = shape; + gameModel.drawingList[k] = tempWall; + } + } + } + } + + //指令“s”开头意味着一些事情改变了一个铁墙对象 + if(perInstruction.substring(0,1).equals("s")){ + int xPos = 0; int yPos = 0; boolean[] shape = new boolean[4]; + String temp = ""; + int j = 1; + //得到x的位置 + while(!perInstruction. substring(j, j+1).equals(",")){ + temp+=perInstruction. substring(j, j+1); + j++; + } + j++; + xPos = Integer.parseInt(temp); + + //得到y的位置 + temp = ""; + while(!perInstruction. substring(j, j+1).equals(",")){ + temp+=perInstruction. substring(j, j+1); + j++; + } + j++; + yPos = Integer.parseInt(temp); + + //详细的钢墙边境 + for(int k = 0; k < 4; k++){ + if(perInstruction. substring(j, j+1).equals("1")) + shape[k] = true; + else + shape[k] = false; + j++; + } + + //执行指令 + for(int k = 0; k < gameModel.drawingList.length; k++){ + if(gameModel.drawingList[k] != null){ + if(gameModel.drawingList[k].getxPos() == xPos && gameModel.drawingList[k].getyPos() == yPos){ + Steelwall tempWall = new Steelwall(xPos, yPos, 4, gameModel); + tempWall.shape = shape; + gameModel.drawingList[k] = tempWall; + } + } + } + } + + //指令“b”开头意味着基地已被摧毁 + if(perInstruction.substring(0,1).equals("b")){ + gameModel.drawingList[4] = new normalObject(260, 498, gameModel, "base", 1); + } + + //指令“n”开头显示正常的对象,如坦克、启动符号 + if(perInstruction.substring(0,1).equals("n")){ + int xPos = 0; int yPos = 0; int textureIndex = -1; + String temp = ""; + int j = 1; + //得到x对象的位置 + while(!perInstruction. substring(j, j+1).equals(",")){ + temp+=perInstruction. substring(j, j+1); + j++; + } + j++; + xPos = Integer.parseInt(temp); + + //得到y对象的位置 + temp = ""; + while(!perInstruction. substring(j, j+1).equals(",")){ + temp+=perInstruction. substring(j, j+1); + j++; + } + j++; + yPos = Integer.parseInt(temp); + + //获得对象的纹理指数 + temp = ""; + while(j < perInstruction.length()){ + temp+=perInstruction. substring(j, j+1); + j++; + } + textureIndex = Integer.parseInt(temp); + + //执行指令 + gameModel.addActor(new normalObject(xPos, yPos, gameModel, "normal", textureIndex)); + } + + + //指令“t”开头表明子弹 + if(perInstruction.substring(0,1).equals("t")){ + int xPos = 0; int yPos = 0; int direction = -1; + String temp = ""; + int j = 1; + //得到x子弹的位置 + while(!perInstruction. substring(j, j+1).equals(",")){ + temp+=perInstruction. substring(j, j+1); + j++; + } + j++; + xPos = Integer.parseInt(temp); + + //得到y子弹的位置 + temp = ""; + while(!perInstruction. substring(j, j+1).equals(",")){ + temp+=perInstruction. substring(j, j+1); + j++; + } + j++; + yPos = Integer.parseInt(temp); + + //子弹的方向 + temp = ""; + while(j < perInstruction.length()){ + temp+=perInstruction. substring(j, j+1); + j++; + } + direction = Integer.parseInt(temp); + + //执行指令 + gameModel.addActor(new bullet(xPos, yPos, gameModel, direction)); + } + + //指令“o”开头表示一个炸弹 + if(perInstruction.substring(0,1).equals("o")){ + int xPos = 0; int yPos = 0; int size = -1; + String temp = ""; + int j = 1; + //得到x炸弹的位置 + while(!perInstruction. substring(j, j+1).equals(",")){ + temp+=perInstruction. substring(j, j+1); + j++; + } + j++; + xPos = Integer.parseInt(temp); + + //得到y炸弹的位置 + temp = ""; + while(!perInstruction. substring(j, j+1).equals(",")){ + temp+=perInstruction. substring(j, j+1); + j++; + } + j++; + yPos = Integer.parseInt(temp); + + //炸弹的大小 + temp = ""; + while(j < perInstruction.length()){ + temp+=perInstruction. substring(j, j+1); + j++; + } + if(temp.equals("small")) + size = 1; + else + size = 0; + //执行指令 + gameModel.addActor(new bomb(xPos, yPos, size, gameModel)); + } + + //指令“i”开头表明坦克盾牌 + if(perInstruction.substring(0,1).equals("i")){ + int xPos = 0; int yPos = 0; + String temp = ""; + int j = 1; + //得到x位置的盾牌 + while(!perInstruction. substring(j, j+1).equals(",")){ + temp+=perInstruction. substring(j, j+1); + j++; + } + j++; + xPos = Integer.parseInt(temp); + + //得到y位置的盾牌 + temp = ""; + while(j < perInstruction. length()){ + temp+=perInstruction. substring(j, j+1); + j++; + } + yPos = Integer.parseInt(temp); + + //执行指令 + gameModel.addActor(new shield(xPos, yPos, gameModel)); + } + + //指令“p”开头表示水平和玩家信息 + if(perInstruction.substring(0,1).equals("p")){ + String temp = ""; + int j = 1; + //得到敌人离开的数量 + while(!perInstruction. substring(j, j+1).equals(",")){ + temp+=perInstruction. substring(j, j+1); + j++; + } + j++; + gameModel.view.mainPanel.EnemyLeft = Integer.parseInt(temp); + + //得到水平指数 + temp = ""; + while(!perInstruction. substring(j, j+1).equals(",")){ + temp+=perInstruction. substring(j, j+1); + j++; + } + j++; + gameModel.view.mainPanel.LevelIndex = Integer.parseInt(temp); + + //玩家1的生命量 + temp = ""; + while(!perInstruction. substring(j, j+1).equals(",")){ + temp+=perInstruction. substring(j, j+1); + j++; + } + j++; + gameModel.view.mainPanel.P1Life = Integer.parseInt(temp); + + //玩家1的分数 + temp = ""; + while(!perInstruction. substring(j, j+1).equals(",")){ + temp+=perInstruction. substring(j, j+1); + j++; + } + j++; + gameModel.view.mainPanel.P1Score = Integer.parseInt(temp); + + //玩家2的生命量 + temp = ""; + while(!perInstruction. substring(j, j+1).equals(",")){ + temp+=perInstruction. substring(j, j+1); + j++; + } + j++; + gameModel.view.mainPanel.P2Life = Integer.parseInt(temp); + + //玩家2的分数 + temp = ""; + while(j < perInstruction.length()){ + temp+=perInstruction. substring(j, j+1); + j++; + } + j++; + gameModel.view.mainPanel.P2Score = Integer.parseInt(temp); + } + + //指令“g”开头表明获取胜利的统计数量 + if(perInstruction.substring(0,1).equals("g")){ + String temp = ""; + int j = 1; + //得到敌人离开的数量 + while(j < perInstruction.length()){ + temp+=perInstruction. substring(j, j+1); + j++; + } + level.winningCount = Integer.parseInt(temp); + } + + //指令“m”开头表示服务器玩家的信息 + if(perInstruction.substring(0,1).equals("m")){ + gameModel.addMessage("主机端玩家说:" + perInstruction.substring(1,perInstruction.length())); + } + + //指令“a”开头表示游戏结束 + if(perInstruction.substring(0,1).equals("a")){ + if(!gameModel.gameOver){ + gameModel.addMessage("GAME OVER !  想再玩一次吗 ( y / n ) ?"); + gameModel.gameOver = true; + } + } + //指令“j”开头表示服务器玩家想在玩一次 + if(perInstruction.substring(0,1).equals("j")){ + if(gameModel.gameOver) + gameModel.serverVoteYes = true; + } + + //指令“x”开头表示服务器玩家暂停游戏 + if(perInstruction.substring(0,1).equals("x")){ + int temp = Integer.parseInt(perInstruction.substring(1,2)); + if(temp == 0){ + if(gameModel.gamePaused){ + gameModel.addMessage("主机端玩家取消了暂停"); + gameModel.gamePaused = false; + } + }else{ + if(!gameModel.gamePaused){ + gameModel.addMessage("主机端玩家暂停了游戏"); + gameModel.gamePaused = true; + } + } + } + i++; + } + } +} \ No newline at end of file diff --git a/源代码/client/src/level.java b/源代码/client/src/level.java new file mode 100644 index 0000000..429a0c1 --- /dev/null +++ b/源代码/client/src/level.java @@ -0,0 +1,266 @@ +import java.awt.*; + +//服务器端的level类 +//因为只有一层对象,所以在这个类是一个静态变量 + +public class level{ + public static int winningCount; + + public static void loadLevel(ClientModel gameModel, int levelIndex){ + //清除所有的东西 + for(int i = 0; i < 400; i ++) + gameModel.drawingList[i] = null; + + //加载基地 + gameModel.drawingList[0] = new wall(248, 498, 2, gameModel); + gameModel.drawingList[1] = new wall(273, 498, 3, gameModel); + gameModel.drawingList[2] = new wall(248, 473, 1, gameModel); + gameModel.drawingList[3] = new wall(273, 473, 1, gameModel); + gameModel.drawingList[4] = new normalObject(260, 498, gameModel, "base", 0); + + //加载一个级别 + if(1+ (levelIndex-1)%8 == 1){ + String[] level = new String[]{ + "__", "__", "__", "__", "__", "__", "__", "__", "__", "__", "__", "__", "__", "__", "__", "__", "__", "__", "__", "__", + "__", "__", "__", "__", "__", "__", "__", "__", "__", "__", "__", "__", "__", "__", "__", "__", "__", "__", "__", "__", + "__", "##", "##", "__", "__", "__", "__", "__", "##", "__", "__", "##", "__", "__", "__", "__", "__", "##", "##", "__", + "__", "##", "##", "__", "__", "__", "__", "__", "##", "__", "__", "##", "__", "__", "__", "__", "__", "##", "##", "__", + "__", "##", "##", "__", "__", "__", "__", "__", "##", "__", "__", "##", "__", "__", "__", "__", "__", "##", "##", "__", + "__", "##", "##", "__", "__", "__", "__", "__", "##", "__", "__", "##", "__", "__", "__", "__", "__", "##", "##", "__", + "__", "##", "##", "__", "__", "__", "__", "__", "##", "__", "__", "##", "__", "__", "__", "__", "__", "##", "##", "__", + "__", "##", "##", "__", "__", "__", "__", "__", "##", "__", "__", "##", "__", "__", "__", "__", "__", "##", "##", "__", + "__", "##", "##", "__", "__", "__", "__", "__", "##", "__", "__", "##", "__", "__", "__", "__", "__", "##", "##", "__", + "__", "##", "##", "__", "__", "__", "__", "__", "##", "ss", "ss", "##", "__", "__", "__", "__", "__", "##", "##", "__", + "__", "__", "__", "__", "__", "__", "__", "__", "__", "__", "__", "__", "__", "__", "__", "__", "__", "__", "__", "__", + "s0", "##", "##", "__", "__", "__", "__", "__", "##", "s0", "s0", "##", "__", "__", "__", "__", "__", "##", "##", "s0", + "__", "##", "##", "__", "__", "__", "__", "__", "##", "__", "__", "##", "__", "__", "__", "__", "__", "##", "##", "__", + "__", "##", "##", "__", "__", "__", "__", "__", "##", "__", "__", "##", "__", "__", "__", "__", "__", "##", "##", "__", + "__", "##", "##", "__", "__", "__", "__", "__", "##", "__", "__", "##", "__", "__", "__", "__", "__", "##", "##", "__", + "__", "##", "##", "__", "__", "__", "__", "__", "##", "__", "__", "##", "__", "__", "__", "__", "__", "##", "##", "__", + "__", "##", "##", "__", "__", "__", "__", "__", "##", "__", "__", "##", "__", "__", "__", "__", "__", "##", "##", "__", + "__", "__", "__", "__", "__", "__", "__", "__", "__", "__", "__", "__", "__", "__", "__", "__", "__", "__", "__", "__", + "__", "__", "__", "__", "__", "__", "__", "__", "__", "__", "__", "__", "__", "__", "__", "__", "__", "__", "__", "__", + "__", "__", "__", "__", "__", "__", "__", "__", "__", "__", "__", "__", "__", "__", "__", "__", "__", "__", "__", "__" + }; + loadLevel(gameModel, level); + } + + if(1+ (levelIndex-1)%8 == 2){ + String[] level = new String[]{ + "__", "__", "__", "__", "__", "__", "__", "__", "__", "__", "__", "__", "__", "__", "__", "__", "__", "__", "__", "__", + "$$", "$$", "$$", "$$", "$$", "$$", "$$", "$$", "$$", "$$", "$$", "$$", "$$", "$$", "$$", "$$", "$$", "$$", "$$", "$$", + "$$", "==", "==", "==", "==", "==", "==", "==", "$$", "$$", "==", "==", "==", "==", "==", "==", "==", "==", "==", "$$", + "$$", "$$", "$$", "$$", "$$", "$$", "$$", "$$", "$$", "$$", "$$", "$$", "$$", "$$", "$$", "$$", "$$", "$$", "$$", "$$", + "__", "__", "__", "__", "__", "__", "__", "__", "__", "__", "__", "__", "__", "__", "__", "__", "__", "__", "__", "__", + "__", "__", "__", "__", "__", "__", "__", "__", "__", "__", "__", "__", "__", "__", "__", "__", "__", "__", "__", "__", + "__", "__", "__", "__", "__", "__", "__", "__", "__", "__", "__", "__", "__", "ss", "##", "##", "##", "##", "##", "__", + "__", "__", "__", "__", "__", "__", "__", "__", "__", "__", "__", "__", "__", "__", "__", "__", "__", "__", "__", "__", + "__", "__", "__", "ss", "##", "##", "##", "__", "__", "ss", "ss", "##", "##", "##", "__", "__", "__", "__", "__", "__", + "__", "__", "__", "__", "__", "__", "##", "__", "__", "__", "__", "__", "__", "##", "__", "__", "__", "__", "__", "__", + "__", "$$", "$$", "$$", "$$", "$$", "##", "__", "__", "__", "__", "__", "__", "##", "==", "==", "==", "==", "==", "__", + "__", "$$", "$$", "$$", "$$", "$$", "##", "__", "__", "__", "__", "__", "__", "##", "==", "==", "==", "==", "==", "__", + "__", "$$", "$$", "$$", "$$", "$$", "##", "__", "##", "##", "##", "##", "##", "##", "==", "==", "==", "==", "==", "__", + "__", "$$", "$$", "$$", "$$", "$$", "##", "__", "##", "##", "##", "##", "##", "##", "==", "==", "==", "==", "==", "__", + "__", "$$", "$$", "$$", "$$", "$$", "##", "__", "##", "##", "##", "##", "##", "##", "==", "==", "==", "==", "==", "__", + "__", "$$", "$$", "$$", "$$", "$$", "##", "__", "##", "##", "##", "##", "##", "##", "==", "==", "==", "==", "==", "__", + "__", "$$", "$$", "$$", "$$", "$$", "##", "__", "##", "##", "##", "##", "##", "##", "==", "==", "==", "==", "==", "__", + "__", "$$", "$$", "$$", "$$", "$$", "##", "__", "__", "__", "__", "__", "__", "##", "==", "==", "==", "==", "==", "__", + "__", "$$", "$$", "$$", "$$", "$$", "##", "__", "__", "__", "__", "__", "__", "##", "==", "==", "==", "==", "==", "__", + "__", "$$", "$$", "$$", "$$", "$$", "##", "__", "__", "__", "__", "__", "__", "##", "==", "==", "==", "==", "==", "__" + }; + loadLevel(gameModel, level); + } + + if(1+ (levelIndex-1)%8 == 3){ + String[] level = new String[]{ + "__", "__", "__", "ss", "__", "__", "ss", "__", "__", "__", "__", "__", "__", "__", "__", "__", "s3", "__", "__", "__", + "__", "__", "__", "__", "__", "__", "ss", "##", "##", "##", "__", "##", "##", "##", "##", "__", "s3", "__", "__", "__", + "__", "__", "__", "__", "__", "__", "__", "__", "__", "__", "__", "__", "__", "__", "__", "__", "s3", "__", "__", "__", + "__", "__", "ss", "ss", "__", "##", "##", "##", "##", "__", "__", "##", "##", "__", "##", "##", "##", "__", "__", "__", + "__", "__", "__", "ss", "__", "##", "__", "__", "__", "__", "__", "__", "__", "__", "__", "__", "##", "__", "##", "s1", + "__", "__", "__", "ss", "__", "##", "__", "ss", "##", "ss", "##", "ss", "##", "##", "##", "##", "##", "__", "__", "##", + "__", "__", "__", "ss", "__", "$$", "$$", "$$", "$$", "$$", "$$", "$$", "$$", "$$", "$$", "$$", "$$", "__", "__", "__", + "__", "__", "__", "ss", "$$", "$$", "$$", "$$", "$$", "$$", "$$", "$$", "$$", "$$", "$$", "$$", "$$", "__", "__", "__", + "__", "__", "__", "##", "ss", "ss", "ss", "ss", "##", "##", "##", "##", "##", "$$", "$$", "$$", "$$", "##", "##", "##", + "##", "__", "__", "##", "$$", "$$", "$$", "$$", "$$", "$$", "$$", "$$", "$$", "$$", "$$", "$$", "$$", "__", "__", "__", + "##", "##", "__", "##", "$$", "$$", "$$", "$$", "$$", "$$", "$$", "$$", "$$", "$$", "$$", "$$", "$$", "__", "__", "__", + "##", "##", "##", "##", "$$", "$$", "$$", "$$", "$$", "$$", "$$", "$$", "##", "##", "##", "##", "##", "__", "__", "__", + "##", "##", "##", "##", "##", "##", "$$", "##", "$$", "##", "$$", "$$", "$$", "$$", "$$", "##", "__", "__", "__", "__", + "##", "##", "##", "##", "$$", "$$", "$$", "$$", "$$", "##", "$$", "$$", "$$", "$$", "$$", "##", "__", "__", "__", "__", + "#0", "s0", "s0", "s0", "$$", "ss", "ss", "ss", "ss", "##", "ss", "ss", "$$", "ss", "ss", "##", "##", "##", "ss", "##", + "__", "__", "__", "##", "__", "__", "$$", "$$", "$$", "$$", "$$", "$$", "$$", "$$", "$$", "$$", "$$", "$$", "$$", "##", + "__", "__", "__", "##", "__", "__", "__", "$$", "$$", "$$", "$$", "$$", "$$", "$$", "$$", "$$", "$$", "$$", "$$", "$$", + "__", "__", "__", "##", "__", "__", "__", "__", "__", "__", "__", "__", "__", "__", "__", "__", "__", "__", "__", "__", + "__", "__", "__", "##", "__", "__", "__", "__", "__", "__", "__", "__", "__", "__", "__", "__", "__", "__", "__", "__", + "__", "__", "__", "##", "__", "__", "__", "__", "__", "__", "__", "__", "__", "__", "__", "__", "__", "__", "__", "__" + }; + loadLevel(gameModel, level); + } + + if(1+ (levelIndex-1)%8 == 4){ + String[] level = new String[]{ + "__", "__", "__", "__", "__", "__", "__", "__", "__", "__", "__", "__", "__", "__", "__", "__", "__", "__", "__", "__", + "__", "__", "__", "__", "__", "__", "__", "__", "__", "__", "__", "__", "__", "__", "__", "__", "__", "__", "__", "__", + "__", "__", "__", "__", "__", "__", "__", "__", "__", "__", "__", "__", "__", "__", "__", "__", "__", "__", "__", "__", + "__", "__", "__", "__", "##", "##", "##", "##", "##", "##", "##", "##", "##", "##", "##", "__", "__", "__", "__", "__", + "__", "__", "__", "##", "##", "##", "##", "##", "##", "##", "##", "##", "ss", "##", "##", "##", "##", "__", "__", "__", + "__", "__", "##", "##", "##", "##", "##", "##", "##", "##", "##", "##", "##", "##", "##", "ss", "ss", "s2", "__", "__", + "__", "__", "##", "##", "$$", "$$", "$$", "$$", "$$", "$$", "$$", "$$","$$", "$$", "$$", "$$", "$$", "s2", "__", "__", + "__", "__", "##", "##", "##", "$$", "$$", "$$", "$$", "$$", "##", "$$", "$$", "$$", "$$", "$$", "$$", "s2", "__", "__", + "__", "##", "##", "##", "##", "##", "$$", "$$", "$$", "##", "$$", "##", "$$", "$$", "$$", "$$", "$$", "s2", "__", "__", + "__", "##", "##", "##", "##", "##", "$$", "$$", "##", "$$", "$$", "$$", "##", "$$", "$$", "$$", "$$", "s2", "__", "__", + "__", "##", "##", "##", "##", "##", "$$", "##", "$$", "$$", "$$", "$$", "$$", "##", "$$", "$$", "$$", "s2", "__", "__", + "__", "##", "##", "##", "##", "##", "$$", "$$", "##", "$$", "$$", "$$", "##", "$$", "$$", "$$", "$$", "s2", "__", "__", + "__", "##", "##", "##", "##", "$$", "$$", "$$", "$$", "##", "$$", "##", "$$", "$$", "$$", "$$", "##", "s2", "__", "__", + "__", "__", "##", "##", "$$", "$$", "$$", "$$", "$$", "$$", "##", "$$", "$$", "$$", "$$", "$$", "##", "##", "__", "__", + "__", "__", "##", "$$", "$$", "$$", "$$", "$$", "$$", "s3", "s2", "$$", "$$", "$$", "$$", "##", "##", "s0", "s0", "s0", + "__", "__", "##", "##", "##", "$$", "$$", "$$", "$$", "$$", "$$", "$$", "$$", "$$", "##", "##", "__", "__", "__", "__", + "__", "__", "__", "##", "##", "##", "##", "##", "##", "##", "##", "##", "##", "##", "##", "__", "__", "__", "__", "__", + "__", "__", "__", "__", "__", "__", "__", "__", "__", "__", "__", "__", "__", "__", "__", "__", "__", "__", "__", "__", + "__", "__", "__", "__", "__", "__", "__", "__", "__", "__", "__", "__", "__", "__", "__", "__", "__", "__", "__", "__", + "__", "__", "__", "__", "__", "__", "__", "__", "__", "__", "__", "__", "__", "__", "__", "__", "__", "__", "__", "__" + }; + loadLevel(gameModel, level); + } + + if(1+ (levelIndex-1)%8 == 5){ + String[] level = new String[]{ + "__", "__", "__", "__", "__", "__", "__", "__", "__", "__", "__", "__", "__", "==", "__", "__", "__", "__", "__", "__", + "__", "__", "__", "__", "__", "__", "__", "__", "__", "__", "__", "__", "__", "__", "__", "__", "__", "__", "__", "__", + "__", "==", "==", "==", "__", "__", "==", "==", "==", "==", "==", "==", "__", "==", "==", "==", "==", "==", "==", "__", + "__", "==", "ss", "__", "__", "__", "__", "==", "__", "__", "__", "__", "__", "__", "__", "__", "__", "__", "==", "__", + "__", "==", "__", "__", "__", "__", "__", "==", "__", "==", "==", "__", "ss", "==", "==", "==", "==", "__", "==", "__", + "__", "==", "__", "==", "==", "==", "==", "==", "__", "==", "__", "__", "==", "__", "__", "==", "__", "__", "==", "__", + "__", "==", "__", "==", "__", "__", "__", "__", "__", "==", "__", "__", "==", "__", "__", "==", "__", "__", "==", "__", + "__", "==", "__", "==", "__", "__", "==", "==", "==", "==", "__", "__", "==", "__", "__", "==", "__", "==", "==", "__", + "__", "==", "__", "==", "__", "__", "==", "__", "__", "__", "__", "__", "==", "ss", "__", "__", "__", "==", "__", "__", + "__", "==", "__", "==", "__", "__", "==", "__", "__", "==", "__", "__", "==", "__", "__", "==", "__", "==", "__", "==", + "__", "==", "__", "==", "__", "__", "==", "__", "__", "==", "__", "__", "==", "__", "__", "==", "__", "==", "__", "__", + "__", "==", "__", "==", "__", "==", "==", "__", "__", "==", "__", "__", "==", "__", "==", "==", "__", "==", "==", "__", + "__", "==", "__", "__", "__", "__", "__", "__", "__", "==", "__", "__", "==", "__", "==", "__", "__", "__", "==", "__", + "__", "==", "__", "__", "__", "__", "__", "__", "__", "__", "__", "__", "==", "__", "==", "==", "==", "__", "__", "__", + "__", "==", "==", "==", "__", "==", "==", "==", "__", "ss", "ss", "==", "==", "__", "__", "__", "==", "__", "==", "__", + "__", "__", "__", "__", "__", "__", "==", "__", "__", "__", "__", "__", "==", "__", "ss", "__", "==", "__", "==", "__", + "==", "==", "==", "==", "==", "__", "==", "__", "__", "__", "__", "__", "==", "__", "__", "__", "==", "__", "==", "__", + "__", "__", "__", "__", "__", "__", "==", "__", "__", "__", "__", "__", "==", "==", "==", "__", "==", "==", "==", "__", + "__", "__", "__", "__", "__", "__", "==", "__", "__", "__", "__", "__", "__", "__", "__", "__", "__", "__", "==", "__", + "__", "__", "__", "__", "__", "__", "==", "__", "__", "__", "__", "__", "__", "__", "__", "__", "__", "__", "==", "__" + }; + loadLevel(gameModel, level); + } + + if(1+ (levelIndex-1)%8 == 6){ + String[] level = new String[]{ + "__", "__", "__", "__", "__", "__", "__", "__", "__", "__", "__", "__", "__", "__", "__", "__", "__", "__", "__", "__", + "__", "__", "__", "$$", "__", "__", "__", "__", "$$", "__", "__", "__", "__", "__", "__", "__", "__", "__", "$$", "__", + "__", "__", "$$", "ss", "$$", "__", "__", "$$", "ss", "$$", "__", "__", "__", "__", "__", "__", "__", "$$", "ss", "$$", + "__", "$$", "ss", "ss", "$$", "__", "$$", "ss", "ss", "ss", "$$", "__", "__", "__", "__", "__", "__", "$$", "ss", "$$", + "__", "$$", "ss", "ss", "ss", "$$", "ss", "ss", "ss", "$$", "$$", "$$", "$$", "__", "__", "__", "$$", "ss", "ss", "$$", + "__", "$$", "ss", "ss", "ss", "$$", "$$", "ss", "$$", "$$", "ss", "ss", "ss", "$$", "__", "__", "$$", "ss", "ss", "$$", + "$$", "ss", "ss", "ss", "ss", "$$", "__", "$$", "$$", "$$", "ss", "ss", "ss", "$$", "__", "__", "$$", "ss", "ss", "$$", + "$$", "ss", "ss", "ss", "ss", "$$", "__", "__", "$$", "$$", "ss", "$$", "$$", "__", "__", "$$", "ss", "ss", "ss", "$$", + "$$", "ss", "ss", "ss", "ss", "$$", "__", "$$", "ss", "ss", "ss", "$$", "__", "__", "__", "$$", "ss", "ss", "ss", "$$", + "$$", "ss", "ss", "ss", "ss", "$$", "__", "$$", "ss", "ss", "ss", "$$", "__", "__", "__", "$$", "ss", "ss", "$$", "__", + "$$", "ss", "ss", "ss", "$$", "__", "__", "ss", "ss", "$$", "$$", "__", "__", "__", "__", "$$", "ss", "ss", "$$", "__", + "$$", "ss", "ss", "ss", "$$", "__", "$$", "ss", "ss", "$$", "__", "__", "__", "__", "$$", "ss", "ss", "ss", "$$", "__", + "$$", "ss", "ss", "ss", "$$", "$$", "ss", "ss", "$$", "__", "__", "__", "__", "__", "__", "$$", "$$", "$$", "__", "__", + "$$", "ss", "ss", "ss", "$$", "$$", "ss", "$$", "__", "__", "$$", "__", "__", "__", "__", "__", "__", "__", "__", "__", + "$$", "ss", "ss", "ss", "$$", "__", "$$", "__", "__", "$$", "ss", "$$", "__", "__", "__", "__", "__", "__", "__", "__", + "__", "$$", "ss", "ss", "$$", "__", "__", "__", "__", "$$", "ss", "ss", "$$", "__", "__", "__", "__", "__", "__", "__", + "__", "$$", "ss", "ss", "$$", "__", "__", "__", "__", "$$", "ss", "ss", "ss", "$$", "$$", "$$", "$$", "$$", "__", "__", + "__", "$$", "ss", "ss", "$$", "__", "__", "__", "__", "__", "$$", "ss", "ss", "ss", "ss", "ss", "ss", "ss", "$$", "__", + "__", "__", "$$", "ss", "$$", "__", "__", "__", "__", "__", "__", "$$", "ss", "ss", "ss", "ss", "$$", "$$", "__", "__", + "__", "__", "__", "$$", "__", "__", "__", "__", "__", "__", "__", "__", "$$", "$$", "$$", "$$", "__", "__", "__", "__" + + }; + loadLevel(gameModel, level); + } + + if(1+ (levelIndex-1)%8 == 7){ + String[] level = new String[]{ + "__", "__", "__", "__", "__", "__", "__", "__", "__", "__", "__", "__", "__", "__", "__", "__", "__", "__", "__", "__", + "__", "__", "__", "__", "__", "__", "__", "__", "__", "__", "__", "__", "__", "__", "__", "__", "__", "__", "__", "__", + "__", "__", "__", "__", "__", "__", "__", "__", "##", "##", "##", "__", "__", "__", "__", "$$", "$$", "$$", "__", "__", + "__", "__", "__", "ss", "ss", "ss", "__", "__", "##", "##", "##", "__", "__", "__", "__", "$$", "$$", "$$", "__", "__", + "__", "__", "__", "ss", "ss", "ss", "__", "__", "##", "##", "##", "__", "__", "__", "__", "$$", "$$", "$$", "__", "__", + "__", "__", "__", "ss", "ss", "ss", "__", "__", "__", "__", "__", "__", "__", "__", "__", "__", "__", "__", "__", "__", + "__", "__", "__", "__", "__", "__", "__", "__", "__", "__", "__", "##", "##", "##", "__", "__", "==", "==", "==", "__", + "$$", "$$", "$$", "__", "__", "__", "__", "__", "__", "__", "__", "##", "##", "##", "__", "__", "==", "==", "==", "__", + "$$", "$$", "$$", "__", "__", "__", "__", "__", "__", "__", "__", "##", "##", "##", "__", "__", "==", "==", "==", "__", + "$$", "$$", "$$", "__", "__", "__", "ss", "ss", "ss", "__", "__", "__", "__", "__", "##", "##", "##", "__", "__", "__", + "__", "__", "__", "__", "__", "__", "ss", "ss", "ss", "__", "__", "__", "__", "__", "##", "##", "##", "__", "__", "__", + "__", "__", "__", "__", "__", "__", "ss", "ss", "ss", "__", "__", "__", "__", "__", "##", "##", "##", "__", "__", "__", + "__", "__", "__", "__", "__", "__", "__", "__", "__", "__", "__", "__", "__", "__", "__", "__", "__", "__", "__", "__", + "__", "ss", "ss", "ss", "__", "__", "__", "__", "__", "__", "__", "__", "__", "__", "__", "__", "__", "__", "__", "__", + "__", "ss", "ss", "ss", "__", "__", "__", "__", "__", "##", "##", "##", "__", "__", "__", "__", "__", "__", "__", "__", + "__", "ss", "ss", "ss", "__", "__", "__", "__", "__", "##", "##", "##", "__", "__", "__", "__", "__", "__", "__", "__", + "__", "__", "__", "__", "__", "__", "__", "__", "__", "##", "##", "##", "__", "__", "__", "__", "__", "__", "__", "__", + "__", "__", "__", "__", "##", "##", "##", "__", "__", "__", "__", "__", "__", "__", "__", "==", "==", "==", "__", "__", + "__", "__", "__", "__", "##", "##", "##", "__", "__", "__", "__", "__", "__", "__", "__", "==", "==", "==", "__", "__", + "__", "__", "__", "__", "##", "##", "##", "__", "__", "__", "__", "__", "__", "__", "__", "==", "==", "==", "__", "__" + }; + loadLevel(gameModel, level); + } + + if(1+ (levelIndex-1)%8 == 8){ + String[] level = new String[]{ + "__", "__", "__", "__", "__", "__", "__", "__", "__", "__", "__", "__", "__", "__", "__", "__", "__", "__", "__", "__", + "##", "##", "##", "##", "__", "__", "__", "__", "__", "__", "__", "__", "__", "__", "__", "__", "__", "__", "__", "__", + "##", "##", "##", "##", "__", "__", "__", "__", "__", "__", "__", "__", "__", "__", "__", "__", "__", "__", "__", "__", + "__", "__", "##", "__", "__", "__", "__", "__", "__", "__", "__", "__", "__", "__", "__", "__", "__", "__", "__", "__", + "__", "__", "##", "__", "__", "__", "__", "__", "__", "__", "__", "__", "__", "__", "__", "__", "__", "__", "__", "__", + "__", "__", "##", "__", "__", "__", "__", "__", "__", "__", "__", "__", "__", "__", "__", "__", "__", "__", "__", "__", + "__", "__", "##", "__", "__", "__", "__", "__", "__", "__", "__", "__", "__", "__", "__", "__", "__", "__", "__", "__", + "__", "__", "##", "__", "__", "__", "__", "__", "__", "__", "__", "__", "__", "__", "__", "__", "__", "__", "__", "__", + "__", "__", "##", "__", "__", "__", "__", "__", "__", "__", "__", "__", "__", "__", "__", "__", "__", "__", "__", "__", + "__", "__", "##", "__", "__", "##", "##", "##", "__", "##", "__", "__", "__", "##", "__", "__", "##", "##", "##", "__", + "__", "__", "##", "__", "##", "__", "__", "##", "__", "##", "__", "__", "__", "##", "__", "##", "__", "__", "##", "__", + "__", "__", "##", "__", "##", "__", "__", "##", "__", "__", "##", "__", "##", "__", "__", "##", "__", "__", "##", "__", + "__", "__", "##", "__", "##", "__", "__", "##", "__", "__", "##", "__", "##", "__", "__", "##", "__", "__", "##", "__", + "__", "__", "##", "__", "##", "__", "__", "##", "__", "__", "##", "__", "##", "__", "__", "##", "__", "__", "##", "__", + "##", "__", "##", "__", "##", "__", "__", "##", "__", "__", "__", "##", "__", "__", "__", "##", "__", "__", "##", "__", + "__", "##", "__", "__", "__", "##", "##", "__", "##", "__", "__", "##", "__", "__", "__", "__", "##", "##", "__", "##", + "__", "__", "__", "__", "__", "__", "__", "__", "__", "__", "__", "__", "__", "__", "__", "__", "__", "__", "__", "__", + "__", "__", "__", "__", "__", "__", "__", "__", "__", "__", "__", "__", "__", "__", "__", "__", "__", "__", "__", "__", + "__", "__", "__", "__", "__", "__", "__", "__", "__", "__", "__", "__", "__", "__", "__", "__", "__", "__", "__", "__", + "__", "__", "__", "__", "__", "__", "__", "__", "__", "__", "__", "__", "__", "__", "__", "__", "__", "__", "__", "__" + }; + loadLevel(gameModel, level); + } + } + public static void loadLevel(ClientModel gameModel, String[] level){ + for(int i = 0; i < level.length; i++){ + if(level[i].equals("##")) + gameModel.addActor(new wall(23 + (i%20)*25, 23 + (i/20)*25, 4,gameModel)); + if(level[i].equals("#0")) + gameModel.addActor(new wall(23 + (i%20)*25, 23 + (i/20)*25, 0, gameModel)); + if(level[i].equals("#1")) + gameModel.addActor(new wall(23 + (i%20)*25, 23 + (i/20)*25, 1, gameModel)); + if(level[i].equals("#2")) + gameModel.addActor(new wall(23 + (i%19)*25, 23 + (i/20)*25, 2, gameModel)); + if(level[i].equals("#3")) + gameModel.addActor(new wall(23 + (i%20)*25, 23 + (i/20)*25, 3, gameModel)); + if(level[i].equals("ss")) + gameModel.addActor(new Steelwall(23 + (i%20)*25, 23 + (i/20)*25, 4, gameModel)); + if(level[i].equals("s0")) + gameModel.addActor(new Steelwall(23 + (i%20)*25, 23 + (i/20)*25, 0, gameModel)); + if(level[i].equals("s1")) + gameModel.addActor(new Steelwall(23 + (i%20)*25, 23 + (i/20)*25, 1, gameModel)); + if(level[i].equals("s2")) + gameModel.addActor(new Steelwall(23 + (i%20)*25, 23 + (i/20)*25, 2, gameModel)); + if(level[i].equals("s3")) + gameModel.addActor(new Steelwall(23 + (i%20)*25, 23 + (i/20)*25, 3, gameModel)); + + if(level[i].equals("$$")){ + for(int j = 399; j >=0; j--){ + if(gameModel.drawingList[j] == null){ + gameModel.drawingList[j] = new normalObject(23 + (i%20)*25, 23 + (i/20)*25, gameModel, "grass", -1); + break; + } + } + } + if(level[i].equals("==")) + gameModel.addActor(new normalObject(23 + (i%20)*25, 23 + (i/20)*25, gameModel, "river", 71)); + } + } +} \ No newline at end of file diff --git a/源代码/client/src/normalObject.java b/源代码/client/src/normalObject.java new file mode 100644 index 0000000..a0ab1e8 --- /dev/null +++ b/源代码/client/src/normalObject.java @@ -0,0 +1,50 @@ +import java.awt.*; +//这个类代表除了墙和钢墙外所有其他对象 +public class normalObject implements Actor{ + public String Type; + public Image image; + public int xPos; + public int yPos; + public ClientModel gameModel; + + public normalObject(int xPos, int yPos, ClientModel gameModel, String Type, int imageIndex){ + this.xPos = xPos; + this.yPos = yPos; + this.gameModel = gameModel; + this.Type = Type; + if(imageIndex != -1) + image = gameModel.textures[imageIndex]; + } + + public void draw(Graphics g){ + if(image != null) + g.drawImage(image, xPos - 12, yPos - 12, null); + else{ + g.setColor(new Color(0, 225, 0)); + for(int i = yPos - 11; i <= yPos + 12; i+=5) + g.drawLine(xPos - 12, i, xPos + 12, i); + for(int i = xPos - 11; i <= xPos + 12; i+=5) + g.drawLine(i, yPos - 12, i, yPos + 12); + g.setColor(new Color(0, 128, 0)); + for(int i = yPos - 10; i <= yPos + 12; i+=5) + g.drawLine(xPos - 12, i, xPos + 12, i); + for(int i = xPos - 10; i <= xPos + 12; i+=5) + g.drawLine( i, yPos - 12, i, yPos + 12); + } + + if(!Type.equals("river") && !Type.equals("grass") && !Type.equals("base")) + gameModel.removeActor(this); + } + + public int getxPos(){ + return xPos; + } + + public int getyPos(){ + return yPos; + } + + public String getType(){ + return Type; + } +} \ No newline at end of file diff --git a/源代码/client/src/shield.java b/源代码/client/src/shield.java new file mode 100644 index 0000000..171b333 --- /dev/null +++ b/源代码/client/src/shield.java @@ -0,0 +1,32 @@ +import java.awt.*; +public class shield implements Actor{ + public int xPos; + public int yPos; + public ClientModel gameModel; + public String Type = "shield"; + + public shield(int xPos, int yPos, ClientModel gameModel){ + this.xPos = xPos; + this.yPos = yPos; + this.gameModel = gameModel; + } + + public void draw(Graphics g){ + g.setColor(Color.red); + g.drawRect(xPos - 12, yPos - 12, 25,25); + g.drawRect(xPos - 11, yPos - 11, 23,23); + gameModel.removeActor(this); + } + + public int getxPos(){ + return xPos; + } + + public int getyPos(){ + return yPos; + } + + public String getType(){ + return Type; + } +} \ No newline at end of file diff --git a/源代码/client/src/wall.java b/源代码/client/src/wall.java new file mode 100644 index 0000000..97076ec --- /dev/null +++ b/源代码/client/src/wall.java @@ -0,0 +1,100 @@ +import java.awt.*; + +public class wall implements Actor{ + public final String Type = "wall"; + public Image wall; + public int xPos; + public int yPos; + public boolean[] shape; + public ClientModel gameModel; + + public wall(int xPos, int yPos, int orientation, ClientModel gameModel){ + this.xPos = xPos; + this.yPos = yPos; + this.gameModel = gameModel; + shape = new boolean[16]; + wall = gameModel.textures[70]; + + if(orientation == 0){ + for(int i = 8; i < 12; i ++) + shape[i] = true; + for(int i = 12; i < 16; i ++) + shape[i] = true; + } + if(orientation == 1){ + for(int i = 0; i < 4; i ++) + shape[i] = true; + for(int i = 4; i < 8; i ++) + shape[i] = true; + } + if(orientation == 2){ + for(int i = 3; i <= 15; i+=4) + shape[i] = true; + for(int i = 2; i <= 14; i+=4) + shape[i] = true; + } + if(orientation == 3){ + for(int i = 1; i <= 13; i+=4) + shape[i] = true; + for(int i = 0; i <= 12; i+=4) + shape[i] = true; + } + } + + public void draw(Graphics g){ + boolean walldestoried = true; + for(int i = 0; i < shape.length; i++) + if(!shape[i]){ + walldestoried = false; + break; + } + if(walldestoried) + return; + g.drawImage(wall, xPos - 12, yPos - 12, null); + g.setColor(new Color(128, 64, 0)); + if(shape[0]) + g.fillRect(xPos - 12, yPos - 12, 7, 7); + if(shape[1]) + g.fillRect(xPos - 6, yPos - 12, 7, 7); + if(shape[2]) + g.fillRect(xPos, yPos - 12, 7, 7); + if(shape[3]) + g.fillRect(xPos + 6, yPos - 12, 7, 7); + if(shape[4]) + g.fillRect(xPos - 12, yPos - 6, 7, 7); + if(shape[5]) + g.fillRect(xPos - 6, yPos - 6, 7, 7); + if(shape[6]) + g.fillRect(xPos, yPos - 6, 7, 7); + if(shape[7]) + g.fillRect(xPos + 6, yPos - 6, 7, 7); + if(shape[8]) + g.fillRect(xPos - 12, yPos, 7, 7); + if(shape[9]) + g.fillRect(xPos - 6, yPos, 7, 7); + if(shape[10]) + g.fillRect(xPos, yPos, 7, 7); + if(shape[11]) + g.fillRect(xPos + 6, yPos, 7, 7); + if(shape[12]) + g.fillRect(xPos - 12, yPos + 6, 7, 7); + if(shape[13]) + g.fillRect(xPos - 6, yPos + 6, 7, 7); + if(shape[14]) + g.fillRect(xPos, yPos + 6, 7, 7); + if(shape[15]) + g.fillRect(xPos + 6, yPos + 6, 7, 7); + } + + public int getxPos(){ + return xPos; + } + + public int getyPos(){ + return yPos; + } + + public String getType(){ + return Type; + } +} \ No newline at end of file diff --git a/源代码/server/.settings/org.eclipse.jdt.core.prefs b/源代码/server/.settings/org.eclipse.jdt.core.prefs new file mode 100644 index 0000000..bb35fa0 --- /dev/null +++ b/源代码/server/.settings/org.eclipse.jdt.core.prefs @@ -0,0 +1,11 @@ +eclipse.preferences.version=1 +org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled +org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.8 +org.eclipse.jdt.core.compiler.codegen.unusedLocal=preserve +org.eclipse.jdt.core.compiler.compliance=1.8 +org.eclipse.jdt.core.compiler.debug.lineNumber=generate +org.eclipse.jdt.core.compiler.debug.localVariable=generate +org.eclipse.jdt.core.compiler.debug.sourceFile=generate +org.eclipse.jdt.core.compiler.problem.assertIdentifier=error +org.eclipse.jdt.core.compiler.problem.enumIdentifier=error +org.eclipse.jdt.core.compiler.source=1.8 diff --git a/源代码/server/bin/Actor.class b/源代码/server/bin/Actor.class new file mode 100644 index 0000000000000000000000000000000000000000..740d713cd3295abab216e7e44e6dc83589c66bc8 GIT binary patch literal 322 zcmYk1!A`tZU7AkOoikMUVe z44pAFBP&Zy>KDFB(&xVq{?l`(+zJkbG$hbsCk3a5giG1jr_Pr3uDf14 z?HlDL?g#_|S*-+5D6Q0};JR+g<(=OVJK>2RfP|Q{yHy&ymaIK9XJ*cPGvCZ#|E>H1 z;4v&n=wj$jbF;$DaYMIEL*wS~hy*V~=!{ZP;+mr8s%Bdcf`#Z-mtD!n2Jh8^vX43AI}LB&q_1UF9` zW`XAz1|!M4qM8s06VZ$xyU-_LH~F?zAKe7e8r!^Lg{*D{Ivc*1lY7UahZR_;$7N z>As=X_dm9N{jT}d*MGlzp}Bl>efd&=9@!(~5kwdQN-me;rIM1T!rbeEvKyGTOjXaj zP+~InVjoqzqVh!s*-bh_66JgV2PMQQn3J>6${4{RGAuZ;CsnRd&b#cQor{+iDRlh! z3_oYtH;Di->j?>uGxUnGc3Q}I5{DV2Jhz0GphMK@z@5qZ@H7Jg7{w6@&urqO14qWQ zc#cTL&z2R9+Pw*}L)k=hPQp=!of}+se28?*wjN0nV_{3=pZa@1&HXJBxv| zQ8u%DQWewM(>6Z`L|x&QFemWe|t;V)Z8>%Vj0NCbXqy%no=t9 z5{77Pc<8?cEEE#kgEm|j{ryBC8aFx}CRu0#vAx$J$8O-BYqm|d(AhV_yBlGWW%3c) z9q6GiaRj|i6c&Wnw!IvyL9StE4Fgq#Tp|2W9S>h~glG->>v%N$R2_*b&bk)2Fg6<= zzk!KOMs>VU$4lhvTFurlMV51?8hC|l!x=JYcL=}ccwNWT#+7(&?q>wuIN>)%K7_zS zxPTZT0%6)tsCE;kK3Z&XI-R7`XSB+y=*J}tUz&zK%75`+ zm{d*t;1BRe8E3B5#A>``Gds`DJUjEu-uEA0zX5oJ#|}~g%Uxwg%Cw`hqZM^QEE8jYp6WB~pd1V`Fq(a+x?pqy&o{p^wl@XY;XF9GN600{u+oHp# zI@I==K&krIX{{%aX-5N?{R?GU zc~nt%P$T^&h>LxeBpX|4C{U0L8~^KoZtGg8eLDTtJWV4^Mu@&A-#ikAmdoY*rr*gX=NdbMII?VyA-V) z@`NtX?g{yfyN;MTuj>0=VJ%vf^5*%hpi?@|tcyH5ZB literal 0 HcmV?d00001 diff --git a/源代码/server/bin/ServerControler$3.class b/源代码/server/bin/ServerControler$3.class new file mode 100644 index 0000000000000000000000000000000000000000..9255b0c9639c38f4ef9f3b3c4016837f489f1a93 GIT binary patch literal 1086 zcmaJ=OHUI~6#i~o=z~$pLsaCYR&0wm}pD@2_~*w`8%Ne2ovKu<4Cj^XEK?4zVn#xeCN!!ABSH6+{RQ8K7p3Jve%V8 zW0{U^m6aV!2N4j6uE=$nDoeAJT3A|9MJI?xfo>O-8%|2CE7M6$7ahYgvqsfXrm_VZ zon@mM8>Xt+y0RH^P8z1++!tt%pYbLN0)ZJzS78X8(-1@`0zaBHgb@|+$2p)mYnW<& zt+J%-hjOW`1X{CJQI-qRHrV#S0Fw}CtN%zWO(dG7OLj%C)Lmv{kjr z6vShWj%m2T&QM8K)B??f!J8W53^p;Ccckqoo$;iG0mdVYFLE_Kgh7Fxql3@2ox_uN zA5LDrJ$}Dm+kSrhZ0G3kMeX3Awz(Cd)Rcx{j8Ll7^&ByfB~tQ&r-D22yki??iFywq zeYWKB)~nk7CYN+;6Mf3>`k#oT4N)&X&B;}7Mv=U=W*5~1gQwVDr|S^UgXEqyi)E`y zOmfOuwshVFnqb%O?I{>)BlDN$yd>J3Nvk+hmLzQzeY8$~dKw_2QQj)rd>=hwL~?0O7|4f zn4`Zti!nUHIEt8Xxp%m|=pJ`Kr3Bbv@n zw70cz^NiY(;0y&3Bc>*zs;NmnEzFW27z&pr3DgjXT-AkqikoK*vyI0Ywv}3D>Y|Lx-j<9t-yzl+dhXmD5j~SBz@$o!d=kB* zUX;pUFS?w^gDFSn-BV}qnz+>`X8PyGr>H1Jbibd!|C)*vS00GoCv%r(!^)nZlI$N< zY_&z^?z!sp4J%%hGXzD?n^dag-5c{m!|B*vqhfIM`|MY8664cz<3lNJ(2Gij=s&dW zKTH@Hb+LH4>7b4`8|`L{AJybI7A+Z&pd2ikn?^mBFf8hS6SvP9aXHj`De}S^L^a+S z{%v^VwEK_iv{MZU)v~xnk4{@aX9ZYZo?H)F;S4%C@R4*SQTvIP5?^`62l&gUu==fQ zlP_hiMtawyfOtRoNNFL8=%!J@+H{oebd)L}P*1SJz8^2;FGYPz$?cMtusBxHIO Hy6O7~FDY9E literal 0 HcmV?d00001 diff --git a/源代码/server/bin/ServerControler$5.class b/源代码/server/bin/ServerControler$5.class new file mode 100644 index 0000000000000000000000000000000000000000..e4accd0d4614e78caed2bba17b5fa1f5838b2cf2 GIT binary patch literal 714 zcmaJh-6*+_}+8RJ@NM+m)`(9#dd_6z|xTHjBMX%XH8DFy&oYIXr9WM z?B-G*caO%Wl(`6t0_!Cz&s~>hq+Rz_=9JN?DjaFD0*mfM741D{O)IoLzI?8M zMd!Ww+yizqXZ-@nq2|BS&t*|if&1)mz-s}b+4M&9W2o_}BWCm}@1F75Bk}Iz&q#K^ z;QFUBXUSvbjjw)#Wj-fdYU{TN6)ele8tTwL5dKAl3?{$(wur)d~6#rd_ZdliXDWJ5rRZ1z3YOGdE8~YFhiW0GcvET!jVYAhz#Vhua zZR-Z(06iYo49$9S%qO--ELOOHr`;rWe0Dh^Q+@&F$>Y4UiSM;LZiwdNMnD5?rnhYC=N z9TK)v+zquTD8ma3MSWb41<94#%NwEz!(w19!fL02m+&&fra>x5XV~gy5){XP7rPja zX2!qE{*?Obx5@0pgK|slDPNwLPLIzlF5FwX`b&1=VfxzD%=NpAsjxaSPQ|qu1YVnVQi{6?##{ zaNt=cnbB|3x9%)G`T1EY*;})jv3u$98_S=5mihcacJfOnyo?&WA)%IG`~TplU=Q|E z6206aeu&1}O|;?Jr{GQOr+yDnjIulrzCN!;BC~A;-G_dlg4#w z-VVEWSN!o|s>Xk;gI}@imw=3SaaaO1yHsSCtD)dM5Dg_tPFM*-Ry#yki;ou{GC)Q> zj!I~tcH5<{(NNHcCZaXJoKSTl+&Ylkdir^oXw)U)qZOFe*w!aBJ;F^dj*;Es{6gl3 zRQA`I?ATO#I=M76OT3WLj8;MaN+F$4(1w!~OpV33LDld1ua4#v;f5hdnsG`&yC~ah zMI8nd5PeQ72;mG3QcPDzXskwJe3do69Dn4f9-RuhaF*~JQuPFHyTnkrHkp;mbB(lTnR zvovY#mKq)isxfyJ$nDXD8RkuzSQf<_#(1x2C{1^x5!Rz|B2kcAebI=(oQ9Tm!zu#< z>n2$2BBjMJXgBIAZIU>4(bmeR)yayA#Ofj`kA4!obYDPH9i7FETvIzo{~kekXzLV; zJNt#U1x}%e&I;Lx+imdCm-ZNn9WU%4JhtxBnpw!RD7k|wM|#osN)o$Q~0bEmK65st4@N+OuV$E(iCX9sC^bDi`swST00S5# LNhU=BHU0eyH5C4< literal 0 HcmV?d00001 diff --git a/源代码/server/bin/ServerControler$7.class b/源代码/server/bin/ServerControler$7.class new file mode 100644 index 0000000000000000000000000000000000000000..f4a79152bc7dffadf70780b499467d19c4578d68 GIT binary patch literal 2566 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 literal 0 HcmV?d00001 diff --git a/源代码/server/bin/ServerView.class b/源代码/server/bin/ServerView.class new file mode 100644 index 0000000000000000000000000000000000000000..7c1cd4a5b0f2be5406cdecb10ce9d7fdd926f132 GIT binary patch literal 2374 zcmZuy+jA3D9R5yHni3XBS}5f%D3}Ipuz+C8wV{G=WXFZZ@<Hm z;Zq+x3jQ|3K4sV)Nu$SyB8Acu`YF9PlIcmNyCS<9Y&~TtOi$^_^jMjl6DZqp=$x~$_^X{r?&y-A11yY+0w*q)BJ8kwwM7bOg{n<$B7JZ_}( z>LgP}CZl&54N1d{D^yGdZ8v%yS3=ww86zEU&TG@sn3Z;H%QS3-U{l_v=s1ho(^6Jk zyqH;#H4908@up-t>1m;MmU>Ii9 z)H9hDH{f$Zl~1D!_OlwEliO!y3}?boKNMDKcpf2&h%GJ~X-86|P(BW(_c#%eFqwv3 z>qi)?eOOh&&o1$3kwd5UY=L*iEjI_hM}5R7=A=hEuoq_owlvh zFb&1RTP@254IA-t9=^`XrsEj}U#O8kfnqvlN$?65nU?KG4K@oH6I3jE66grFY1ocB zCX-gy>9LbtwqPlgO|Ud-@w{u{4n|^PPImoQMSet4EoQ!=VJ2n?xj~j)8g`?JJwp8Y zw0_Jq2woIAC`PvMnn`H+$}PcOnmBg#`lJ2cor2I&g4d;HNAErS=E@%QI z1xjg{E}ke@8oKcYJCjcAFple4(}|i^#@N$s*t(On(h?~*PfEO2a5QAcgV~YHBwe2s zdNlNo2ZJLad0K+u!)Z2lzI)vc^`j4ONddgAFgsM}U711}207^kFI zQt({DQYEE{Wkm3D)(aBbk6&yvl(;+7=FS|ET9`p{%&{zUz_tDc~GB8b1H=qC#Li6{CeTz!-J zW>6)j=$i$7)73A|Asr6lMiA$Mp8lYxB?mi9w=!XhPtmu&&hRka9KsoX_jiVgd1e^r zhH(BalUWRzR2Nw^?=i`DP|3B7+IgQg6i0p^wyFWn`3s1u8`z;fN4@$IJJq+?t?r`*muaO&>sf%fg7-;%z<&Uq z$8<*dDB*GuoLnE`Dk+vM)(e-rZxm`6*Y5Ju<2vn^N=7T4ZhHdEuDOnn$XEE-)%@gN Dpgcrd literal 0 HcmV?d00001 diff --git a/源代码/server/bin/Steelwall.class b/源代码/server/bin/Steelwall.class new file mode 100644 index 0000000000000000000000000000000000000000..f2c57eb6519fe39ff4554cc317383a5de2d8085e GIT binary patch literal 3818 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 literal 0 HcmV?d00001 diff --git a/源代码/server/bin/bomb.class b/源代码/server/bin/bomb.class new file mode 100644 index 0000000000000000000000000000000000000000..88b426ad6300daebbc48d634c129d5ffaeb18f4d GIT binary patch literal 2617 zcmbtVTT@e46#h;^I3XSoqM(R(sU}AWNRd`STe)blK~yLfY^x{9fgCu=iOC6g>&3R# zUhTaz&h)Jhed$B(5bV^MK6m;*+CR~mw%^_-fe7}g%&_-5dw*-~wZ3)9?|=XDD}Ww+ zqr#`4CgEffDryuo&KV0vr)^|sJI4}pX3|wrs~~VP={kAhuAOrV3X~Cw*QHo*WUY+h zT26Mt%9sjj6HY#561q7qEg6e$=LMRfLEG%3TEV(OSlGLj?~J>7D?7`(fR)V()!K}e zO4&pOoT4iZw7Fs?H)IuPCCTHuStDbPIw{juP#+&R^9yEPe$qy5zm>Jz6AIcRBO~h{ zc?=z$q(6hS6M`SD8k(_9fj<(RRI!~duJ=ELHtZC*T?$m%9~p^G)hxlF%2O7B)LIY(!8< zhcz^M($gB6Jn4vruqQpEA%tKMM@eBJW7xJ(>C>Qk*T*%~A*f(u+{&6~iYVN%0Ik;UMQW!qy51{peoDGk%&RWs#=3Lyb# z6h{DE4Mi+4b|aTFvvjzl`jLvpx<|@>GAn6Z6DF=J*d7^){wFYqn|$(65U+ESYHw>!gr{9_Nh)X)C_yVob0l@r=0T2=1sXzop7 z(r{<{p+WAP2y*8m4QR)mv*yXzvK`Uq<9U+V#fT5@LE|T?t)!V?znudSkGJ9(msTJ@$8mpOwfRdO!eG ziR0QW#2&Hq>TM+))3=w<|9~(1af0g!&NDEc8q{)H)?+JU+R3v6oNh-M>vNoF!@N1q z7!3M9!wBZliX67F*4lV4e#2xWcpfMD#h5U_$Q3CKQu0Yju;rJM;G+gZl$+uE2QMH% zZWKjDROMUPOV!gnl|VP|O9Z}L1?;K- zyHWzuC4pUO4|u5x7^?td5*U-fm;eg8e3Gu6OdCj$id`HGyV1pxxj>Jnun#xUF6n6T z{9U2r7GA?;Mx)>gN%PV_#Ha*8f6}A&B^dW{N=Q>nFdrd3efek1Jw!Hqbr}VoA6v#^ z_=YF^Ciy(_CC(Z|GX z|LW1>w}RvU>lh>T$}Ps`0gEey2;yXLl)tWTzZRPpL_{3wBx`JUqiET q{VS@U;q$WUp|Yw^S*tlvrRiJI`~qLD)%5?c#@)duYJMeAU;hhY`zId& literal 0 HcmV?d00001 diff --git a/源代码/server/bin/bullet.class b/源代码/server/bin/bullet.class new file mode 100644 index 0000000000000000000000000000000000000000..bc59203c541ffec78eda9e8a65b9fe34d8ccbc35 GIT binary patch literal 4527 zcmZ`+dw5jU5&xZ=-Rx#_kt9HP1r6`)CLxLl)u64!7qTJ2U?4$-o9rc7*hkoG2vK~{ zV%4hDw@uUnZ7o{0RhtbUEn*+EwJo(T)cUAxt$q0U_3=l)uSIQtbMDRV5-4H!%$Ym$ zn>jOcX70ZH@e79mEW-Of7z%|QeX*FG_Q9i2vdP+N)y1qtS6x%bCcBf|LIv-|o#|vs zp&)McC`=4%A*(-KcNHZl8?);LCYg%Zlq!luQ{+dJ2?e#B+ATe{9Z@KD?DQo2Mar|S zIoZo)Krh~8e?qvvur@`wqAn|LHzp%?OkrHO#ZGOtQ+g}Ux})jUR;tTR(?UB5CL9s+P+?7vvTEm9xA6}Zv|X1+A5Jc?~%1;X^c*G_9;g$a2cIQn9~0xL~4Nm$f2*{w2h zmEH{q`f3wbqmnQiqp_IOAjP@}mGflO9>e2_C%4)~xDf3o)?t!DKq{-*>g%;50p{si z6W2*Cl=i2hX?u0DsW08rmzHEm1#B>3fx!(#6KOluOIr;7HoHwk#ip4^rlT9915Hx>@?f)xm^|>utNvEQT zu6jSNCuDEhwqt9oSS*0;xXFhbPwEhksEM0#3!SsK^jR@FH^~i7UK6Pgw)^mD;v~JLSh9+m@ZM;{!fC zLUxa42QY-kOngxivT7VYh9?(%nTA`-+LjHLJHXnX-FDYM+TG zgyl&y>H#ty^W!OQJFH&Yho=H~8ecc@4GkViCgYO%=S(~=r}9h5Hn9V;(4zuj$5{`> z;cPtXX+11wBjFD_?vnI{^&v=kMTN;O42!*b0soeXZ{skdoXl3d^c;O>^Gm^pBP{u` z>}7pXCXGeA9p5qWU3`z$wpy`1yNSg=?{qbADsliX;;6LPAB-s*w+Mr+e*B0>PK)4= zP5cBu@F8%gIG3Ei@rHZIdsR5Ja#4{u3gd42u(Eo0vsXJ!I;6Tg$g{+^SA z^W+py>&MJ1=_c=*_@i_azZHqNt)!F}_Yym8MPqhk^uAB73a)eT#!h8UI1b1_OR_K3 zX>OSo8O2QAj{<(Y98sk**!W^#$dJ-2$Ch3>s`Sc1#g&J4R}MJ6=NQy0hoD}0 z-MC6aE5~GhPodIc7yX9NeoPG=LPc9iSxH%`dXNA2Q zDl!O$W@Jzu8bTa!8ENt-5aU!NBkw@w07-2Om^7*NQF02GS2U?Lz6ri)P*K_ zGdSltI#qyk`Mr?S7d(cCe^WW9&*CJX%R|(0jxXXN8rU(~>3o8&rzvqgrjZX0AqmV4 zI1h`t3blkGP@4J#DMM4|lPb{E1*ANhswd^ulmx3#QxYy8mXe-|g8$N}-v_1t`QY_2 z{V1P6@K54XP7Lu3A;d&m_4BxR1ec#2mI?_|?JycW8yuq9v!Sr0Xap@H=iTkZuW%1e zCs%a|G*$Fhw4c-N{cEKby2j!P0%|Lq{z>ec@5{ zL6#0ZuHMOQhB5nb^$Pa_NE;MBh%E|)9#jYNczx`110%R$5R0?iBiPYcGmOs+sa-WL z#5r86NAOv)KR2lQLoB4b_o-x7;p&N z5fA6|9T)1eVn?vMQJxZKB^})}gbB56!}v1kua-o*H)KeT;7J#LNmkE+|C;t@W|n&d zPm4FtWKYO&Kf6<@>8`}#y&ru{^6tU^Qzd*>J%maw;zTpox=4mAH$itJtMrePgy?2Y zh#M{B%?Zg71*uVx=DQnNt9g?~k+cw%b3)wA*VW7WpnHxg=esl5WdfMT&NH7~rv@`n zOU?oWdB19LHqPPSLf)?>IFIdMF*cCehV!ut7vK@p^F3oJ-v}yZQ&#sej=bV?3@kDsY`qiS@=@Y%prE$XJSQqXAK41vVK?*le^Q zW~@QnSc@KGJ+>H0q>SxI8#~cwJbE1~ z>8sapk-zYxU_z&jKo-=0- zt@8H(zd5w9g%+f{H!$CGng2tF@M8P=19)jazF+pk5xh+P{1F^0`?*60^Jun?V`aZ2 ze+0kI;E=RdLl2*TZk;=swp;b#O~-_LcqOm%uK7ByV%|$Lwa;b&3N`cgJY{cInJ@RQ za;>XeQ1;+h)w}Xk3$m*GN#d$zSh6x_R?+V4qd27pNS~H#AFgIhUh}ZlU)u-iXD4-< zNsiQRE%k;-y^)(Qv-Bjrhx6rLM*2Qx?SAI<0oL_{xC{@W8H3u%N}NISV3e7-3&T0_YmG}<0`i{SoXGX_T!xq{9$ZP9_25-$MRw` vBO9Cd@Fy3zhN}P@YHU>Zi@vS}CzX3otN9l#_1FIan0No| literal 0 HcmV?d00001 diff --git a/源代码/server/bin/drawingPanel.class b/源代码/server/bin/drawingPanel.class new file mode 100644 index 0000000000000000000000000000000000000000..5085edb760d8fd776188da51735d05a677525e8c GIT binary patch literal 2384 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 ZxJH}T>wScMes7!mQL*B)q-eqQe*xZw%8dX3 literal 0 HcmV?d00001 diff --git a/源代码/server/bin/grass.class b/源代码/server/bin/grass.class new file mode 100644 index 0000000000000000000000000000000000000000..0e43cde12a68d3c362b1e0efb7090c6064519a5e GIT binary patch literal 1517 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 literal 0 HcmV?d00001 diff --git a/源代码/server/bin/player.class b/源代码/server/bin/player.class new file mode 100644 index 0000000000000000000000000000000000000000..e714439c905752931f8b267e268981ae05487724 GIT binary patch literal 9673 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 SN6y^Xocpx$l( literal 0 HcmV?d00001 diff --git a/源代码/server/bin/powerUp.class b/源代码/server/bin/powerUp.class new file mode 100644 index 0000000000000000000000000000000000000000..d2d417c786a921a5f16a781904389da4fc0e3b05 GIT binary patch literal 2426 zcmZuxU2_vv7=BKYW|MSFx1scl(1IW)DJ4Sr&<3PH1)?cM0!2Wj+hl3CO_R9Y^h3pQ zM!jXm8!z+2p#!Jf|-iljVX@6zIt23~R-(oFngor_7RRzrkeVn{E=*OzS*tBJiU}MHIaP{&-?K z41smvBJA{<@(9&ZKV7t9Tg)nU1BG z3gsmy)I@On-VekUkY1B26olmNkV-))IDW*rb1q+15s{+LoBGF8bReYQgg~^BV*|nn zj^j01)$8n8Jj0(`Sz1LqRDsT{Su!qHmu3y?nm$`3#?fp!uNS9v%amtN7_jF}f*#I# zZ6~0@lLQZT{m-3 z%h{G$noEZy?E*{X6?SR}SrwDGOh=X>MIO~6@vO5;%OZzxMa4U~DiA4G?Ml^_rONu6 zZ1r3#xF*oMReY{$7D>$rrtz+V8=GkE8mhR7TTFaKFIJ7Iy8;K}EzaFhNP7shmJ&e@ z@5!dTFR-iC#LFi!9l{-=Tat>pidp2z7`;+4N(F(D?JQd2x=y_8)6#_@T`;{^JoEo- z>WU%EGvpzuzo23fm*lvWU1uSXse*kA6fAvJpvOx=PU}TWugshIWnvz|hgep?Y3^z; zv3{+>MwJYb4x9-R7;W+5j<^q>CwsI_1cxW|y5=PA7=Am=oC9RIB@Ea$O|QgkkGu z(J0gz*c(r@JQS@I>{!){?C&z)DAORUBq6;=a^7yIxAlYXXQJ>HAKxQcJkXzqu=SpPw79&C)kx7uAwifDZgN# zhM52KBZ?j)78`zyLG5sC=4kEuOsbK6o?1*X3Il!~#3BppLO$x%UhAIU?DNtQOrxYks(CG>^DF{h{MnPvx z>w1WAQj<1Gt>DBz;-og3e1_vUSw=!r3tWb|X#HCM6P&DJ>_?XF$0>dnFu<>h0H3lj z0gLk4?ImCbxuyu$8-!~TyEutGxWk(Q`cOtcDK&u4up3_@hOe*(UtMA+%~3|G06?U7B{jd3=~$4C!w*4droeILRv7}l>q zC>Rnz*I1{bBko(Q#*O`A+qDO literal 0 HcmV?d00001 diff --git a/源代码/server/bin/river.class b/源代码/server/bin/river.class new file mode 100644 index 0000000000000000000000000000000000000000..4cfd3d6d2502accfcf9c39c03ca0f45894eccc96 GIT binary patch literal 1521 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 F{XY)VuowUU literal 0 HcmV?d00001 diff --git a/源代码/server/image/1(1).jpg b/源代码/server/image/1(1).jpg new file mode 100644 index 0000000000000000000000000000000000000000..bb1823d53fb7863f38c66cb085520b170c5a8de6 GIT binary patch literal 514 zcmex=Ms=g{8!#jAdkub3AN4a!3aMk1!N6FfcJOLmUkuS=ktv zm|55b7?>EDfq)ez#|Tu$BB*E>$SUN>mRKk(qO|b?BLg!dBTNC9W@Kh!6$BcIVkjdM z12c=DkfNdE#Q(P#c$gW1p};K2V9)R@?Au#o22+)XA$iBUtoBXa@8Gg6kArdJ+{PRK z8MqE!p3Euf+}z-{YpqQz|mvzN@A>J`khUOax(=9g;_rGNL!VZnqY zZ7l!Pzd9HCnrDjVq^W2uWvgDw=lQ9GSzcs!sf4%@<5_RL#z58@3C%lqUS9WF{bkOB z-p$WCIaQMtn*wFhOWz-Jm;17HZq{p^?nS#95152cIkCsKrf1#nws(1pyA&reG9RDC c_Q}{XdFQH0o+@)@P1RnX?RO?2tN#B@0E9T0+W-In literal 0 HcmV?d00001 diff --git a/源代码/server/image/1.jpg b/源代码/server/image/1.jpg new file mode 100644 index 0000000000000000000000000000000000000000..bb1823d53fb7863f38c66cb085520b170c5a8de6 GIT binary patch literal 514 zcmex=Ms=g{8!#jAdkub3AN4a!3aMk1!N6FfcJOLmUkuS=ktv zm|55b7?>EDfq)ez#|Tu$BB*E>$SUN>mRKk(qO|b?BLg!dBTNC9W@Kh!6$BcIVkjdM z12c=DkfNdE#Q(P#c$gW1p};K2V9)R@?Au#o22+)XA$iBUtoBXa@8Gg6kArdJ+{PRK z8MqE!p3Euf+}z-{YpqQz|mvzN@A>J`khUOax(=9g;_rGNL!VZnqY zZ7l!Pzd9HCnrDjVq^W2uWvgDw=lQ9GSzcs!sf4%@<5_RL#z58@3C%lqUS9WF{bkOB z-p$WCIaQMtn*wFhOWz-Jm;17HZq{p^?nS#95152cIkCsKrf1#nws(1pyA&reG9RDC c_Q}{XdFQH0o+@)@P1RnX?RO?2tN#B@0E9T0+W-In literal 0 HcmV?d00001 diff --git a/源代码/server/image/10.jpg b/源代码/server/image/10.jpg new file mode 100644 index 0000000000000000000000000000000000000000..d446085a4a0c18ac30dc00297ca41ac2431927f8 GIT binary patch literal 519 zcmex=Ms=g{8!#jAdkub3AN4a!3aMk1&)nFfuSRLL3btSs9pF z*aR3DnVFfG*;!#Sj7-de3@nPQLWzwFl?)vN3nv~DF>2a)5u_VMJ0mj-1FIkdBMTD~ zlDSMk^8{HEg$#ui8w3B}V&DPFF$n^Vv}ZV)b#B&f7tJF(VwAVe@vGS{x3zHlrQ)r8 zKaNa3W@nqRY3XvWLf^j!=0ym*sy%yLaqDx-IkrdXQzJWDMJ^iJ*PE}^?mi}Z>hJr! z``yb+dsWP~vg}e2;`w#__*(9$JE14H#C@C1o-yy{XBlnP;^IXTOA`538XRy~k^d^` z;%@!LZm*9lO%V#dJLmBNnOBeQ%~R8#l$6|G|DpQBf~+u}n+_4~%N+Y0vxKVrY_83V iDpdNZB2Z(S{AGR>-%>A^%OdAb>~=bN@8sM1|2F}ZVWZpt literal 0 HcmV?d00001 diff --git a/源代码/server/image/11.jpg b/源代码/server/image/11.jpg new file mode 100644 index 0000000000000000000000000000000000000000..4a7a633ea070469de6d0ae5ce4798486cd3b8bf3 GIT binary patch literal 518 zcmex=Ms=g{8!#jAdkub3AN4a!3aMk1*sjFfuSPLmUku*%(-v zSl9&^7@3(^nVDH(QjAQ@f($IILc)rMB94V@N)ttmOac=bfdHlgOfxdE2!aemHj|Nw zfmu+|kVV+>|1Aa{W}tGq{V^*?N`t&*aWad1Ri?n01u< z)s)+(qC}^8dic1@Z{91pY}(I#or%-UALdW9I5jVQd+&?b#Jx@rghO?rJ-goMzg=T+ zyZlac%8L~&3#vOOZd@fkxp8+z{EK%1Q?(5<`BapT3$Zsp()L;^_f6L2!txz^_jsNA hbtUtq@sdl&W*zv}C@A8z)T@2NzML%%vnT(*2>`VOox}hD literal 0 HcmV?d00001 diff --git a/源代码/server/image/12.jpg b/源代码/server/image/12.jpg new file mode 100644 index 0000000000000000000000000000000000000000..8dd249b948723e56ac3c1008becfeb649008c146 GIT binary patch literal 528 zcmex=Ms=g{8!#jAdkub3AN4a!3aMk1!N5FfuT*LL3bt*%+9Z zSyfRPg>$H>Gi$iTuXq-ZGOn8>DL;uKg|G;!fYMh0d^m=Z9}$jrhd2s8tP z;DC{dfmx8nP|-2)|1Aa{pbjQMplS9DtFH6r*Y<4Z%-Qm4R#5ZgO+EdlE2~bO>^_|J zEV5Ms=g{8!#jAdkub3AN4a!3aMk1*sjFfuSRLL3bt*%(+@ znFN4dVP$4wgG(_oF*C3T3K_BrD;hbniHIr%COQ=^{D7{RfsvVoNsxh&m5~w2P(}tO zWaEqc zSZ4V7jPS)}rqgOpZTXp^TV3~f(!@`!mG&{mB$%2z?!;ARy!g>_>ERuJQ%OxtPSqWM z*6j7t_25>RT72U1Uk^?3fH#NtiBG*BbY+U&k}VMs=g{8!#jAdkub3AN4a!3aMk1!N4FfuSRLL3bt*%(+@ znFJUZnSp?j6DGsR#LU9LDk!ArXqY&WO;kxaFu1U&@dG0Wz|??fW=19!K?WwEkw~U8 zf<%N^gcT?Lzs0}mz)WnSl#e>TO=T7lQ=oS3q1e2Fwn neYotoqqAo)4;xb#L-AdP+@9p4!YhONy}w0udKC!I|9=wzK}n#~ literal 0 HcmV?d00001 diff --git a/源代码/server/image/15.jpg b/源代码/server/image/15.jpg new file mode 100644 index 0000000000000000000000000000000000000000..3ced3c9ec345342517f93f9b13126828c40ccf20 GIT binary patch literal 523 zcmex=Ms=g{8!#jAdkub3AN4a!3aMk1$j+FoFQY)nJm9fsKhp zfPs;jnTds&6DGmP#4O0bqR1*FZ0K0X7MLg^s%&J^IC0|#Mg}Hkm?ALE$il?TD#*aZ z1T=vaF2l&gz$_@FXviWg;+VK_T+B1BzPtPft?W(Hj+{LoeGi1eg z5#u%6=7ui&u|xA@pS#8Lzov`o%XjLim*g56%IEE$b*w>os;R5#x5J`$p1A342o0KK zJgLsmv?_J#M*fdZF*e4m={fTLQDXBxe0!e~clW;U+>NKK&imb5kZr$qZFa#5vp+os zOo!N|Yu)1ur@Ywavg68IBjL}<=PehC<|Zun`e(p$?gC5Q>shPpQX8H6Sfq*;`aP(2 p|I)5|O1^c=l(rsrh9i}n$E%oDty;Z4yKmVu;b}?7uhsv*2>_UiooE06 literal 0 HcmV?d00001 diff --git a/源代码/server/image/16.jpg b/源代码/server/image/16.jpg new file mode 100644 index 0000000000000000000000000000000000000000..38235792594d5181797a3da8456b255d73ace9fe GIT binary patch literal 519 zcmex=Ms=g{8!#jAdkub3AN4a!3aMk1&)mFfuYSFhg7oCRy1S zn3!1v7#NwESeaPZVKR&$Q9)KAMMFo?LM4^Pg+?ZcMH3HR1Zro5sR7e0%uIp|OiYX{ zjI3~RMkWSkK^CCag~EXw4?g^Vi-Ct3XrLgoAcH-_XMcD9i!YuCOtXD!KIuP$_%79B zy_06#4RdbX_@VCIoEdz*E;)M9D^EDu?OE}FbsN{oWouuDDOYr_`;ryJ=Ba*U?V%N! z^KLb&s3qO#WO(2kG?6?2g>bLQL_651xCwHa>>`i|c n^x(7Ov<0RQ7r2xZZ_0eRKZWbG(%s^iqC2N#rs-7A|9=wzWdNkV literal 0 HcmV?d00001 diff --git a/源代码/server/image/17.jpg b/源代码/server/image/17.jpg new file mode 100644 index 0000000000000000000000000000000000000000..019794413703fbf753a4b2bd4f476c866d1aec3a GIT binary patch literal 525 zcmex=Ms=g{8!#jAdkub3AN4a!3aMk1$j)FfcJQLL3bxS(#Ya zm<51-VP$4wVTVaEG6^y;vj{1&3L82Wiij#11tvC5+<5RIBf5TO7LZm!1|}v(7A9tx zcAyxuAOlc;qOf7%!4Lm$G4KGbWfBAm+B2+lwQ9JyRBI8}j44xAy6m2O@XsTi_nFh} zr!8GqR@Zy{zTw=-MthCYa!-0n6kjPmmRP~qrnn-Z|Jc&jd3}Z|7hM>&JZ-OE%Ub9ABiK$v)9~GSt?@iddsIpjcZCBm)i== zew1o+Wa^Z=6Yg3+v#J!ez4k7sdTkl+;r)4YAMyyU__|)ICGhyWO@}>LnU5bh{@G;7 mEZ2TvMNOX#8}!l+CjR+(h(n>l-*D!3^F7nfMs=g{8!#jAdkub3AN4a!3aMk1$j+FfcJOLmUkyS((`w znOFpXo?&HXX5@s)F)}bQv#<&p3Mo2@G)`0!7F9M13_keq10w@7BTNm1W@cd$1e(go z#D*}Kk%@s>kVR2Q$*{2TVqoIJ|F;-;fclsOnFSf_8J`1N-Q*}}28@A&MZ#n(;0-Tr&mcg+&^rwaV{4O_4J zYgl~#s8jMQqh^jqQyRBV@D9CW#b5re=~CIr@OtVUlLtlhGD|!n*T;Na;VR8{Z?VN1 uW`?&n+%LX#URvyOg{`gW;j0Z_-sb&L(Qumgy7%mns>3>d5zp%X-vj{mj;V|Q literal 0 HcmV?d00001 diff --git a/源代码/server/image/19.jpg b/源代码/server/image/19.jpg new file mode 100644 index 0000000000000000000000000000000000000000..7b903ad6ec83faef9b1e2903aa298d2cc9d5d2c3 GIT binary patch literal 519 zcmex=Ms=g{8!#jAdkub3AN4a!3aMk1&)nFfg(*LL3btSr{0Z zS=pEb7?_wCnVFb5VRDR2%z_LotU|(yj=>W}3{9L9iyJ3xWMp7Q(apfb%)%fd2@&>W21{KChkJrcruG(^W&eX~CtXHa3Op}_k zB8(yUs{FEmlUoj?B+I?%Xql&Z=c63+{qE>bcBdZPSQITT>SH4Kv~sQ9)Ge>24lmU{ m%AeYEx9nWe^t>N0{xjGgZccQn=J~yN`(oXbhhOjde-i*=u%FBT literal 0 HcmV?d00001 diff --git a/源代码/server/image/2.jpg b/源代码/server/image/2.jpg new file mode 100644 index 0000000000000000000000000000000000000000..a837deab2f0e79726b326ae3cb4ac392dfe1a41d GIT binary patch literal 526 zcmex=Ms=g{8!#jAdkub3AN4a!3aMk1%92FfcJQLL3bt+1MFa zSeXSFm>8K@SXfzMQjE+@41z4ILWYV;j)82#MvWU2CoVjAkr4!7YQQuj6VQKXf{Z|K z|G&k+1GI@rkXewyo`LyMs=g{8!#jAdkub3AN4a!3aMk1*6TFfcJQLL3btnOPZG z*q8(u7@3(^m{|B>QjAQ@f($IILWYhaio&AB2bGMBO-!9#f)fiHnS1r zhfTV7>E?>UDJmxg*2_=H{kibNo9b!*83JP-Y%rL%g~4L)<6^g^oAP??W))9X^Q-vm z8oVNtVaJ9EP6;a-y%zJoKCha6;lnS7)3eP_N37buZ}CRopl|Cp@9XKDSzQyf*G^`= z>6+AQVN4Q19G(Kw$`d-?EewjWK0o`{e+J&Lm3gk46~8Rox>)z5(%bE`{@(-uZgHza literal 0 HcmV?d00001 diff --git a/源代码/server/image/21.jpg b/源代码/server/image/21.jpg new file mode 100644 index 0000000000000000000000000000000000000000..00557b37c4e7c13ebcb45b240ba5b07582afa1c3 GIT binary patch literal 520 zcmex=Ms=g{8!#jAdkub3AN4a!3aMk1$j-Ffg(*LL3btSs56a zS=g8a7?>EDnV4C)VRDR2%nU4oLW-;+j>1ZYMWV(gfx(F>jguB_WMlwJAp;gxpkhIg z0nA8dGcqwS3mUR0E>udKc=6%K|F;-;n1Naafhz48s?{UkCKoI$JH}MKa^Aa>k`vcG z2$N)yVd4#ZIB&|+;0 zwvDYfdP)}9+`sJjBj~}qXV*K9#dax`hs>Q`{J<(SYuc{dit`S0*?yl@ZSl>|lrmfE zkn&j8*XfShkx9oS*@_Be8te{SzFn;o=lEx(cA&!(3FDXDmPy68-@Li4baQq@$fB1T ii<$Gba8KCvBYwl;&^fEDSk8UeE33AQW50a*|C<2ZJ)a-| literal 0 HcmV?d00001 diff --git a/源代码/server/image/22.jpg b/源代码/server/image/22.jpg new file mode 100644 index 0000000000000000000000000000000000000000..2ff4934eb0000a7c8605afc646607ef88312d8ec GIT binary patch literal 531 zcmex=Ms=g{8!#jAdkub3AN4a!3aMk1*6TFfcJQLL3btnOT`w z*cb&E7@3)vnK?OOQj9=#EP_Icjv}JLtZc%{hQ=m|ivmMZiW(h!Nb68s94AnIPu~`Rzab}jsI^k@BlS32{H>Z*fYEpzHO_M&&zx28qYV4 zw_D_X`mbC3Yx1X-{{Gn)5~^o+IbBaQ+i_lL6=P!JjRh{8dS!1TueTYO7Ja%sH7l(+ zsrQlqM~2=uewF6z9~pK>GeWNCb==(jYoi}Sy^pb&B2jkV^cn7@^a v&I;68FG$d3-NCS7!|9U>H?(%dEtsqGC}i!l1J$85vMZw{`es+I|9=wzZvvu~ literal 0 HcmV?d00001 diff --git a/源代码/server/image/23.jpg b/源代码/server/image/23.jpg new file mode 100644 index 0000000000000000000000000000000000000000..4219feb6e5b330bb156d4c8b23edd5166c8f91f8 GIT binary patch literal 530 zcmex=Ms=g{8!#jAdkub3AN4a!3aMk1*6QFfcPRLL3btnORtw z*aR4u7@3(EIk;gmj7-c7EP|{;iozmFhK`AalT=Nd1A{|~8z*kO2-MGvY6LJKSOpn? zfx*I#kYEIgFbgYwU=cD5Ok8;I;{RI=JV1R+g3N*p_6*85qwl!weiYZWLPEOs@wy4S zFFoiF+tA|PI(^ECdle7(Ue$d)m1*wR+ZN%-8u3KVzH9o~+!s`*ZwA2 zXxgt+8(x02K_BMbAF?A^B66*_2wDoi<|WfzysLs4&jwI&05osu#NE zfMKUfr^4-mQ=(VhRE}{xK744w$z{h<^1LG>9-q9`IODBs^SbuxH+Ef@uH;XcDy|We uZ8h6{TS$a1*ITy}5$6gF?>ny8RleT+`(LT3t?e}%e!qXy&N=1z|C;~^6RWBK literal 0 HcmV?d00001 diff --git a/源代码/server/image/24.jpg b/源代码/server/image/24.jpg new file mode 100644 index 0000000000000000000000000000000000000000..9e2249017411ee715d4ffb2a3e794e0aa4765818 GIT binary patch literal 530 zcmex=Ms=g{8!#jAdkub3AN4a!3aMk1*6TFoFQY)nJl^m6?G} z0O%DKW@c7Fm;@seGXsmD5UZl0h;g8>sFJFYiK(NrOHgoPVR2*A#7PS`9%N(yszC;f zKrKKMn3xz@kR%wH7zCMx6bmmJe)#zR76T76P@f>PAcH-_#gmeiEo$G6yJ|8u-7UJN zxZAeb?A7g?^I}&iJy|1AoA9AK`0w-CXYy=beQab9nlPn-;RNG@o=Xosb@U&+GwiMi z4*YZ}Xw8Jz8lEdf!gGRdU8zm@Z7tWje~a4;2d{!FjV?><9!TC|OS95Rke)qp#snU( zdCs~`uMTMmdY_Q-@qBf!?#`(qYqKe0cgr_NIV`Vn-|54BYM=ib4UKJ&R~(CGp7})26VZvOGFgo#X!VK?(d?&K?3&;Q>903n#9M*si- literal 0 HcmV?d00001 diff --git a/源代码/server/image/25.jpg b/源代码/server/image/25.jpg new file mode 100644 index 0000000000000000000000000000000000000000..90a4f3d0d0ebcc05292ffeb7227397f7a1fdfdab GIT binary patch literal 515 zcmex=Ms=g{8!#jAdkub3AN4a!3aMk1&)mFfcJQLL3btnb{av zSeXPE7@3)wm|3`CQj9_w z6E7_+a1>McSEJQ7`DLEyJ{jl3vu-}ETl7~W;P+(tT)WWO#kZor>~mGm;9U2*cai0U zIbsux#qyJMAHG}qPXFPIzZ$cmu0>sqI`J*HNuc}9yyOcNp<0_>E*BQsQMlMQHE`j! z*7OPDPq(khZq1zV-NM7;&P}}uth;V7Z)Gzt&3+*l;^laGUW|5xoQu_>1x|*NP7~&M gXNrkQ$4%eC8F%`Z=vMEk;>RC9FDw*_n*aYM0DxMXHUIzs literal 0 HcmV?d00001 diff --git a/源代码/server/image/26.jpg b/源代码/server/image/26.jpg new file mode 100644 index 0000000000000000000000000000000000000000..36b5b236f76937ca56e9a676bd096ef832e1fbad GIT binary patch literal 529 zcmex=Ms=g{8!#jAdkub3AN4a!3aMk1&)oFfcPRLL3btnOWIb zm;@LYnVA_`*g0V`j7-de3@nO5timFWq9(zKg^i2YlnqmgCN11}kP!%A>cBKJ6RRLl zh>@9v87|Jq#K0`5sAM?tqGMp;|62?^%#6UW02*q~pxSh?Fyq#jr4~%g#UDPHp4@x$ z;`OyV|JA(IyHI-U@9gBVt;)fxytd4k;CS%e+6632R23Ku7@kIM+a$8ye%?l@S1CV^ z^-nRnbXSwzL#y{n(fgI>^qwR14b=2y-}j@` x=~LSDoA;u%?lO8#d3QMs=g{8!#jAdkub3AN4a!3aMk1$j*FfuYi+zcgI*;oV^ z7@3)wm|3`CGK@^jf($H*tU_$Uh9Zs=Cn+hLI5`Ifha?s^Ze(O&Ml%7ZlT{FG1UtfH zMxf7`g%uqSvKR&~y!hec|62?^%wR!52789kDBq=DH>VyG*4=hOS|CcjFes_mQsGRR z#_xa9iF50{w(=axv%F;av=Z3iWRSBKV1D?syORn)}d z+U>WuK5;#6w_K-I)pz(*k*9#|sTJEU>b#NX_U61dy}4k^^aEd0V;O|6lqYG}ojZOp z|CDB*Tv3UdcelXot4l<81u$?1Fc+L)U|??*kJ=HCdhq7cUEH0ga?5oLlLV_42)y=T znEvf;kYk{-@QVXIO~tdOR(oy>ey7=|kUGt))7fE1nOecjo&!fy_WqDxYC3D##oS}2 zp_^ok)^B+|TO#YcucqJi?Muau$S$7d9@;p^bN>9wg&MKew`c$R&(O9x_>$6;iRMs=g{8!#jAdkub3AN4a!3aMk1*6SFaiO@(GZfAjfGtR z=o3~(RwjO!3?maW1B;-LA}gD)h@qoVpqP@fiIcNSaAIL`W7DLK2Z2T~!_nK^CQt|8Fty0CfR{1R3lZ0;61(eAd-G)*78VrJ+S^ zb)m9a+s99k+}T_AGOk(5DSVD+M>I3nmv#*^lZwSR54_%zr{{0`x TCR&Cr9{b~iO_m&4|NkZc;d8)7 literal 0 HcmV?d00001 diff --git a/源代码/server/image/29.jpg b/源代码/server/image/29.jpg new file mode 100644 index 0000000000000000000000000000000000000000..c98a9bb2ffec8537d217b46a73c950406da6b3fb GIT binary patch literal 590 zcmex=Ms=g{8!#jAdkub3AN4a!3aMk1$j+FoFQY)nJm9jhTT( zfPs;jnTeT|6DGmP#4O0b!YZUFV(2KUY|^-qO*k+(rKot)A~fv`49rZdf(%SR4RFm2 z42(b#W)@*ZAtl4ai3<;2eE9zs0}nGJFf@S1+B1anMD9DjnbBIPT)KIC5U=aUdY|Jj zjR|4-|>F(4JncWAXcPI9xYKwEmu$DXSZEj&O zS1b2;p`w(-i|v5jMCRfbw1GB7ydMs=g{8!#jAdkub3AN4a!3aMk1!N6FoFQY)nJm1ftiI> zfPs;jiIs_&6DGmP#4O0b!pdgo*r<3=NGVZRM8(KCsBq&UMg}Hkm?AI@&mxn^ZDy4G2eO1w`bjteze{yRy}$uKBBaJ%CxKBmIyKYse5v6OVq7p z#qEbTyss{0Q`&z>H%I5b1LM)QLrquLoV>g~+3n@B1cS2&W=wPUyuR}5n~H^{?G~IT z{%G|l`3Sw8?PEJVu0)k1YKh;6vbhz{cCHhgmZyLAcIVEila_Ad{IF)`r1JYoChLV( v?RpcnTwA$m^)>Ay8@aP@OSeaqpMKMzFvD0q^G(Lm(4hDA1uy-D|K9`v2`H^Y literal 0 HcmV?d00001 diff --git a/源代码/server/image/30.jpg b/源代码/server/image/30.jpg new file mode 100644 index 0000000000000000000000000000000000000000..d34e9bb10b424e0e8c44179143bccc470138b9ab GIT binary patch literal 605 zcmex=Ms=g{8!#jAdkub3AN4a!3aMk1$j-FoFQY)nJm1m6?%A zfPs;jnTd&=gBdEr$iytjz#_z|Xz0i$ETW_wm?$b{;uPGtXk$vzBs3Ek7?_w@1sNF_ zSs0nv;U+UOF)#}%ItESzYEN8v@!|hl3_Q$?!0-SXY|pTIu~`0=Z*z3F+&rpz)U36* z@qXjnCq9kFG3LJnJ>{-$5E4^~p1aA|rn2bM;;82Lh8Ma0mR{X{Eyk+#!6GA1Cdbcm zQ#UYba(XcEHpr}23rrFUuQfcj%jEi%Baf!Uv+3L{da~_Om+Bqfi4GmdtdHcX)SkJ} zcl}SA{n6N+d#{FGoSimx@uLG9Ilb>LRaf~@`zFbqar^qEqG#_f{u!!sD5Y%fInCQs zD&@}FTzD(9_0pxIr}O4aHfXrXs&}AyqOpoQ|J{o3^`5!x2d^{*O_iN5%_0$g_SBNw zHQMnP>Q;L#pE~KuG~>6woji6g5&w2-=cd@n9y`1?n!WIvbWQVy7MqION%<`98+!Yu YKhe4>v-rU@AL}2#S4V|gtp9%#0FSK9ng9R* literal 0 HcmV?d00001 diff --git a/源代码/server/image/31.jpg b/源代码/server/image/31.jpg new file mode 100644 index 0000000000000000000000000000000000000000..091234dbe35a4ebaa14ea8276809c60591361a9d GIT binary patch literal 554 zcmex=Ms=g{8!#jAdkub3AN4a!3aMk1&)oFfcJQLL3btSy-9a z*qH?w7@3)v*_qg3QjAQ@f($IILW*p{N`{V!je!$IOq_#@Cv9Y8U}i)yfPtBXkx3A! zpM{ATrkjC*5$JOkVG%`UC85BB|8Fty0BvOw1e$5jU|3PQ_O`}7qnS?9%v#N;ZzRYZCK4-E_e4VC*=%d>)x?(RBJqspHQor%-W#rp%Z}$nF z0?M!M9d}qO*rRpr?41`W>3k`VSZ_R3-@fA8(*1nLZ{~j$@jJUCbn~@Sg~j|DUUM`X zgdBt~`)W`1c*ZvAzQ-r^%i?SnJ*uu{ literal 0 HcmV?d00001 diff --git a/源代码/server/image/32.jpg b/源代码/server/image/32.jpg new file mode 100644 index 0000000000000000000000000000000000000000..f1c859ad1e4ed3068e953395297f65e01823a4a5 GIT binary patch literal 547 zcmex=Ms=g{8!#jAdkub3AN4a!3aMk1$j-FoFQY)nJm9g^ihA z0O%DKCU$0Cm;@seGXsmD5UU}Zu!y3PV_@OLgJLR1CeALwiN%dglQuFkFr%2lz{JeL zz$nPT1O&`5Lm0p!EQ-v+LV=0@Z!z#NGXledS&+e=VQodumfIeBCKduW7&Wh6Thj9< z+3w3XmecP{H~Hut6}i*i=(VDleTjXCKuKLyi@ceix7O>sHzhdM3v=z%owCobIe9_I z7fBy8zgW-8X%|+lVOaaFNk?t*+AQk@f9Li$-G8OjE1{6_WTOh>`mj%%8Yezep5vLt zH90=GQh3M2nR$^d)9-A0vNdl*gSk*;(cRn3uMOsFyu10Ntaj40+XqX3{<6IMl=a+i z{zWso@9pQ8@OY-vDpBDiT&{0&_^9rwwW8h)EgRf9Hgs_{US1;3^zh!E`}cn&W$^tq LMs=g{8!#jAdkub3AN4a!3aMk1$j+FfcJOLmUkuS=bm@ znV8uHfSzGtW@F-p$uRMs=g{8!#jAdkub3AN4a!3aMk1$j-Ffaol5@2CvV`63( z0Q!Z6nT3rTCd0_Y%)lZj#Hwh>CgPYVtP~hrxJXpl$k@awrKoYzMn({TsRhx@ER3vz z3`|T+jI0P@MxY3@B8!NU;ek-9S_V_+ z*XE}tHVKvat=VtnPu%47mg>8-@OFCPk~=%A0)y5ry)xTdlT~9;5nEGB8OOvsYP;7P RvMs=g{8!#jAdkub3AN4a!3aMk1*6SFfuYi+zcgInOOuF z7@3)wn3;KD5{yjDf($G|tct=)h9ZH%%0?!RPR@yi#f=juZDeF%Vuq=M&_LBJf(%TI zOf0Oda2cQ=gCL8LVxn+h;lzU?N{$yl{=db*!wl3e2sGTDq4%-QiftmdlKF#@lzM8H zvHo4b@znCf{oT(!UZr#w1tqkF?y$AYkQ1(xsu%e&@u<|a=*gF7F1yj%Cc>KMw|BpKBZBmB0$K)zd^Xu1YZH x?<)3l&WI8^DY4LyQ{iY_>*c+c`}cpimgV26Q#^5d{w+DBPhvLh$D{t=1ON(IqSOEY literal 0 HcmV?d00001 diff --git a/源代码/server/image/36.jpg b/源代码/server/image/36.jpg new file mode 100644 index 0000000000000000000000000000000000000000..1951f745f80b9e86d6fb103b2a3d0be6fdf60ce0 GIT binary patch literal 527 zcmex=Ms=g{8!#jAdkub3AN4a!3aMk1*6RFfaol5@2RwWn^L# zU|?isWMSiiOECgn4wMoSRx~tmbSf4RRdRL-E^KU?v}of&Mj${kfq{XEnNg5|iIJI! zg&i)=$i&PbsK_FuWEgnRF>&I;iw{5izs11A3^rJh!JdJ4Q?GdH)+@6mOq`Px-D`Kf z%RXHcmvE$U!9TC9uQyvy`uq9N!bT>xC9;z&F1J0ozdYFWD=$xA>oZ5YXX_#~14L)N z%E__Z#N(yzzVONAUoBftGfmZXVEFs-Nbt&C>;7q!`jjWJL-w_IBEx0|8cO^fq+mE-ek&F$(w@1QvChkxB{qm|w;BtL(*u4PHajDs(qWiQbV-@`>l=_hzf~oK#GzVXyjs696NPr6K?T literal 0 HcmV?d00001 diff --git a/源代码/server/image/37.jpg b/源代码/server/image/37.jpg new file mode 100644 index 0000000000000000000000000000000000000000..976111510ddf0bf9cef2d3d7d0be3ab69e8f2ee2 GIT binary patch literal 530 zcmex=Ms=g{8!#jAdkub3AN4a!3aMk1$j+FoFQY)nJmDm4%H- zfPs;jnTeT=9VWrZz{JcVC?u@NDq?7C5?HkHp<{5$q(v7$qUmN}U;+A%fr*isiIo+m z85l0i41$R)LW+)og%5?5j22$}e~W>K8EB{=P_aFOgx03zy@%8oJLJT+f2=GQY!SNj zf>E3$%RJReu6k;k(tQ5bPy2)4ZFIe{`IPA7%U!0q+tv5`eJy3v2=(au{<yl@qoBG0n zH@2>|X3DGa{JY3TarRuXzU7%R?5i&O-c9<%@6ySw{FeLBVYzIvY0hu61q`1xPT@~c t6LULecB5NvcJ<0Rt>LHsG;P^=q}F?y!v5?0w{DqF{O3~i^x6LZHvyL_qC@}y literal 0 HcmV?d00001 diff --git a/源代码/server/image/38.jpg b/源代码/server/image/38.jpg new file mode 100644 index 0000000000000000000000000000000000000000..91f26d8784c451bd67ea14b63b0fee93057994d1 GIT binary patch literal 540 zcmex=Ms=g{8!#jAdkub3AN4a!3aMk1#YaFfcJQLL3btnOPZG z*q8(u7@3(F*jcz?Qj9=#EP_J9BBF|hj=@TSi!QPnn>Yuh6g5uT_>qwT)eMkYMnMK9 zMkW?kR+tIE&|zj!WDzWUD5Mma_`%R|;=zmmZ!z!ywK54Z3o_U<@Q6kRAA2awaD?x5 z^pBml0%}VB{CyoX>$~N?wr+93@`xKBWtRx(=vXME_nF4|oP1Z6?c6a*Bf7q@?%ZQe3sG7ha>t6JGwaLBH;uq{aI;P%l;ZCv6 z58g6K+RR;VaTVWEwVopq$C?b^%#+?TX|L1jrH?o-ol{AQ*~$8TdE0!MNgkd_cINB< G-vj_#2&pIl literal 0 HcmV?d00001 diff --git a/源代码/server/image/39.jpg b/源代码/server/image/39.jpg new file mode 100644 index 0000000000000000000000000000000000000000..0e3655f1f61fd3315d5b876c976132a8585b1bfa GIT binary patch literal 537 zcmex=Ms=g{8!#jAdkub3AN4a!3aMk1!N5FfuSPLmUku*%(-v znArswm>8LvSeQ9sQj9=VEP|{;!it8DB7uc$qDn@I6AvD`$jHFV2vY;58JSoZ1VLsZ z8_USVz%0lD()<4w0}oIKlOVGogFVBs`|fT38T_|JR22Fi){8Dw`7Cen_S%;Ho5i_n zMdZ|M_T>FMcwA}mx7BC4%Uidcds7fCdCaPB?!T|+Q+Lg)UR-0?q{%i-KpyISk~sem9g)&$n;BV)ymQ)c{`m8VVo4|dH(XH zmXPf$Vwi%x#V#f7=Kh_{Yj&?v&Zt6%X~B=q6Hl_HJ&Tol9%BAJvvALjvL2(HB*QDo z`z(LWTDQ`9?>?uD;CBY!*REU2Sa4EWC4Z;tGk2fl-_EZ>mQ-^;JMO~0)BgWW05-#_ A4gdfE literal 0 HcmV?d00001 diff --git a/源代码/server/image/4.jpg b/源代码/server/image/4.jpg new file mode 100644 index 0000000000000000000000000000000000000000..efcf8d5e34217757164bc8157a53e5ce53c0da3a GIT binary patch literal 531 zcmex=Ms=g{8!#jAdkub3AN4a!3aMk1*sjFoFQY)nJm1ftiU# zfPs-2NU^ZPBp8{P1sPaa6%Bw1q1dhXR|&um$G zH$_0f<%QpYmm5vreYp5DJLUYHz|L|)Yf++m;9bE~DyeQg{PXEz$^^s3kT?@zwedX4Xa zns;GHnaZKq&6)kF*XMFNiLDeq$FF&RdDPWA&onD%S1)Sv&e<_f>HZ3#VEJ?UH~(DB tT4BAgk-cNr(Mp}xt#5k|ud#mlsX<|evHFy6CPAxK>ep9%S-#}|O#mqWsKx*Q literal 0 HcmV?d00001 diff --git a/源代码/server/image/40.jpg b/源代码/server/image/40.jpg new file mode 100644 index 0000000000000000000000000000000000000000..1d8280d5a384b7b52ae6919e6cf344e34946805f GIT binary patch literal 525 zcmex=Ms=g{8!#jAdkub3AN4a!3aMk1*sgFfuSPLmUku*%(-v zSl9&^7@3(_7+K&_j7-de3@ofd!itU}N``@nMuig@8JHQ7bppN5!XOAV4k&>TXJlev z7BplLcKm;ffd?qXBnULfp5fGW-u&90?VLGVUd;+>o_wgMf7hCF$((a85tfrO%~d@; z+;06n<8CP1<=)7Ae5--Vrj!>7^W1B%+mu-D+WTScUH7>Cr^AbF&vN}K-Ml%n`ud5x zdzi&?H0=5nkD6`rc%Y`lE4J*y!=sTu8K&3x$35bjy4owPj{oLDQ{7kM3{x&0-7;g@ zWwm40(pjG#rfdrmnyzxDZ`WG$;u+tK-o~z$nzUtMkcVer$YReK-v#Qox(2oH-RG1U od}F8OG$W5l=1kvhJGqN}`s{4~GlaM;^>W{^FQ>#|_vHUK0d@(W+5i9m literal 0 HcmV?d00001 diff --git a/源代码/server/image/41.jpg b/源代码/server/image/41.jpg new file mode 100644 index 0000000000000000000000000000000000000000..9123956d77927387db0f33545b8fd8e0557fc972 GIT binary patch literal 528 zcmex=Ms=g{8!#jAdkub3AN4a!3aMk1%92FaiO@(GZf2m4Qis zfsvV+nT3fNCc((W%)%fjB&=x2%H|j-k|?VDfsuh3MITTLPzeJgD~dQH0~52L5R0&) z(f?ZvJU|^xg3N*p_6*M#8S>TCiX6?3+#=I;^3LQX^-EZDm_qT z87y>Y*)HEL_f%pD>jbaucXIz`X@)L}~TlcM~&APHvesjr;V+o<_|K9`vU`VFQ literal 0 HcmV?d00001 diff --git a/源代码/server/image/42.jpg b/源代码/server/image/42.jpg new file mode 100644 index 0000000000000000000000000000000000000000..c17ea64b51b2a869b740f27eb5dd15f8772a7d3e GIT binary patch literal 529 zcmex=Ms=g{8!#jAdkub3AN4a!3aMk1*siFoFQY)nJm1ft86x zfPs;jnT3&=6(+;T#4O0bBE%}JXz0i$lBlF?6j(Tsk%1W|4>5p|nT0`+fr%N#NJfx| zkT8qU|62?^Kn+ZSK%?v#UOR8wv~RPM>uRpj#ow8(rN;iLw?B13O4&f|+?^RdbNUS` zKR)Zr^t)%AUiY*iawqR%hL)6iLmS7BCN);i-u-*Dz39BwY*@8O9#E~g3w>a@9*-2bvP zVtTm9uhMO6-Uj^$)++qRsqdydkE6fqTYpj<|8Hs8OF?^{TBi6H_a|?5%32)zlY>LI q-*vKhcBkLc493D~SFU-pm$}Qh$JGQ%ty=oB?sVXk<%*X7Zvp@#3Zysy literal 0 HcmV?d00001 diff --git a/源代码/server/image/43.jpg b/源代码/server/image/43.jpg new file mode 100644 index 0000000000000000000000000000000000000000..2270b56fc19a9e39e030cbd2d3445e038cd16357 GIT binary patch literal 520 zcmex=Ms=g{8!#jAdkub3AN4a!3aMk1!N6FoFQY)nJm9je(g( zfPsmTnVE%&879NXBnT815>{k&3`{gC6g6y|$jAVfg=lADW?>X$U;+XLcDR9zObpD5 zhAcvYB1(>d8$bTP#lQp9#w5rr$Y9U#DgN*=TXn&yp?U_YGovE@cG+$WNm0t%BAWd1 zgZuuHvw!1T4$KW)a^y(8^?!z~3bAv)OLi8YTldv9CM#;g8Ds70pjlIA2zlE5XAoMv zEHPQIzC`!%wuGIR*{|;sTVcg*{rGNWQnXyenu_i>Z7*OY+TwJ16d0Z}ORXN#VNH6}h4V3*B1I^LsciobjK*b9dr( k#op5i+%88CsQ1hK`+GrjbuhHibm|;Ecjo_10N<6NZU6uP literal 0 HcmV?d00001 diff --git a/源代码/server/image/44.jpg b/源代码/server/image/44.jpg new file mode 100644 index 0000000000000000000000000000000000000000..cca42086cc452f6146e842c39c0fd21843658c35 GIT binary patch literal 514 zcmex=Ms=g{8!#jAdkub3AN4a!3aMk1!N5FaiO@(GZfAfrU+g zfsq*mSYZ;3Ow57|EJCcpilT;&iH!@50t+X8WMp7shA9Bk%q+kV5M*FtVq`&*VPs-p z7Gx1pG!%ARxbfltTMRtRK%Ig>1ML~k{GGeseRF|Pz}6+FCx5NEnB}`l{$}W@=1DBM zfB(K*-tgj@8_SeW1q$=)O^>gTv}~R}^Sw#Q<&dx1f@jih*O+QEPV)RQH*IQi&Xzmu zlKLWBJk&eBzIVKQOG54L*@Id)o~wvT_BX$FxK#D(+V)$`%pcrj7?T;V%Lm?WpXJw` zI_Y@wq40@+D;72`~MdB0f^GhxGw ej1OBM{{0gm8tS;~+m3g2PlY18g-_1^e-i+7l%)y) literal 0 HcmV?d00001 diff --git a/源代码/server/image/45.jpg b/源代码/server/image/45.jpg new file mode 100644 index 0000000000000000000000000000000000000000..318c5072bf1e128092683423b47e9ba55d0662f2 GIT binary patch literal 526 zcmex=Ms=g{8!#jAdkub3AN4a!3aMk1&)lFfcPRLL3bxnORxb z1Q-~Zfq;<{Cd0_YEXcqj#Hwg0>{uuwsuY;mIC0~_i;U>H8JSs_SOpoFK!6#h85k}M z%z{EJhKh-fg&+RkV&GwB1O^1qM0{&{QW>&%({n}a2N z{4*ZE-|MznpT)9Cz@;zD{rJQc~qKb zyKLFrlpAVQ70pwsZ@>TgH$*F$yYj42+=+P$j!Zn!6oSXYJwH*H#6FSxVS0t0`Mo*LAn%`C2CZ_`ObY2TXY%zwmya nnOJsOYgYMs=g{8!#jAdkub3AN4a!3aMk1!N7FfuSPLmUkuSs7TE znArpv7@2{9i5(`z$iytjz``n|Xy_O?QP@aCR5@tj#)piI49tu$B_Nsw7zRLvOiYZd zKsgv-WMW_zWC7|eOuYF276T7Z50fBJnLWeWq;J*_Zt+E^W;_0B58pjs)+X%1J1dsQ zmweQGKC{=GXobAei4Qh@#WbVQ_QeFB*OOPz4c_y8-LI6DuUMzgn4P<74qK4t@6K!c z{+a6N#_RiYG1o2c7ZHsp4QD&bn!Cu;XVPM0_9dZJd|N|xZ|!w4TD6gTPVFbl{$s5- zw>;RHs(N{c*5i5A_1TJTDJv{rMQ2%s8mM{x?c2iZb+zjGS|@$y^Cy{aurU`t=)aTn kHF}NoHWyayyWigaoW-=%%l5nU?CNrjX-VEPGymTN09E>&L;wH) literal 0 HcmV?d00001 diff --git a/源代码/server/image/47.jpg b/源代码/server/image/47.jpg new file mode 100644 index 0000000000000000000000000000000000000000..54d9bd179daa158b50d2737b14011398b1062d2c GIT binary patch literal 556 zcmex=Ms=g{8!#jAdkub3AN4a!3aMk1*shFaiO@(GZfEiGfXk zfsvV+nTeGZCc((W%)-DbD5Pj8EW##cRM@EOlsNGqP$M&nUM8SE7C{CkCMIT>P7uw= zB*?5NBpmqv76T7Z1CS@kV9zl7=(P~dM>d7Bx=W{Zuo-7r>Mogks;FFT<;?Q*ob&#& z`vev?-rTyY?(vInf2DRB<-UpUuNSef(#b3?Uj9-cZyv{w^PiV^^DOM^igJoND8=M9 zN3LvL#nF>{XK!0HtuN?ev#MPjD+0$?N+kNQ`M?5mUPt3R_ z_CU(v(6Ix2eq|>`L^j4Ms=g{8!#jAdkub3AN4a!3aMk1*shFfcPh+zcZbnOOuF z7@3)wnAurjQjAQ@EDWrILW*o6hQgvs%0`KeVvd1H6Bjaq08A&C1}YU~WMD!u703tb zHT-{zfd?qgB*-ktV9&7m++F#7<+^}M^{GG95 zS;$Ali7iXDyvjdSP1^X!#3-#c?L$k)tAg8tlYVzO1sTfMbA@=mFnoVK>jLY8La7?F zqjoF!c$Zi&)qERu=V#@)0t4G$$#tdcs?M%cOM4Q#uuygr%h%g+F3Z`Rc~pLsE)giY zRQ2k2omR**&gR}XYWbRL)?^CaiQ4v7`t?f9{|v@nYb%yadttOGu(Gv2v;OAhUeQM%*B_D3L*6f$r2_j7OhAUH~xPU0A1$2fdBvi literal 0 HcmV?d00001 diff --git a/源代码/server/image/49.jpg b/源代码/server/image/49.jpg new file mode 100644 index 0000000000000000000000000000000000000000..a234e4fb6a32a2fc2c322210dcccb4460798369d GIT binary patch literal 525 zcmex=Ms=g{8!#jAdkub3AN4a!3aMk1!N4FfcPRLL3btnORsF z*aR4u7+DxtSlD4Qj7-c7EUbcTLW+jMqRJ{FVn&XM7cVh_089ypW(H~#WMp7sVq!*! zGcpM>Fe@6e2u-~B{}uxeP=-m6S&+e=K`dF{cA7)9)3p<;dE9;Tg=J@4nLBCsJ6|=6 zrtd3_qKo?eU6X&-e&od3xqc1rB(`7Pzi6uD&!$uEp*oI#N|#=LbUayLR{X2Nk856N z^haJ!D&Bl2ZOz-I)oz~Y9(V2J6g+eo<^5j#UNJ+(e~#hfiKUNS?(X}i@H*^;S=B3+ zIPb&rD`cK&D;7@@KHR@!mNARXx(S<^Uusw>1lhSxxhNN0zWDy_?XOlzUGcHpeac)h sv^%ljrpD)OMkjlAxq3dWz=>Px# literal 0 HcmV?d00001 diff --git a/源代码/server/image/5.jpg b/源代码/server/image/5.jpg new file mode 100644 index 0000000000000000000000000000000000000000..cf31c449282c8872e6803fb4d414a4d45cda8230 GIT binary patch literal 539 zcmex=Ms=g{8!#jAdkub3AN4a!3aMk1*sjFfuSRLL3bt*%+8v zSp*muSeaPZn3!QQj7-cdf()#RhK`ABLc&TD7a9c?HEv`?*UZGg2vo<&z{Jc5l!E~f zpG8nevGD&b1|FboOoGgU4E7AGu4iZcoEW0y9`Hb*?gNLJm0!Gk=?xp3KAW|n*Hj(u znf|H0YNJ-(n)i4?6FXnQM5{xwW*Qf7Prddjy6I@q%R^j^yC*9(1x-(2klDZUv3GdH zxq^qkW#3J6?3j1+=9ZjArxq;aU@)+Cn428)&+f(D+==CW77DAZ4dzsRaGr7Jm|?o1 z;EY-@j!wAJzZA2>_M{ BrN;mO literal 0 HcmV?d00001 diff --git a/源代码/server/image/50.jpg b/源代码/server/image/50.jpg new file mode 100644 index 0000000000000000000000000000000000000000..6efa7217e8da251bf31a0065917c724f83c7907b GIT binary patch literal 464 zcmex=Ms=g{8!#jAdkub3AN4a!3aMk1*siFfcJQLL3bxS(#Ya z*aaAv7@3(^nOR{{j7-c7EP_Ictipy97b*t^C2lVbGDqcgYE!&qI50qcktL`(`fBL1Epi2Tr-_9~)Uf29XWZm4hzK1CpS9)A0 z`58ETJF5Fs{rFjveI=#yCTe@P#wdR|_qEDsks?RM31z9DEew3d+w<;w`MMg a_d=hsj7#1QmCE0tQW|T$8FlRc-vj`DMs=g{8!#jAdkub3AN4a!3aMk1&)lFfcPRLL3btnORsF z7zG%Z7@3)wSlF1MQjAQ@3@n1ILW;tMN{)evY@#MkL4^x99%Mw<&d9{Vz%0lBRL%s% zFu=$J6l5_JQgm$m@c$MA4>Kb$Ab`s38Is<;dMEv^NAO6pz|qUD+j=$|y6AX|*iS2} z%{Zp(ziQ?6?Xjn#UnnUS_Ho{_eE!4qglBA3nc(hut($&$NIP~`S}OlFxqJFlp3-)I zCePCz{sndy-_@^qyj^M*bJH3BBE53U7p3dA%4XibU&x((d;jcPx6jIW@!l!)=*{Ki zTT|U6P$d<$;%>vOdsB{y1x??mwNsggljZUJ#5*Cc99ku(%srVDqrXy@*~IBy^s5W6 zyQ|Ze$DEaR;Ms=g{8!#jAdkub3AN4a!3aMk1&)nFfuSRLL3bxnORub z1b|*)VP@iGg~I|LqQXjMu7RP2r7e>;9lWS)j6hQa85x*R z&1Pg0RCE;je~WNGx z`R3_8wG(fqt|QCMMnJFy1~@-;G*-vKTmj@z4B7^ov}do(j?Cdv1V_# zr>^l1pRvYZ`<8N!D6dH~CkL!~y5v8DXwk$=`aiA|8Cz!0j=tP<=W5)V$|u^7q-U+Z z+HccZ<0|2N>+W`~J5v_?=#OXG?NVTIxJ8lU{{Nc* DE%le2 literal 0 HcmV?d00001 diff --git a/源代码/server/image/53.jpg b/源代码/server/image/53.jpg new file mode 100644 index 0000000000000000000000000000000000000000..084a2a5ec318ba28bb72ad867fbaa290cad8f2be GIT binary patch literal 571 zcmex=Ms=g{8!#jAdkub3AN4a!3aMk1!N6FfcPRLL3bxnV4A^ z1sE8anVDFaIbkx4Kv4!(K{iDpVZ%UCr9=_6g|LL}IjP0)PWaa9fY!9> z*;fkU3)^OQz4;=-7Jh76#Wb7cr{?fX?%mCIb8oO@aSE9i$DFan?Gx-$gkS&%_laj-7LQ++HmO}TV0>b iqkB3Y%u#iCY_sJMs=g{8!#jAdkub3AN4a!3aMk1(V#FfuYSFhg7oCfOO7 znOIl_7?>DY7@61@S)o#lOw0@{tb#(qifkgH%7%eT#)*YR#X!AiKoCRZ|1Aa{W=5dL znFSf_8NL?$SQB|LIdY@L_q5H8Gv{40)A7mjR9SaYG+ce4^(zcpSCM|QK?*`z192mn`0Qx@C&Yg+>?3h zkmIdKaawyLcF)hRzSq|N{^Pob_jVjhx^yc%#?HiOp~6p%ef!t42dBKAZQvn)$w}0v zV_x3j_@_=Kd=@Jo`iSYqrG$x@{bp^jU$S+Qui!^}LoE@BmyCJN&iC3{UM(owwX<<; UDpSQt4F|^dt1MST+5g`J086c&{Qv*} literal 0 HcmV?d00001 diff --git a/源代码/server/image/55.jpg b/源代码/server/image/55.jpg new file mode 100644 index 0000000000000000000000000000000000000000..67e22594dbb97c952094da6ecfbad769652dbba4 GIT binary patch literal 567 zcmex=Ms=g{8!#jAdkub3AN4a!3aMk1!N5FfuSRLL3bt*%(;a zSp*munL&Vs87jrd#LU9LD##{esOVUzWE3c@V%C_LJP}XMLYCeX% zi+R&#?swlt zaj0{88DEfHyv+K?F`IndLiMQc8wx*0g-?uKv_?5IqvLWoXOP(Plr2q5bT>H#HqI%1 zZu`lm=EAFsx#u+Bvg%&v2)Zt^(mh{g`}L#gA#T3Sx3xa*o^Yx-b@y$_i))TeH08CB z(G03}b-oh%mbs_=Z>Z;vmtQTv^0;&Typy!p{@p9fpnlQGQzQ=Fs<`^@%39sROd%(+ hWmBeX*$}j5VgrLD`xigMs=g{8!#jAdkub3AN4a!3aMk1$j)FfcPRLL3bxS=m_F z1%O^*VPR(BhRHB8F*C5R3bF|)8VWlGiYXZ_6cKd_O)PAjIA!A{Mh2iPG5~TJSp^xG zfB;E?k%>W&Sy9L^@!*I5w-|Vsf!YL_1sUuauKOIG^7D++o!6~L&aBOPzqC3lh%I*Q z`Sr()z9q%q6%y= zu-qun(eaXb@V-vo`nAj}ZqYZwUuWD&nOJmfX4G=e2WhtopR7vc4yw@nIC;j3THW*C zN?KN}+x*(?*Ms=g{8!#jAdkub3AN4a!3aMk1!N5FfuSRLL3bt*%(+@ z*##IFnVFeb*qE51QjAQ@fQYX*r9? z8ovt@mE0L+_>W&WUQ?2v8a6N=3Op@H&$7?gzwgRW2S3(N$f{R^3}r9$+@$qdpcd%+VaN3Sf=s} zv+ch0z|*`MpHBDPkJQcT44QINegDAmh?0d_mY@Rmier1D}iD|8D{SR4}(6 literal 0 HcmV?d00001 diff --git a/源代码/server/image/58.jpg b/源代码/server/image/58.jpg new file mode 100644 index 0000000000000000000000000000000000000000..d2916f416ef11301c958eb1307c1c601cbd577f8 GIT binary patch literal 570 zcmex=Ms=g{8!#jAdkub3AN4a!3aMk1&)oFfcPRLL3bxS=m_F z1%O^*WoBaLgvl^6F*C5R3L3HrDLMw46iyTt5mhn@N-WyQ2m&xwAexzpfmM(J7!WM% z2w_Gh20>;;!;M11N{t6Ee*Axnfrpt97#7Te4E7ASmuZ%0?o!|5Z}93KpC(seP{ZCv zhFpt{ug|{ct>a$u{^9lPzweT-sc)IzGVkxLe|kozPhH@f5cB5ri>wVySGeL8FFc66 z{VBe0uHkvfK3Sn-C$I2qzJ8=8Tq}9kTWjx=7w;A>yW?`G?ONGdm#II6vy=YSp6FOn zz9M!`SzL&Z*R}&*b8gjcdwWOihrih4YeLS8jPwKdJ$Nh5+swb|yr)uMm(^9{pv>ua z3Z^df=2W`x@!V4F@%~4WTy>NA*;&4HM1&qXG<)yo`iSQNj-NKGegAHFnC0g5sJ^(C nzmi$5kxT6k+`Hi2=(6Iend}?Om-9Yyvj}F)VOqLk<^P)iby~lO literal 0 HcmV?d00001 diff --git a/源代码/server/image/59.jpg b/源代码/server/image/59.jpg new file mode 100644 index 0000000000000000000000000000000000000000..ba972df442199109d4e69f0314ac30024d921c31 GIT binary patch literal 568 zcmex=Ms=g{8!#jAdkub3AN4a!3aMk1!N5FfcPh+zcbx*jWV_ z7@3)wnOIq2QjAQ@f($IILW+iL!XiqJiH)LSM#c*dG6FTjlz_DZ)iJONG5|>?Acg@( zCI)6fpkBwoNgw{-V&DPV$Rr3f(4OI%giq>mzX;z=L7#43z2o#{#f&SZ!f*JEKYCxU znCE+9aQMHK(6tmAdslIWRNpT<;W>*c)3fTYS9}yX{i7pn|8mUz6E0 z&M%KNV;=1a*(LtfoXO!2vv%{p{|wn;T_tNLOj_gi$LFec<&+rFbDCnUV%yKI<=MPQ hY|^9&lY9=|v$^v-`+~cgI5?KdS$K69DrXyQTmD literal 0 HcmV?d00001 diff --git a/源代码/server/image/6.jpg b/源代码/server/image/6.jpg new file mode 100644 index 0000000000000000000000000000000000000000..34ec3cd93900ac538f6ba4528f335de59cb7bb16 GIT binary patch literal 538 zcmex=Ms=g{8!#jAdkub3AN4a!3aMk1!N4FoFQY)nJm1frXh> zfPs;jiG_uY879HV%p%CZ#H#3+$R=dCP*};RuyLYsU=bq&GqPTwY9^pUuqYE;F9Rdc z*UT(J!is_aZ!z!ybpW}74E799TOa1e8*TL#+UtFw`_BW{n=fr`ZC@uod{X>0Yu!dI z-pBFJ_a+{?Qqa%ysLS-vwobMrmNdt|jp~p37k4KeE%~GVZhi2KqT7#ROJ<&M+jr%k ze)s3gKE~gIzHLmovG5(=*~O`1p{zO^nAwjAugSiC`Cjj(c?!Wo`87 zr^4@|Ms=g{8!#jAdkub3AN4a!3aMk1&)mFfcPRLL3btS=rbb zm<51dVPRor<%G#FGBGo-2r9C&2^k7II*BNm1Qr^ZnmM~PHcdRp2m&yLAexzpg;kIN zsDp_aAEWWAOof*Re!cPj zd6t9GwGh6x-zE1JX$J)Q-@9<>{^5$!_I6v7pI*<;i5KkI-|Ca1`pECptJy;Dbu5nr z?DATX8C4{B;LH`{qH5;jFYA@#zO#l&9o(QJTJ$>DXQzQo#tPj_yh5I0OWQZ)>DNAF z)0pXh=hHPgURl#uF@BFe)~w+y+^o`;%Hel%<1~Zkax+sHjxvR8DwVbJSg?0>Rb^4D z>&_O-89%!7d^X;E<93!BKeO-jIq-Z*eCpG! lMh6~lahf!BrBx88YV7OFdtc^0DwHyjtK_+5=o<3>CIIEvx#|D_ literal 0 HcmV?d00001 diff --git a/源代码/server/image/61.jpg b/源代码/server/image/61.jpg new file mode 100644 index 0000000000000000000000000000000000000000..ef20698b558a7116ebc19bbc2afef07b010f249d GIT binary patch literal 558 zcmex=Ms=g{8!#jAdkub3AN4a!3aMk1!N4FfcJQLL3btS=kv_ z*q8-?eqm){Vq}F$F)|4zD+Y1sUuabQ8oXzj?CUUZPj!G+|GJ%8I;@S9u*ee}8q~ zh>U-0((@-(`{VDP)*1I$8BJC$4q}|U>C=h%J*ltT@(WAD{_3pN%L+A{amQCK_0_qw zJpRYiElVyQs@k#rboDRk->-~swy!ALDi&F`YE^5rX2Y}wyE!tGH{8`bfA}l+4bu!` zzUK936;$-%Sjvq5?O|Ms=g{8!#jAdkub3AN4a!3aMk1$j*FfcPRGD2JpAz9g( zS=a;^7+9HD8JT%uGK@^jtbzy_aRe6V%Sio!avFp7-msl_{+b2f}BiGMZ26Y510M|4?>~+3i+6iQKD2 zL09z7&JN%&QIYpZ&N(RUnqc)x=j!Kp*8R(@iao#0`1M8NLVj#&)Y=1FGkX{$Q$868 zsLr^b`7h+#?3HEDYHVhP=1)0xW8vC$a)qTTys}kqAA5XW{i!}{y}Q3buHE^Hv&BMx zpK|k?ELtY%X)Mdi^x)CL1CP`+as{^(ZuovSPa<)bZQ%a?mb|)Gb1w#eICW+E9QBB8 uPi2qJHJ$ZN$m+y$ju~7D22++cr`>ZYoAAfiPh-){)$tP3+l4m&zX<@Ms=g{8!#jAdkub3AN4a!3aMk1&)oFfcPh+zcbx*jWV_ z7@3)wnONAEp@NJ|%z_LoLac0tib^7)j)}rzM#d(Mfg2ApGBBa)XJTexWMLHq5{%5O zFe4clK*si!>eb?Z&ppy(fRgyx8dpT zITe?{ZDnL zZcv%TBGRB1RPp-#AEi+C^hs+qmkKRfoHohdZ|}QeQ@f>yD=mb!xaCAG;O-X5oog8` z-n(hS5f49CcOH($Gon?6BI`=#ZiwOf9NNHs`Qdf;ziX;A9w#r}6XW_}<%O+xPqlBq tcj?xaAl>!13wbs+a(jAuc&a7L?E5i4YhIwM$KwN&%QJ3WxI6v-O#slby$S#T literal 0 HcmV?d00001 diff --git a/源代码/server/image/64.jpg b/源代码/server/image/64.jpg new file mode 100644 index 0000000000000000000000000000000000000000..09ca67b733386769e61136899e4e65f491483801 GIT binary patch literal 585 zcmex=Ms=g{8!#jAdkub3AN4a!3aMk1$j*FfcJQLL3bt+1MGF zSy=>teqm)|V&jHMF)}eTum}n%vKq2E3X3Q?1r~~m85x_HCMFk6+{g$5FqI&hnT3f} zkb#kfiIEi{%m}nfP|=V@$T9KY#s9Y$cz_l&2{H>Z*fU)HqBm)u?8L&Kr3;R3s^(&e(BOZ_T;xC)-xUsrGPpF!yzkK($@efJJo zMrayW)a7{|lZ!4Edb~KLRgpW$DTp)l?wZTnpZ5M_z2h-arLaVJ?(*!+`u{fp6L+@% literal 0 HcmV?d00001 diff --git a/源代码/server/image/65.jpg b/源代码/server/image/65.jpg new file mode 100644 index 0000000000000000000000000000000000000000..3abeb62f5f24e50b5406f96b4e0ea509e50ad75d GIT binary patch literal 572 zcmex=Ms=g{8!#jAdkub3AN4a!3aMk1!N7FfcPRGD2JpAz9hk zm{|lE7@0wU6(+;T#4O0b!YZU_$mW0}oIalOWJMdxp&BFv&ZrJ1wrs)Tnw!1o%vvdunNbg~E~V zALGte*ww0CpJ%%9NL^_2#vS`yH+bvCww&IrbXHq>0rQ?e#UIReD*9(F+EeKtHbM-v4H9hweaDyPglzJb_~dzK+V%aFzhBk5s-0%?$ZC1aduNe-Q{o=k or>jJB4#_x$aH(>7vP?AcyL|rL@{&ORUar{LJ5KF#_5Xhp0327kr~m)} literal 0 HcmV?d00001 diff --git a/源代码/server/image/66.jpg b/源代码/server/image/66.jpg new file mode 100644 index 0000000000000000000000000000000000000000..ea9d8c9e34e000e5b5b276e4f31fbaed75d79dca GIT binary patch literal 577 zcmex=Ms=g{8!#jAdkub3AN4a!3aMk1$j*FfcJQGD2JpA=#N( z*%(;_fSzGtVP@roNii}pGqA7<3JEJZvKa=7C^;oA6a~61sIh7CMMef@6eECU0+li_ zvM@2S!t^sRFam`Ig%w$Z3>O}}`2Q9I4^R`6AhRHYJ;Szz)v~9U`Pa?XdvsyVcEc%m zR^1KFtNHn|I#+H%#+YG^{nI$DvZg@hS_I3twZ9UsU;22fq@8ztv$&zb&ca}x zT@E29xsPyd_+D7ayS2y0sk_tmwbS2aCl#|-=<3{B;p<`dddkWIX0M(c_s1&jm);*de~s&h58jU3`|Slc1$uTm zF5dK=$K=wS!~?%)t~%y5$zOW1rBj9*c-obiHZm$0Sn*ac!yWIc) literal 0 HcmV?d00001 diff --git a/源代码/server/image/67.jpg b/源代码/server/image/67.jpg new file mode 100644 index 0000000000000000000000000000000000000000..0c63b54ba73aa4431e811799ee9568ec5a66c5a4 GIT binary patch literal 584 zcmex=Ms=g{8!#jAdkub3AN4a!3aMk1*6QFfcPh+zcgISlO5b zfIeYnWoF}t$pE;Bp8_(m<5FtSqvBczs0}{qxDHQUR>|Wg`?0!OWQzxD(}E=@Crw&aHhHQ=^+S{1 z>yu|~o>_UabMEpB?c%QLOI%C7%{cW@Uu0#v!Md;wtpcyvPHpb_z;7V4LM12>%&f=A7SjbkL_l3UNSFdvva@>iP=s701O|m(T?Us(|-XMWn zH*c7F_Ms=g{8!#jAdkub3AN4a!3aMk1*6QFfaol5@2CvV_;?% zU|?ckVP;|FWrRvGGBGf-2(k((vKcxiiYkRnz9^z>T^;@KX=tfQyQ`C4-v0e-7~9^miK=rin{KqC zZMvr5pWCx#cCXKKQ+&jp_DcQ9%{k5C0e5FDUzBw--`{WT977%vAsx0iM|z7LZRMSB zJSlfRB=$z@ma9hU&t+#?_sI#o6UN#OndCh~-=g`l_YrnE= z<)n(g9}G3wCfXWlx{}r5?26ZU`+0AFy?f5=K(Ould-gXrFFYpn=hr*=kOhptue^x1 x4)*vlL+F(XcN(MUUB(^vxU*k<{!^&DM58*T?@PrIkrcmN1Dj*4O!fb70sy=QyHfxF literal 0 HcmV?d00001 diff --git a/源代码/server/image/69.jpg b/源代码/server/image/69.jpg new file mode 100644 index 0000000000000000000000000000000000000000..25d19f78c3e970c52206dfca4b2468b76047610e GIT binary patch literal 584 zcmex=Ms=g{8!#jAdkub3AN4a!3aMk1*6QFfcJQLL3btnb{av zSlI;_7@3)vSlRetQjAQ@fXOR{308l^ZxFCHnYU* z+_~4hwa3@qu8l4-y_+Li8vOdP>8U4$ViRI}RCnCCu_)iX&m=YgHeO00oRVk zJZ0nP^6i7Xy{fy3uHGK6HwUApvgsvT%zK|I?Y@UI|84EDEvtfymFE~sGRvoO z*UFaeb~U)2xb0dadxq#WE{{{}6_>6XJgU?ED*Su7*K?ColJh+bE~Gcr|GxMs=g{8!#jAdkub3AN4a!3aMk1&)nFfuSRLL3btSs7T^ zm<1RZnVDEvSXp5*j0{Z7EP|{`fd>^06C2rtgcoj9R&x%T2-1zBoq>@RsE~mP1ejsE zfdRuT$iO0`Xy~XE`0@WO1|FcDOoBi$dxoW~rq&+l@OSOn{ZG`czh3(7-DXi^5AFF1m7fidn7m+&ofWmwS9H_&pHoC9ChI)< z7hl(!)@K!!*cNJinf0w?%;V$R1wRD5e9^mM*1_u7J?qckPrk{t?7h;GJs|Jm&Ifj9zr8E=D~kP0O39ob6K5Uy&mb-;DEDUKdRAtkFMB*TmiIa9 jq;ss{ow`Kq-?eW$erTAAMEDxc+-W|CcbZP^^Zz#iM8~6j literal 0 HcmV?d00001 diff --git a/源代码/server/image/70.jpg b/源代码/server/image/70.jpg new file mode 100644 index 0000000000000000000000000000000000000000..7d6190c253d4eeb71a3bab28485773fb892531b0 GIT binary patch literal 573 zcmex=Ms=g{8!#jAdkub3AN4a!3aMk1&)nFfaol5@2CvV`63( zU|?ckVPR%xWrRvGGBGf-2(k((DzOjlaJwX+C1G7AYSE}Z!P76T76BQPYG1sUuaa@~6u9DezXE2@++?BSHgYS9f$zjD=Y z8N{hAu?&rB?Ym$uJzM_z`iSXA?oMuf`DtVHuIA)3ad{J-cN+YXwBU6)Su#o0;N)Ia z4dsHpizF_2_ue$?dE;nyBssKCVZn;DB@^y@b~Ws5PBXjq?N#p6dXDzq+>j_w=Z-M5 zGYh%iTCdOFJw4vOLfZc6%(o&XFT9xVw@F=P?00!#a>q94MoL%tG{pY@bvL}1@b@s<0HmzPN`hvehgP>*; n!^8Dc8_l0y_kZ8EF|fL`EH!-5e+D*%#jeJAY)ajn|8D{Szc;qE literal 0 HcmV?d00001 diff --git a/源代码/server/image/71.jpg b/源代码/server/image/71.jpg new file mode 100644 index 0000000000000000000000000000000000000000..641240cf64aef8201a5f2e3a76e23ad44f8765cf GIT binary patch literal 468 zcmex=Ms=g{8!#jAdkub3AN4a!3aMk1%92FfcPRLL3bx8JU?_ z1Q>uMGYcmxOoj<4z#=H5cu80!B#~7~H8`nh;^ZZ!PQ@EHF#-Wh8H8qJ6+{!yrzR|(xoUBD&1_Ca;jd0VEq+w4+sgc_$G*$| bhQ{*Ur;qu*kP6%|y=V3XlhukE|8D{SAM}nh literal 0 HcmV?d00001 diff --git a/源代码/server/image/72.jpg b/源代码/server/image/72.jpg new file mode 100644 index 0000000000000000000000000000000000000000..96edb9126eaae5df33ea2f3b15421b6c1ed05225 GIT binary patch literal 405 zcmex=Ms=g{8!#jAdkub3AN4a!3aMk1(V$FfcPRLL3bt8JU8K@SXp5*j7)+IiiXTW!p2IDfsK=lf|3d+G6Dfi9zrv*3StNf3K{;t#lXW1 zG*OUQkinkeN%(}83GP+Lr!>26{CZhIe6L(+Xyp{?iEc+L)Al5}E;f^~jW`-(>+w%s zrrR!Kxxs9+%bk}W)*k;ZaAHaHrS^iOH5zMgZcV6;`|;_m+|4Y`MdB)#z06Nu`77UN PvakL7lq1XK|K9`v&3$a| literal 0 HcmV?d00001 diff --git a/源代码/server/image/73.JPG b/源代码/server/image/73.JPG new file mode 100644 index 0000000000000000000000000000000000000000..63ccfcb2895222225f9ecbee822513766dc91694 GIT binary patch literal 931 zcmex=Hq-)3-T;9z58XJh4H zXJ_Z+|EI`$@KzRlhK~^C}Lq|5@z(jVX zLJ_0Ji3>TDoi-j64Z8S2#W<;`iIYoATtZSxRZU$(Q_IBE%-q7#%Gt%$&E3P(D>x)H zEIcAIDmf)JEj=SMtGJ}Jth}PKs=1}Lt-YhOYtrN?Q>RUzF>}_U#Y>hhTfSoDs!f}> zY~8kf$Ie}c4j(ys?D&b3r!HN-a`oEv8#iw~eDwIq(`V0LynOZX)8{W=zkUDl^B2fp zj10^WZ^3kup-7Ki62q;4&!2wHyRl*mV{h4g`M32i)Ru0a zckT7zOK~w-lj<|yOuf>*wr`2>r&Z4z%K8ld8h$#p<>i&4=&0NAk(w(1!fa&XGJBSG zukemZI!!?j}^|J((h-lcXiRN zx7}x-nRVx-$OFaB=OzVul_Z*%|7y*XK6Guh*5)beep^@mTYA^)Kf`agr)m*4OI^(PF6}rMnOeST|r4lSw=>~TvNxu(8R<ECr+Na zbot8FYu9hwy!G(W<0ns_J%91?)yGetzkL1n{m0K=Ab&A3Fhjfr_ZgbM1cClyVqsxs zVF&q(k*OSrnFU!`6%E;h90S=C3x$=88aYIqCNA7~kW<+>=!0ld(M2vX6_bamA38O{%dq`CgP9)|%2YZR(M3HNT5JpKsr8ev$noU32HB zqu*ZEzW?WbKDn4Dr!Z8}Z_T8jt&^VJJ$*J(yG|wio6*b7YmB$#c;%fE?n(JwKTm7> zwEqmB&-tJK&#-YVZ~U3~H~$%oE2cyq-(7!?ea`cHD{AI7e>PnrUFbXC@$lBwNh{8U zE-x=S+Is!QR*82kiCsKz?ryh~IG63Y$3Z%z>GzxE8EqbAoz~Nw|K2H)+uFCkNdJ4v zqWZ78{~2QA|1&s>uGK1eZhmHc$%W7pA4;`$O;s*8PhWj=@0RU9r)|x?yef{wpCThO$|P|<3Gc^Y4+d$1bO~j|L^C&(uF~@7qgz+c)RI9(1FWO7jJ%f^(PF6}rMnOeST|r4lSw=>~TvNxu(8R<ECr+Na zbot8FYu9hwy!G(W<0ns_J%91?)yGetzkL1n{m0K=Ab&A3Fhjfr_ZgbM1cClyVqsxs zVF&q(k*OSrnFU!`6%E;h90S=C3x$=88aYIqCNA7~kW<+>=!0ld(M2vX6_bamA3-afMCws-F1#yO?7Sr;yp2JEgo zW%%z?eXqS!_QG1ljcscAI?vC~=;>MiJ)}P>y1P~>Th{H-zl{08;j^DkDl*$}?rPw~ zsS*>iV=@ zU8ea?`oiz4u5MpvJXhZ%lTF3o&*2LXizBA2ID3xE|JRl8JM#8M{fP8iGrQ(&>C4we zPvg-&6lH zTsUiJ_wtwg%dnSDr{2rXz>65 literal 0 HcmV?d00001 diff --git a/源代码/server/image/76.JPG b/源代码/server/image/76.JPG new file mode 100644 index 0000000000000000000000000000000000000000..876b883b7c22fcfd1b9c74362a78a55e1143dbba GIT binary patch literal 928 zcmex=^(PF6}rMnOeST|r4lSw=>~TvNxu(8R<ECr+Na zbot8FYu9hwy!G(W<0ns_J%91?)yGetzkL1n{m0K=Ab&A3Fhjfr_ZgbM1cClyVqsxs zVF&q(k*OSrnFU!`6%E;h90S=C3x$=88aYIqCNA7~kW<+>=!0ld(M2vX6_bamA3glT*MyoyN-tn-(cIWFatJ@u~`v2Ko z|HSn_gVe@{G5;B|y#F)A_Etv6ZsPkAnP z_mz(4e+JvsKSy&anzCQoozYwSU>n0m);#X#Q{Qf=t>-%OY0-a%c`yGn)SQehNe-Uq zmmB-->GW6U7o1pqWg2hDTJ4kf_e}eCaoP39JChFmi#2<=tTnV-?f#sU^(PF6}rMnOeST|r4lSw=>~TvNxu(8R<ECr+Na zbot8FYu9hwy!G(W<0ns_J%91?)yGetzkL1n{m0K=Ab&A3Fhjfr_ZgbM1cClyVqsxs zVF&q(k*OSrnFU!`6%E;h90S=C3x$=88aYIqCNA7~kW<+>=!0ld(M2vX6_bamA3G^Zd#@*+gwEwuI_Mh#a?b6mI_q0Z?xH4U9>YA2q8GogC>D&`wNmR+ zQB~d2+1mRzo=N%i{dvCRardzQ3^xmZTy@`cX_i}JZb`!=r?saZRP!v$yb^XL`|5(* zOV!rzoq3t3scX*i^V%oBl>KKgy8851jFP*EoKNBWspanu-0EVhe;~g$bWzt)ZP}T1 Vk^YQlR&Kkz?O*uo&-VXs0sv1wWS#&3 literal 0 HcmV?d00001 diff --git a/源代码/server/image/78.JPG b/源代码/server/image/78.JPG new file mode 100644 index 0000000000000000000000000000000000000000..8eb3102085bf6cb434f032fe2349fd8af5ba17c5 GIT binary patch literal 911 zcmex=^(PF6}rMnOeST|r4lSw=>~TvNxu(8R<ECr+Na zbot8FYu9hwy!G(W<0ns_J%91?)yGetzkL1n{m0K=Ab&A3Fhjfr_ZgbM1cClyVqsxs zVF&q(k*OSrnFU!`6%E;h90S=C3x$=88aYIqCNA7~kW<+>=!0ld(M2vX6_bamA38(?WjAZ?; zOjVIxttj8f*&HRM{-@6T@8{ckXp3&N-fYcdg7RoKq(HAn}^~ zy=jW4uJ?rNZlC&nzc2sXY1vUzJy%|t)HTWL+TFXa>z%e}Di}zWRFqPtzOwJMn*oc>~u~o0j~F`Cd^h7`1Dq)~2GWx}~$VCuSQaN%L+Ii%Bhb zbyM=e{AqK(TcylX%#5>)GuwVTuSw|W>95KXf2yu}t+9Wi@t@)A(fTjSu@(`pgFJ73 z+J9kZ!8iH2XHVV>zjeBP^1oeDx2C?j=lMxevV1zf8neu*K8MFYvZjiJ>m)7O8TcY~ WXROWsStheHZ`W)8XPBS-|0VzkWnLQq literal 0 HcmV?d00001 diff --git a/源代码/server/image/79.JPG b/源代码/server/image/79.JPG new file mode 100644 index 0000000000000000000000000000000000000000..8c7b06d71f2e8f988b6c0baca3a3eb661726d9da GIT binary patch literal 900 zcmex=^(PF6}rMnOeST|r4lSw=>~TvNxu(8R<ECr+Na zbot8FYu9hwy!G(W<0ns_J%91?)yGetzkL1n{m0K=Ab&A3Fhjfr_ZgbM1cClyVqsxs zVF&q(k*OSrnFU!`6%E;h90S=C3x$=88aYIqCNA7~kW<+>=!0ld(M2vX6_bamA3_;<`rpX#Ph-w(|{@^j9ywI0b@ZpM>hu3ZjWzi!v+I@RdinmXSq+pRzM zPrSbT_bJ<~t!5|hZqY6{905jBJE&u=k literal 0 HcmV?d00001 diff --git a/源代码/server/image/8.jpg b/源代码/server/image/8.jpg new file mode 100644 index 0000000000000000000000000000000000000000..e9be67bc26a54579c89a39d2f48607c384ae7e24 GIT binary patch literal 521 zcmex=Ms=g{8!#jAdkub3AN4a!3aMk1&)mFaiO@(GZfAg@H|g zfsvVsg@uJ3Cc((WEXcsZs@Ql?NXalzIC0@dHW4-Fpu!?X1}0_{?My5{y{v)^OpGkZ zGC%_uSOkR>0}UM$AO63^zys99BnULro}sflyY#`rqh^yHMn0RDclXhzU`9j#(Dnr zR;HJ>XXhB4URsf`R(YzI<;xl0Ol)l~_NaaE@v8EVkL{bnTbw^JC^jS^a0j=t#>ZJ% zcaQM5UlMubVo{`ZtL)l>ptolqXFqmn(Y6!5Q(5=Q>#EYeNvanejz(E4y|O-QaeD0> ir4OoCCItU^(PF6}rMnOeST|r4lSw=>~TvNxu(8R<ECr+Na zbot8FYu9hwy!G(W<0ns_J%91?)yGetzkL1n{m0K=Ab&A3Fhjfr_ZgbM1cClyVqsxs zVF&q(k*OSrnFU!`6%E;h90S=C3x$=88aYIqCNA7~kW<+>=!0ld(M2vX6_bamA3nvY-nox2cXhgH`7or&6r?z~KPe3VqHBM+_{9a!x^IVGyt^m&Wa01QGI-)+&pbJH`6F?mPcEf4qD<&p>Q zES^&wy6W!PcZ>Bp=H<;hv&`ehnLLr{c0rH(b}G+5E;{{NcmK~%^}pZNADdH9y4Cl% z|NFy#&M$cQ(l_zRtKFx*-TSS2>t+7yt!JgJ*KazhESeVXEUj_-gstP9CCMLF?z^7+ zpTXh9e}?xR^*^o#F4{S*@8#`hZtCr!RhQOk%{qPhA7|P3pz0%vjK~U-r^1-1mNV-TD*%Zvp@Y32xy4 literal 0 HcmV?d00001 diff --git a/源代码/server/image/81.JPG b/源代码/server/image/81.JPG new file mode 100644 index 0000000000000000000000000000000000000000..fc4d646185533b3f299700c35a50b14aa8729d59 GIT binary patch literal 946 zcmex=Hq-)3-T;9z58XJh4H zXJ_Z+|EI`$@KzRlhK~^C}Lq|5@z(jVX zLJ_0Ji3>TDoi-j64Z8S2#W<;`iIYoATtZSxRZU$(Q_IBE%-q7#%Gt%$&E3P(D>x)H zEIcAIDmf)JEj=SMtGJ}Jth}PKs=1}Lt-YhOYtrN?Q>RUzF>}_U#Y>hhTfSoDs!f}> zY~8kf$Ie}c4j(ys?D&b3r!HN-a`oEv8#iw~eDwIq(`V0LynOZX)8{W=zkUDl^B2fp zj10^WZ^3M3OE`xtwqWk#zu<_Mp&=KA@@wA3wl%I(ctO1#V0{%7Dn@^fce=*rL) zt3syh{tUW!^VGXvzf3>hNL!e+EtShBHB8m-#hIKX2@jgz99ntx_wmY-+mb42<*8w5 z$&)xvi zhumcXDh-d-x!&K+oTVZ8pP`{{Ygm_-kY}Xq%(6&-#xpBVZh5aVYN{@(-u%Smew literal 0 HcmV?d00001 diff --git a/源代码/server/image/82.JPG b/源代码/server/image/82.JPG new file mode 100644 index 0000000000000000000000000000000000000000..f03255c180255d45ee1dc85986917db7153d80b3 GIT binary patch literal 916 zcmex=^(PF6}rMnOeST|r4lSw=>~TvNxu(8R<ECr+Na zbot8FYu9hwy!G(W<0ns_J%91?)yGetzkL1n{m0K=Ab&A3Fhjfr_ZgbM1cClyVqsxs zVF&q(k*OSrnFU!`6%E;h90S=C3x$=88aYIqCNA7~kW<+>=!0ld(M2vX6_bamA3tde8--=h= z6h9#u^tAFnLx$e{>s@;n)gOOcf7|}Aw5;p$`lR|pLjTIY)!+Wpxp9B`?A^NC*IT~q zKeR7vmfySZs-;VJ-4EZ_b^P3E!=u3~O_pnGs-`}#E!{V(P9;1nKTBk$(!_{|QD!IX zwYE8aIn1>_Jg@$V@bdo*JNExllUf=meLMK>!!xc~|E^x0Jo$3{%zVF{eb*k&3RFAB zkk>CgrHzNx2Ky3NkD&VO3}+5Z1c03A7H;{X5v literal 0 HcmV?d00001 diff --git a/源代码/server/image/83.JPG b/源代码/server/image/83.JPG new file mode 100644 index 0000000000000000000000000000000000000000..ffbee39d76966b7b58cc291310a34490626e818b GIT binary patch literal 916 zcmex=^(PF6}rMnOeST|r4lSw=>~TvNxu(8R<ECr+Na zbot8FYu9hwy!G(W<0ns_J%91?)yGetzkL1n{m0K=Ab&A3Fhjfr_ZgbM1cClyVqsxs zVF&q(k*OSrnFU!`6%E;h90S=C3x$=88aYIqCNA7~kW<+>=!0ld(M2vX6_bamA3zlXTDXh36gbFU`o97AL*ulH!i5YTL~>iD&w3 zPmP#+e3CiejrH@^w@np!u6Z|BzclvkwQqL$MpLswSNYG2*>g+vy=~~%t9pOqouqeb z>U^tgxBlEe@%r-Lr);yfs!l$0Pj-_~+l|dWN~az_{mC!4-!T7^W|lg;pC9kNv+Ixi z%9HQ8D*5^J%$26!>!M%9Y`nrd%cqrFr&U_(Mygg3#|h;x%lAH=vdLsp=8JbnHXEy` zOsbkxvudGh>PhL(y60-#c~@Os8hPcK-|zZ^y0LfH9tk)qlV^(PF6}rMnOeST|r4lSw=>~TvNxu(8R<ECr+Na zbot8FYu9hwy!G(W<0ns_J%91?)yGetzkL1n{m0K=Ab&A3Fhjfr_ZgbM1cClyVqsxs zVF&q(k*OSrnFU!`6%E;h90S=C3x$=88aYIqCNA7~kW<+>=!0ld(M2vX6_bamA3nwj#pdL)S7~<)>o-j(TUQtKO8P&8?Dxj!Z(Y0o_P^u%<+H5!oSpf5 z_payLw4Y72UYB-n-7W1ecVDg9YFBPJ)vIFVQcKmdsi}46W5Z_s?A>{J+13`XGizr5 z+1zj{bmJU>19DS?W~yFWXf~@YdiM9Ql%%)|x$387-oNs*H#}dpd|&;~*MRij5 z_2=$=HStgViSM5*PfeAqjx6^2D>tj^cKi>vy>qYMOqnn>EmGNVQ}3SUE3&8D?761D zHIx6s+yC$H;r|TBR!tQ>cxru7p^W9**IuhvubH3!L#_4QihSKO(Gq#n&z6<3Ox~jL if`M7?>U>ubH^Z(i{@z-r!{U7}_pF<}@7mwU|2F|Of@^aC literal 0 HcmV?d00001 diff --git a/源代码/server/image/85.JPG b/源代码/server/image/85.JPG new file mode 100644 index 0000000000000000000000000000000000000000..1f2330852b61de48e20f663d87164595305df772 GIT binary patch literal 969 zcmex=Hq-)3-T;9z58XJh4H zXJ_Z+|EI`$@KzRlhK~^C}Lq|5@z(jVX zLJ_0Ji3>TDoi-j64Z8S2#W<;`iIYoATtZSxRZU$(Q_IBE%-q7#%Gt%$&E3P(D>x)H zEIcAIDmf)JEj=SMtGJ}Jth}PKs=1}Lt-YhOYtrN?Q>RUzF>}_U#Y>hhTfSoDs!f}> zY~8kf$Ie}c4j(ys?D&b3r!HN-a`oEv8#iw~eDwIq(`V0LynOZX)8{W=zkUDl^B2fp zj10^WZ^3Nd7p%~@z(w&l-R&1VwV!?Ko!moDpFyDtB*?%pkhCi~Nw zPj^hIn90(xq^tPg-S0bd60Rk89^SD1x{ty0?}a*(1-fs#%eIRKb?wT$oV$Gg;y)MP zKlo9^CwK8md7am-syi=|r(Ftbvk<%Cwp1`N;$C3GCYh-U!l$c0pIlcqt!sw!)a})G Xx@t@o#|4DOoqV-^@1H;Y|8D{SxB7IA literal 0 HcmV?d00001 diff --git a/源代码/server/image/86.JPG b/源代码/server/image/86.JPG new file mode 100644 index 0000000000000000000000000000000000000000..f6c472e0eb98a16dd61db2d5644263285355f366 GIT binary patch literal 944 zcmex=^(PF6}rMnOeST|r4lSw=>~TvNxu(8R<ECr+Na zbot8FYu9hwy!G(W<0ns_J%91?)yGetzkL1n{m0K=Ab&A3Fhjfr_ZgbM1cClyVqsxs zVF&q(k*OSrnFU!`6%E;h90S=C3x$=88aYIqCNA7~kW<+>=!0ld(M2vX6_bamA3*Lm@=VMCt|7Tc#;y=T;s4qpY0)r-h`E!2RGip+AmPrW#qVYeP4bPvA`Kl}W{LrknV;3G~i9GqK_I7#x5BZ7z GZvp`DgmdZu literal 0 HcmV?d00001 diff --git a/源代码/server/image/87.JPG b/源代码/server/image/87.JPG new file mode 100644 index 0000000000000000000000000000000000000000..f13e29ff08c0d3c538b246bb49b2a526fdf9fe30 GIT binary patch literal 952 zcmex=^(PF6}rMnOeST|r4lSw=>~TvNxu(8R<ECr+Na zbot8FYu9hwy!G(W<0ns_J%91?)yGetzkL1n{m0K=Ab&A3Fhjfr_ZgbM1cClyVqsxs zVF&q(k*OSrnFU!`6%E;h90S=C3x$=88aYIqCNA7~kW<+>=!0ld(M2vX6_bamA3|9s{HtR(?ikse)`UT+Z(4pL*{7y|$ z%7B%-a+kgT&%iVDON@DQb8C2TcTC)w_--M!nlZ_e{y*H}flM3vPoyv~06&(LmHFYmYd*wq!w)62Gm zyX9@@tN=5d%n7D<@KJdW5Qv( Ns#d?Rf3N)iCIH7MbEE(O literal 0 HcmV?d00001 diff --git a/源代码/server/image/88.JPG b/源代码/server/image/88.JPG new file mode 100644 index 0000000000000000000000000000000000000000..2780490e8c62e3f664f2308491804fd0af10e794 GIT binary patch literal 951 zcmex=^(PF6}rMnOeST|r4lSw=>~TvNxu(8R<ECr+Na zbot8FYu9hwy!G(W<0ns_J%91?)yGetzkL1n{m0K=Ab&A3Fhjfr_ZgbM1cClyVqsxs zVF&q(k*OSrnFU!`6%E;h90S=C3x$=88aYIqCNA7~kW<+>=!0ld(M2vX6_bamA3iPoU4O6nO7L$V z``uiQx{%cl3m!Qg5pbU8c8PsyQkd!4A5-T4n44|<=Yh(yych{hBMOnRWZiANez1WQ{D7w)Tdpl}*?snsN1N^Qvuj zKmLib&yNW)d|8&Tq;q-mk-XiDRRoT6Pe^-LEq`pI#(FD*m0~~Dv%mdkXtzt-Yjy8d zQSj#6d$&sK>OUO&x8ZY4w8%J`ofB(W`S3aS N%es5<9|Zs31OU9ocYOc= literal 0 HcmV?d00001 diff --git a/源代码/server/image/9.jpg b/源代码/server/image/9.jpg new file mode 100644 index 0000000000000000000000000000000000000000..6d7912891a6b9a6ded79f0013f6f666cda5a28df GIT binary patch literal 521 zcmex=Ms=g{8!#jAdkub3AN4a!3aMk1&)nFoFQY)nJm9nSq5( zfPs;jnTeU56(+&Rz{JcVsK_ehn7B|x$uO{R;-SW-jTav>GBBg)W?*1s1uA4<0s&^2 zZeYML3o@_>83raQZv62776T76&_F?;m_5UzrR~18%CgESMuPXw>Ce~SzG~z0OT}9! zecXETd47LLuHlT}@5zbM=e$omuvA*UVwJFkr}B;0PZu6x*lk*}XqIa7{r8cM(@Y)S zL_hn>zvj!PgG)N@J-F%GsBr(`AHYPoxOep0zJaYubf$lV*)ESZ+~SgcsI z-Tj=Qr>uB#+N)z*p9n=iobz~rd}y-VJpHU^v*Ygksdv6Vi8V#-&5DKL3wvz3G$XEA lnnYE0xph68;P~)${^8mS**Y6$rOo)1_c2;HC*S`6O#s;ds7?R? literal 0 HcmV?d00001 diff --git a/源代码/server/image/Thumbs.db b/源代码/server/image/Thumbs.db new file mode 100644 index 0000000000000000000000000000000000000000..b1b2db9d5d9d6d5f2b78e488ee12a6c51f5d7950 GIT binary patch literal 120320 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 0){ + model.addMessage("提示:用\"tab\"键可以自由切换于控制界面和对话界面"); + model.addMessage("提示:按回车键可以直接发送您的对话"); + helpMessageCount--; + } + + if(e.getKeyCode()==e.VK_ENTER){ + if(!view.messageField.getText().equals("")){ + model.addMessage("主机端玩家说:" + view.messageField.getText()); + model.playerTypedMessage += "m" + view.messageField.getText() + ";"; + view.messageField.setText(""); + }else{ + model.addMessage("对话内容不能为空"); + } + } + } + }); + + JPanel temp = view.mainPanel; + temp.addKeyListener( new KeyAdapter(){ + public void keyPressed(KeyEvent e){ + if(model.P1 != null){ + if(e.getKeyCode() == KeyEvent.VK_UP){ + model.P1.moveUp = true; + model.P1.moveDown = false; + model.P1.moveLeft = false; + model.P1.moveRight = false; + } + if(e.getKeyCode() == KeyEvent.VK_DOWN ){ + model.P1.moveDown = true; + model.P1.moveUp = false; + model.P1.moveLeft = false; + model.P1.moveRight = false; + } + if(e.getKeyCode() == KeyEvent.VK_LEFT ){ + model.P1.moveLeft = true; + model.P1.moveUp = false; + model.P1.moveDown = false; + model.P1.moveRight = false; + } + if(e.getKeyCode() == KeyEvent.VK_RIGHT ){ + model.P1.moveLeft = false; + model.P1.moveUp = false; + model.P1.moveDown = false; + model.P1.moveRight = true; + } + if(e.getKeyChar() == 's') + model.P1.fire = true; + + if(e.getKeyCode()==e.VK_ENTER){ + if(!view.messageField.getText().equals("")){ + model.addMessage("主机端玩家说:" + view.messageField.getText()); + model.playerTypedMessage += "m" + view.messageField.getText() + ";"; + view.messageField.setText(""); + } + } + + if(e.getKeyChar() == 'y' && model.gameOver && !model.serverVoteYes){ + model.serverVoteYes = true; + model.addMessage("等待用户端玩家的回应..."); + } + + if(e.getKeyChar() == 'n' && model.gameOver) + model.serverVoteNo = true; + } + } + + public void keyReleased(KeyEvent e){ + if(model.P1 != null){ + if(e.getKeyCode() == KeyEvent.VK_UP) + model.P1.moveUp = false; + if(e.getKeyCode() == KeyEvent.VK_DOWN ) + model.P1.moveDown = false; + if(e.getKeyCode() == KeyEvent.VK_LEFT ) + model.P1.moveLeft = false; + if(e.getKeyCode() == KeyEvent.VK_RIGHT ) + model.P1.moveRight = false; + if(e.getKeyChar() == 's') + model.P1.fire = false; + } + } + } + ); + + } +} \ No newline at end of file diff --git a/源代码/server/src/ServerModel.java b/源代码/server/src/ServerModel.java new file mode 100644 index 0000000..e8a9f9f --- /dev/null +++ b/源代码/server/src/ServerModel.java @@ -0,0 +1,343 @@ +import java.net.*; +import java.io.*; +import java.awt.event.*; +import java.awt.*; + +public class ServerModel implements ActionListener{ + //视图参考 + public ServerView view; + + //连接变量 + public ServerSocket serverSocket; + public Socket clientSocket; + public PrintWriter out; + public BufferedReader in; + public String inputLine, outputLine; + + //服务器状态 + public boolean serverCreated; + public boolean clientConnected; + public boolean gameStarted; + public boolean gamePaused; + public boolean gameOver; + public boolean serverVoteYes, serverVoteNo; + public boolean clientVoteYes, clientVoteNo; + public boolean pausePressed; + + //游戏消息 + public String[] messageQueue; + public int messageIndex; + public String playerTypedMessage = ""; + + //实际的游戏在这个线程上运行,而主线程监听用户的输入 + public Ticker t; + + public Image[] textures; + + //游戏变量 + public static int gameFlow; + public Actor[] actors; + public player P1; //由服务器玩家控制的坦克 + public player P2; //有客户端玩家控制的坦克 + + public ServerModel(ServerView thisview){ + + view = thisview; + messageQueue = new String[8]; + view.mainPanel.messageQueue = messageQueue; + + addMessage("欢迎来到坦克大战主机端! 请点击\"建立主机\"按钮开始游戏" ); + + t = new Ticker(1000); + t.addActionListener(this); + + } + + + public void createServer(){ + + addMessage("正在建立主机(端口9999)"); + + try { + serverSocket = new ServerSocket(9999); + serverCreated = true; + } catch (Exception e) { + addMessage("无法建立主机,请确认端口9999没有被别的程序使用"); + System.out.println(e); + t.stop(); + return; + } + + addMessage("建立完成,等待玩家连接"); + + try { + clientSocket = serverSocket.accept(); + clientConnected = true; + + out = new PrintWriter(clientSocket.getOutputStream(), true); + in = new BufferedReader(new InputStreamReader( + clientSocket.getInputStream())); + + } catch (Exception e) { + addMessage("连接中出现错误,请重新建立主机"); + serverCreated = false; + clientConnected = false; + t.stop(); + + //当发生错误,摧毁一切已创建的 + try{ + serverSocket.close(); + clientSocket.close(); + out.close(); + in.close(); + }catch(Exception ex){} + + return; + } + + view.messageField.setEnabled(true); + addMessage("玩家已连接上,开始载入游戏"); + + //一旦客户端连接,然后告诉客户端开始加载游戏 + out.println("L1;"); + + //加载游戏 + textures = new Image[88]; + for(int i = 1; i < textures.length+1; i++) + textures[i-1] = Toolkit.getDefaultToolkit().getImage("image\\" + i + ".jpg"); + + + //设置第一关 + actors = new Actor[400]; + level.loadLevel(this); + + P1 = new player("1P", this); + addActor(P1); + P2 = new player("2P", this); + addActor(P2); + + + + gameStarted = true; + view.mainPanel.actors = actors; + view.mainPanel.gameStarted = true; + + addMessage("载入完毕,游戏开始了!"); + } + + public void actionPerformed(ActionEvent e){ + createServer(); + + //如果程序未能创建服务器,则什么也不做 + if(!serverCreated) + return; + + //游戏逻辑回路, + try{ + while((inputLine = in.readLine()) != null){ + //处理客户反馈消息 + feedbackHandler.handleInstruction(this, inputLine); + + outputLine = ""; + + if(!gamePaused) + gameFlow++; + + if(pausePressed){ + if(!gamePaused){ + outputLine+= "x0;"; + }else{ + outputLine+= "x1;"; + } + pausePressed = false; + } + + if(gameOver || (P1.life == 0 && P2.life == 0)){ + if(P1.freezed != 1) + outputLine+="a;"; + + + if((P1.freezed != 1 || messageIndex == 1) && serverVoteYes){ + addMessage("等待用户端玩家的回应..."); + } + if(P1.freezed != 1 || messageIndex == 0){ + addMessage("GAME OVER !  想再玩一次吗 ( y / n ) ?"); + } + gameOver = true; + P1.freezed = 1; + P2.freezed = 1; + + if(serverVoteNo && !serverVoteYes) + System.exit(0); + + if(serverVoteYes){ + outputLine+="j;"; + if(clientVoteYes){ + addMessage("用户端玩家决定再玩一次,游戏重新开始了..."); + + //重新启动游戏 + P1 = new player("1P", this); + P2 = new player("2P", this); + level.reset(); + level.loadLevel(this); + gameOver = false; + serverVoteYes = false; + clientVoteYes = false; + serverVoteNo = false; + enemy.freezedMoment = 0; + enemy.freezedTime = 0; + gameFlow = 0; + + //告诉客户端程序重新启动游戏 + outputLine+="L1;"; + } + } + } + + if(level.deathCount == 20 && !gameOver){ + level.winningCount++; + if(level.winningCount == 120){ + P1.freezed = 1; + P2.freezed = 1; + } + if(level.winningCount == 470){ + if(P1.life > 0) + P1.reset(); + if(P2.life > 0) + P2.reset(); + level.loadLevel(this); + //告诉客户端程序加载下一关 + outputLine+="L" +(1 + (level.currentLevel-1)%8) + ";"; + } + if(level.winningCount == 500){ + P1.freezed = 0; + P2.freezed = 0; + level.deathCount = 0; + level.winningCount = 0; + } + + } + + //大量生产敌人坦克 + if(!gamePaused) + level.spawnEnemy(this); + + for(int i = 0; i < actors.length; i++){ + if(actors[i] != null) + actors[i].move(); + } + + //从消息队列中删除一个消息每10秒,(如果有的话) + if(gameFlow%300 == 0) + removeMessage(); + + //将玩家、关卡的信息写入输出行 + outputLine+="p" + level.enemyLeft + "," + level.currentLevel + "," + P1.life + "," + P1.scores + "," + P2.life + "," + P2.scores +";"; + outputLine+="g" + level.winningCount + ";"; + + //将玩家类型信息写入输出行 + if(!playerTypedMessage.equals("")){ + outputLine+=playerTypedMessage; + playerTypedMessage = ""; + } + + //将最后的指令字符串发送到客户端程序 + out.println(outputLine); + + //调用视图重绘本身 + view.mainPanel.repaint(); + + //如果玩家切换到对话框模式,则停止所有坦克动作 + if(!view.mainPanel.hasFocus()){ + P1.moveLeft = false; + P1.moveUp = false; + P1.moveDown = false; + P1.moveRight = false; + P1.fire = false; + } + + Thread.sleep(30); + } + }catch(Exception ex){ + ex.printStackTrace(); + view.messageField.setEnabled(false); + serverVoteYes= false; + serverVoteNo = false; + clientVoteYes = false; + serverCreated = false; + gameStarted = false; + gameOver = false; + gameFlow = 0; + enemy.freezedTime = 0; + enemy.freezedMoment = 0; + view.mainPanel.gameStarted = false; + t.stop(); + addMessage("玩家退出了,请重新建立主机"); + + //当发生错误在游戏中,摧毁任何东西,包括游戏的变量 + try{ + out.close(); + in.close(); + clientSocket.close(); + serverSocket.close(); + }catch(Exception exc){} + + //破坏游戏数据 + P1 = null; + P2 = null; + level.reset(); + } + } + + //添加游戏对象(如坦克,子弹等..)到游戏系统 + public void addActor(Actor actor){ + for(int i = 0; i < actors.length; i ++ ) + if(actors[i] == null){ + actors[i] = actor; + break; + } + } + + //从游戏系统中移除游戏对象 + public void removeActor(Actor actor){ + for(int i = 0; i < actors.length; i ++ ) + if(actors[i] == actor){ + actors[i] = null; + break; + } + } + + + //在屏幕上显示一行消息 + public void addMessage(String message){ + if(messageIndex < 8){ + messageQueue[messageIndex] = message; + messageIndex++; + } + else{ + for(int i = 0; i < 7; i++) + messageQueue[i] = messageQueue[i+1]; + messageQueue[7] = message; + } + + //调用视图重绘屏幕如果游戏有没有开始 + if(!gameStarted) + view.mainPanel.repaint(); + } + + //删除屏幕上最早的信息 + public void removeMessage(){ + if(messageIndex == 0) + return; + + messageIndex--; + for(int i = 0; i < messageIndex; i++) + messageQueue[i] = messageQueue[i+1]; + messageQueue[messageIndex] = null; + + //调用视图重绘屏幕如果比赛还没开始 + if(!gameStarted) + view.mainPanel.repaint(); + } + +} \ No newline at end of file diff --git a/源代码/server/src/ServerView.java b/源代码/server/src/ServerView.java new file mode 100644 index 0000000..08a3a99 --- /dev/null +++ b/源代码/server/src/ServerView.java @@ -0,0 +1,87 @@ + +import javax.swing.*; +import java.awt.*; +import java.awt.event.*; + + +//这个类表示服务器的图形界面 +public class ServerView extends JFrame{ + public drawingPanel mainPanel; + public JButton createServer, exit, pauseAndResume, help, hiddenButton; + public JTextField messageField; + public JButton sendMessage; + + public ServerControler controler; + public ServerModel model; + + public ServerView(){ + + super("坦克大战"); + + + try { + UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName()); + } catch (Exception e) { } + + getContentPane().setLayout(null); + + //制作动画绘制的主面板 + mainPanel = new drawingPanel(); + mainPanel.setLayout(null); + mainPanel.setBounds(0, 22, 679, 605); + mainPanel.setBackground(new Color(128, 64, 0)); + messageField = new JTextField(); + messageField.setBounds(0,519, 560,22); + messageField.setEnabled(false); + sendMessage = new JButton("发送"); + sendMessage.setBounds(570,518, 62,24); + sendMessage.setFocusable(false); + mainPanel.add(messageField); + mainPanel.add(sendMessage); + getContentPane().add(mainPanel); + mainPanel.setFocusable(true); + + //制作选项按钮 + createServer = new JButton("建立主机"); + createServer.setBounds(0, 0,120,22); + getContentPane().add(createServer); + createServer.setFocusable(false); + + pauseAndResume = new JButton("暂停/继续"); + pauseAndResume.setBounds(120, 0,120,22); + getContentPane().add(pauseAndResume); + pauseAndResume.setFocusable(false); + + help = new JButton("帮助"); + help.setBounds(240, 0,120,22); + getContentPane().add(help); + help.setFocusable(false); + + exit = new JButton("退出"); + exit.setBounds(360, 0,120,22); + getContentPane().add(exit); + exit.setFocusable(false); + + //设置主框架 + setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); + setBounds(150, 130, 640, 590); + setVisible(true); + setResizable( false ); + + //设置服务器模式 + model = new ServerModel(this); + + //设置服务器控制器 + controler = new ServerControler(this, model); + + + } + + + public static void main(String[] args){ + new ServerView(); + } + + + +} \ No newline at end of file diff --git a/源代码/server/src/Steelwall.java b/源代码/server/src/Steelwall.java new file mode 100644 index 0000000..98c35bb --- /dev/null +++ b/源代码/server/src/Steelwall.java @@ -0,0 +1,133 @@ +import java.awt.*; + +public class Steelwall implements Actor{ + private int xPos; + private int yPos; + private Rectangle[] border = new Rectangle[4]; + public boolean[] shape = new boolean[4]; + public boolean walldestoried; + public boolean bulletdestoried; + public ServerModel gameModel; + public Image steelWall; + public Rectangle generalBorder; + + public Steelwall(int a, int b, ServerModel gameModel){ + this.gameModel = gameModel; + steelWall = gameModel.textures[53]; + xPos = a; + yPos = b; + generalBorder = new Rectangle(xPos - 12, yPos - 12, 25, 25); + border[0] = new Rectangle(xPos - 11, yPos - 11, 11, 11); + border[1] = new Rectangle(xPos + 1, yPos - 11, 11, 11); + border[2] = new Rectangle(xPos - 11, yPos + 1, 11, 11); + border[3] = new Rectangle(xPos + 1, yPos + 1, 11, 11); + } + + public Steelwall(int a, int b, int orientation, ServerModel gameModel){ + xPos = a; + yPos = b; + this.gameModel = gameModel; + steelWall = gameModel.textures[53]; + generalBorder = new Rectangle(xPos - 12, yPos - 12, 25, 25); + if(orientation == 0){ + border[0] = new Rectangle(xPos - 11, yPos - 11, 11, 11); + border[1] = new Rectangle(xPos + 1, yPos - 11, 11, 11); + shape[2] = true; + shape[3] = true; + } + if(orientation == 1){ + border[2] = new Rectangle(xPos - 11, yPos + 1, 11, 11); + border[3] = new Rectangle(xPos + 1, yPos + 1, 11, 11); + shape[0] = true; + shape[1] = true; + } + if(orientation == 2){ + border[0] = new Rectangle(xPos - 11, yPos - 11, 11, 11); + border[2] = new Rectangle(xPos - 11, yPos + 1, 11, 11); + shape[1] = true; + shape[3] = true; + } + if(orientation == 3){ + border[1] = new Rectangle(xPos + 1, yPos - 11, 11, 11); + border[3] = new Rectangle(xPos + 1, yPos + 1, 11, 11); + shape[0] = true; + shape[2] = true; + } + } + + + public void damageWall(Rectangle bullet, int bulletpower, int bulletdirection){ + bulletdestoried = false; + if(bulletpower == 2){ + for(int i = 0; i < 4; i++){ + if(border[i] != null){ + if(bullet.intersects(border[i])){ + bulletdestoried = true; + border[i] = null; + shape[i] = true; + } + } + } + } + if(bulletpower == 1){ + for(int i = 0; i < 4; i++){ + if(border[i] != null){ + if(bullet.intersects(border[i])) + bulletdestoried = true; + } + } + } + + //将变化写入输出行 + gameModel.outputLine+="s" + xPos + ","+ yPos+","; + for(int i = 0; i < shape.length; i++){ + if(shape[i]) + gameModel.outputLine+="1"; + else + gameModel.outputLine+="0"; + } + gameModel.outputLine+=";"; + + } + + public boolean walldestoried(){ + if(walldestoried) + return true; + boolean walldestory = false; + if(border[0] == null && border[1] == null && border[2] == null && border[3] == null) + walldestory = true; + return walldestory; + } + + public Rectangle getBorder(){ + return generalBorder; + } + + public Rectangle[] getDetailedBorder(){ + return border; + } + + public void draw(Graphics g) { + if(walldestoried) + return; + + g.drawImage(steelWall, xPos - 12, yPos - 12, null); + g.setColor(new Color(128, 64, 0)); + if(shape[0]) + g.fillRect(xPos - 12, yPos - 12, 13, 13); + if(shape[1]) + g.fillRect(xPos, yPos - 12, 13, 13); + if(shape[2]) + g.fillRect(xPos - 12, yPos, 13, 13); + if(shape[3]) + g.fillRect(xPos, yPos, 13, 13); + } + + public String getType(){ + return "steelWall"; + } + + + //未使用的方法 + public void move(){} +} \ No newline at end of file diff --git a/源代码/server/src/Ticker.java b/源代码/server/src/Ticker.java new file mode 100644 index 0000000..9ef0a2a --- /dev/null +++ b/源代码/server/src/Ticker.java @@ -0,0 +1,78 @@ +import java.awt.event.ActionEvent; +import java.awt.event.ActionListener; +import java.io.PrintStream; + +public class Ticker implements Runnable{ + + + + ActionListener al; + private boolean isTicking; + Thread t; + int delay; + + public Ticker(int i, ActionListener actionlistener){ + al = actionlistener; + delay = i; + t = new Thread(this); + t.start(); + isTicking = false; + } + + public Ticker(int i){ + delay = i; + t = new Thread(this); + t.start(); + isTicking = false; + } + + public void addActionListener(ActionListener actionlistener){ + if(al == null) + al = actionlistener; + else + System.out.println("WARNING: ActionListener already added to Ticker."); + } + + public boolean isRunning(){ + return isTicking; + } + + public void start(){ + isTicking = true; + } + + public void stop(){ + isTicking = false; + } + + public void setDelay(int i){ + delay = i; + } + + public int getDelay(){ + return delay; + } + + private void fireActionPerformed(){ + if(al == null || !isTicking){ + return; + } else{ + ActionEvent actionevent = new ActionEvent(this, 0, null); + al.actionPerformed(actionevent); + return; + } + } + + public void run(){ + do{ + fireActionPerformed(); + try{ + Thread.sleep(delay); + }catch(InterruptedException interruptedexception){ + System.out.println("WARNING: Ticker thread interrupted."); + } + } while(true); + } +} + + diff --git a/源代码/server/src/base.java b/源代码/server/src/base.java new file mode 100644 index 0000000..5c17cf9 --- /dev/null +++ b/源代码/server/src/base.java @@ -0,0 +1,99 @@ +import java.awt.*; + +public class base implements Actor{ + private Rectangle border; + public Image base; + public int xPos, yPos; + public ServerModel gameModel; + public int steelWallTime; + public boolean baseKilled; + + public base(ServerModel gameModel){ + this.gameModel = gameModel; + xPos = 260; + yPos = 498; + base = gameModel.textures[0]; + border = new Rectangle(xPos - 11, yPos - 11, 23, 23); + + } + + public Rectangle getBorder(){ + return border; + } + + public void doom(){ + base = gameModel.textures[1]; + if(!baseKilled) + gameModel.addActor(new bomb(xPos, yPos, "big", gameModel)); + baseKilled = true; + + //记录变化到输出行 + gameModel.outputLine+="b"+ xPos + "," + yPos + "," + "1;"; + + } + + public void move(){ + if(steelWallTime == 600){ + Steelwall temp = new Steelwall(248, 498, 2, gameModel); + gameModel.actors[0] = temp; + writeToOutputLine("s", temp.shape, 248, 498); + + temp = new Steelwall(273, 498, 3, gameModel); + gameModel.actors[1] = temp; + writeToOutputLine("s", temp.shape, 273, 498); + + temp = new Steelwall(248, 473, 1, gameModel); + gameModel.actors[2] = temp; + writeToOutputLine("s", temp.shape, 248, 473); + + temp = new Steelwall(273, 473, 1, gameModel); + gameModel.actors[3] = temp; + writeToOutputLine("s", temp.shape, 273, 473); + } + if(steelWallTime> 0) + steelWallTime--; + if(steelWallTime == 1){ + wall temp = new wall(248, 498, 2, gameModel); + gameModel.actors[0] = temp; + writeToOutputLine("w", temp.shape, 248, 498); + + temp = new wall(273, 498, 3, gameModel); + gameModel.actors[1] = temp; + writeToOutputLine("w", temp.shape, 273, 498); + + temp = new wall(248, 473, 1, gameModel); + gameModel.actors[2] = temp; + writeToOutputLine("w", temp.shape, 248, 473); + + temp = new wall(273, 473, 1, gameModel); + gameModel.actors[3] = temp; + writeToOutputLine("w", temp.shape, 273, 473); + } + + } + + public void writeToOutputLine(String type, boolean[] shape, int xPos, int yPos){ + //记录变化到输出行 + gameModel.outputLine+=type + xPos + ","+ yPos+","; + for(int i = 0; i < shape.length; i++){ + if(shape[i]) + gameModel.outputLine+="1"; + else + gameModel.outputLine+="0"; + } + gameModel.outputLine+=";"; + } + + public String getType(){ + return "base"; + } + + public void draw(Graphics g){ + g.drawImage(base, xPos - 12, yPos - 12, null ); + } + + //未使用的方法 + public Rectangle[] getDetailedBorder(){return null;} + public boolean walldestoried(){return false;} + +} \ No newline at end of file diff --git a/源代码/server/src/bomb.java b/源代码/server/src/bomb.java new file mode 100644 index 0000000..e6b234e --- /dev/null +++ b/源代码/server/src/bomb.java @@ -0,0 +1,69 @@ +import java.awt.*; + +public class bomb implements Actor{ + private int xPos, yPos; + private int animationTime; + public final Rectangle border = new Rectangle(0,0,0,0); + public String size; + public int inner, middle, outer, jumpDistance; + public ServerModel gameModel; + + + public bomb(int a, int b, String size, ServerModel gameModel){ + this.size = size; + this.gameModel = gameModel; + if(size.equals("big") ){ + inner = 6; middle = 9; outer = 14; + jumpDistance = 8; + animationTime = 6; + }else if(size.equals("small")){ + inner = 2; middle = 4; outer = 7; + jumpDistance = 4; + animationTime = 4; + } + + xPos = a; + yPos = b; + } + + public void draw(Graphics g){ + g.setColor(Color.red); + g.fillOval(xPos-outer, yPos-outer, 2*outer, 2*outer); + g.setColor(Color.orange); + g.fillOval(xPos-middle, yPos-middle, 2*middle, 2*middle); + g.setColor(Color.yellow); + g.fillOval(xPos-inner, yPos-inner, 2*inner, 2*inner); + } + + public void move(){ + if(gameModel.gamePaused){ + gameModel.outputLine+="o"+ xPos + "," + yPos + "," + size + ";" ; + return; + } + + animationTime--; + if(animationTime < 0){ + gameModel.removeActor(this); + return; + } + xPos = xPos + (int)(Math.random()*jumpDistance) - (int)(Math.random()*jumpDistance); + yPos = yPos + (int)(Math.random()*jumpDistance) - (int)(Math.random()*jumpDistance); + + //将变化写入输出行 + gameModel.outputLine+="o"+ xPos + "," + yPos + "," + size + ";" ; + } + + public Rectangle getBorder(){ + return border; + } + + public String getType(){ + return "bomb"; + } + + + //未使用的方法 + public Rectangle[] getDetailedBorder(){return null;} + public boolean walldestoried(){return false;} + +} diff --git a/源代码/server/src/bullet.java b/源代码/server/src/bullet.java new file mode 100644 index 0000000..f34b7d8 --- /dev/null +++ b/源代码/server/src/bullet.java @@ -0,0 +1,166 @@ +import java.awt.*; + +public class bullet implements Actor{ + public final Rectangle map = new Rectangle(18, 18, 486, 486); + private Rectangle border; + private int direction; + private int Speed; + private int bulletpower; + public int xPos, yPos; + public Actor owner; + public ServerModel gameModel; + public boolean hitTarget; + + public bullet(int a, int b, int c, int d, int e, Actor owner, ServerModel gameModel){ + this.owner = owner; + this.gameModel = gameModel; + xPos = a; yPos = b; + direction = c; + if(direction == 0 || direction == 1) + border = new Rectangle(a - 2, b - 5, 5, 13); + else + border = new Rectangle(a - 5, b - 2, 13, 5); + + Speed = d; + bulletpower = e; + } + + public void draw(Graphics g) { + g.setColor(Color.lightGray); + if(direction == 0 || direction == 1) + g.fillRect(border.x + 1, border.y +1, 3, 9); + if(direction == 2 || direction == 3) + g.fillRect(border.x +1, border.y + 1, 9, 3); + } + + public void move(){ + if(gameModel.gamePaused){ + writeToOutputLine(); + return; + } + + + //检查这子弹是否撞击地图边界 + if(!border.intersects(map)){ + gameModel.removeActor(this); + notifiyOwner(); + makeBomb(); + writeToOutputLine(); + return; + } + //检查这颗子弹是否击中其他对象 + for(int i = 0; i < gameModel.actors.length; i++){ + if(gameModel.actors[i] != null){ + if(gameModel.actors[i] != this && gameModel.actors[i] != owner){ + if(border.intersects(gameModel.actors[i].getBorder())){ + + if(gameModel.actors[i].getType().equals("steelWall")){ + Steelwall temp = (Steelwall)gameModel.actors[i]; + if(!temp.walldestoried){ + temp.damageWall(border, bulletpower, direction); + if(temp.bulletdestoried) + hitTarget = true; + } + }else if(gameModel.actors[i].getType().equals("wall")){ + wall temp = (wall)gameModel.actors[i]; + if(!temp.walldestoried){ + temp.damageWall(border, bulletpower, direction); + if(temp.bulletdestoried) + hitTarget = true; + } + }else if(gameModel.actors[i].getType().equals("bullet")){ + bullet temp = (bullet)gameModel.actors[i]; + if(temp.owner.getType().equals("Player")){ + hitTarget = true; + gameModel.removeActor(gameModel.actors[i]); + temp.notifiyOwner(); + } + }else if(gameModel.actors[i].getType().equals("Player")){ + if(owner.getType().equals("enemy")){ + player temp = (player)gameModel.actors[i]; + temp.hurt(); + }else{ + } + hitTarget = true; + }else if(gameModel.actors[i].getType().equals("enemy") && owner.getType().equals("Player")){ + enemy temp = (enemy)gameModel.actors[i]; + player tempe = (player)owner; + if(temp.health == 0) + tempe.scores+=temp.type*100; + temp.hurt(); + hitTarget = true; + }else if(gameModel.actors[i].getType().equals("base")){ + base temp = (base)gameModel.actors[i]; + temp.doom(); + hitTarget = true; + gameModel.gameOver = true; + } + } + } + } + } + + //如果子弹打到其他对象,从游戏系统中删除这个子弹对象 + if(hitTarget){ + gameModel.removeActor(this); + notifiyOwner(); + makeBomb(); + writeToOutputLine(); + return; + } + + if(direction == 0){ + border.y -= Speed; + yPos -= Speed; + } + if(direction == 1){ + border.y += Speed; + yPos += Speed; + } + if(direction == 2){ + border.x -= Speed; + xPos -= Speed; + } + if(direction == 3){ + border.x += Speed; + xPos += Speed; + } + writeToOutputLine(); + } + + public void writeToOutputLine(){ + gameModel.outputLine+="t"+ xPos + "," + yPos + "," + direction + ";"; + } + + public Rectangle getBorder(){ + return border; + } + + public String getType(){ + return "bullet"; + } + + public void notifiyOwner(){ + if(owner != null){ + if(owner.getType().equals("Player")){ + player temp = (player)owner; + temp.numberOfBullet++; + }else if(owner.getType().equals("enemy")){ + enemy temp = (enemy)owner; + temp.numberOfBullet++; + } + } + } + + public void makeBomb(){ + gameModel.addActor(new bomb(xPos, yPos, "small", gameModel)); + } + + //未使用的方法 + public Rectangle[] getDetailedBorder(){return null;} + public boolean walldestoried(){return false;} + + + + +} diff --git a/源代码/server/src/drawingPanel.java b/源代码/server/src/drawingPanel.java new file mode 100644 index 0000000..4c69479 --- /dev/null +++ b/源代码/server/src/drawingPanel.java @@ -0,0 +1,81 @@ +import java.awt.*; +import javax.swing.*; + +//drawingPanel类属于服务器程序 +public class drawingPanel extends JPanel{ + public Image offScreenImage; + + //这些是指出在serverModel都是真实的东西的参考 + public String[] messageQueue; + public Actor[] actors; + public boolean gameStarted; + public int green, red, blue; + + public drawingPanel() {} + + public void paintComponent(Graphics g) { + Graphics offScreenGraphics; + if (offScreenImage == null) { + offScreenImage = createImage(640, 550); + } + offScreenGraphics = offScreenImage.getGraphics(); + myPaint(offScreenGraphics); + g.drawImage(offScreenImage, 0, 0, this); + } + + public void myPaint(Graphics g) { + super.paintComponent(g); + + if(gameStarted){ + //制作背景 + g.setColor(Color.blue); + g.drawRect(10, 10, 501, 501); + + //制作坦克等等 + if(actors != null) + for(int i = 0; i < actors.length; i++) + if(actors[i] != null) + actors[i].draw(g); + + //制作级别关卡 + g.setColor(new Color(81,111, 230)); + g.drawString("第 " + level.currentLevel + " 关", 527, 39); + g.drawString("敌人数 = " + level.enemyLeft, 527, 79); + + //制作获胜场景 + if(level.winningCount > 150){ + int temp = level.winningCount - 150; + if(temp*10 > 300) + temp = 30; + if(level.winningCount > 470) + temp = 500 - level.winningCount; + g.setColor(Color.gray); + g.fillRect(11,11, 500, temp*10); + g.fillRect(11, 500 - temp*10, 500, (1+temp)*10 + 2); + + if(level.winningCount > 190 &&level.winningCount < 470){ + if(level.winningCount > 400 ){ + red+=(int)((128-red)*0.2); + green+=(int)((128-green)*0.2); + } + g.setColor(new Color(red, green, blue)); + g.drawString("过 关 了 !", 240, 250); + } + }else{ + green = 23; red = 34; blue = 128; + } + + } + + //消息 + g.setColor(new Color(255, 255, 255)); + if(messageQueue != null){ + for(int i = 0 ; i < 8; i++){ + if(messageQueue[i] != null) + g.drawString(messageQueue[i] , 5, 12 +i*16); + else + break; + } + } + } +} \ No newline at end of file diff --git a/源代码/server/src/enemy.java b/源代码/server/src/enemy.java new file mode 100644 index 0000000..d284f51 --- /dev/null +++ b/源代码/server/src/enemy.java @@ -0,0 +1,330 @@ +import java.awt.*; + +public class enemy implements Actor{ + public final int UP = 0; + public final int DOWN = 1; + public final int LEFT = 2; + public final int RIGHT = 3; + public final int size = 12; + public final Rectangle map = new Rectangle(35, 35, 452, 452); + public static int freezedTime; + public static int freezedMoment; + public int numberOfBullet; + public int coolDownTime; + public int type; + public int speed; + public int direction; + public int interval; + public int health;; + public int xPos, yPos, xVPos, yVPos; + public Rectangle border; + public boolean flashing; + public double firePosibility; + public Image[] textures; + public ServerModel gameModel; + + public enemy(int type, boolean flashing, int xPos, int yPos, ServerModel gameModel){ + this.type = type; + this. xPos = xPos; + this.yPos = yPos; + this.flashing = flashing; + this.gameModel = gameModel; + + //设置全部敌人的共同属性 + interval = (int)(Math.random()*200); + direction = (int)(Math.random()*4); + numberOfBullet = 1; + xVPos = xPos; + yVPos = yPos; + border = new Rectangle(xPos - size, yPos - size, 25, 25); + + + //根据不同类型的敌人设置独特的属性如:容貌,速度,等等 + if(type ==1 ){ + firePosibility = 0.95; + speed = 2; + textures = new Image[8]; + for(int i = 0; i < 8; i++) + textures[i] = gameModel.textures[38+i]; + }else if(type == 2){ + firePosibility = 0.95; + speed = 4; + textures = new Image[8]; + for(int i = 0; i < 8; i++) + textures[i] = gameModel.textures[2+i]; + }else if(type == 3){ + firePosibility = 0.9; + speed = 2; + textures = new Image[8]; + for(int i = 0; i < 8; i++) + textures[i] = gameModel.textures[10+i]; + }else{ + firePosibility = 0.95; + health = 3; + speed = 2; + textures = new Image[20]; + for(int i = 0; i < 20; i++) + textures[i] = gameModel.textures[18+i]; + + } + + } + + public void move(){ + if(gameModel.gamePaused){ + writeToOutputLine(); + return; + } + + if(freezedTime > ServerModel.gameFlow - freezedMoment){ + writeToOutputLine(); + return; + } + + + //敌方坦克在一个周期内将会朝着相同的方向继续移动(如果不与其他对象相互影响) + //在每个周期结束时,它将转向新的方向 + if(interval > 0) + interval--; + if(interval == 0){ + interval = (int)(Math.random()*200); + int newDirection = (int)(Math.random()*4); + if(direction != newDirection){ + if(direction/2 != newDirection/2){ + xPos = xVPos; yPos = yVPos; + border.x = xPos - size; border.y = yPos - size; + } + direction = newDirection; + } + + } + + + //完全随机的决定是否要发射一颗子弹,敌方坦克不能开火 + //如果第一个不是摧毁的子弹 + if(coolDownTime > 0) + coolDownTime--; + if(Math.random() > firePosibility && coolDownTime == 0 && numberOfBullet > 0){ + //获得子弹方向 + int c = direction; + //获得子弹位置 + int a, b; + if(direction == UP){ + a = xPos; b = yPos - size; + }else if(direction == DOWN){ + a = xPos; b = yPos + size; + }else if(direction == LEFT){ + a = xPos - size; b = yPos; + }else{ + a = xPos + size; b = yPos; + } + //获得子弹速度 + int d; + if(type == 3){ + d = 12; + }else{ + d = 7; + } + //添加子弹 + gameModel.addActor(new bullet(a,b,c,d,1, this, gameModel)); + coolDownTime = 7; + if(type == 3) + coolDownTime = 5; + numberOfBullet--; + } + + //保存当前位置信息,如果确定了新举措无效后,然后改变 + + int xPosTemp = xPos; + int yPosTemp = yPos; + Rectangle borderTemp = new Rectangle(xPosTemp - size, yPosTemp - size, 25,25); + + //定义地方坦克的下一个边界,假设它有效的根据方向来进行移动 + if(direction == UP){ + yPos-=speed; + }else if(direction == DOWN){ + yPos+=speed; + }else if(direction == LEFT){ + xPos-=speed; + }else{ + xPos+=speed; + } + + + //更新边界 + border.y = yPos - size; + border.x = xPos - size; + + //检查下一个边界是否会与地图边界相交,如果不相交则随机生成边界 + if(!border.intersects(map)){ + direction = (int)(Math.random()*4); + interval = (int)(Math.random()*250); + xPos = xVPos; yPos = yVPos; + border.x = xPos - size; border.y = yPos - size; + writeToOutputLine(); + return; + } + + //检查下一个边界是否与其他对象相交,例如玩家控制的坦克,墙等等 + for(int i = 0; i < gameModel.actors.length; i++){ + if(gameModel.actors[i] != null){ + if(this != gameModel.actors[i] ){ + if(border.intersects(gameModel.actors[i].getBorder())){ + //静态对象,例如河流,墙等等 + if(gameModel.actors[i].getType().equals("steelWall") || gameModel.actors[i].getType().equals("wall")){ + if(!gameModel.actors[i].walldestoried()){ + for(int j = 0;j < gameModel.actors[i].getDetailedBorder().length; j++){ + if( gameModel.actors[i].getDetailedBorder()[j] != null){ + if(gameModel.actors[i].getDetailedBorder()[j].intersects(border)){ + if(Math.random() > 0.90) + direction = (int)(Math.random()*4); + xPos = xVPos; yPos = yVPos; + border.x = xPos - size; border.y = yPos - size; + writeToOutputLine(); + return; + } + } + } + } + }else if(gameModel.actors[i].getType().equals("river") || gameModel.actors[i].getType().equals("base")){ + if(Math.random() > 0.90) + direction = (int)(Math.random()*4); + xPos = xVPos; yPos = yVPos; + border.x = xPos - size; border.y = yPos - size; + writeToOutputLine(); + return; + } + //其他对象,其他的坦克 + if(gameModel.actors[i].getType().equals("Player") || gameModel.actors[i].getType().equals("enemy")){ + if(!borderTemp.intersects(gameModel.actors[i].getBorder())){ + xPos = xPosTemp; + yPos = yPosTemp; + border.x = xPos - size; border.y = yPos - size; + int newDirection = (int)(Math.random()*4); + if(direction != newDirection){ + if(direction/2 != newDirection/2){ + xPos = xVPos; yPos = yVPos; + border.x = xPos - size; border.y = yPos - size; + } + direction = newDirection; + } + writeToOutputLine(); + return; + } + } + } + } + } + } + + + ///当坦克是90度倾斜时,找到坦克的虚拟位置,使用虚拟位置调整坦克的真实位置 + int a = (xPos - 10)/25; + int b = (xPos - 10)%25; + if(b < 7) + b = 0; + if(b > 18) + b = 25; + if((b < 19 && b > 6) || xPos < 17 || xPos > 492) + b = 13; + xVPos = a*25 + b + 10; + int c = (yPos - 10)/25; + int d = (yPos - 10)%25; + if(d < 7) + d = 0; + if(d > 18) + d = 25; + if((d < 19 && d > 6) || yPos < 17 || yPos > 492) + d = 13; + yVPos = c*25 + d + 10; + writeToOutputLine(); + } + + public void writeToOutputLine(){ + //将变化写入输出行 + gameModel.outputLine+="n"+ xPos + "," + yPos + ","; + int textureIndex = 0; + if(flashing && gameModel.gameFlow%10 > 4){ + if(type == 1) + textureIndex = 42+ direction; + else if(type == 2) + textureIndex = 6 + direction; + else if(type == 3) + textureIndex = 14 + direction; + else + textureIndex = 34 + direction; + }else{ + if(type == 1) + textureIndex = 38 + direction; + else if(type == 2) + textureIndex = 2 + direction; + else if(type == 3) + textureIndex = 10 + direction; + else{ + if(health == 3) + textureIndex = 18 + direction; + else if(health == 2) + textureIndex = 22 + direction; + else if(health == 1) + textureIndex = 26 + direction; + else + textureIndex = 30 + direction; + } + } + gameModel.outputLine+= "" + textureIndex + ";"; + + } + + //如果敌方坦克打出一颗子弹,判断会发生什么 + public void hurt(){ + if(flashing) + gameModel.addActor(new powerUp(gameModel)); + flashing = false; + boolean death = false; + if(type != 4 ) + death = true; + else{ + if(health == 0) + death = true; + else{ + if(health == 3){ + for(int i = 0; i < 4; i++) + textures[i] = textures[4+i]; + }else if(health == 2){ + for(int i = 0; i < 4; i++) + textures[i] = textures[8+i]; + }else if(health == 1){ + for(int i = 0; i < 4; i++) + textures[i] = textures[12+i]; + } + health--; + } + } + + if(death){ + level.NoOfEnemy--; + level.deathCount++; + gameModel.removeActor(this); + gameModel.addActor(new bomb(xPos, yPos, "big", gameModel)); + } + } + + public String getType(){ + return "enemy"; + } + + public void draw(Graphics g){ + if(flashing && gameModel.gameFlow%10 > 4) + g.drawImage(textures[textures.length-4+direction], xPos - size, yPos - size, null); + else + g.drawImage(textures[direction], xPos - size, yPos - size, null); + } + + public Rectangle getBorder(){ + return border; + } + + //未使用的方法 + public Rectangle[] getDetailedBorder(){return null;} + public boolean walldestoried(){return false;} +} \ No newline at end of file diff --git a/源代码/server/src/feedbackHandler.java b/源代码/server/src/feedbackHandler.java new file mode 100644 index 0000000..804acfe --- /dev/null +++ b/源代码/server/src/feedbackHandler.java @@ -0,0 +1,69 @@ +//这个类从客户端程序解码指令字符串,然后将字符串转换为真正的指令 +//服务器程序可读 + +public class feedbackHandler{ + public static void handleInstruction(ServerModel gameModel, String instruction){ + if(instruction.length() == 0) + return; + + int i = 0; + while(i < instruction.length()){ + String perInstruction = ""; + + //指令是“;”时 + while(!instruction.substring(i, i+1).equals(";")){ + perInstruction+=instruction.substring(i, i+1); + i++; + } + + //指令是“m”表明客户端运动信息 + if(perInstruction.substring(0,1).equals("m")){ + gameModel.P2.moveUp = false; + gameModel.P2.moveDown = false; + gameModel.P2.moveLeft = false; + gameModel.P2.moveRight = false; + gameModel.P2.fire = false; + + String temp = perInstruction.substring(1,2); + if(temp.equals("1")) + gameModel.P2.moveUp = true; + temp = perInstruction.substring(2,3); + if(temp.equals("1")) + gameModel.P2.moveDown = true; + temp = perInstruction.substring(3,4); + if(temp.equals("1")) + gameModel.P2.moveLeft = true; + temp = perInstruction.substring(4,5); + if(temp.equals("1")) + gameModel.P2.moveRight = true; + temp = perInstruction.substring(5,6); + if(temp.equals("1")) + gameModel.P2.fire = true; + } + + //指令是“m”表示服务器玩家信息 + if(perInstruction.substring(0,1).equals("e")){ + gameModel.addMessage("用户端玩家说:" + perInstruction.substring(1,perInstruction.length())); + } + + //指令是“j”表示客户端玩家想在玩一次 + if(perInstruction.substring(0,1).equals("j")){ + if(gameModel.gameOver) + gameModel.clientVoteYes = true; + } + + //指令是“x”表示服务器玩家暂停游戏 + if(perInstruction.substring(0,1).equals("x")){ + if(gameModel.gamePaused){ + gameModel.addMessage("用户端玩家取消了暂停"); + gameModel.gamePaused = false; + } else if(!gameModel.gamePaused){ + gameModel.addMessage("用户端玩家暂停了游戏"); + gameModel.gamePaused = true; + } + } + i++; + } + } + +} \ No newline at end of file diff --git a/源代码/server/src/grass.java b/源代码/server/src/grass.java new file mode 100644 index 0000000..3fe5c59 --- /dev/null +++ b/源代码/server/src/grass.java @@ -0,0 +1,40 @@ +import java.awt.*; + +public class grass implements Actor{ + private int xPos; + private int yPos; + public Rectangle border; + + public grass(int a, int b){ + xPos = a; + yPos = b; + border = new Rectangle(0,0,0,0); + } + + public void draw(Graphics g) { + g.setColor(new Color(0, 225, 0)); + for(int i = yPos - 11; i <= yPos + 12; i+=5) + g.drawLine(xPos - 12, i, xPos + 12, i); + for(int i = xPos - 11; i <= xPos + 12; i+=5) + g.drawLine(i, yPos - 12, i, yPos + 12); + g.setColor(new Color(0, 128, 0)); + for(int i = yPos - 10; i <= yPos + 12; i+=5) + g.drawLine(xPos - 12, i, xPos + 12, i); + for(int i = xPos - 10; i <= xPos + 12; i+=5) + g.drawLine( i, yPos - 12, i, yPos + 12); + } + + public String getType(){ + return "grass"; + } + + public Rectangle getBorder(){ + return border; + } + + public void move(){} + public Rectangle[] getDetailedBorder(){return null;} + public boolean walldestoried(){return false;} + + +} \ No newline at end of file diff --git a/源代码/server/src/level.java b/源代码/server/src/level.java new file mode 100644 index 0000000..3b36d41 --- /dev/null +++ b/源代码/server/src/level.java @@ -0,0 +1,316 @@ +import java.awt.*; + +//服务器端的类 +//因为只有一层对象,所以在这个类是一个静态变量 +public class level{ + public static int currentLevel = 0; + public static int enemySpawnTime = 150; + public static int enemyLeft = 20; + public static int deathCount = 0; + public static int maxNoEnemy = 3; + public static int NoOfEnemy = 0; + public static int[] enemySequence; + + //制作获胜场景所需的变量 + public static int winningCount; + + public static void loadLevel(ServerModel gameModel){ + //增加关卡数量 + currentLevel++; + + //每次加载一个新的关卡将增加难度 + if(enemySpawnTime > 30) + enemySpawnTime-=10; + if(maxNoEnemy < 10 && (currentLevel%2 == 0)) + maxNoEnemy++; + + //从上个关卡清除所有东西 + for(int i = 0; i < 400; i ++) + gameModel.actors[i] = null; + + //启动时各关卡共享 + enemyLeft = 20; + + //加载基地,每个关卡都一样 + gameModel.actors[0] = new wall(248, 498, 2, gameModel); + gameModel.actors[1] = new wall(273, 498, 3, gameModel); + gameModel.actors[2] = new wall(248, 473, 1, gameModel); + gameModel.actors[3] = new wall(273, 473, 1, gameModel); + gameModel.actors[4] = new base(gameModel); + + //加载一个关卡 + if(1+ (currentLevel-1)%8 == 1){ + enemySequence = new int[]{1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,2,2}; + String[] level = new String[]{ + "__", "__", "__", "__", "__", "__", "__", "__", "__", "__", "__", "__", "__", "__", "__", "__", "__", "__", "__", "__", + "__", "__", "__", "__", "__", "__", "__", "__", "__", "__", "__", "__", "__", "__", "__", "__", "__", "__", "__", "__", + "__", "##", "##", "__", "__", "__", "__", "__", "##", "__", "__", "##", "__", "__", "__", "__", "__", "##", "##", "__", + "__", "##", "##", "__", "__", "__", "__", "__", "##", "__", "__", "##", "__", "__", "__", "__", "__", "##", "##", "__", + "__", "##", "##", "__", "__", "__", "__", "__", "##", "__", "__", "##", "__", "__", "__", "__", "__", "##", "##", "__", + "__", "##", "##", "__", "__", "__", "__", "__", "##", "__", "__", "##", "__", "__", "__", "__", "__", "##", "##", "__", + "__", "##", "##", "__", "__", "__", "__", "__", "##", "__", "__", "##", "__", "__", "__", "__", "__", "##", "##", "__", + "__", "##", "##", "__", "__", "__", "__", "__", "##", "__", "__", "##", "__", "__", "__", "__", "__", "##", "##", "__", + "__", "##", "##", "__", "__", "__", "__", "__", "##", "__", "__", "##", "__", "__", "__", "__", "__", "##", "##", "__", + "__", "##", "##", "__", "__", "__", "__", "__", "##", "ss", "ss", "##", "__", "__", "__", "__", "__", "##", "##", "__", + "__", "__", "__", "__", "__", "__", "__", "__", "__", "__", "__", "__", "__", "__", "__", "__", "__", "__", "__", "__", + "s0", "##", "##", "__", "__", "__", "__", "__", "##", "s0", "s0", "##", "__", "__", "__", "__", "__", "##", "##", "s0", + "__", "##", "##", "__", "__", "__", "__", "__", "##", "__", "__", "##", "__", "__", "__", "__", "__", "##", "##", "__", + "__", "##", "##", "__", "__", "__", "__", "__", "##", "__", "__", "##", "__", "__", "__", "__", "__", "##", "##", "__", + "__", "##", "##", "__", "__", "__", "__", "__", "##", "__", "__", "##", "__", "__", "__", "__", "__", "##", "##", "__", + "__", "##", "##", "__", "__", "__", "__", "__", "##", "__", "__", "##", "__", "__", "__", "__", "__", "##", "##", "__", + "__", "##", "##", "__", "__", "__", "__", "__", "##", "__", "__", "##", "__", "__", "__", "__", "__", "##", "##", "__", + "__", "__", "__", "__", "__", "__", "__", "__", "__", "__", "__", "__", "__", "__", "__", "__", "__", "__", "__", "__", + "__", "__", "__", "__", "__", "__", "__", "__", "__", "__", "__", "__", "__", "__", "__", "__", "__", "__", "__", "__", + "__", "__", "__", "__", "__", "__", "__", "__", "__", "__", "__", "__", "__", "__", "__", "__", "__", "__", "__", "__" + }; + loadLevel(gameModel, level); + } + + if(1+ (currentLevel-1)%8 == 2){ + enemySequence = new int[]{1,1,2,2,1,1,1,1,2,2,2,2,1,1,1,1,3,3,3,3}; + String[] level = new String[]{ + "__", "__", "__", "__", "__", "__", "__", "__", "__", "__", "__", "__", "__", "__", "__", "__", "__", "__", "__", "__", + "$$", "$$", "$$", "$$", "$$", "$$", "$$", "$$", "$$", "$$", "$$", "$$", "$$", "$$", "$$", "$$", "$$", "$$", "$$", "$$", + "$$", "==", "==", "==", "==", "==", "==", "==", "$$", "$$", "==", "==", "==", "==", "==", "==", "==", "==", "==", "$$", + "$$", "$$", "$$", "$$", "$$", "$$", "$$", "$$", "$$", "$$", "$$", "$$", "$$", "$$", "$$", "$$", "$$", "$$", "$$", "$$", + "__", "__", "__", "__", "__", "__", "__", "__", "__", "__", "__", "__", "__", "__", "__", "__", "__", "__", "__", "__", + "__", "__", "__", "__", "__", "__", "__", "__", "__", "__", "__", "__", "__", "__", "__", "__", "__", "__", "__", "__", + "__", "__", "__", "__", "__", "__", "__", "__", "__", "__", "__", "__", "__", "ss", "##", "##", "##", "##", "##", "__", + "__", "__", "__", "__", "__", "__", "__", "__", "__", "__", "__", "__", "__", "__", "__", "__", "__", "__", "__", "__", + "__", "__", "__", "ss", "##", "##", "##", "__", "__", "ss", "ss", "##", "##", "##", "__", "__", "__", "__", "__", "__", + "__", "__", "__", "__", "__", "__", "##", "__", "__", "__", "__", "__", "__", "##", "__", "__", "__", "__", "__", "__", + "__", "$$", "$$", "$$", "$$", "$$", "##", "__", "__", "__", "__", "__", "__", "##", "==", "==", "==", "==", "==", "__", + "__", "$$", "$$", "$$", "$$", "$$", "##", "__", "__", "__", "__", "__", "__", "##", "==", "==", "==", "==", "==", "__", + "__", "$$", "$$", "$$", "$$", "$$", "##", "__", "##", "##", "##", "##", "##", "##", "==", "==", "==", "==", "==", "__", + "__", "$$", "$$", "$$", "$$", "$$", "##", "__", "##", "##", "##", "##", "##", "##", "==", "==", "==", "==", "==", "__", + "__", "$$", "$$", "$$", "$$", "$$", "##", "__", "##", "##", "##", "##", "##", "##", "==", "==", "==", "==", "==", "__", + "__", "$$", "$$", "$$", "$$", "$$", "##", "__", "##", "##", "##", "##", "##", "##", "==", "==", "==", "==", "==", "__", + "__", "$$", "$$", "$$", "$$", "$$", "##", "__", "##", "##", "##", "##", "##", "##", "==", "==", "==", "==", "==", "__", + "__", "$$", "$$", "$$", "$$", "$$", "##", "__", "__", "__", "__", "__", "__", "##", "==", "==", "==", "==", "==", "__", + "__", "$$", "$$", "$$", "$$", "$$", "##", "__", "__", "__", "__", "__", "__", "##", "==", "==", "==", "==", "==", "__", + "__", "$$", "$$", "$$", "$$", "$$", "##", "__", "__", "__", "__", "__", "__", "##", "==", "==", "==", "==", "==", "__" + }; + loadLevel(gameModel, level); + } + + if(1+ (currentLevel-1)%8 == 3){ + enemySequence = new int[]{1,1,1,2,2,2,4,4,2,2,2,2,1,1,1,1,2,2,4,4}; + String[] level = new String[]{ + "__", "__", "__", "ss", "__", "__", "ss", "__", "__", "__", "__", "__", "__", "__", "__", "__", "s3", "__", "__", "__", + "__", "__", "__", "__", "__", "__", "ss", "##", "##", "##", "__", "##", "##", "##", "##", "__", "s3", "__", "__", "__", + "__", "__", "__", "__", "__", "__", "__", "__", "__", "__", "__", "__", "__", "__", "__", "__", "s3", "__", "__", "__", + "__", "__", "ss", "ss", "__", "##", "##", "##", "##", "__", "__", "##", "##", "__", "##", "##", "##", "__", "__", "__", + "__", "__", "__", "ss", "__", "##", "__", "__", "__", "__", "__", "__", "__", "__", "__", "__", "##", "__", "##", "s1", + "__", "__", "__", "ss", "__", "##", "__", "ss", "##", "ss", "##", "ss", "##", "##", "##", "##", "##", "__", "__", "##", + "__", "__", "__", "ss", "__", "$$", "$$", "$$", "$$", "$$", "$$", "$$", "$$", "$$", "$$", "$$", "$$", "__", "__", "__", + "__", "__", "__", "ss", "$$", "$$", "$$", "$$", "$$", "$$", "$$", "$$", "$$", "$$", "$$", "$$", "$$", "__", "__", "__", + "__", "__", "__", "##", "ss", "ss", "ss", "ss", "##", "##", "##", "##", "##", "$$", "$$", "$$", "$$", "##", "##", "##", + "##", "__", "__", "##", "$$", "$$", "$$", "$$", "$$", "$$", "$$", "$$", "$$", "$$", "$$", "$$", "$$", "__", "__", "__", + "##", "##", "__", "##", "$$", "$$", "$$", "$$", "$$", "$$", "$$", "$$", "$$", "$$", "$$", "$$", "$$", "__", "__", "__", + "##", "##", "##", "##", "$$", "$$", "$$", "$$", "$$", "$$", "$$", "$$", "##", "##", "##", "##", "##", "__", "__", "__", + "##", "##", "##", "##", "##", "##", "$$", "##", "$$", "##", "$$", "$$", "$$", "$$", "$$", "##", "__", "__", "__", "__", + "##", "##", "##", "##", "$$", "$$", "$$", "$$", "$$", "##", "$$", "$$", "$$", "$$", "$$", "##", "__", "__", "__", "__", + "#0", "s0", "s0", "s0", "$$", "ss", "ss", "ss", "ss", "##", "ss", "ss", "$$", "ss", "ss", "##", "##", "##", "ss", "##", + "__", "__", "__", "##", "__", "__", "$$", "$$", "$$", "$$", "$$", "$$", "$$", "$$", "$$", "$$", "$$", "$$", "$$", "##", + "__", "__", "__", "##", "__", "__", "__", "$$", "$$", "$$", "$$", "$$", "$$", "$$", "$$", "$$", "$$", "$$", "$$", "$$", + "__", "__", "__", "##", "__", "__", "__", "__", "__", "__", "__", "__", "__", "__", "__", "__", "__", "__", "__", "__", + "__", "__", "__", "##", "__", "__", "__", "__", "__", "__", "__", "__", "__", "__", "__", "__", "__", "__", "__", "__", + "__", "__", "__", "##", "__", "__", "__", "__", "__", "__", "__", "__", "__", "__", "__", "__", "__", "__", "__", "__" + }; + loadLevel(gameModel, level); + } + + if(1+ (currentLevel-1)%8 == 4){ + enemySequence = new int[]{3,3,3,3,2,2,2,3,3,1,1,1,3,3,3,1,1,4,4,4}; + String[] level = new String[]{ + "__", "__", "__", "__", "__", "__", "__", "__", "__", "__", "__", "__", "__", "__", "__", "__", "__", "__", "__", "__", + "__", "__", "__", "__", "__", "__", "__", "__", "__", "__", "__", "__", "__", "__", "__", "__", "__", "__", "__", "__", + "__", "__", "__", "__", "__", "__", "__", "__", "__", "__", "__", "__", "__", "__", "__", "__", "__", "__", "__", "__", + "__", "__", "__", "__", "##", "##", "##", "##", "##", "##", "##", "##", "##", "##", "##", "__", "__", "__", "__", "__", + "__", "__", "__", "##", "##", "##", "##", "##", "##", "##", "##", "##", "ss", "##", "##", "##", "##", "__", "__", "__", + "__", "__", "##", "##", "##", "##", "##", "##", "##", "##", "##", "##", "##", "##", "##", "ss", "ss", "s2", "__", "__", + "__", "__", "##", "##", "$$", "$$", "$$", "$$", "$$", "$$", "$$", "$$","$$", "$$", "$$", "$$", "$$", "s2", "__", "__", + "__", "__", "##", "##", "##", "$$", "$$", "$$", "$$", "$$", "##", "$$", "$$", "$$", "$$", "$$", "$$", "s2", "__", "__", + "__", "##", "##", "##", "##", "##", "$$", "$$", "$$", "##", "$$", "##", "$$", "$$", "$$", "$$", "$$", "s2", "__", "__", + "__", "##", "##", "##", "##", "##", "$$", "$$", "##", "$$", "$$", "$$", "##", "$$", "$$", "$$", "$$", "s2", "__", "__", + "__", "##", "##", "##", "##", "##", "$$", "##", "$$", "$$", "$$", "$$", "$$", "##", "$$", "$$", "$$", "s2", "__", "__", + "__", "##", "##", "##", "##", "##", "$$", "$$", "##", "$$", "$$", "$$", "##", "$$", "$$","$$", "$$", "s2", "__", "__", + "__", "##", "##", "##", "##", "$$", "$$", "$$", "$$", "##", "$$", "##", "$$", "$$", "$$", "$$","##", "s2", "__", "__", + "__", "__", "##", "##", "$$", "$$", "$$", "$$", "$$", "$$", "##", "$$", "$$", "$$", "$$", "$$", "##", "##", "__", "__", + "__", "__", "##", "$$", "$$", "$$", "$$", "$$", "$$", "##", "##", "$$", "$$", "$$", "$$", "##", "##", "s0", "s0", "s0", + "__", "__", "##", "##", "##", "$$", "$$", "$$", "$$", "$$", "$$", "$$", "$$", "$$", "##", "##", "__", "__", "__", "__", + "__", "__", "__", "##", "##", "##", "##", "##", "##", "##", "##", "##", "##", "##", "##", "__", "__", "__", "__", "__", + "__", "__", "__", "__", "__", "__", "__", "__", "__", "__", "__", "__", "__", "__", "__", "__", "__", "__", "__", "__", + "__", "__", "__", "__", "__", "__", "__", "__", "__", "__", "__", "__", "__", "__", "__", "__", "__", "__", "__", "__", + "__", "__", "__", "__", "__", "__", "__", "__", "__", "__", "__", "__", "__", "__", "__", "__", "__", "__", "__", "__" + }; + loadLevel(gameModel, level); + } + + if(1+ (currentLevel-1)%8 == 5){ + enemySequence = new int[]{2,2,2,3,3,3,2,2,2,4,4,4,3,3,3,3,3,2,2,2}; + String[] level = new String[]{ + "__", "__", "__", "__", "__", "__", "__", "__", "__", "__", "__", "__", "__", "==", "__", "__", "__", "__", "__", "__", + "__", "__", "__", "__", "__", "__", "__", "__", "__", "__", "__", "__", "__", "__", "__", "__", "__", "__", "__", "__", + "__", "==", "==", "==", "__", "__", "==", "==", "==", "==", "==", "==", "__", "==", "==", "==", "==", "==", "==", "__", + "__", "==", "ss", "__", "__", "__", "__", "==", "__", "__", "__", "__", "__", "__", "__", "__", "__", "__", "==", "__", + "__", "==", "__", "__", "__", "__", "__", "==", "__", "==", "==", "__", "ss", "==", "==", "==", "==", "__", "==", "__", + "__", "==", "__", "==", "==", "==", "==", "==", "__", "==", "__", "__", "==", "__", "__", "==", "__", "__", "==", "__", + "__", "==", "__", "==", "__", "__", "__", "__", "__", "==", "__", "__", "==", "__", "__", "==", "__", "__", "==", "__", + "__", "==", "__", "==", "__", "__", "==", "==", "==", "==", "__", "__", "==", "__", "__", "==", "__", "==", "==", "__", + "__", "==", "__", "==", "__", "__", "==", "__", "__", "__", "__", "__", "==", "ss", "__", "__", "__", "==", "__", "__", + "__", "==", "__", "==", "__", "__", "==", "__", "__", "==", "__", "__", "==", "__", "__", "==", "__", "==", "__", "==", + "__", "==", "__", "==", "__", "__", "==", "__", "__", "==", "__", "__", "==", "__", "__", "==", "__", "==", "__", "__", + "__", "==", "__", "==", "__", "==", "==", "__", "__", "==", "__", "__", "==", "__", "==", "==", "__", "==", "==", "__", + "__", "==", "__", "__", "__", "__", "__", "__", "__", "==", "__", "__", "==", "__", "==", "__", "__", "__", "==", "__", + "__", "==", "__", "__", "__", "__", "__", "__", "__", "__", "__", "__", "==", "__", "==", "==", "==", "__", "__", "__", + "__", "==", "==", "==", "__", "==", "==", "==", "__", "ss", "ss", "==", "==", "__", "__", "__", "==", "__", "==", "__", + "__", "__", "__", "__", "__", "__", "==", "__", "__", "__", "__", "__", "==", "__", "ss", "__", "==", "__", "==", "__", + "==", "==", "==", "==", "==", "__", "==", "__", "__", "__", "__", "__", "==", "__", "__", "__", "==", "__", "==", "__", + "__", "__", "__", "__", "__", "__", "==", "__", "__", "__", "__", "__", "==", "==", "==", "__", "==", "==", "==", "__", + "__", "__", "__", "__", "__", "__", "==", "__", "__", "__", "__", "__", "__", "__", "__", "__", "__", "__", "==", "__", + "__", "__", "__", "__", "__", "__", "==", "__", "__", "__", "__", "__", "__", "__", "__", "__", "__", "__", "==", "__" + }; + loadLevel(gameModel, level); + } + + if(1+ (currentLevel-1)%8 == 6){ + enemySequence = new int[]{4,4,4,4,2,2,2,4,4,1,1,1,3,3,3,1,1,4,4,4}; + String[] level = new String[]{ + "__", "__", "__", "__", "__", "__", "__", "__", "__", "__", "__", "__", "__", "__", "__", "__", "__", "__", "__", "__", + "__", "__", "__", "$$", "__", "__", "__", "__", "$$", "__", "__", "__", "__", "__", "__", "__", "__", "__", "$$", "__", + "__", "__", "$$", "ss", "$$", "__", "__", "$$", "ss", "$$", "__", "__", "__", "__", "__", "__", "__", "$$", "ss", "$$", + "__", "$$", "ss", "ss", "$$", "__", "$$", "ss", "ss", "ss", "$$", "__", "__", "__", "__", "__", "__", "$$", "ss", "$$", + "__", "$$", "ss", "ss", "ss", "$$", "ss", "ss", "ss", "$$", "$$", "$$", "$$", "__", "__", "__", "$$", "ss", "ss", "$$", + "__", "$$", "ss", "ss", "ss", "$$", "$$", "ss", "$$", "$$", "ss", "ss", "ss", "$$", "__", "__", "$$", "ss", "ss", "$$", + "$$", "ss", "ss", "ss", "ss", "$$", "__", "$$", "$$", "$$", "ss", "ss", "ss", "$$", "__", "__", "$$", "ss", "ss", "$$", + "$$", "ss", "ss", "ss", "ss", "$$", "__", "__", "$$", "$$", "ss", "$$", "$$", "__", "__", "$$", "ss", "ss", "ss", "$$", + "$$", "ss", "ss", "ss", "ss", "$$", "__", "$$", "ss", "ss", "ss", "$$", "__", "__", "__", "$$", "ss", "ss", "ss", "$$", + "$$", "ss", "ss", "ss", "ss", "$$", "__", "$$", "ss", "ss", "ss", "$$", "__", "__", "__", "$$", "ss", "ss", "$$", "__", + "$$", "ss", "ss", "ss", "$$", "__", "__", "ss", "ss", "$$", "$$", "__", "__", "__", "__", "$$", "ss", "ss", "$$", "__", + "$$", "ss", "ss", "ss", "$$", "__", "$$", "ss", "ss", "$$", "__", "__", "__", "__", "$$", "ss", "ss", "ss", "$$", "__", + "$$", "ss", "ss", "ss", "$$", "$$", "ss", "ss", "$$", "__", "__", "__", "__", "__", "__", "$$", "$$", "$$", "__", "__", + "$$", "ss", "ss", "ss", "$$", "$$", "ss", "$$", "__", "__", "$$", "__", "__", "__", "__", "__", "__", "__", "__", "__", + "$$", "ss", "ss", "ss", "$$", "__", "$$", "__", "__", "$$", "ss", "$$", "__", "__", "__", "__", "__", "__", "__", "__", + "__", "$$", "ss", "ss", "$$", "__", "__", "__", "__", "$$", "ss", "ss", "$$", "__", "__", "__", "__", "__", "__", "__", + "__", "$$", "ss", "ss", "$$", "__", "__", "__", "__", "$$", "ss", "ss", "ss", "$$", "$$", "$$", "$$", "$$", "__", "__", + "__", "$$", "ss", "ss", "$$", "__", "__", "__", "__", "__", "$$", "ss", "ss", "ss", "ss", "ss", "ss", "ss", "$$", "__", + "__", "__", "$$", "ss", "$$", "__", "__", "__", "__", "__", "__", "$$", "ss", "ss", "ss", "ss", "$$", "$$", "__", "__", + "__", "__", "__", "$$", "__", "__", "__", "__", "__", "__", "__", "__", "$$", "$$", "$$", "$$", "__", "__", "__", "__" + + }; + loadLevel(gameModel, level); + } + + if(1+ (currentLevel-1)%8 == 7){ + enemySequence = new int[]{3,3,3,3,3,3,3,3,3,3,2,4,2,4,2,4,2,4,2,4}; + String[] level = new String[]{ + "__", "__", "__", "__", "__", "__", "__", "__", "__", "__", "__", "__", "__", "__", "__", "__", "__", "__", "__", "__", + "__", "__", "__", "__", "__", "__", "__", "__", "__", "__", "__", "__", "__", "__", "__", "__", "__", "__", "__", "__", + "__", "__", "__", "__", "__", "__", "__", "__", "##", "##", "##", "__", "__", "__", "__", "$$", "$$", "$$", "__", "__", + "__", "__", "__", "ss", "ss", "ss", "__", "__", "##", "##", "##", "__", "__", "__", "__", "$$", "$$", "$$", "__", "__", + "__", "__", "__", "ss", "ss", "ss", "__", "__", "##", "##", "##", "__", "__", "__", "__", "$$", "$$", "$$", "__", "__", + "__", "__", "__", "ss", "ss", "ss", "__", "__", "__", "__", "__", "__", "__", "__", "__", "__", "__", "__", "__", "__", + "__", "__", "__", "__", "__", "__", "__", "__", "__", "__", "__", "##", "##", "##", "__", "__", "==", "==", "==", "__", + "$$", "$$", "$$", "__", "__", "__", "__", "__", "__", "__", "__", "##", "##", "##", "__", "__", "==", "==", "==", "__", + "$$", "$$", "$$", "__", "__", "__", "__", "__", "__", "__", "__", "##", "##", "##", "__", "__", "==", "==", "==", "__", + "$$", "$$", "$$", "__", "__", "__", "ss", "ss", "ss", "__", "__", "__", "__", "__", "##", "##", "##", "__", "__", "__", + "__", "__", "__", "__", "__", "__", "ss", "ss", "ss", "__", "__", "__", "__", "__", "##", "##", "##", "__", "__", "__", + "__", "__", "__", "__", "__", "__", "ss", "ss", "ss", "__", "__", "__", "__", "__", "##", "##", "##", "__", "__", "__", + "__", "__", "__", "__", "__", "__", "__", "__", "__", "__", "__", "__", "__", "__", "__", "__", "__", "__", "__", "__", + "__", "ss", "ss", "ss", "__", "__", "__", "__", "__", "__", "__", "__", "__", "__", "__", "__", "__", "__", "__", "__", + "__", "ss", "ss", "ss", "__", "__", "__", "__", "__", "##", "##", "##", "__", "__", "__", "__", "__", "__", "__", "__", + "__", "ss", "ss", "ss", "__", "__", "__", "__", "__", "##", "##", "##", "__", "__", "__", "__", "__", "__", "__", "__", + "__", "__", "__", "__", "__", "__", "__", "__", "__", "##", "##", "##", "__", "__", "__", "__", "__", "__", "__", "__", + "__", "__", "__", "__", "##", "##", "##", "__", "__", "__", "__", "__", "__", "__", "__", "==", "==", "==", "__", "__", + "__", "__", "__", "__", "##", "##", "##", "__", "__", "__", "__", "__", "__", "__", "__", "==", "==", "==", "__", "__", + "__", "__", "__", "__", "##", "##", "##", "__", "__", "__", "__", "__", "__", "__", "__", "==", "==", "==", "__", "__" + }; + loadLevel(gameModel, level); + } + + if(1+ (currentLevel-1)%8 == 8){ + enemySequence = new int[]{3,4,4,2,3,4,4,2,3,4,4,2,3,4,4,2,3,4,4,2}; + String[] level = new String[]{ + "__", "__", "__", "__", "__", "__", "__", "__", "__", "__", "__", "__", "__", "__", "__", "__", "__", "__", "__", "__", + "##", "##", "##", "##", "__", "__", "__", "__", "__", "__", "__", "__", "__", "__", "__", "__", "__", "__", "__", "__", + "##", "##", "##", "##", "__", "__", "__", "__", "__", "__", "__", "__", "__", "__", "__", "__", "__", "__", "__", "__", + "__", "__", "##", "__", "__", "__", "__", "__", "__", "__", "__", "__", "__", "__", "__", "__", "__", "__", "__", "__", + "__", "__", "##", "__", "__", "__", "__", "__", "__", "__", "__", "__", "__", "__", "__", "__", "__", "__", "__", "__", + "__", "__", "##", "__", "__", "__", "__", "__", "__", "__", "__", "__", "__", "__", "__", "__", "__", "__", "__", "__", + "__", "__", "##", "__", "__", "__", "__", "__", "__", "__", "__", "__", "__", "__", "__", "__", "__", "__", "__", "__", + "__", "__", "##", "__", "__", "__", "__", "__", "__", "__", "__", "__", "__", "__", "__", "__", "__", "__", "__", "__", + "__", "__", "##", "__", "__", "__", "__", "__", "__", "__", "__", "__", "__", "__", "__", "__", "__", "__", "__", "__", + "__", "__", "##", "__", "__", "##", "##", "##", "__", "##", "__", "__", "__", "##", "__", "__", "##", "##", "##", "__", + "__", "__", "##", "__", "##", "__", "__", "##", "__", "##", "__", "__", "__", "##", "__", "##", "__", "__", "##", "__", + "__", "__", "##", "__", "##", "__", "__", "##", "__", "__", "##", "__", "##", "__", "__", "##", "__", "__", "##", "__", + "__", "__", "##", "__", "##", "__", "__", "##", "__", "__", "##", "__", "##", "__", "__", "##", "__", "__", "##", "__", + "__", "__", "##", "__", "##", "__", "__", "##", "__", "__", "##", "__", "##", "__", "__", "##", "__", "__", "##", "__", + "##", "__", "##", "__", "##", "__", "__", "##", "__", "__", "__", "##", "__", "__", "__", "##", "__", "__", "##", "__", + "__", "##", "__", "__", "__", "##", "##", "__", "##", "__", "__", "##", "__", "__", "__", "__", "##", "##", "__", "##", + "__", "__", "__", "__", "__", "__", "__", "__", "__", "__", "__", "__", "__", "__", "__", "__", "__", "__", "__", "__", + "__", "__", "__", "__", "__", "__", "__", "__", "__", "__", "__", "__", "__", "__", "__", "__", "__", "__", "__", "__", + "__", "__", "__", "__", "__", "__", "__", "__", "__", "__", "__", "__", "__", "__", "__", "__", "__", "__", "__", "__", + "__", "__", "__", "__", "__", "__", "__", "__", "__", "__", "__", "__", "__", "__", "__", "__", "__", "__", "__", "__" + }; + loadLevel(gameModel, level); + } + + gameModel.addActor(gameModel.P1); + gameModel.addActor(gameModel.P2); + } + + public static void loadLevel(ServerModel gameModel, String[] level){ + for(int i = 0; i < level.length; i++){ + if(level[i].equals("##")) + gameModel.addActor(new wall(23 + (i%20)*25, 23 + (i/20)*25, gameModel)); + if(level[i].equals("#0")) + gameModel.addActor(new wall(23 + (i%20)*25, 23 + (i/20)*25, 0, gameModel)); + if(level[i].equals("#1")) + gameModel.addActor(new wall(23 + (i%20)*25, 23 + (i/20)*25, 1, gameModel)); + if(level[i].equals("#2")) + gameModel.addActor(new wall(23 + (i%19)*25, 23 + (i/20)*25, 2, gameModel)); + if(level[i].equals("#3")) + gameModel.addActor(new wall(23 + (i%20)*25, 23 + (i/20)*25, 3, gameModel)); + if(level[i].equals("ss")) + gameModel.addActor(new Steelwall(23 + (i%20)*25, 23 + (i/20)*25, gameModel)); + if(level[i].equals("s0")) + gameModel.addActor(new Steelwall(23 + (i%20)*25, 23 + (i/20)*25, 0, gameModel)); + if(level[i].equals("s1")) + gameModel.addActor(new Steelwall(23 + (i%20)*25, 23 + (i/20)*25, 1, gameModel)); + if(level[i].equals("s2")) + gameModel.addActor(new Steelwall(23 + (i%20)*25, 23 + (i/20)*25, 2, gameModel)); + if(level[i].equals("s3")) + gameModel.addActor(new Steelwall(23 + (i%20)*25, 23 + (i/20)*25, 3, gameModel)); + if(level[i].equals("$$")){ + for(int j = 399; j >=0; j--){ + if(gameModel.actors[j] == null){ + gameModel.actors[j] = new grass(23 + (i%20)*25, 23 + (i/20)*25); + break; + } + } + } + if(level[i].equals("==")) + gameModel.addActor(new river(23 + (i%20)*25, 23 + (i/20)*25, gameModel)); + } + } + + public static void spawnEnemy(ServerModel gameModel){ + if(NoOfEnemy < maxNoEnemy && enemyLeft > 0 && (gameModel.gameFlow % enemySpawnTime == 0)){ + int xPos = 23 + (20 -enemyLeft)%3*238; + boolean flashing = (enemyLeft%3 == 0); + gameModel.addActor(new enemy(enemySequence[20-enemyLeft], flashing, xPos, 23, gameModel)); + enemyLeft--; + NoOfEnemy++; + } + } + + public static void reset(){ + currentLevel = 0; + enemySpawnTime = 150; + enemyLeft = 20; + deathCount = 0; + maxNoEnemy = 3; + NoOfEnemy = 0; + } +} \ No newline at end of file diff --git a/源代码/server/src/player.java b/源代码/server/src/player.java new file mode 100644 index 0000000..7995053 --- /dev/null +++ b/源代码/server/src/player.java @@ -0,0 +1,460 @@ +import java.awt.*; + +public class player implements Actor{ + public final int UP = 0; + public final int DOWN = 1; + public final int LEFT = 2; + public final int RIGHT = 3; + public final int size = 12; + public final Rectangle map = new Rectangle(35, 35, 452, 452); + public int scores; + public String type; + public int life; + public int speed; + public int direction; + public int InvulnerableTime; + public int freezed; + public int freezedTime; + public boolean moveUp; + public boolean moveDown; + public boolean moveLeft; + public boolean moveRight; + public boolean fire; + public int numberOfBullet; + public int coolDownTime; + public int status; + public int health; + public int xPos, yPos, xVPos, yVPos; + public Rectangle border; + public Image standardImage; + public Image[] textures; + public ServerModel gameModel; + + public player(String type, ServerModel gameModel){ + this.type = type; + life = 3; + direction = UP; + status = 1; + health = 1; + numberOfBullet = 1; + InvulnerableTime = 150; + this.gameModel = gameModel; + + textures = new Image[4]; + if(type.equals( "1P")){ + //玩家1游戏开启时位置 + xPos = 198; + yPos = 498; + //玩家1的图像 + for(int i = 0; i < 4; i ++) + textures[i] = gameModel.textures[54+i]; + standardImage = textures[0]; + }else{ + //玩家2游戏开启时位置 + xPos = 323; + yPos = 498; + //玩家2的图像 + for(int i = 0; i < 4; i ++) + textures[i] = gameModel.textures[72+i]; + standardImage = textures[0]; + } + + xVPos = xPos; + yVPos = yPos; + border = new Rectangle(xPos - size, yPos - size, 25, 25); + + } + + public void move(){ + if(gameModel.gamePaused){ + writeToOutputLine(); + return; + } + + if(coolDownTime > 0) + coolDownTime--; + if(InvulnerableTime > 0) + InvulnerableTime--; + + if(freezed == 1){ + writeToOutputLine(); + return; + } + + //如果玩家点击“开火”键,并且满足条件,则创建一个子弹目标(即发射子弹) + if(fire && coolDownTime == 0 && numberOfBullet > 0){ + //子弹方向 + int c = direction; + //子弹位置 + int a, b; + if(direction == UP){ + a = xPos; b = yPos - size; + }else if(direction == DOWN){ + a = xPos; b = yPos + size; + }else if(direction == LEFT){ + a = xPos - size; b = yPos; + }else{ + a = xPos + size; b = yPos; + } + //子弹速度 + int d; + if(status == 1){ + numberOfBullet = 1; + d = 7; + }else{ + d = 12; + } + //子弹能力 + int e; + if(status == 4){ + e = 2; + }else{ + e = 1; + } + //添加子弹 + gameModel.addActor(new bullet(a,b,c,d,e, this, gameModel)); + //coolDownTime是你要等到你可以发射第二颗子弹时间(与魔兽争霸3相同) + if(status> 2) + coolDownTime = 5; + else + coolDownTime = 8; + //减少子弹的可用数,子弹发射时numberOfBullet会增加 + //由玩家的坦克击中目标(例如,墙壁,敌人坦克等); + numberOfBullet--; + } + + + //保存当前位置信息,如果新的移动确定后无效,则更改 + //以前的位置 + int xPosTemp = xPos; + int yPosTemp = yPos; + Rectangle borderTemp = new Rectangle(xPosTemp - size, yPosTemp - size, 25,25); + + //根据玩家坦克的移动定义玩家坦克的下一个边界,假设它的下一个移动是有效的; + boolean notMoving = false; + if(moveUp){ + if(direction != UP && direction != DOWN) + xPos = xVPos; + yPos-=speed; + direction = UP; + }else if(moveDown){ + if(direction != UP && direction != DOWN) + xPos = xVPos; + yPos+=speed; + direction = DOWN; + }else if(moveLeft){ + if(direction != LEFT && direction != RIGHT) + yPos = yVPos; + xPos-=speed; + direction = LEFT; + }else if(moveRight){ + if(direction != LEFT && direction != RIGHT) + yPos = yVPos; + xPos+=speed; + direction = RIGHT; + }else{ + notMoving = true; + } + if(notMoving){ + if(speed > 0) + speed--; + }else{ + if(speed < 3) + speed++; + } + + //更新边界 + border.y = yPos - size; + border.x = xPos - size; + + //检查下一个边界是否与地图边界相交,如果不移动到任何地方 + if(!border.intersects(map)){ + xPos = xVPos; yPos = yVPos; + border.x = xPos - size; border.y = yPos - size; + writeToOutputLine(); + return; + } + + + //检查下个边界是否与其他对象相交,如玩家控制的坦克,墙等等 + for(int i = 0; i < gameModel.actors.length; i++){ + if(gameModel.actors[i] != null){ + if(this != gameModel.actors[i] ){ + if(border.intersects(gameModel.actors[i].getBorder())){ + if(gameModel.actors[i].getType().equals("powerUp")){ + scores+=50; + powerUp temp = (powerUp)gameModel.actors[i]; + int function = temp.function; + if(function == 0){ //普通星星,增加速度 + upgrade(); + }else if(function == 1){ //钢墙保护基地 + base tempe = (base)gameModel.actors[4]; + tempe.steelWallTime = 600; + }else if(function == 2){ // 杀死所有的敌方坦克 + for(int j = 0; j < gameModel.actors.length; j++) + if(gameModel.actors[j] != null) + if(gameModel.actors[j].getType().equals("enemy")){ + enemy tempe = (enemy)gameModel.actors[j]; + gameModel.addActor(new bomb(tempe.xPos, tempe.yPos, "big", gameModel)); + gameModel.removeActor(gameModel.actors[j]); + } + level.NoOfEnemy = 0; + level.deathCount = 20 - level.enemyLeft; + }else if(function == 3){ //防护盾,刀枪不入 + InvulnerableTime = 300 + (int)Math.random()*400; + }else if(function == 4){ //冻结所有敌人 + enemy.freezedTime = 300 + (int)Math.random()*400; + enemy.freezedMoment = ServerModel.gameFlow; + }else if(function == 5){ //超级星星 + if(status < 3) + numberOfBullet++; + status =4; + health = 2; + if(type.equals("1P")) + for(int j = 0; j < 4; j ++) + textures[j] = gameModel.textures[66+j]; + else + for(int j = 0; j < 4; j ++) + textures[j] = gameModel.textures[84+j]; + }else if(function == 6){ // 增加生命 + life++; + } + + gameModel.removeActor(gameModel.actors[i]); + + } + //静态对象,如墙壁,河流 + else if(gameModel.actors[i].getType().equals("steelWall") || gameModel.actors[i].getType().equals("wall")){ + if(!gameModel.actors[i].walldestoried()){ + for(int j = 0;j < gameModel.actors[i].getDetailedBorder().length; j++){ + if( gameModel.actors[i].getDetailedBorder()[j] != null){ + if(gameModel.actors[i].getDetailedBorder()[j].intersects(border)){ + xPos = xVPos; yPos = yVPos; + border.x = xPos - size; border.y = yPos - size; + writeToOutputLine(); + return; + } + } + } + } + } + else if(gameModel.actors[i].getType().equals("river") || gameModel.actors[i].getType().equals("base")){ + xPos = xVPos; yPos = yVPos; + border.x = xPos - size; border.y = yPos - size; + writeToOutputLine(); + return; + } + //移动对象,例如敌人坦克 + else if(gameModel.actors[i].getType().equals("enemy") || gameModel.actors[i].getType().equals("Player") ){ + if(!borderTemp.intersects(gameModel.actors[i].getBorder()) || gameModel.actors[i].getType().equals("enemy")){ + xPos = xPosTemp; + yPos = yPosTemp; + border.x = xPos - size; border.y = yPos - size; + writeToOutputLine(); + return; + } + } + } + } + } + } + + //找到坦克的虚拟位置,当90度转弯时,虚拟位置用来调整坦克的真实位置。 + int a = (xPos - 10)/25; + int b = (xPos - 10)%25; + if(b < 7) + b = 0; + if(b > 18) + b = 25; + if((b < 19 && b > 6) || xPos < 17 || xPos > 492) + b = 13; + xVPos = a*25 + b + 10; + int c = (yPos - 10)/25; + int d = (yPos - 10)%25; + if(d < 7) + d = 0; + if(d > 18) + d = 25; + if((d < 19 && d > 6) || yPos < 17 || yPos > 492) + d = 13; + yVPos = c*25 + d + 10; + + writeToOutputLine(); + } + + public void writeToOutputLine(){ + //将变化写入输出行 + gameModel.outputLine+="n"+ xPos + "," + yPos + ","; + int textureIndex = 0; + if(type.equals("1P")){ + if(status == 1) + textureIndex = 54 + direction; + else if (status == 2) + textureIndex = 58 + direction; + else if(status == 3) + textureIndex = 62 + direction; + else + textureIndex = 66 + direction; + }else{ + if(status == 1) + textureIndex = 72 + direction; + else if (status == 2) + textureIndex = 76 + direction; + else if(status == 3) + textureIndex = 80 + direction; + else + textureIndex = 84 + direction; + } + + + gameModel.outputLine+= "" + textureIndex + ";"; + + if(InvulnerableTime > 0) + gameModel.outputLine+="i"+ xPos + "," + yPos + ";"; + } + + public void draw(Graphics g){ + //绘制玩家坦克 + g.drawImage(textures[direction], xPos - size, yPos - size, null); + if(InvulnerableTime > 0){ + g.setColor(Color.red); + g.drawRect(xPos - 12, yPos - 12, 25,25); + g.drawRect(xPos - 11, yPos - 11, 23,23); + } + + //关于玩家的信息,如分数,生命等 + if(type.equals("1P")){ + g.setColor(Color.yellow); + g.drawImage(standardImage, 520, 380, null ); + g.drawString("x", 555, 395); + g.drawString(life + "", 565, 396); + String SCORE = "000000000" + scores; + g.drawString(type +" 得分:" + "", 515, 370); + g.drawString(SCORE.substring(SCORE.length() - 7, SCORE.length()) + "", 566, 370); + } + if(type.equals("2P")){ + g.setColor(Color.green); + g.drawImage(standardImage, 520, 460, null ); + g.drawString("x", 555, 475); + g.drawString(life + "", 565, 476); + String SCORE = "000000000" + scores; + g.drawString(type +" 得分:" + "", 515, 450); + g.drawString(SCORE.substring(SCORE.length() - 7, SCORE.length()) + "", 566, 450); + } + + + } + + public Rectangle getBorder(){ + return border; + } + + public String getType(){ + return "Player"; + } + + public void hurt(){ + if(InvulnerableTime != 0) + return; + + //如果坦克只有1级的健康状态,被击中,那么玩家坦克失去一个生命,如果玩家坦克是最后一次生命,被击中,则game over + //只有吃掉超级星星时,玩家才会有2级的生命健康状态 + if(health == 1){ + gameModel.addActor(new bomb(xPos, yPos, "big", gameModel)); + life--; + if(life == 0){ + xPos = 100000; yPos = 100000; //this will make the player never come back to the main screen, thus looks like "dead" + border = new Rectangle(xPos - size, yPos - size, 25, 25); + xVPos = xPos; yVPos = yPos; + return; + }else{ + direction = UP; + status = 1; + health = 1; + numberOfBullet = 1; + InvulnerableTime = 150; + if(type.equals( "1P")){ + xPos = 198; + yPos = 498; + border = new Rectangle(xPos - size, yPos - size, 25, 25); + xVPos = xPos; yVPos = yPos; + for(int i = 0; i < 4; i ++) + textures[i] = gameModel.textures[54+i]; + }else{ + xPos = 323; + yPos = 498; + border = new Rectangle(xPos - size, yPos - size, 25, 25); + xVPos = xPos; yVPos = yPos; + for(int i = 0; i < 4; i ++) + textures[i] = gameModel.textures[72+i]; + } + } + }else{ + health--; + status = 3; + if(type.equals( "1P")){ + for(int i = 0; i < 4; i ++) + textures[i] = gameModel.textures[62+i]; + }else{ + for(int i = 0; i < 4; i ++) + textures[i] = gameModel.textures[80+i]; + } + } + } + + public void upgrade(){ + //当玩家坦克吃掉正常的星星时,他的子弹将会升级 + if(type.equals( "1P")){ + if(status == 1){ + status = 2; + for(int i = 0; i < 4; i ++) + textures[i] = gameModel.textures[58+i]; + }else if(status == 2){ + status = 3; + numberOfBullet ++; + for(int i = 0; i < 4; i ++) + textures[i] = gameModel.textures[62+i]; + }else if(status == 3){ + status = 4; + for(int i = 0; i < 4; i ++) + textures[i] = gameModel.textures[66+i]; + } + }else{ + if(status == 1){ + status = 2; + for(int i = 0; i < 4; i ++) + textures[i] = gameModel.textures[76+i]; + }else if(status == 2){ + status = 3; + numberOfBullet ++; + for(int i = 0; i < 4; i ++) + textures[i] = gameModel.textures[80+i]; + }else if(status == 3){ + status = 4; + for(int i = 0; i < 4; i ++) + textures[i] = gameModel.textures[84+i]; + } + } + } + + public void reset(){ + direction = UP; + InvulnerableTime = 150; + if(type.equals( "1P")){ + xPos = 198; + yPos = 498; + }else{ + xPos = 323; + yPos = 498; + } + + xVPos = xPos; + yVPos = yPos; + border = new Rectangle(xPos - size, yPos - size, 25, 25); + } + + //未使用的方法 + public Rectangle[] getDetailedBorder(){return null;} + public boolean walldestoried(){return false;} + +} diff --git a/源代码/server/src/powerUp.java b/源代码/server/src/powerUp.java new file mode 100644 index 0000000..c10bf57 --- /dev/null +++ b/源代码/server/src/powerUp.java @@ -0,0 +1,70 @@ +import java.awt.*; + +public class powerUp implements Actor{ + private int xPos; + private int yPos; + public int function; + public Rectangle border; + public int displaytime; + public Image[] textures; + public ServerModel gameModel; + + public powerUp(ServerModel gameModel){ + this.gameModel = gameModel; + //加载图像 + textures = new Image[7]; + for(int i = 0; i < 7; i ++) + textures[i] = gameModel.textures[46+i]; + + xPos = 24 + (int)(Math.random()*475); + yPos = 24 + (int)(Math.random()*475); + int a = (int)(Math.random()*17); + if(0 <= a && a< 3) + function = 0; + if(3 <= a && a < 6) + function = 1; + if(6 <= a && a < 9) + function = 2; + if(9 <= a && a< 12) + function = 3; + if(12 <= a && a < 15) + function = 4; + if(15 <= a && a < 16) + function = 5; + if(16 <= a && a < 17) + function = 6; + displaytime = 100 + (int)(Math.random()*630); + border= new Rectangle(xPos - 12, yPos -12, 25, 25); + } + + public Rectangle getBorder(){ + return border; + } + + public int getFunction(){ + return function; + } + + public String getType(){ + return "powerUp"; + } + + public void move(){ + displaytime--; + if(displaytime == 0) + gameModel.removeActor(this); + + //将变化写入输出行 + gameModel.outputLine+="n"+ xPos + "," + yPos + ","; + gameModel.outputLine+= "" + (46 + function) + ";"; + } + + public void draw(Graphics g){ + g.drawImage(textures[function], xPos - 12, yPos - 12, null); + } + + //未使用的方法 + public Rectangle[] getDetailedBorder(){return null;} + public boolean walldestoried(){return false;}; + +} \ No newline at end of file diff --git a/源代码/server/src/river.java b/源代码/server/src/river.java new file mode 100644 index 0000000..26c69da --- /dev/null +++ b/源代码/server/src/river.java @@ -0,0 +1,46 @@ +import java.awt.*; + +public class river implements Actor{ + private int xPos; + private int yPos; + private Rectangle Border; + public Image river; + public ServerModel gameModel; + + public river(int a, int b, ServerModel gameModel){ + this.gameModel = gameModel; + river = gameModel.textures[71]; + xPos = a; + yPos = b; + Border = new Rectangle(xPos - 12, yPos - 12, 25, 25); + } + + public Rectangle getBorder(){ + return Border; + } + + public int getxPos(){ + return xPos; + } + + public int getyPos(){ + return yPos; + } + + public String getType(){ + return "river"; + } + + public void draw(Graphics g){ + g.drawImage(river, xPos - 12, yPos - 12, null); + } + + + + //未使用的方法 + public void move(){} + public Rectangle[] getDetailedBorder(){return null;} + public boolean walldestoried(){return false;} + +} + diff --git a/源代码/server/src/wall.java b/源代码/server/src/wall.java new file mode 100644 index 0000000..b08f42c --- /dev/null +++ b/源代码/server/src/wall.java @@ -0,0 +1,1095 @@ +import java.awt.*; + +public class wall implements Actor{ + private int xPos; + private int yPos; + private Rectangle[] border = new Rectangle[4]; + public boolean[] shape = new boolean[16]; + public boolean walldestoried; + public boolean bulletdestoried; + public ServerModel gameModel; + public Image wall; + public Rectangle generalBorder; + + + public wall(int a, int b, ServerModel gameModel){ + xPos = a; + yPos = b; + this.gameModel = gameModel; + wall = gameModel.textures[70]; + generalBorder = new Rectangle(xPos - 12, yPos - 12, 25, 25); + border[0] = new Rectangle(xPos - 11, yPos - 11, 11, 11); + border[1] = new Rectangle(xPos + 1, yPos - 11, 11, 11); + border[2] = new Rectangle(xPos - 11, yPos + 1, 11, 11); + border[3] = new Rectangle(xPos + 1, yPos + 1, 11, 11); + + } + + public wall(int a, int b, int orientation, ServerModel gameModel){ + xPos = a; + yPos = b; + this.gameModel = gameModel; + wall = gameModel.textures[70]; + generalBorder = new Rectangle(xPos - 12, yPos - 12, 25, 25); + if(orientation == 0){ + border[0] = new Rectangle(xPos - 11, yPos - 11, 11, 11); + border[1] = new Rectangle(xPos + 1, yPos - 11, 11, 11); + for(int i = 8; i < 12; i ++) + shape[i] = true; + for(int i = 12; i < 16; i ++) + shape[i] = true; + } + if(orientation == 1){ + border[2] = new Rectangle(xPos - 11, yPos + 1, 11, 11); + border[3] = new Rectangle(xPos + 1, yPos + 1, 11, 11); + for(int i = 0; i < 4; i ++) + shape[i] = true; + for(int i = 4; i < 8; i ++) + shape[i] = true; + } + if(orientation == 2){ + border[0] = new Rectangle(xPos - 11, yPos - 11, 11, 11); + border[2] = new Rectangle(xPos - 11, yPos + 1, 11, 11); + for(int i = 3; i <= 15; i+=4) + shape[i] = true; + for(int i = 2; i <= 14; i+=4) + shape[i] = true; + } + if(orientation == 3){ + border[1] = new Rectangle(xPos + 1, yPos - 11, 11, 11); + border[3] = new Rectangle(xPos + 1, yPos + 1, 11, 11); + for(int i = 1; i <= 13; i+=4) + shape[i] = true; + for(int i = 0; i <= 12; i+=4) + shape[i] = true; + } + + } + + + + public void damageWall(Rectangle bullet, int bulletpower, int bulletdirection){ + + + bulletdestoried = false; + + if(bulletpower == 1){ + if(border[0] != null && border[1] != null && bulletdirection == 1){ + if(bullet.intersects(border[0]) && bullet.intersects(border[1])){ + if(shape[1] && shape[2]){ + for(int i = 4; i < 8; i ++) + shape[i] = true; + border[0] = null; + border[1] = null; + } + if(!shape[1] || !shape[2]){ + for(int i = 0; i < 4; i ++) + shape[i] = true; + } + bulletdestoried = true; + } + } + if(border[0] != null && border[1] != null && bulletdirection == 0){ + if(bullet.intersects(border[0]) && bullet.intersects(border[1])){ + if(shape[5] && shape[6]){ + for(int i = 0; i < 4; i ++) + shape[i] = true; + border[0] = null; + border[1] = null; + } + if(!shape[5] || !shape[6]){ + for(int i = 4; i < 8; i ++) + shape[i] = true; + } + bulletdestoried = true; + } + } + if(border[2] != null && border[3] != null && bulletdirection == 1){ + if(bullet.intersects(border[2]) && bullet.intersects(border[3])){ + if(shape[9] && shape[10]){ + for(int i = 12; i < 16; i ++) + shape[i] = true; + border[2] = null; + border[3] = null; + } + if(!shape[9] || !shape[10]){ + for(int i = 8; i < 12; i ++) + shape[i] = true; + } + bulletdestoried = true; + } + } + if(border[2] != null && border[3] != null && bulletdirection == 0){ + if(bullet.intersects(border[2]) && bullet.intersects(border[3])){ + if(shape[13] && shape[14]){ + for(int i = 8; i < 12; i ++) + shape[i] = true; + border[2] = null; + border[3] = null; + } + if(!shape[13] || !shape[14]){ + for(int i = 12; i < 16; i ++) + shape[i] = true; + } + bulletdestoried = true; + } + } + if(border[0] != null && border[2] != null && bulletdirection == 3){ + if(bullet.intersects(border[0]) && bullet.intersects(border[2])){ + if(shape[4] && shape[8]){ + for(int i = 1; i <= 13; i+=4) + shape[i] = true; + border[0] = null; + border[2] = null; + } + if(!shape[4] || !shape[8]){ + for(int i = 0; i <= 12; i+=4) + shape[i] = true; + } + bulletdestoried = true; + } + } + if(border[0] != null && border[2] != null && bulletdirection == 2){ + if(bullet.intersects(border[0]) && bullet.intersects(border[2])){ + if(shape[5] && shape[9]){ + for(int i = 0; i <= 12; i+=4) + shape[i] = true; + border[0] = null; + border[2] = null; + } + if(!shape[5] || !shape[9]){ + for(int i = 1; i <= 13; i+=4) + shape[i] = true; + } + bulletdestoried = true; + } + } + if(border[1] != null && border[3] != null && bulletdirection == 3){ + if(bullet.intersects(border[1]) && bullet.intersects(border[3])){ + if(shape[6] && shape[10]){ + for(int i = 3; i <= 15; i+=4) + shape[i] = true; + border[1] = null; + border[3] = null; + } + if(!shape[6] || !shape[10]){ + for(int i = 2; i <= 14; i+=4) + shape[i] = true; + } + bulletdestoried = true; + } + } + if(border[1] != null && border[3] != null && bulletdirection == 2){ + if(bullet.intersects(border[1]) && bullet.intersects(border[3])){ + if(shape[7] && shape[11]){ + for(int i = 2; i <= 14; i+=4) + shape[i] = true; + border[1] = null; + border[3] = null; + } + if(!shape[7] || !shape[11]){ + for(int i = 3; i <= 15; i+=4) + shape[i] = true; + } + bulletdestoried = true; + } + } + } + + if(bulletpower == 2){ + if(border[0] != null && border[1] != null && (bulletdirection == 0 || bulletdirection == 1)){ + if(bullet.intersects(border[0]) && bullet.intersects(border[1])){ + for(int i = 0; i < 8; i++) + shape[i] = true; + border[0] = null; + border[1] = null; + bulletdestoried = true; + } + } + if(border[2] != null && border[3] != null && (bulletdirection == 0 || bulletdirection == 1)){ + if(bullet.intersects(border[2]) && bullet.intersects(border[3])){ + for(int i = 8; i < 16; i++) + shape[i] = true; + border[2] = null; + border[3] = null; + bulletdestoried = true; + } + } + if(border[0] != null && border[2] != null && (bulletdirection == 2 || bulletdirection == 3)){ + if(bullet.intersects(border[0]) && bullet.intersects(border[2])){ + for(int i = 0; i <= 12; i+=4) + shape[i] = true; + for(int i = 1; i <= 13; i+=4) + shape[i] = true; + border[0] = null; + border[2] = null; + bulletdestoried = true; + } + } + if(border[1] != null && border[3] != null && (bulletdirection == 2 || bulletdirection == 3)){ + if(bullet.intersects(border[1]) && bullet.intersects(border[3])){ + for(int i = 2; i <= 14; i+=4) + shape[i] = true; + for(int i = 3; i <= 15; i+=4) + shape[i] = true; + border[1] = null; + border[3] = null; + bulletdestoried = true; + } + } + } + + + +//******************************************************************************************* if(border[0] != null ){ + if(border[0] != null){ + Rectangle a = new Rectangle(border[0].x, border[0].y, 5, 5); + Rectangle b = new Rectangle(border[0].x + 7, border[0].y, 5, 5); + Rectangle c = new Rectangle(border[0].x, border[0].y + 7, 5, 5); + Rectangle d = new Rectangle(border[0].x + 7, border[0].y + 7, 5, 5); + if(border[0] != null){ + if(bullet.intersects(border[0]) && bulletdirection == 1 && !(bullet.intersects(b) && ((!shape[2] || !shape[6]) || (shape[1] && shape[2] && shape[5] && shape[6])))){ + if(bullet.intersects(a) && shape[0] && !shape[4]){ + shape[4] = true; + shape[5] = true; + bulletdestoried = true; + border[0] = null; + } + if(bullet.intersects(b) && shape[1] && !shape[5]){ + shape[4] = true; + shape[5] = true; + bulletdestoried = true; + border[0] = null; + } + if(bullet.intersects(a) && !shape[0]) { + if(bulletpower == 1){ + shape[0] = true; + shape[1] = true; + } + if(bulletpower == 2){ + shape[0] = true; + shape[1] = true; + shape[4] = true; + shape[5] = true; + } + bulletdestoried = true; + if(shape[4] && shape[5]) + border[0] = null; + } + if(bullet.intersects(b) && !shape[1]) { + if(bulletpower == 1){ + shape[0] = true; + shape[1] = true; + } + if(bulletpower == 2){ + shape[0] = true; + shape[1] = true; + shape[4] = true; + shape[5] = true; + } + bulletdestoried = true; + if(shape[4] && shape[5]) + border[0] = null; + } + } + } + if(border[0] != null){ + if(bullet.intersects(border[0]) && bulletdirection == 0 && !(bullet.intersects(d) && ((!shape[2] || !shape[6]) || (shape[1] && shape[2] && shape[5] && shape[6])))){ + if(bullet.intersects(c) && shape[4] && !shape[0]){ + shape[0] = true; + shape[1] = true; + bulletdestoried = true; + border[0] = null; + } + if(bullet.intersects(d) && shape[5] && !shape[1]){ + shape[0] = true; + shape[1] = true; + bulletdestoried = true; + border[0] = null; + } + if(bullet.intersects(c) && !shape[4]){ + if(bulletpower == 1){ + shape[4] = true; + shape[5] = true; + } + if(bulletpower == 2){ + shape[4] = true; + shape[5] = true; + shape[1] = true; + shape[0] = true; + } + bulletdestoried = true; + if(shape[0] && shape[1]) + border[0] = null; + } + if(bullet.intersects(d) && !shape[5]){ + if(bulletpower == 1){ + shape[4] = true; + shape[5] = true; + } + if(bulletpower == 2){ + shape[4] = true; + shape[5] = true; + shape[1] = true; + shape[0] = true; + } + bulletdestoried = true; + if(shape[0] && shape[1]) + border[0] = null; + } + } + } + if(border[0] != null){ + if(bullet.intersects(border[0]) && bulletdirection == 3 && !(bullet.intersects(c) && ((!shape[8] || !shape[9]) || (shape[4] && shape[5] && shape[8] && shape[9])))){ + if(bullet.intersects(a) && shape[0] && !shape[1]){ + shape[1] = true; + shape[5] = true; + bulletdestoried = true; + border[0] = null; + } + if(bullet.intersects(c) && shape[4] && !shape[5]){ + shape[1] = true; + shape[5] = true; + bulletdestoried = true; + border[0] = null; + } + if(bullet.intersects(a) && !shape[0]){ + if(bulletpower == 1){ + shape[0] = true; + shape[4] = true; + } + if(bulletpower == 2){ + shape[0] = true; + shape[4] = true; + shape[1] = true; + shape[5] = true; + } + bulletdestoried = true; + if(shape[1] && shape[5]) + border[0] = null; + } + if(bullet.intersects(c) && !shape[4]){ + if(bulletpower == 1){ + shape[0] = true; + shape[4] = true; + } + if(bulletpower == 2){ + shape[0] = true; + shape[4] = true; + shape[1] = true; + shape[5] = true; + } + bulletdestoried = true; + if(shape[1] && shape[5]) + border[0] = null; + } + } + } + if(border[0] != null){ + if(bullet.intersects(border[0]) && bulletdirection == 2 && !(bullet.intersects(d) && ((!shape[8] || !shape[9]) || (shape[4] && shape[5] && shape[8] && shape[9])))){ + if(bullet.intersects(b) && shape[1] && !shape[0]){ + shape[0] = true; + shape[4] = true; + bulletdestoried = true; + border[0] = null; + } + if(bullet.intersects(d) && shape[5] && !shape[4]){ + shape[0] = true; + shape[4] = true; + bulletdestoried = true; + border[0] = null; + } + if(bullet.intersects(b) && !shape[1]){ + if(bulletpower == 1){ + shape[1] = true; + shape[5] = true; + } + if(bulletpower == 2){ + shape[1] = true; + shape[5] = true; + shape[0] = true; + shape[4] = true; + } + bulletdestoried = true; + if(shape[0] && shape[4]) + border[0] = null; + } + if(bullet.intersects(d) && !shape[5]){ + if(bulletpower == 1){ + shape[1] = true; + shape[5] = true; + } + if(bulletpower == 2){ + shape[1] = true; + shape[5] = true; + shape[0] = true; + shape[4] = true; + } + bulletdestoried = true; + if(shape[0] && shape[4]) + border[0] = null; + } + } + } + } + //******************************************************************************* + if(border[1] != null ){ + Rectangle a = new Rectangle(border[1].x, border[1].y, 5, 5); + Rectangle b = new Rectangle(border[1].x + 7, border[1].y, 5, 5); + Rectangle c = new Rectangle(border[1].x, border[1].y + 7, 5, 5); + Rectangle d = new Rectangle(border[1].x + 7, border[1].y + 7, 5, 5); + if(border[1] != null){ + if(bullet.intersects(border[1]) && bulletdirection == 1 && !(bullet.intersects(a) && ((!shape[1] || !shape[5]) || (shape[1] && shape[2] && shape[5] && shape[6])))){ + if(bullet.intersects(a) && shape[2] && !shape[6]){ + shape[6] = true; + shape[7] = true; + bulletdestoried = true; + border[1] = null; + } + if(bullet.intersects(b) && shape[3] && !shape[7]){ + shape[6] = true; + shape[7] = true; + bulletdestoried = true; + border[1] = null; + } + if(bullet.intersects(a) && !shape[2]) { + if(bulletpower == 1){ + shape[2] = true; + shape[3] = true; + } + if(bulletpower == 2){ + shape[2] = true; + shape[3] = true; + shape[6] = true; + shape[7] = true; + } + bulletdestoried = true; + if(shape[6] && shape[7]) + border[1] = null; + } + if(bullet.intersects(b) && !shape[3]) { + if(bulletpower == 1){ + shape[2] = true; + shape[3] = true; + } + if(bulletpower == 2){ + shape[2] = true; + shape[3] = true; + shape[6] = true; + shape[7] = true; + } + bulletdestoried = true; + if(shape[6] && shape[7]) + border[1] = null; + } + } + } + if(border[1] != null){ + if(bullet.intersects(border[1]) && bulletdirection == 0 && !(bullet.intersects(c) && ((!shape[1] || !shape[5]) || (shape[1] && shape[2] && shape[5] && shape[6])))){ + if(bullet.intersects(c) && shape[6] && !shape[2]){ + shape[2] = true; + shape[3] = true; + bulletdestoried = true; + border[1] = null; + } + if(bullet.intersects(d) && shape[7] && !shape[3]){ + shape[2] = true; + shape[3] = true; + bulletdestoried = true; + border[1] = null; + } + if(bullet.intersects(c) && !shape[6]){ + if(bulletpower == 1){ + shape[6] = true; + shape[7] = true; + } + if(bulletpower == 2){ + shape[6] = true; + shape[7] = true; + shape[2] = true; + shape[3] = true; + } + bulletdestoried = true; + if(shape[2] && shape[3]) + border[1] = null; + } + if(bullet.intersects(d) && !shape[7]){ + if(bulletpower == 1){ + shape[6] = true; + shape[7] = true; + } + if(bulletpower == 2){ + shape[6] = true; + shape[7] = true; + shape[2] = true; + shape[3] = true; + } + bulletdestoried = true; + if(shape[2] && shape[3]) + border[1] = null; + } + } + } + if(border[1] != null){ + if(bullet.intersects(border[1]) && bulletdirection == 3 && !(bullet.intersects(c) && ((!shape[10] || !shape[11]) || (shape[6] && shape[7] && shape[10] && shape[11])))){ + if(bullet.intersects(a) && shape[2] && !shape[3]){ + shape[3] = true; + shape[7] = true; + bulletdestoried = true; + border[1] = null; + } + if(bullet.intersects(c) && shape[6] && !shape[7]){ + shape[3] = true; + shape[7] = true; + bulletdestoried = true; + border[1] = null; + } + if(bullet.intersects(a) && !shape[2]){ + if(bulletpower == 1){ + shape[2] = true; + shape[6] = true; + } + if(bulletpower == 2){ + shape[2] = true; + shape[6] = true; + shape[3] = true; + shape[7] = true; + } + bulletdestoried = true; + if(shape[3] && shape[7]) + border[1] = null; + } + if(bullet.intersects(c) && !shape[6]){ + if(bulletpower == 1){ + shape[2] = true; + shape[6] = true; + } + if(bulletpower == 2){ + shape[2] = true; + shape[6] = true; + shape[3] = true; + shape[7] = true; + } + bulletdestoried = true; + if(shape[3] && shape[7]) + border[1] = null; + } + } + } + if(border[1] != null){ + if(bullet.intersects(border[1]) && bulletdirection == 2 && !(bullet.intersects(d) && ((!shape[10] || !shape[11]) || (shape[6] && shape[7] && shape[10] && shape[11])))){ + if(bullet.intersects(b) && shape[3] && !shape[2]){ + shape[2] = true; + shape[6] = true; + bulletdestoried = true; + border[1] = null; + } + if(bullet.intersects(d) && shape[7] && !shape[6]){ + shape[2] = true; + shape[6] = true; + bulletdestoried = true; + border[1] = null; + } + if(bullet.intersects(b) && !shape[3]){ + if(bulletpower == 1){ + shape[3] = true; + shape[7] = true; + } + if(bulletpower == 2){ + shape[3] = true; + shape[7] = true; + shape[2] = true; + shape[6] = true; + } + bulletdestoried = true; + if(shape[2] && shape[6]) + border[1] = null; + } + if(bullet.intersects(d) && !shape[7]){ + if(bulletpower == 1){ + shape[3] = true; + shape[7] = true; + } + if(bulletpower == 2){ + shape[3] = true; + shape[7] = true; + shape[2] = true; + shape[6] = true; + } + bulletdestoried = true; + if(shape[2] && shape[6]) + border[1] = null; + } + } + } + } + + //*********************************************************************************** + if(border[2] != null ){ + Rectangle a = new Rectangle(border[2].x, border[2].y, 5, 5); + Rectangle b = new Rectangle(border[2].x + 7, border[2].y, 5, 5); + Rectangle c = new Rectangle(border[2].x, border[2].y + 7, 5, 5); + Rectangle d = new Rectangle(border[2].x + 7, border[2].y + 7, 5, 5); + if(border[2] != null ){ + if(bullet.intersects(border[2]) && bulletdirection == 1 && !(bullet.intersects(b) && ((!shape[10] || !shape[14]) || (shape[9] && shape[10] && shape[13] && shape[14])))){ + if(bullet.intersects(a) && shape[8] && !shape[12]){ + shape[12] = true; + shape[13] = true; + bulletdestoried = true; + border[2] = null; + } + if(bullet.intersects(b) && shape[9] && !shape[13]){ + shape[12] = true; + shape[13] = true; + bulletdestoried = true; + border[2] = null; + } + if(bullet.intersects(a) && !shape[8]) { + if(bulletpower == 1){ + shape[8] = true; + shape[9] = true; + } + if(bulletpower == 2){ + shape[8] = true; + shape[9] = true; + shape[12] = true; + shape[13] = true; + } + bulletdestoried = true; + if(shape[12] && shape[13]) + border[2] = null; + } + if(bullet.intersects(b) && !shape[9]) { + if(bulletpower == 1){ + shape[8] = true; + shape[9] = true; + } + if(bulletpower == 2){ + shape[8] = true; + shape[9] = true; + shape[12] = true; + shape[13] = true; + } + bulletdestoried = true; + if(shape[12] && shape[13]) + border[2] = null; + } + } + } + if(border[2] != null){ + if(bullet.intersects(border[2]) && bulletdirection == 0 && !(bullet.intersects(d) && ((!shape[10] || !shape[14]) || (shape[9] && shape[10] && shape[13] && shape[14])))){ + if(bullet.intersects(c) && shape[12] && !shape[8]){ + shape[8] = true; + shape[9] = true; + bulletdestoried = true; + border[2] = null; + } + if(bullet.intersects(d) && shape[13] && !shape[9]){ + shape[8] = true; + shape[9] = true; + bulletdestoried = true; + border[2] = null; + } + if(bullet.intersects(c) && !shape[12]){ + if(bulletpower == 1){ + shape[12] = true; + shape[13] = true; + } + if(bulletpower == 2){ + shape[12] = true; + shape[13] = true; + shape[8] = true; + shape[9] = true; + } + bulletdestoried = true; + if(shape[8] && shape[9]) + border[2] = null; + } + if(bullet.intersects(d) && !shape[13]){ + if(bulletpower == 1){ + shape[12] = true; + shape[13] = true; + } + if(bulletpower == 2){ + shape[12] = true; + shape[13] = true; + shape[8] = true; + shape[9] = true; + } + bulletdestoried = true; + if(shape[8] && shape[9]) + border[2] = null; + } + } + } + if(border[2] != null){ + if(bullet.intersects(border[2]) && bulletdirection == 3 && !(bullet.intersects(a) && ((!shape[4] || !shape[5]) || (shape[4] && shape[5] && shape[8] && shape[9])))){ + if(bullet.intersects(a) && shape[8] && !shape[9]){ + shape[9] = true; + shape[13] = true; + bulletdestoried = true; + border[2] = null; + } + if(bullet.intersects(c) && shape[12] && !shape[13]){ + shape[9] = true; + shape[13] = true; + bulletdestoried = true; + border[2] = null; + } + if(bullet.intersects(a) && !shape[8]){ + if(bulletpower == 1){ + shape[8] = true; + shape[12] = true; + } + if(bulletpower == 2){ + shape[8] = true; + shape[12] = true; + shape[9] = true; + shape[13] = true; + } + bulletdestoried = true; + if(shape[9] && shape[13]) + border[2] = null; + } + if(bullet.intersects(c) && !shape[12]){ + if(bulletpower == 1){ + shape[8] = true; + shape[12] = true; + } + if(bulletpower == 2){ + shape[8] = true; + shape[12] = true; + shape[9] = true; + shape[13] = true; + } + bulletdestoried = true; + if(shape[9] && shape[13]) + border[2] = null; + } + } + } + if(border[2] != null){ + if(bullet.intersects(border[2]) && bulletdirection == 2 && !(bullet.intersects(b) && ((!shape[4] || !shape[5]) || (shape[4] && shape[5] && shape[8] && shape[9])))){ + if(bullet.intersects(b) && shape[9] && !shape[8]){ + shape[8] = true; + shape[12] = true; + bulletdestoried = true; + border[2] = null; + } + if(bullet.intersects(d) && shape[13] && !shape[12]){ + shape[8] = true; + shape[12] = true; + bulletdestoried = true; + border[2] = null; + } + if(bullet.intersects(b) && !shape[9]){ + if(bulletpower == 1){ + shape[9] = true; + shape[13] = true; + } + if(bulletpower == 2){ + shape[9] = true; + shape[13] = true; + shape[8] = true; + shape[12] = true; + } + bulletdestoried = true; + if(shape[8] && shape[12]) + border[2] = null; + } + if(bullet.intersects(d) && !shape[13]){ + if(bulletpower == 1){ + shape[9] = true; + shape[13] = true; + } + if(bulletpower == 2){ + shape[9] = true; + shape[13] = true; + shape[8] = true; + shape[12] = true; + } + bulletdestoried = true; + if(shape[8] && shape[12]) + border[2] = null; + } + } + } + + } + //************************************************************************************ + if(border[3] != null ){ + Rectangle a = new Rectangle(border[3].x, border[3].y, 5, 5); + Rectangle b = new Rectangle(border[3].x + 7, border[3].y, 5, 5); + Rectangle c = new Rectangle(border[3].x, border[3].y + 7, 5, 5); + Rectangle d = new Rectangle(border[3].x + 7, border[3].y + 7, 5, 5); + if(border[3] != null ){ + if(bullet.intersects(border[3]) && bulletdirection == 1 && !(bullet.intersects(a) && ((!shape[9] || !shape[13]) || (shape[9] && shape[10] && shape[13] && shape[14])))){ + if(bullet.intersects(a) && shape[10] && !shape[14]){ + shape[14] = true; + shape[15] = true; + bulletdestoried = true; + border[3] = null; + } + if(bullet.intersects(b) && shape[11] && !shape[15]){ + shape[14] = true; + shape[15] = true; + bulletdestoried = true; + border[3] = null; + } + if(bullet.intersects(a) && !shape[10]) { + if(bulletpower == 1){ + shape[10] = true; + shape[11] = true; + } + if(bulletpower == 2){ + shape[10] = true; + shape[11] = true; + shape[14] = true; + shape[15] = true; + } + bulletdestoried = true; + if(shape[14] && shape[15]) + border[3] = null; + } + if(bullet.intersects(b) && !shape[11]) { + if(bulletpower == 1){ + shape[10] = true; + shape[11] = true; + } + if(bulletpower == 2){ + shape[10] = true; + shape[11] = true; + shape[14] = true; + shape[15] = true; + } + bulletdestoried = true; + if(shape[14] && shape[15]) + border[3] = null; + } + } + } + if(border[3] != null){ + if(bullet.intersects(border[3]) && bulletdirection == 0 && !(bullet.intersects(c) && ((!shape[9] || !shape[13]) || (shape[9] && shape[10] && shape[13] && shape[14])))){ + if(bullet.intersects(c) && shape[14] && !shape[10]){ + shape[10] = true; + shape[11] = true; + bulletdestoried = true; + border[3] = null; + } + if(bullet.intersects(d) && shape[15] && !shape[11]){ + shape[10] = true; + shape[11] = true; + bulletdestoried = true; + border[3] = null; + } + if(bullet.intersects(c) && !shape[14]){ + if(bulletpower == 1){ + shape[14] = true; + shape[15] = true; + } + if(bulletpower == 2){ + shape[14] = true; + shape[15] = true; + shape[10] = true; + shape[11] = true; + } + bulletdestoried = true; + if(shape[10] && shape[11]) + border[3] = null; + } + if(bullet.intersects(d) && !shape[15]){ + if(bulletpower == 1){ + shape[14] = true; + shape[15] = true; + } + if(bulletpower == 2){ + shape[14] = true; + shape[15] = true; + shape[10] = true; + shape[11] = true; + } + bulletdestoried = true; + if(shape[10] && shape[11]) + border[3] = null; + } + } + } + if(border[3] != null){ + if(bullet.intersects(border[3]) && bulletdirection == 3 && !(bullet.intersects(a) && ((!shape[6] || !shape[7]) || (shape[6] && shape[7] && shape[10] && shape[11])))){ + if(bullet.intersects(a) && shape[10] && !shape[11]){ + shape[11] = true; + shape[15] = true; + bulletdestoried = true; + border[3] = null; + } + if(bullet.intersects(c) && shape[14] && !shape[15]){ + shape[11] = true; + shape[15] = true; + bulletdestoried = true; + border[3] = null; + } + if(bullet.intersects(a) && !shape[10]){ + if(bulletpower == 1){ + shape[10] = true; + shape[14] = true; + } + if(bulletpower == 2){ + shape[10] = true; + shape[14] = true; + shape[11] = true; + shape[15] = true; + } + bulletdestoried = true; + if(shape[11] && shape[15]) + border[3] = null; + } + if(bullet.intersects(c) && !shape[14]){ + if(bulletpower == 1){ + shape[10] = true; + shape[14] = true; + } + if(bulletpower == 2){ + shape[10] = true; + shape[14] = true; + shape[11] = true; + shape[15] = true; + } + bulletdestoried = true; + if(shape[11] && shape[15]) + border[3] = null; + } + } + } + if(border[3] != null){ + if(bullet.intersects(border[3]) && bulletdirection == 2 && !(bullet.intersects(b) && ((!shape[6] || !shape[7]) || (shape[6] && shape[7] && shape[10] && shape[11])))){ + if(bullet.intersects(b) && shape[11] && !shape[10]){ + shape[10] = true; + shape[14] = true; + bulletdestoried = true; + border[3] = null; + } + if(bullet.intersects(d) && shape[15] && !shape[14]){ + shape[10] = true; + shape[14] = true; + bulletdestoried = true; + border[3] = null; + } + if(bullet.intersects(b) && !shape[11]){ + if(bulletpower == 1){ + shape[11] = true; + shape[15] = true; + } + if(bulletpower == 2){ + shape[11] = true; + shape[15] = true; + shape[10] = true; + shape[14] = true; + } + bulletdestoried = true; + if(shape[10] && shape[14]) + border[3] = null; + } + if(bullet.intersects(d) && !shape[15]){ + if(bulletpower == 1){ + shape[11] = true; + shape[15] = true; + } + if(bulletpower == 2){ + shape[11] = true; + shape[15] = true; + shape[10] = true; + shape[14] = true; + } + bulletdestoried = true; + if(shape[10] && shape[14]) + border[3] = null; + } + } + } + } + + //write changes to the outputline + gameModel.outputLine+="w" + xPos + ","+ yPos+","; + for(int i = 0; i < shape.length; i++){ + if(shape[i]) + gameModel.outputLine+="1"; + else + gameModel.outputLine+="0"; + } + gameModel.outputLine+=";"; + + } +//=========================================================================================== + + public boolean walldestoried(){ + if(walldestoried) + return true; + walldestoried = true; + for(int i = 0; i < shape.length; i++) + if(!shape[i]){ + walldestoried = false; + break; + } + return walldestoried; + } + + + public Rectangle getBorder(){ + return generalBorder; + } + + public Rectangle[] getDetailedBorder(){ + return border; + } + + + public void draw(Graphics g) { + if(walldestoried) + return; + g.drawImage(wall, xPos - 12, yPos - 12, null); + g.setColor(new Color(128, 64, 0)); + if(shape[0]) + g.fillRect(xPos - 12, yPos - 12, 7, 7); + if(shape[1]) + g.fillRect(xPos - 6, yPos - 12, 7, 7); + if(shape[2]) + g.fillRect(xPos, yPos - 12, 7, 7); + if(shape[3]) + g.fillRect(xPos + 6, yPos - 12, 7, 7); + if(shape[4]) + g.fillRect(xPos - 12, yPos - 6, 7, 7); + if(shape[5]) + g.fillRect(xPos - 6, yPos - 6, 7, 7); + if(shape[6]) + g.fillRect(xPos, yPos - 6, 7, 7); + if(shape[7]) + g.fillRect(xPos + 6, yPos - 6, 7, 7); + if(shape[8]) + g.fillRect(xPos - 12, yPos, 7, 7); + if(shape[9]) + g.fillRect(xPos - 6, yPos, 7, 7); + if(shape[10]) + g.fillRect(xPos, yPos, 7, 7); + if(shape[11]) + g.fillRect(xPos + 6, yPos, 7, 7); + if(shape[12]) + g.fillRect(xPos - 12, yPos + 6, 7, 7); + if(shape[13]) + g.fillRect(xPos - 6, yPos + 6, 7, 7); + if(shape[14]) + g.fillRect(xPos, yPos + 6, 7, 7); + if(shape[15]) + g.fillRect(xPos + 6, yPos + 6, 7, 7); + } + + public String getType(){ + return "wall"; + } + + + //未使用的方法 + public void move(){} +} + + +