http://apk.hiapk.com/html/2012/05/586468.html
1.客户端接受服务端的消息并打印:
客户端:
import java.io.BufferedReader; import java.io.IOException; import java.io.InputStream; import java.io.InputStreamReader; import java.net.Socket; public class Client { private static final String IP = "localhost";//服务器地址 private static final int PORT = 8000;//服务器端口号 public static void main(String[] args) { handler(); } private static void handler() { //创建一个流套接字,连接到指定主机上的指定端口号 Socket client = null; try { while(true){ client = new Socket(IP, PORT); //取得输入流 InputStream is = client.getInputStream(); BufferedReader br = new BufferedReader(new InputStreamReader(is)); //读取服务器端数据 System.out.println(br.readLine()); br.close(); is.close(); } }catch (Exception e) { System.out.println("客户端异常:" + e.getMessage()); }finally{ if(client != null){ try { client.close(); } catch (IOException e) { System.out.println("客户端异常:" + e.getMessage()); } } } } }
服务端:
import java.io.BufferedWriter; import java.io.IOException; import java.io.OutputStream; import java.io.OutputStreamWriter; import java.net.ServerSocket; import java.net.Socket; import java.util.Scanner; public class Server { private static final int PORT = 8000;//监听的端口号 public static void main(String[] args) { Server server = new Server(); server.init(); } private void init(){ try { ServerSocket serverSocket = new ServerSocket(PORT); while(true){ Socket client = serverSocket.accept(); //一个客户端连接就开户一个线程处理 new Thread(new HandlerThread(client)).start(); } } catch (IOException e) { System.out.println("服务器异常:" + e.getMessage()); } } private class HandlerThread implements Runnable{ private Socket client; public HandlerThread(Socket client) { this.client = client; } @Override public void run() { try { //取得输出流 OutputStream os = client.getOutputStream(); BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(os)); //输入要输出给客户端的内容 Scanner sc = new Scanner(System.in); bw.write(sc.nextLine()); bw.close(); } catch (IOException e) { System.out.println("服务器异常:" + e.getMessage()); }finally{ if(client != null){ try { client.close(); } catch (IOException e) { client = null; System.out.println("服务器异常:" + e.getMessage()); } } } } } }
2.服务端接受客户端的消息并打印:
客户端:
import java.io.BufferedWriter; import java.io.IOException; import java.io.OutputStream; import java.io.OutputStreamWriter; import java.net.Socket; import java.util.Scanner; public class Client { private static final String IP = "localhost";//服务器地址 private static final int PORT = 8000;//服务器端口号 public static void main(String[] args) { handler(); } private static void handler() { //创建一个流套接字,连接到指定主机上的指定端口号 Socket client = null; try { while(true){ client = new Socket(IP, PORT); //取得输出流 OutputStream os = client.getOutputStream(); BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(os)); //输入要发送到服务端的消息 Scanner sc = new Scanner(System.in); bw.write(sc.nextLine()); bw.close(); os.close(); } }catch (Exception e) { System.out.println("客户端异常:" + e.getMessage()); }finally{ if(client != null){ try { client.close(); } catch (IOException e) { System.out.println("客户端异常:" + e.getMessage()); } } } } }
服务端:
import java.io.BufferedReader; import java.io.IOException; import java.io.InputStream; import java.io.InputStreamReader; import java.net.ServerSocket; import java.net.Socket; public class Server { private static final int PORT = 8000;//监听的端口号 public static void main(String[] args) { Server server = new Server(); server.init(); } private void init(){ try { ServerSocket serverSocket = new ServerSocket(PORT); while(true){ Socket client = serverSocket.accept(); //一个客户端连接就开户一个线程处理 new Thread(new HandlerThread(client)).start(); } } catch (IOException e) { System.out.println("服务器异常:" + e.getMessage()); } } private class HandlerThread implements Runnable{ private Socket client; public HandlerThread(Socket client) { this.client = client; } @Override public void run() { try { //取得输入流 InputStream is = client.getInputStream(); BufferedReader bw = new BufferedReader(new InputStreamReader(is)); //读取客户端发送来的数据 System.out.println(bw.readLine()); bw.close(); } catch (IOException e) { System.out.println("服务器异常:" + e.getMessage()); }finally{ if(client != null){ try { client.close(); } catch (IOException e) { client = null; System.out.println("服务器异常:" + e.getMessage()); } } } } } }
文/LL
之前一段时间花了很长时间来玩了一个 Mac OS平台下的塔防游戏<iBomber Defense Pacific>,为此浪费了不少时间。玩到通关之后,躺在床上,我一方面心痛我居然对游戏如此没有免疫力,另外一方面我在思考这款游戏好在哪里,哪些地方设计的很好?
作为一款塔防游戏,这款游戏和其他塔防游戏有什么优点?如何设计一款塔防游戏呢?它需要遵循哪些原则呢?
塔防游戏,Tower Defense,指的是一类通过在地图上建造炮塔或类似建筑物,以阻止游戏中敌人进攻的策略型游戏。比较有名的像《植物大战僵尸》、《Field Runners》、《保卫萝卜》、《Desktop TD》等。
这种游戏多见于flash游戏,手机平台也很多,塔防的操作模式和节奏都比较适合触屏的操作,所以现在的Android 和 iOS平台上有非常多的此类游戏。
现在以玩的《iBomber Defense Pacific》为例,来说明一款好的TD游戏的要素和原则:
要素之一:美工设计。
不同游戏有不同的美术风格,比如《植物大战僵尸》和《保护萝卜》的Q版风格, 《iBomber Defense Pacific》的战争风格。App Store中国区很多塔防游戏都是三国流。游戏设计的越精美越好。
要素之二:敌人
敌人也分为几类:
<1>. 低HP,移动速度快,低攻击力,在一波中数量众多;
<2>. 中等HP,移动速度快,中等攻击力,在一波中数量中等;
<3>. 高HP,移动速度慢,高攻击力,在一波中熟练较少。
以上的都是地面unit,我们所摆的阵型只对上面起作用,但TD游戏中都有空军无视你的阵型。
要素之三:塔
塔的属性有以下几点:
攻击力ATTACK: 决定单位建筑对敌人所能造成的伤害程度
攻击频率FREQENCY: 决定单位建筑在单位时间内的攻击次数
攻击范围RANGE:决定单位建筑的攻击有效距离
造价GOLD: 决定单位建筑的造价。
塔也分为几类,一类是攻击型的,一类是减速型的,一类是加群防群补型的,一款好的游戏应该包含以上所有类型。
要素之四:地图
地图在一款好的TD游戏是非常重要的,不同的地图需要不同类型的塔才能发挥最大的作用。
再来谈谈我认可的几个原则:
原则之一:一个高等级的塔效果要超过2个低等级的塔。
只有这样才能体现策略,才能在地图上摆阵需要思考。
原则之二:不同类型的塔的组合效果必须大于单一塔的效果。
只依靠一个塔的简单累加就能过关的游戏是失败的。
原则之三:不同敌人组合。
在敌人组合的时候,不是固定的,三类不同敌人进行组合才能对玩家产生最大的压迫效果。
原则之四:关卡设计。
一款游戏一般都设计成以下阶段:新手-->成长-->高手-->专业。不同阶段都需要对玩家产生吸引力,每个阶段的难度设计都需要比较合理。
最后总结:
玩游戏,倒后面对游戏设计师的所有伎俩都清清楚楚,反倒不想打游戏了。
2013年3月28日下午10:09第一版
2013年4月2日下午10:43 完稿。