30
もっと賢く動かしたい
http://read.pudn.com/downloads78/sourcecode/java/296785/TCP_IP_JAVA_SRC/ch5/UmiServer.java__.htm
http://read.pudn.com/downloads78/sourcecode/java/296785/TCP_IP_JAVA_SRC/ch5/UmiClient.java__.htm
上記2つのファイルから成る、燃料を取得するゲームで
自動的に燃料を取得するrobt.javaを作りたく、以下のファイルを参考に、
http://read.pudn.com/downloads78/sourcecode/java/296785/TCP_IP_JAVA_SRC/ch5/Robot.java__.htm
以下のように書き換えました。
// 「海ゲーム」クライアントプログラムRobot.java
// このプログラムは,海ゲームのクライアントプログラムです
// 決められた手順で海ゲームをプレイします
// 使い方java Robot 接続先サーバアドレスゲーム参加者名
// 起動後,指定したサーバと接続し,自動的にゲームを行います
// 起動後,指定回数の繰り返しの後,logoutします
// このプログラムはlogoutコマンドがありません
// プログラムを途中で停止するには,以下の手順を踏んでください
// (1)コントロールC を入力してRobotプログラムを停止します
// (2)T1.javaプログラムなど,別のクライアントを使ってRobotと同じ名前でloginします
// (3)logoutします
// 別クライアントからのlogout作業を省略すると,サーバ上に情報が残ってしまいます
// ライブラリの利用
import java.net.*;// ネットワーク関連
import java.io.*;
import java.util.*;
// Robotクラス
public class Robot {
// ロボットの動作タイミングを規定する変数sleeptime
int sleeptime = 50 ;
// ロボットがlogoutするまでの時間を規定する変数timeTolive
int timeTolive = 50 ;
// コンストラクタ
public Robot (String[] args)
{
login(args[0],args[1]) ;
try{
for(;timeTolive > 0; -- timeTolive){
System.out.println("あと" + timeTolive + "回") ;
// 10 回に渡り,sleeptime*100ミリ秒おきにleftコマンドを送ります
for(int i = 0;i < 10;++i){
Thread.sleep(sleeptime * 100) ;
out.println("left");
out.flush() ;
}
// 10 回に渡り,sleeptime秒おきにrightコマンドを送ります
for(int i = 0;i < 10;++i){
Thread.sleep(sleeptime * 100) ;
out.println("right");
out.flush() ;
}
// upコマンドを1 回送ります
out.println("up");
out.flush() ;
}
// logout処理
out.println("logout") ;
out.flush() ;
server.close() ;
}catch(Exception e){
e.printStackTrace();
System.exit(1);
}
}
// login関連のオブジェクト
Socket server;// ゲームサーバとの接続ソケット
int port = 10000;// 接続ポート
BufferedReader in;// 入力ストリーム
PrintWriter out;// 出力ストリーム
String name;// ゲーム参加者の名前
// loginメソッド
// サーバへのlogin処理を行います
void login(String host, String name){
try {
// サーバとの接続
this.name = name;
server = new Socket(host, port);
in = new BufferedReader(new InputStreamReader(
server.getInputStream()));
out = new PrintWriter(server.getOutputStream());
// loginコマンドの送付
out.println("login " + name);
out.flush();
}catch(Exception e){
e.printStackTrace();
System.exit(1);
}
}
void auto(){
int ship_x = 0, ship_y = 0, ene_x = 0, ene_y = 0;
try {
String line = in.readLine();// サーバからの入力の読み込み
//ship_infoから始まる船の情報の先頭行を探します
while (!"ship_info".equalsIgnoreCase(line))
line = in.readLine();
// 船の情報ship_infoの表示
// ship_infoはピリオドのみの行で終了です
line = in.readLine();
while (!".".equals(line)){
StringTokenizer st = new StringTokenizer(line);
// 船の位置座標を読み取ります
int x = Integer.parseInt(st.nextToken()) ;
int y = Integer.parseInt(st.nextToken()) ;
ship_x = x;
ship_y = y;
// 次の1行を読み取ります
line = in.readLine();
}
// energy_infoから始まる,燃料タンクの情報を待ち受けます
while (!"energy_info".equalsIgnoreCase(line))
line = in.readLine();
// 燃料タンクの情報energy_infoの表示
// energy_infoはピリオドのみの行で終了です
line = in.readLine();
while (!".".equals(line)){
StringTokenizer st = new StringTokenizer(line);
// 燃料タンクの位置座標を読み取ります
int x = Integer.parseInt(st.nextToken()) ;
int y = Integer.parseInt(st.nextToken()) ;
ene_x = x;
ene_y = y;
// 次の1行を読み取ります
line = in.readLine();
}
if (ship_x < ene_x) {
out.println("right");
} else if (ene_x < ship_x) {
out.println("left");
}
if (ship_y < ene_y) {
out.println("up");
} else if (ene_y < ship_y) {
out.println("down");
}
}catch (Exception e){
e.printStackTrace();
System.exit(1);
}
}
// mainメソッド
// Robotを起動します
public static void main(String[] args){
new Robot(args);
}
}
左右には動くのですが、上下に動きません。
また、このif文の書き方はイマイチだなと思うのですが、どのように改善すればより良くなるでしょうか。
よろしくお願いいたします。