ServerModel.java
上传用户:jhzhutan
上传日期:2021-03-28
资源大小:374k
文件大小:8k
源码类别:

射击游戏

开发平台:

Java

  1. import java.net.*;
  2. import java.io.*;
  3. import java.awt.event.*;
  4. import java.awt.*;
  5. //Download:http://www.codefans.net
  6. public class ServerModel implements ActionListener{
  7. //a reference of view
  8. public ServerView view;
  9. //connection variables
  10. public ServerSocket serverSocket;
  11. public Socket clientSocket;
  12. public PrintWriter out;
  13. public BufferedReader in;
  14. public String inputLine, outputLine;
  15. //server status
  16. public boolean serverCreated;
  17. public boolean clientConnected;
  18. public boolean gameStarted;
  19. public boolean gamePaused;
  20. public boolean gameOver;
  21. public boolean serverVoteYes, serverVoteNo;
  22. public boolean clientVoteYes, clientVoteNo;
  23. public boolean pausePressed;
  24. //game message
  25. public String[] messageQueue;
  26. public int messageIndex;
  27. public String playerTypedMessage = "";
  28. //the actual game is running on this thread, while the main thread listen to user's input
  29. public Ticker t;
  30. //textures
  31. public Image[] textures;
  32. //game vaiables
  33. public static int gameFlow;
  34. public Actor[] actors;
  35. public player P1;   //the tank controled by the server player
  36. public player P2;   //the tank controled by the client player
  37. public ServerModel(ServerView thisview){
  38. view = thisview;
  39. messageQueue = new String[8];
  40. view.mainPanel.messageQueue = messageQueue;
  41. addMessage("欢迎来到坦克大战主机端!  请点击"建立主机"按钮开始游戏" );
  42. t = new Ticker(1000);
  43. t.addActionListener(this);
  44. }
  45. public void createServer(){
  46.   addMessage("正在建立主机(端口4321)");
  47.   try {
  48. serverSocket = new ServerSocket(4321);
  49.          serverCreated = true;
  50.         } catch (Exception e) {
  51. addMessage("无法建立主机,请确认端口4321没有被别的程序使用");
  52. System.out.println(e);
  53. t.stop();
  54. return;
  55.         }
  56. addMessage("建立完成,等待玩家连接");
  57.         try {
  58.    clientSocket = serverSocket.accept();
  59.        clientConnected = true;
  60.      out = new PrintWriter(clientSocket.getOutputStream(), true);
  61.     in = new BufferedReader(new InputStreamReader(
  62. clientSocket.getInputStream()));
  63.     } catch (Exception e) {
  64. addMessage("连接中出现错误,请重新建立主机");
  65. serverCreated = false;
  66. clientConnected = false;
  67. t.stop();
  68. //when something goes wrong, destory evertthing that has been created
  69. try{
  70. serverSocket.close();
  71. clientSocket.close();
  72. out.close();
  73. in.close();
  74. }catch(Exception ex){}
  75. return;
  76.         }
  77. view.messageField.setEnabled(true);
  78. addMessage("玩家已连接上,开始载入游戏");
  79. //once the clinet is connected, then tell client computer to start loading the game
  80.  out.println("L1;");
  81. //load game texture
  82. textures = new Image[88];
  83. for(int i = 1; i < textures.length+1; i++)
  84. textures[i-1] = Toolkit.getDefaultToolkit().getImage("image\" + i + ".jpg");
  85. //setup the first level
  86. actors = new Actor[400];
  87. level.loadLevel(this);
  88. P1 = new player("1P", this);
  89. addActor(P1);
  90. P2 = new player("2P", this);
  91. addActor(P2);
  92. gameStarted = true;
  93. view.mainPanel.actors = actors;
  94. view.mainPanel.gameStarted = true;
  95. addMessage("载入完毕,游戏开始了!");
  96. }
  97. public void actionPerformed(ActionEvent e){
  98. createServer();
  99. //if the program fail to create server then do nothing
  100. if(!serverCreated)
  101. return;
  102. //the game logic loop,
  103. try{
  104. while((inputLine = in.readLine()) != null){
  105. //process feedback message from the client
  106. feedbackHandler.handleInstruction(this, inputLine);
  107. outputLine = "";
  108. if(!gamePaused)
  109. gameFlow++;
  110. if(pausePressed){
  111. if(!gamePaused){
  112. outputLine+= "x0;";
  113. }else{
  114. outputLine+= "x1;";
  115. }
  116. pausePressed = false;
  117. }
  118. if(gameOver || (P1.life == 0 && P2.life == 0)){
  119. if(P1.freezed != 1)
  120. outputLine+="a;";
  121. if((P1.freezed != 1 || messageIndex == 1) && serverVoteYes){
  122. addMessage("等待用户端玩家的回应...");
  123. }
  124. if(P1.freezed != 1 || messageIndex == 0){
  125. addMessage("GAME OVER !  想再玩一次吗 ( y / n ) ?");
  126. }
  127. gameOver =  true;
  128. P1.freezed = 1;
  129. P2.freezed = 1;
  130. if(serverVoteNo && !serverVoteYes)
  131. System.exit(0);
  132. if(serverVoteYes){
  133. outputLine+="j;";
  134. if(clientVoteYes){
  135. addMessage("用户端玩家决定再玩一次,游戏重新开始了...");
  136. //restart game
  137. P1 = new player("1P", this);
  138. P2 = new player("2P", this);
  139. level.reset();
  140. level.loadLevel(this);
  141. gameOver = false;
  142. serverVoteYes = false;
  143. clientVoteYes = false;
  144. serverVoteNo = false;
  145. enemy.freezedMoment = 0;
  146. enemy.freezedTime = 0;
  147. gameFlow = 0;
  148. //tell the client program to restart the game
  149. outputLine+="L1;";
  150. }
  151. }
  152. }
  153. if(level.deathCount == 20 &&  !gameOver){
  154. level.winningCount++;
  155. if(level.winningCount == 120){
  156. P1.freezed = 1;
  157. P2.freezed = 1;
  158. }
  159. if(level.winningCount == 470){
  160. if(P1.life > 0)
  161. P1.reset();
  162. if(P2.life > 0)
  163. P2.reset();
  164. level.loadLevel(this);
  165. //tell the client program to load the next level
  166. outputLine+="L" +(1 +  (level.currentLevel-1)%8) + ";";
  167. }
  168. if(level.winningCount  == 500){
  169. P1.freezed = 0;
  170. P2.freezed = 0;
  171. level.deathCount = 0;
  172. level.winningCount = 0;
  173. }
  174. }
  175. //spawn enemy tanks
  176. if(!gamePaused)
  177. level.spawnEnemy(this);
  178. for(int i = 0; i < actors.length; i++){
  179. if(actors[i] != null)
  180. actors[i].move();
  181. }
  182. //delete one message from the message queue every 10 secs, (if there is any)
  183. if(gameFlow%300 == 0)
  184. removeMessage();
  185. //write player and level  information  to the outputLine
  186. outputLine+="p" + level.enemyLeft + "," + level.currentLevel + "," + P1.life + "," + P1.scores + "," +  P2.life + "," + P2.scores +";";
  187. outputLine+="g" + level.winningCount + ";";
  188. //wtire player typed message to the outputLine
  189. if(!playerTypedMessage.equals("")){
  190. outputLine+=playerTypedMessage;
  191. playerTypedMessage = "";
  192. }
  193. //send the final instruction-string to the client program
  194. out.println(outputLine);
  195. //call view to repaint itself
  196. view.mainPanel.repaint();
  197. //if the player switch to dialoge mode, then stop all tank actions
  198. if(!view.mainPanel.hasFocus()){
  199. P1.moveLeft = false;
  200. P1.moveUp = false;
  201. P1.moveDown = false;
  202. P1.moveRight = false;
  203. P1.fire = false;
  204. }
  205. Thread.sleep(30);
  206. }
  207. }catch(Exception ex){
  208. ex.printStackTrace();
  209. view.messageField.setEnabled(false);
  210. serverVoteYes= false;
  211. serverVoteNo = false;
  212. clientVoteYes = false;
  213. serverCreated = false;
  214. gameStarted = false;
  215. gameOver = false;
  216. gameFlow = 0;
  217. enemy.freezedTime = 0;
  218. enemy.freezedMoment = 0;
  219. view.mainPanel.gameStarted = false;
  220. t.stop();
  221. addMessage("玩家退出了,请重新建立主机");
  222. //when something goes wrong in the middle of the game, destory any thing that has been created, include game variables
  223. try{
  224. out.close();
  225. in.close();
  226. clientSocket.close();
  227.          serverSocket.close();
  228. }catch(Exception exc){}
  229. //destory game data
  230. P1 = null;
  231. P2 = null;
  232. level.reset();
  233. }
  234. }
  235. //add a game object (eg, tanks, bullet etc...) to the game system
  236. public void addActor(Actor actor){
  237. for(int i = 0; i < actors.length; i ++ )
  238. if(actors[i] == null){
  239. actors[i] = actor;
  240. break;
  241. }
  242. }
  243. //remove a game object from the game system
  244. public void removeActor(Actor actor){
  245. for(int i = 0; i < actors.length; i ++ )
  246. if(actors[i] == actor){
  247. actors[i] = null;
  248. break;
  249. }
  250. }
  251. //display a line of message on the screen
  252. public void addMessage(String message){
  253. if(messageIndex < 8){
  254. messageQueue[messageIndex] = message;
  255. messageIndex++;
  256. }
  257. else{
  258. for(int  i = 0; i < 7; i++)
  259. messageQueue[i] = messageQueue[i+1];
  260. messageQueue[7] = message;
  261. }
  262. //call view to repaint the screen if game has't started
  263. if(!gameStarted)
  264. view.mainPanel.repaint();
  265. }
  266. //remove the earliest message on the screen
  267. public void removeMessage(){
  268. if(messageIndex == 0)
  269. return;
  270. messageIndex--;
  271. for(int  i = 0; i < messageIndex; i++)
  272. messageQueue[i] = messageQueue[i+1];
  273. messageQueue[messageIndex] = null;
  274. //call view to repaint the screen if game hasn't started
  275. if(!gameStarted)
  276. view.mainPanel.repaint();
  277. }
  278. }