From 65c6c04aa40090a6302c6ad4fa3af729f6d490e8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=9F=8F=E6=93=8D?= Date: Fri, 18 Dec 2020 18:02:08 +0800 Subject: [PATCH 01/24] =?UTF-8?q?=E6=B3=A8=E9=87=8A?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .vscode/settings.json | 5 +++++ elf/context_utils.py | 28 ++++++++++++++-------------- elf/python_options_utils_cpp.h | 8 ++++---- elf/tree_search_options.h | 8 ++++---- rts/engine/common_loader.py | 20 ++++++++++---------- rts/engine/python_common_options.h | 10 +++++----- rts/engine/rule_actor.h | 2 +- rts/game_MC/game.py | 20 ++++++++++---------- rts/game_MC/model.py | 2 +- rts/game_MC/python_options.h | 2 +- rts/game_MC/python_wrapper.cc | 20 ++++++++++---------- rts/game_MC/state_feature.h | 13 +++++++------ train.py | 22 ++++++++++++++++++++-- 13 files changed, 92 insertions(+), 68 deletions(-) create mode 100644 .vscode/settings.json diff --git a/.vscode/settings.json b/.vscode/settings.json new file mode 100644 index 00000000..01ec88be --- /dev/null +++ b/.vscode/settings.json @@ -0,0 +1,5 @@ +{ + "files.associations": { + "*.ipp": "cpp" + } +} \ No newline at end of file diff --git a/elf/context_utils.py b/elf/context_utils.py index 85117f52..c319269b 100644 --- a/elf/context_utils.py +++ b/elf/context_utils.py @@ -15,22 +15,22 @@ def __init__(self): call_from = self, define_args = [ ("num_games", 1024), - ("batchsize", 128), - ("game_multi", dict(type=int, default=None)), - ("T", 6), - ("eval", dict(action="store_true")), - ("wait_per_group", dict(action="store_true")), - ("num_collectors", 0), - ("verbose_comm", dict(action="store_true")), - ("verbose_collector", dict(action="store_true")), - ("mcts_threads", 0), + ("batchsize", 128), # 64 + ("game_multi", dict(type=int, default=None)), + ("T", 6), # 20 + ("eval", dict(action="store_true")), # False + ("wait_per_group", dict(action="store_true")), # False + ("num_collectors", 0), + ("verbose_comm", dict(action="store_true")), # False + ("verbose_collector", dict(action="store_true")), # False + ("mcts_threads", 0), ("mcts_rollout_per_thread", 1), - ("mcts_verbose", dict(action="store_true")), - ("mcts_save_tree_filename", ""), - ("mcts_verbose_time", dict(action="store_true")), + ("mcts_verbose", dict(action="store_true")), # False + ("mcts_save_tree_filename", ""), + ("mcts_verbose_time", dict(action="store_true")), # False - ("mcts_use_prior", dict(action="store_true")), - ("mcts_pseudo_games", 0), + ("mcts_use_prior", dict(action="store_true")), # False + ("mcts_pseudo_games", 0), ("mcts_pick_method", "most_visited"), ], on_get_args = self._on_get_args diff --git a/elf/python_options_utils_cpp.h b/elf/python_options_utils_cpp.h index 7063182a..20cfd76e 100644 --- a/elf/python_options_utils_cpp.h +++ b/elf/python_options_utils_cpp.h @@ -19,13 +19,13 @@ struct ContextOptions { // How many simulation threads we are running. - int num_games = 1; + int num_games = 1; // 1024 // The maximum number of threads per game - int max_num_threads = 0; + int max_num_threads = 0; //0 // History length. How long we should keep the history. - int T = 1; + int T = 1; // 20 // verbose options. bool verbose_comm = false; @@ -34,7 +34,7 @@ struct ContextOptions { // Whether we wait for each group or we wait jointly. bool wait_per_group = false; - int num_collectors = 1; + int num_collectors = 1; // 0 mcts::TSOptions mcts_options; diff --git a/elf/tree_search_options.h b/elf/tree_search_options.h index 4813786e..a1bf8b0f 100644 --- a/elf/tree_search_options.h +++ b/elf/tree_search_options.h @@ -20,12 +20,12 @@ using namespace std; struct TSOptions { int max_num_moves = 0; - int num_threads = 16; - int num_rollout_per_thread = 100; - bool verbose = false; + int num_threads = 16; // 0 + int num_rollout_per_thread = 100; // 1 + bool verbose = false; bool verbose_time = false; - string save_tree_filename; + string save_tree_filename; // "" bool persistent_tree = false; // [TODO] Not a good design. diff --git a/rts/engine/common_loader.py b/rts/engine/common_loader.py index 25cde403..09968060 100644 --- a/rts/engine/common_loader.py +++ b/rts/engine/common_loader.py @@ -17,17 +17,17 @@ def __init__(self, module): self.module = module basic_define_args = [ - ("handicap_level", 0), + ("handicap_level", 0), ("players", dict(type=str, help=";-separated player infos. For example: type=AI_NN,fs=50,args=backup/AI_SIMPLE|decay/0.99|start/1000,fow=True;type=AI_SIMPLE,fs=50")), ("max_tick", dict(type=int, default=30000, help="Maximal tick")), - ("shuffle_player", dict(action="store_true")), - ("num_frames_in_state", 1), + ("shuffle_player", dict(action="store_true")), # false + ("num_frames_in_state", 1), ("max_unit_cmd", 1), ("seed", 0), - ("actor_only", dict(action="store_true")), - ("model_no_spatial", dict(action="store_true")), # TODO, put it to model - ("save_replay_prefix", dict(type=str, default=None)), - ("output_file", dict(type=str, default=None)), + ("actor_only", dict(action="store_true")), # false + ("model_no_spatial", dict(action="store_true")), # TODO, put it to model false + ("save_replay_prefix", dict(type=str, default=None)), + ("output_file", dict(type=str, default=None)), ("cmd_dumper_prefix", dict(type=str, default=None)), ("gpu", dict(type=int, help="gpu to use", default=None)), ] @@ -85,7 +85,7 @@ def _parse_players(self, opt, player_names): def _init_gc(self, player_names=None): args = self.args - co = self.module.ContextOptions() + co = self.module.ContextOptions() #/elf/python_options_utils_cpp.h self.context_args.initialize(co) opt = self.module.PythonOptions() @@ -96,7 +96,7 @@ def _init_gc(self, player_names=None): # [TODO] Put it to TD. opt.handicap_level = args.handicap_level - player_infos = self._parse_players(opt, player_names) + player_infos = self._parse_players(opt, player_names) # 处理Players并设置为AI # opt.output_filename = b"simulators.txt" # opt.output_filename = b"cout" @@ -153,7 +153,7 @@ def initialize(self): # For training, we want input, action (filled by actor models), value (filled by actor models) and reward. desc["train"] = self._get_train_spec() - self.more_labels.add_labels(desc) + self.more_labels.add_labels(desc) # ? params.update(dict( num_group = 1 if args.actor_only else 2, diff --git a/rts/engine/python_common_options.h b/rts/engine/python_common_options.h index e548c7e0..0f0da064 100644 --- a/rts/engine/python_common_options.h +++ b/rts/engine/python_common_options.h @@ -71,21 +71,21 @@ struct PythonOptions { int map_size_x, map_size_y; // Maximum unit command you could send per action. - int max_unit_cmd; + int max_unit_cmd; // 1 // Max tick. - int max_tick; + int max_tick; // 30000 // Random seed to use. seed = 0 mean uses time(NULL). // If seed != 0, then each simulation thread will use a seed which is a deterministic function // of PythonOption.seed and the thread id. - int seed; + int seed; // 0 - bool shuffle_player; + bool shuffle_player; // false int game_name; // [TODO] put handicap to TD. - int handicap_level; + int handicap_level; // 0 PythonOptions() : simulation_type(ST_NORMAL), map_size_x(20), map_size_y(20), max_unit_cmd(10), max_tick(30000), seed(0), shuffle_player(false), game_name(0), handicap_level(0) { diff --git a/rts/engine/rule_actor.h b/rts/engine/rule_actor.h index 474563cc..eed23247 100644 --- a/rts/engine/rule_actor.h +++ b/rts/engine/rule_actor.h @@ -16,7 +16,7 @@ custom_enum(AIState, STATE_START = 0, STATE_BUILD_WORKER, STATE_BUILD_BARRACK, STATE_BUILD_MELEE_TROOP, STATE_BUILD_RANGE_TROOP, STATE_ATTACK, - STATE_ATTACK_IN_RANGE, STATE_HIT_AND_RUN, STATE_DEFEND, NUM_AISTATE); + STATE_ATTACK_IN_RANGE, STATE_HIT_AND_RUN, STATE_DEFEND, NUM_AISTATE); // Action Space custom_enum(FlagState, FLAGSTATE_START = 0, FLAGSTATE_GET_FLAG, FLAGSTATE_ATTACK_FLAG, FLAGSTATE_ESCORT_FLAG, FLAGSTATE_PROTECT_FLAG, //FLAGSTATE_ATTACK, FLAGSTATE_MOVE, diff --git a/rts/game_MC/game.py b/rts/game_MC/game.py index 40c36437..d2cf20fb 100644 --- a/rts/game_MC/game.py +++ b/rts/game_MC/game.py @@ -20,11 +20,11 @@ def __init__(self): def _define_args(self): return [ - ("use_unit_action", dict(action="store_true")), - ("disable_time_decay", dict(action="store_true")), - ("use_prev_units", dict(action="store_true")), - ("attach_complete_info", dict(action="store_true")), - ("feature_type", "ORIGINAL") + ("use_unit_action", dict(action="store_true")), # false + ("disable_time_decay", dict(action="store_true")), # false + ("use_prev_units", dict(action="store_true")), # false + ("attach_complete_info", dict(action="store_true")),# false + ("feature_type", "ORIGINAL") # "ORIGINAL" ] def _on_gc(self, GC): @@ -32,11 +32,11 @@ def _on_gc(self, GC): opt.use_time_decay = not self.args.disable_time_decay opt.save_prev_seen_units = self.args.use_prev_units opt.attach_complete_info = self.args.attach_complete_info - GC.ApplyExtractorParams(opt) + GC.ApplyExtractorParams(opt) # 设置 MCExtractor usage = minirts.MCExtractorUsageOptions() usage.Set(self.args.feature_type) - GC.ApplyExtractorUsage(usage) + GC.ApplyExtractorUsage(usage) # 设置 ExtractorUsage def _unit_action_keys(self): if self.args.use_unit_action: @@ -44,12 +44,12 @@ def _unit_action_keys(self): else: return [] - def _get_actor_spec(self): + def _get_actor_spec(self): #d=定义用于actor的batch字典 reply_keys = ["V", "pi", "a"] return dict( batchsize=self.args.batchsize, - input=dict(T=1, keys=set(["s", "last_r", "terminal"])), + input=dict(T=1, keys=set(["s", "last_r", "terminal"])), # 期待收到 s last_r terminal reply=dict(T=1, keys=set(reply_keys + self._unit_action_keys())), ) @@ -58,7 +58,7 @@ def _get_train_spec(self): return dict( batchsize=self.args.batchsize, input=dict(T=self.args.T, keys=set(keys + self._unit_action_keys())), - reply=None + reply=None # train 不需要回复 ) def _get_reduced_predict(self): diff --git a/rts/game_MC/model.py b/rts/game_MC/model.py index 04bf5f61..8353ad00 100644 --- a/rts/game_MC/model.py +++ b/rts/game_MC/model.py @@ -23,7 +23,7 @@ def _init(self, args): params = args.params assert isinstance(params["num_action"], int), "num_action has to be a number. action = " + str(params["num_action"]) self.params = params - self.net = MiniRTSNet(args) + self.net = MiniRTSNet(args) # 卷积神经网络处理输入数据 last_num_channel = self.net.num_channels[-1] if self.params.get("model_no_spatial", False): diff --git a/rts/game_MC/python_options.h b/rts/game_MC/python_options.h index 52629a02..ec744d8b 100644 --- a/rts/game_MC/python_options.h +++ b/rts/game_MC/python_options.h @@ -52,7 +52,7 @@ struct GameState { std::vector uloc, tloc; std::vector bt, ct; - // Also we need to save distributions. + // Also we need to save distributions. 概率? std::vector uloc_prob, tloc_prob; std::vector bt_prob, ct_prob; diff --git a/rts/game_MC/python_wrapper.cc b/rts/game_MC/python_wrapper.cc index 3788527c..925df69a 100644 --- a/rts/game_MC/python_wrapper.cc +++ b/rts/game_MC/python_wrapper.cc @@ -49,16 +49,16 @@ class GameContext { std::map GetParams() const { return std::map{ - { "num_action", GameDef::GetNumAction() }, - { "num_unit_type", GameDef::GetNumUnitType() }, - { "num_planes_per_time_stamp", MCExtractor::Size() }, - { "num_planes", MCExtractor::Size() * _num_frames_in_state }, - { "resource_dim", 2 * NUM_RES_SLOT }, - { "max_unit_cmd", _context->options().max_unit_cmd }, - { "map_x", _context->options().map_size_x }, - { "map_y", _context->options().map_size_y }, - { "num_cmd_type", CmdInput::CI_NUM_CMDS }, - { "reduced_dim", MCExtractor::Size() * 5 * 5 } + { "num_action", GameDef::GetNumAction() }, + { "num_unit_type", GameDef::GetNumUnitType() }, + { "num_planes_per_time_stamp", MCExtractor::Size() }, // 22 每一个时间戳中的 planes数? + { "num_planes", MCExtractor::Size() * _num_frames_in_state }, // 22 每一个状态包含一帧的数据 + { "resource_dim", 2 * NUM_RES_SLOT }, // 10 + { "max_unit_cmd", _context->options().max_unit_cmd }, // 1 + { "map_x", _context->options().map_size_x }, // 20 + { "map_y", _context->options().map_size_y }, // 20 + { "num_cmd_type", CmdInput::CI_NUM_CMDS }, // 4 + { "reduced_dim", MCExtractor::Size() * 5 * 5 }// 22*5*5 }; } diff --git a/rts/game_MC/state_feature.h b/rts/game_MC/state_feature.h index f627a2ab..ea81b6a1 100644 --- a/rts/game_MC/state_feature.h +++ b/rts/game_MC/state_feature.h @@ -22,6 +22,7 @@ using namespace std; #define NUM_RES_SLOT 5 +// MCExtractor设置 struct MCExtractorOptions { bool use_time_decay = true; bool save_prev_seen_units = false; @@ -122,15 +123,15 @@ class MCExtractorInfo { void Reset(const MCExtractorOptions &opt) { extractors_.clear(); - int num_unit_type = GameDef::GetNumUnitType(); + int num_unit_type = GameDef::GetNumUnitType(); total_dim_ = 0; - total_dim_ += _add_extractor("UnitType", new ExtractorSpan(total_dim_, num_unit_type)); - total_dim_ += _add_extractor("Feature", new ExtractorSpan(total_dim_, NUM_FEATURE)); + total_dim_ += _add_extractor("UnitType", new ExtractorSpan(total_dim_, num_unit_type)); // 6 + total_dim_ += _add_extractor("Feature", new ExtractorSpan(total_dim_, NUM_FEATURE)); // 4 std::initializer_list ticks = { 200, 500, 1000, 2000, 5000, 10000 }; if (opt.use_time_decay) { - total_dim_ += _add_extractor("HistBin", new ExtractorSeq(total_dim_, ticks)); + total_dim_ += _add_extractor("HistBin", new ExtractorSeq(total_dim_, ticks)); // 6+1 } if (opt.save_prev_seen_units) { @@ -138,7 +139,7 @@ class MCExtractorInfo { total_dim_ += _add_extractor("HistBinPrevSeen", new ExtractorSeq(total_dim_, ticks)); } - total_dim_ += _add_extractor("Resource", new ExtractorSpan(total_dim_, NUM_RES_SLOT, 50)); + total_dim_ += _add_extractor("Resource", new ExtractorSpan(total_dim_, NUM_RES_SLOT, 50)); // 5 } int size() const { return total_dim_; } @@ -150,7 +151,7 @@ class MCExtractorInfo { private: int total_dim_; - map> extractors_; + map> extractors_; // int _add_extractor(const std::string &name, Extractor *e) { extractors_[name].reset(e); diff --git a/train.py b/train.py index 8b30c168..c9573456 100644 --- a/train.py +++ b/train.py @@ -16,8 +16,26 @@ if __name__ == '__main__': trainer = Trainer() runner = SingleProcessRun() - env, all_args = load_env(os.environ, trainer=trainer, runner=runner) - + ''' + 设置环境参数 + env : dice [ + game = game game.py + sampler = sampler + model_loaders = 存ModelLoader类的字典,每一个ModelLoader中有一个model + mi=mi + ] + + all_args: 所有定义的参数 + ''' + env, all_args = load_env(os.environ, trainer=trainer, runner=runner) + + ''' + GC = GCWrapper(GC, co, desc, gpu=args.gpu, use_numpy=False, params=params) + GC /gameMC/python_wrapper.cc GameContext + co /elf/python_options_utils_cpp.h ContextOption + desc actor 和 critic 的 Batch定义 + {'actor': {'batchsize': 64, 'input': {'T': 1, 'keys': {'s', 'terminal', 'last_r'}}, 'reply': {'T': 1, 'keys': {'a', 'pi', 'V'}}}} + ''' GC = env["game"].initialize() model = env["model_loaders"][0].load_model(GC.params) From 6efcd00c285d3d85adc73b4b2b747dde055fc681 Mon Sep 17 00:00:00 2001 From: bc <729078846@qq.com> Date: Tue, 22 Dec 2020 15:08:11 +0800 Subject: [PATCH 02/24] Update Comment For Net --- .vscode/settings.json | 3 ++- elf/utils_elf.py | 21 ++++++++++++++++----- rlpytorch/sampler/sample_methods.py | 9 +++++---- rlpytorch/sampler/sampler.py | 0 rlpytorch/trainer/trainer.py | 8 ++++++++ rts/engine/game_env.cc | 1 + rts/game_MC/game.py | 0 rts/game_MC/gamedef.cc | 2 +- rts/game_MC/model.py | 19 +++++++++++++++---- rts/game_MC/python_options.h | 7 +++++++ rts/game_MC/python_wrapper.cc | 3 +++ rts/game_MC/state_feature.cc | 8 ++++++++ rts/game_MC/trunk.py | 18 +++++++++++++++--- train.py | 8 ++++++++ train_minirts.sh | 2 +- 15 files changed, 90 insertions(+), 19 deletions(-) mode change 100644 => 100755 .vscode/settings.json mode change 100644 => 100755 elf/utils_elf.py mode change 100644 => 100755 rlpytorch/sampler/sample_methods.py mode change 100644 => 100755 rlpytorch/sampler/sampler.py mode change 100644 => 100755 rlpytorch/trainer/trainer.py mode change 100644 => 100755 rts/engine/game_env.cc mode change 100644 => 100755 rts/game_MC/game.py mode change 100644 => 100755 rts/game_MC/gamedef.cc mode change 100644 => 100755 rts/game_MC/model.py mode change 100644 => 100755 rts/game_MC/python_options.h mode change 100644 => 100755 rts/game_MC/python_wrapper.cc mode change 100644 => 100755 rts/game_MC/state_feature.cc mode change 100644 => 100755 rts/game_MC/trunk.py mode change 100644 => 100755 train.py diff --git a/.vscode/settings.json b/.vscode/settings.json old mode 100644 new mode 100755 index 01ec88be..52733bb9 --- a/.vscode/settings.json +++ b/.vscode/settings.json @@ -1,5 +1,6 @@ { "files.associations": { "*.ipp": "cpp" - } + }, + "python.pythonPath": "/usr/local/Caskroom/miniconda/base/envs/moRL/bin/python" } \ No newline at end of file diff --git a/elf/utils_elf.py b/elf/utils_elf.py old mode 100644 new mode 100755 index d3e30027..8ed9200c --- a/elf/utils_elf.py +++ b/elf/utils_elf.py @@ -223,12 +223,14 @@ def __init__(self, GC, co, descriptions, use_numpy=False, gpu=None, params=dict( gpu(int): gpu to use. params(dict): additional parameters ''' - + + #self.isPrint = False self._init_collectors(GC, co, descriptions, use_gpu=gpu is not None, use_numpy=use_numpy) self.gpu = gpu self.inputs_gpu = [ self.inputs[gids[0]].cpu2gpu(gpu=gpu) for gids in self.gpu2gid ] if gpu is not None else None self.params = params self._cb = { } + def _init_collectors(self, GC, co, descriptions, use_gpu=True, use_numpy=False): num_games = co.num_games @@ -236,7 +238,7 @@ def _init_collectors(self, GC, co, descriptions, use_gpu=True, use_numpy=False): total_batchsize = 0 for key, v in descriptions.items(): total_batchsize += v["batchsize"] - + if co.num_collectors > 0: num_recv_thread = co.num_collectors else: @@ -269,11 +271,11 @@ def _init_collectors(self, GC, co, descriptions, use_gpu=True, use_numpy=False): for i in range(num_recv_thread): group_id = GC.AddCollectors(batchsize, len(gpu2gid) - 1, timeout_usec, gstat) - input_batch = Batch.load(GC, "input", input, group_id, use_gpu=use_gpu, use_numpy=use_numpy) + input_batch = Batch.load(GC, "input", input, group_id, use_gpu=use_gpu, use_numpy=use_numpy) # 加载输入Batch input_batch.batchsize = batchsize inputs.append(input_batch) if reply is not None: - reply_batch = Batch.load(GC, "reply", reply, group_id, use_gpu=use_gpu, use_numpy=use_numpy) + reply_batch = Batch.load(GC, "reply", reply, group_id, use_gpu=use_gpu, use_numpy=use_numpy) # 加载回复Batch reply_batch.batchsize= batchsize replies.append(reply_batch) else: @@ -298,6 +300,14 @@ def _init_collectors(self, GC, co, descriptions, use_gpu=True, use_numpy=False): self.name2idx = name2idx self.gid2gpu = gid2gpu self.gpu2gid = gpu2gid + # if not self.isPrint: + # print("idx2name",self.idx2name) + # print("name2idx",self.name2idx) + # print("gid2gpu",self.gid2gpu) + # print("gpu2gid",self.gpu2gid) + # print("num_collectors: ",co.num_collectors) + # self.isPrint = True + def reg_has_callback(self, key): return key in self.name2idx @@ -311,6 +321,7 @@ def reg_callback_if_exists(self, key, cb): def reg_callback(self, key, cb): '''Set callback function for key + 注册回调函数,有符合要求和数量的Batch到来时,调用对应的函数 Parameters: key(str): the key used to register the callback function. @@ -332,7 +343,7 @@ def _call(self, infos): raise ValueError("info.gid[%d] is not in callback functions" % infos.gid) if self._cb[infos.gid] is None: - return; + return batchsize = len(infos.s) diff --git a/rlpytorch/sampler/sample_methods.py b/rlpytorch/sampler/sample_methods.py old mode 100644 new mode 100755 index ec657de7..b5b98f38 --- a/rlpytorch/sampler/sample_methods.py +++ b/rlpytorch/sampler/sample_methods.py @@ -33,10 +33,10 @@ def sample_with_check(probs, greedy=False): ''' num_action = probs.size(1) if greedy: - _, actions = probs.max(1) + _, actions = probs.max(1) # 贪婪算法,每次取概率最大的动作 return actions while True: - actions = probs.multinomial(1)[:,0] + actions = probs.multinomial(1)[:,0] # 按照概率选择一个动作 cond1 = (actions < 0).sum() cond2 = (actions >= num_action).sum() if cond1 == 0 and cond2 == 0: @@ -74,8 +74,9 @@ def sample_eps_with_check(probs, epsilon, greedy=False): rej_p = probs.new().resize_(2) rej_p[0] = 1 - epsilon rej_p[1] = epsilon + # rej 按照概率取 0 或 1(batchsize次),取到1时(epsilon)表示此次不选择该动作并随机取样 rej = rej_p.multinomial(batchsize, replacement=True).byte() - + # 随机取样 uniform_p = probs.new().resize_(num_action).fill_(1.0 / num_action) uniform_sampling = uniform_p.multinomial(batchsize, replacement=True) actions[rej] = uniform_sampling[rej] @@ -110,7 +111,7 @@ def sample_multinomial(state_curr, args, node="pi", greedy=False): return actions else: probs = state_curr[node].data - return sample_eps_with_check(probs, args.epsilon, greedy=greedy) + return sample_eps_with_check(probs, args.epsilon, greedy=greedy) # probs 0 False def epsilon_greedy(state_curr, args, node="pi"): ''' epsilon greedy sampling diff --git a/rlpytorch/sampler/sampler.py b/rlpytorch/sampler/sampler.py old mode 100644 new mode 100755 diff --git a/rlpytorch/trainer/trainer.py b/rlpytorch/trainer/trainer.py old mode 100644 new mode 100755 index 8f2b4241..66bbbe15 --- a/rlpytorch/trainer/trainer.py +++ b/rlpytorch/trainer/trainer.py @@ -40,6 +40,7 @@ def __init__(self, name="eval", stats=True, verbose=False, actor_name="actor"): on_get_args = self._on_get_args, child_providers = child_providers ) + self.isPrint = False def _on_get_args(self, _): if self.stats is not None and not self.stats.is_valid(): @@ -75,6 +76,8 @@ def actor(self, batch): if self.sampler is not None: reply_msg = self.sampler.sample(state_curr) + # if not self.isPrint: + # print("sampler reply: ",reply_msg) else: reply_msg = dict(pi=state_curr["pi"].data) @@ -88,6 +91,11 @@ def actor(self, batch): reply_msg["V"] = state_curr["V"].data self.actor_count += 1 + # if not self.isPrint: + # print("batch: ",batch) + # print("state_curr",state_curr) + # print("reply_msg",reply_msg) + # self.isPrint = True return reply_msg def episode_summary(self, i): diff --git a/rts/engine/game_env.cc b/rts/engine/game_env.cc old mode 100644 new mode 100755 index 3387ecc5..eb9442b3 --- a/rts/engine/game_env.cc +++ b/rts/engine/game_env.cc @@ -121,6 +121,7 @@ bool GameEnv::RemoveUnit(const UnitId &id) { return true; } +// 找到最近的基地 UnitId GameEnv::FindClosestBase(PlayerId player_id) const { // Find closest base. [TODO]: Not efficient here. for (auto it = _units.begin(); it != _units.end(); ++it) { diff --git a/rts/game_MC/game.py b/rts/game_MC/game.py old mode 100644 new mode 100755 diff --git a/rts/game_MC/gamedef.cc b/rts/game_MC/gamedef.cc old mode 100644 new mode 100755 index 1bbde036..dd936171 --- a/rts/game_MC/gamedef.cc +++ b/rts/game_MC/gamedef.cc @@ -35,7 +35,7 @@ bool GameDef::CheckAddUnit(RTSMap *_map, UnitType, const PointF& p) const{ } void GameDef::GlobalInit() { - reg_engine(); + reg_engine(); // reg_engine_specific(); reg_minirts_specific(); diff --git a/rts/game_MC/model.py b/rts/game_MC/model.py old mode 100644 new mode 100755 index 8353ad00..f1848f3c --- a/rts/game_MC/model.py +++ b/rts/game_MC/model.py @@ -18,6 +18,7 @@ class Model_ActorCritic(Model): def __init__(self, args): super(Model_ActorCritic, self).__init__(args) self._init(args) + #self.isPrint = False def _init(self, args): params = args.params @@ -31,9 +32,11 @@ def _init(self, args): linear_in_dim = last_num_channel else: linear_in_dim = last_num_channel * 25 + + - self.linear_policy = nn.Linear(linear_in_dim, params["num_action"]) - self.linear_value = nn.Linear(linear_in_dim, 1) + self.linear_policy = nn.Linear(linear_in_dim, params["num_action"]) # 策略函数 + self.linear_value = nn.Linear(linear_in_dim, 1) # 价值函数 self.relu = nn.LeakyReLU(0.1) @@ -49,13 +52,21 @@ def get_define_args(): def forward(self, x): if self.params.get("model_no_spatial", False): # Replace a complicated network with a simple retraction. - # Input: batchsize, channel, height, width + # Input: batchsize, channel, height, width Batch Object xreduced = x["s"].sum(2).sum(3).squeeze() xreduced[:, self.num_unit:] /= 20 * 20 output = self._var(xreduced) else: output = self.net(self._var(x["s"])) - + + #decide = self.decision(output) + #if not self.isPrint: + #print("x: ",x.batch) + # print("output: ",output) + # print("decision: ",decide) + # print("net: ",self) + #self.isPrint = True + #return decide return self.decision(output) def decision(self, h): diff --git a/rts/game_MC/python_options.h b/rts/game_MC/python_options.h old mode 100644 new mode 100755 index ec744d8b..1eb52308 --- a/rts/game_MC/python_options.h +++ b/rts/game_MC/python_options.h @@ -22,6 +22,12 @@ struct GameState { using State = GameState; using Data = GameState; + /** + * 测试获取基地位置信息 + * */ + //float base_x, base_y; + + int32_t id; int32_t seq; int32_t game_counter; @@ -133,6 +139,7 @@ struct GameState { // These fields are used to exchange with Python side using tensor interface. DECLARE_FIELD(GameState, id, a, V, pi, last_r, s, rv, terminal, seq, game_counter, last_terminal, uloc, tloc, bt, ct, uloc_prob, tloc_prob, bt_prob, ct_prob, reduced_s, reduced_next_s); + //DECLARE_FIELD(GameState, id, a, V, pi, last_r, s, rv, terminal, seq, game_counter, last_terminal, uloc, tloc, bt, ct, uloc_prob, tloc_prob, bt_prob, ct_prob, reduced_s, reduced_next_s,base_x,base_y); REGISTER_PYBIND_FIELDS(id); }; diff --git a/rts/game_MC/python_wrapper.cc b/rts/game_MC/python_wrapper.cc old mode 100644 new mode 100755 index 925df69a..40d932ed --- a/rts/game_MC/python_wrapper.cc +++ b/rts/game_MC/python_wrapper.cc @@ -40,6 +40,7 @@ class GameContext { } void Start() { + std::cout<<"--------------GameContext Start-----------"<Start( [this](int game_idx, const ContextOptions &context_options, const PythonOptions &options, const elf::Signal &signal, Comm *comm) { auto params = this->GetParams(); @@ -88,7 +89,9 @@ class GameContext { else if (key == "ct_prob") return EntryInfo(key, type_name, { max_unit_cmd, CmdInput::CI_NUM_CMDS }); else if (key == "reduced_s") return EntryInfo(key, type_name, { reduced_size }); else if (key == "reduced_next_s") return EntryInfo(key, type_name, { reduced_size }); + else if (key == "base_x" || key == "base_y") return EntryInfo(key, type_name); + return EntryInfo(); } diff --git a/rts/game_MC/state_feature.cc b/rts/game_MC/state_feature.cc old mode 100644 new mode 100755 index 5ff62a8a..3e822adc --- a/rts/game_MC/state_feature.cc +++ b/rts/game_MC/state_feature.cc @@ -28,6 +28,14 @@ void MCExtractor::SaveInfo(const RTSState &s, PlayerId player_id, GameState *gs) gs->terminal = s.env().GetTermination() ? 1 : 0; gs->last_r = 0.0; + + // 测试获取基地位置 + // UnitId baseId = s.env().FindClosestBase(player_id); + //const Unit* base = s.env().GetUnit(s.env().FindClosestBase(player_id)); + //gs->base_x = s.env().GetUnit(s.env().FindClosestBase(player_id))->GetPointF().x; + //gs->base_y = s.env().GetUnit(s.env().FindClosestBase(player_id))->GetPointF().y; + // 测试获取基地位置 + int winner = s.env().GetWinnerId(); if (winner != INVALID) { if (winner == player_id) gs->last_r = 1.0; diff --git a/rts/game_MC/trunk.py b/rts/game_MC/trunk.py old mode 100644 new mode 100755 index e685481a..a226026d --- a/rts/game_MC/trunk.py +++ b/rts/game_MC/trunk.py @@ -16,6 +16,7 @@ def __init__(self, args, output1d=True): super(MiniRTSNet, self).__init__(args) self._init(args) self.output1d = output1d + #self.isPrint = False def _init(self, args): self.m = args.params.get("num_planes_per_time_stamp", 13) @@ -64,7 +65,13 @@ def get_define_args(): def forward(self, input): # BN and LeakyReLU are from Wendy's code. x = input.view(input.size(0), self.input_channel, self.mapy, self.mapx) - + # if not self.isPrint: + # print("input size: ",input.size()) + # print("input: ",input) + # print("x size:",x.size()) + # print("x: ",x) + # print("Net",self) + # self.isPrint = True counts = Counter() for i in range(len(self.arch)): if self.arch[i] == "c": @@ -78,5 +85,10 @@ def forward(self, input): if self.output1d: x = x.view(x.size(0), -1) - - return x + + # if not self.isPrint: + # print("x",x) + # print("x.size ",x.size()) + # self.isPrint = True + + return x # 64 x 550 diff --git a/train.py b/train.py old mode 100644 new mode 100755 index c9573456..17fcba0d --- a/train.py +++ b/train.py @@ -45,7 +45,15 @@ trainer.setup(sampler=env["sampler"], mi=env["mi"], rl_method=env["method"]) GC.reg_callback("train", trainer.train) + # def train(batch): + # print(batch) + # import pdb + # pdb.set_trace() + # return trainer.train(batch) + + # GC.reg_callback("train", train) GC.reg_callback("actor", trainer.actor) + runner.setup(GC, episode_summary=trainer.episode_summary, episode_start=trainer.episode_start) diff --git a/train_minirts.sh b/train_minirts.sh index 1fa620da..692956e3 100755 --- a/train_minirts.sh +++ b/train_minirts.sh @@ -1,3 +1,3 @@ #!/bin/bash -game=./rts/game_MC/game model=actor_critic model_file=./rts/game_MC/model python3 train.py --batchsize 128 --freq_update 1 --players "type=AI_NN,fs=50,args=backup/AI_SIMPLE|start/500|decay/0.99;type=AI_SIMPLE,fs=20" --num_games 1024 --tqdm --T 20 --additional_labels id,last_terminal --trainer_stats winrate --keys_in_reply V "$@" +game=./rts/game_MC/game model=actor_critic model_file=./rts/game_MC/model python3 train.py --batchsize 64 --freq_update 1 --players "type=AI_NN,fs=50,args=backup/AI_SIMPLE|start/500|decay/0.99;type=AI_SIMPLE,fs=20" --num_games 1024 --tqdm --T 20 --additional_labels id,last_terminal --trainer_stats winrate --keys_in_reply V "$@" From 28660c311fb413230abeb3bbe6fdf2386e443346 Mon Sep 17 00:00:00 2001 From: bc <729078846@qq.com> Date: Wed, 23 Dec 2020 18:20:17 +0800 Subject: [PATCH 03/24] Update Comment --- .vscode/settings.json | 87 +++++++++++++++++++++++++++++++- elf/ai.h | 6 ++- elf/comm_template.h | 14 +++-- elf/game_base.h | 6 ++- rts/engine/cmd_receiver.h | 4 +- rts/engine/game.cc | 6 ++- rts/engine/game.h | 2 +- rts/engine/game_options.h | 2 +- rts/engine/game_state.cc | 22 ++++++-- rts/engine/game_state.h | 4 +- rts/engine/gamedef.cc | 13 ++++- rts/engine/gamedef.h | 4 +- rts/engine/map.cc | 3 +- rts/engine/wrapper_template.h | 53 +++++++++++++------ rts/frontend/._minirts.html | Bin 0 -> 4096 bytes rts/game_MC/game_action.h | 0 rts/game_MC/gamedef.cc | 27 +++++++++- rts/game_MC/python_wrapper.cc | 8 +-- rts/game_MC/wrapper_callback.cc | 2 +- rts/game_MC/wrapper_callback.h | 2 +- train_minirts.sh | 2 +- 21 files changed, 218 insertions(+), 49 deletions(-) mode change 100644 => 100755 elf/ai.h mode change 100644 => 100755 elf/comm_template.h mode change 100644 => 100755 elf/game_base.h mode change 100644 => 100755 rts/engine/cmd_receiver.h mode change 100644 => 100755 rts/engine/game.cc mode change 100644 => 100755 rts/engine/game.h mode change 100644 => 100755 rts/engine/game_options.h mode change 100644 => 100755 rts/engine/game_state.cc mode change 100644 => 100755 rts/engine/game_state.h mode change 100644 => 100755 rts/engine/gamedef.cc mode change 100644 => 100755 rts/engine/gamedef.h mode change 100644 => 100755 rts/engine/map.cc mode change 100644 => 100755 rts/engine/wrapper_template.h create mode 100755 rts/frontend/._minirts.html mode change 100644 => 100755 rts/game_MC/game_action.h mode change 100644 => 100755 rts/game_MC/wrapper_callback.cc mode change 100644 => 100755 rts/game_MC/wrapper_callback.h diff --git a/.vscode/settings.json b/.vscode/settings.json index 52733bb9..c7cd746d 100755 --- a/.vscode/settings.json +++ b/.vscode/settings.json @@ -1,6 +1,91 @@ { "files.associations": { - "*.ipp": "cpp" + "*.ipp": "cpp", + "memory": "cpp", + "regex": "cpp", + "utility": "cpp", + "__bit_reference": "cpp", + "__config": "cpp", + "__debug": "cpp", + "__errc": "cpp", + "__functional_base": "cpp", + "__hash_table": "cpp", + "__locale": "cpp", + "__mutex_base": "cpp", + "__node_handle": "cpp", + "__nullptr": "cpp", + "__split_buffer": "cpp", + "__string": "cpp", + "__threading_support": "cpp", + "__tree": "cpp", + "__tuple": "cpp", + "algorithm": "cpp", + "array": "cpp", + "atomic": "cpp", + "bit": "cpp", + "bitset": "cpp", + "cctype": "cpp", + "chrono": "cpp", + "clocale": "cpp", + "cmath": "cpp", + "codecvt": "cpp", + "complex": "cpp", + "condition_variable": "cpp", + "csignal": "cpp", + "cstdarg": "cpp", + "cstddef": "cpp", + "cstdint": "cpp", + "cstdio": "cpp", + "cstdlib": "cpp", + "cstring": "cpp", + "ctime": "cpp", + "cwchar": "cpp", + "cwctype": "cpp", + "deque": "cpp", + "exception": "cpp", + "forward_list": "cpp", + "fstream": "cpp", + "functional": "cpp", + "future": "cpp", + "initializer_list": "cpp", + "iomanip": "cpp", + "ios": "cpp", + "iosfwd": "cpp", + "iostream": "cpp", + "istream": "cpp", + "iterator": "cpp", + "limits": "cpp", + "list": "cpp", + "locale": "cpp", + "map": "cpp", + "mutex": "cpp", + "new": "cpp", + "numeric": "cpp", + "optional": "cpp", + "ostream": "cpp", + "queue": "cpp", + "random": "cpp", + "ratio": "cpp", + "set": "cpp", + "sstream": "cpp", + "stack": "cpp", + "stdexcept": "cpp", + "streambuf": "cpp", + "string": "cpp", + "string_view": "cpp", + "system_error": "cpp", + "thread": "cpp", + "tuple": "cpp", + "type_traits": "cpp", + "typeindex": "cpp", + "typeinfo": "cpp", + "unordered_map": "cpp", + "unordered_set": "cpp", + "valarray": "cpp", + "variant": "cpp", + "vector": "cpp", + "__functional_03": "cpp", + "filesystem": "cpp" }, "python.pythonPath": "/usr/local/Caskroom/miniconda/base/envs/moRL/bin/python" } \ No newline at end of file diff --git a/elf/ai.h b/elf/ai.h old mode 100644 new mode 100755 index a2658460..8d8b37d2 --- a/elf/ai.h +++ b/elf/ai.h @@ -17,7 +17,7 @@ namespace elf { using namespace std; -template +template // RTSState RTSMCAction class AI_T { public: using Action = A; @@ -43,6 +43,8 @@ class AI_T { virtual ~AI_T() { } + void Print(){std::cout<<"AIName: _name: "<<_name<<" id: "<<_id< +template //带有AICommT的AI class AIWithCommT : public AI_T { public: using AI = AI_T; diff --git a/elf/comm_template.h b/elf/comm_template.h old mode 100644 new mode 100755 index 26a2a110..3224898f --- a/elf/comm_template.h +++ b/elf/comm_template.h @@ -200,14 +200,16 @@ class CommT { _signal->use_queue_per_group(_groups.size()); } + //std::cout<<"-------CommT CollectorsReady---------------"<MainLoop(); }); + _pool.push([p, this](int) { p->MainLoop(); }); // 16 个 Batch Collector } } @@ -343,13 +345,15 @@ class ContextT { const Options &options() const { return _options; } void Start(GameStartFunc game_start_func) { - _comm.CollectorsReady(); - + std::cout<<"--------ContextT Start---------------"<Init(); + void MainLoop(const std::atomic_bool *done = nullptr,bool isPrint = false) { + if(isPrint) + std::cout<<"-------MainLoop----------"<Init(isPrint); // 初始化游戏 while (true) { if (Step(done) != GAME_NORMAL) break; if (done != nullptr && done->load()) break; diff --git a/rts/engine/cmd_receiver.h b/rts/engine/cmd_receiver.h old mode 100644 new mode 100755 index f1f07b53..20a28edd --- a/rts/engine/cmd_receiver.h +++ b/rts/engine/cmd_receiver.h @@ -36,8 +36,8 @@ typedef int VerboseChoice; #define CR_NODERIVED 8 #define CR_ALL ( CR_DURATIVE | CR_IMMEDIATE | CR_DERIVED | CR_NODERIVED ) -// receive command and record them in the history. -// The cmds are ordered so that the lowest level is executed first. +// receive command and record them in the history. 接收命令 +// The cmds are ordered so that the lowest level is executed first. class CmdReceiver { private: Tick _tick; diff --git a/rts/engine/game.cc b/rts/engine/game.cc old mode 100644 new mode 100755 index 09d0ad08..1be2a3bf --- a/rts/engine/game.cc +++ b/rts/engine/game.cc @@ -69,8 +69,10 @@ CmdReturn RTSStateExtend::dispatch_cmds(const UICmd& cmd) { return CMD_FAILED; } -bool RTSStateExtend::Init() { - if (! RTSState::Prepare(_options, _output_stream)) return false; +bool RTSStateExtend::Init(bool isPrint = false) { + if(isPrint) + std::cout<<"------初始化游戏-------"< snapshots; - // Initial seed. If seed = 0, then we use time(NULL) + // Initial seed. If seed = 0, then we use time(NULL) 初始化种子 // When seed != 0, the game should be deterministic (If not then there is a bug somewhere). int seed = 0; diff --git a/rts/engine/game_state.cc b/rts/engine/game_state.cc old mode 100644 new mode 100755 index 52c7c45c..db6eaa20 --- a/rts/engine/game_state.cc +++ b/rts/engine/game_state.cc @@ -25,7 +25,9 @@ void RTSState::RemoveLastPlayer() { _env.RemovePlayer(); } -bool RTSState::Prepare(const RTSGameOptions &options, ostream *output) { +bool RTSState::Prepare(const RTSGameOptions &options, ostream *output,bool isPrint) { + if(isPrint) + std::cout<<"------------Prepare-------------"<PrintInfo()<PrintInfo()<<" "< &cds, const vector &l, UnitAttr attr) { @@ -21,7 +30,7 @@ UnitTemplate _C(int cost, int hp, int defense, float speed, int att, int att_r, p._attr = attr; p._att_r = att_r; p._vis_r = vis_r; - for (int i = 0; i < NUM_COOLDOWN; ++i) { + for (int i = 0; i < NUM_COOLDOWN; ++i) { //设置CD p._cds[i].Set(cds[i]); } diff --git a/rts/engine/gamedef.h b/rts/engine/gamedef.h old mode 100644 new mode 100755 index a2140cd7..6cbc88e7 --- a/rts/engine/gamedef.h +++ b/rts/engine/gamedef.h @@ -21,8 +21,8 @@ struct UnitProperty { int _att_r; float _speed; - // Visualization range. - int _vis_r; + // Visualization range. 可视距离 + int _vis_r; int _changed_hp; UnitId _damage_from; diff --git a/rts/engine/map.cc b/rts/engine/map.cc old mode 100644 new mode 100755 index e11659f6..e8e7483f --- a/rts/engine/map.cc +++ b/rts/engine/map.cc @@ -162,8 +162,9 @@ void RTSMap::precompute_all_pair_distances() { // once for each map, we could just use it. } +// 增加单位 bool RTSMap::AddUnit(const UnitId &id, const PointF& new_p) { - if (_locality.Exists(id)) return false; + if (_locality.Exists(id)) return false; // 位置已有单位,不可添加 if (! _locality.IsEmpty(new_p, kUnitRadius, INVALID)) return false; _locality.Add(id, new_p, kUnitRadius); diff --git a/rts/engine/wrapper_template.h b/rts/engine/wrapper_template.h old mode 100644 new mode 100755 index eca6d382..9a5726ee --- a/rts/engine/wrapper_template.h +++ b/rts/engine/wrapper_template.h @@ -30,7 +30,11 @@ class WrapperT { const PythonOptions &options, const elf::Signal &signal, const std::map *more_params, Comm *comm) { const string& replay_prefix = options.save_replay_prefix; - + + bool isPrint = false; + if (game_idx==1) + isPrint = true; + // Create a game. RTSGameOptions op; op.seed = (options.seed == 0 ? 0 : options.seed + game_idx); @@ -41,30 +45,47 @@ class WrapperT { op.output_file = options.output_filename; op.cmd_dumper_prefix = options.cmd_dumper_prefix; - // std::cout << "before running wrapper" << std::endl; - - WrapperCB wrapper(game_idx, context_options, options, comm); - wrapper.OnGameOptions(&op); - - // std::cout << "before initializing the game" << std::endl; + if(isPrint){ + string ss = op.PrintInfo(); + std::cout<<"----------RTSGameOptions----"<$Vqox1Ojhs@R)|o50+1L3ClDJkFz{^v(m+1nBL)UWIUt(=a103vV$hni z1fqjs0Z_RBnifVNA1W@DoS&{0, 0, 0, 0}, vector{}, ATTR_INVULNERABLE); + /** + * int cost, int hp, int defense, float speed, int att, int att_r, int vis_r, + const vector &cds, const vector &l, UnitAttr attr + + _units[RESOURCE] = _C(0, 1000, 1000, 0, 0, 0, 0, vector{0, 0, 0, 0}, vector{}, ATTR_INVULNERABLE); _units[WORKER] = _C(50, 50, 0, 0.1, 2, 1, 3, vector{0, 10, 40, 40}, vector{MOVE, ATTACK, BUILD, GATHER}); _units[MELEE_ATTACKER] = _C(100, 100, 1, 0.1, 15, 1, 3, vector{0, 15, 0, 0}, vector{MOVE, ATTACK}); _units[RANGE_ATTACKER] = _C(100, 50, 0, 0.2, 10, 5, 5, vector{0, 10, 0, 0}, vector{MOVE, ATTACK}); _units[BARRACKS] = _C(200, 200, 1, 0.0, 0, 0, 5, vector{0, 0, 0, 50}, vector{BUILD}); _units[BASE] = _C(500, 500, 2, 0.0, 0, 0, 5, {0, 0, 0, 50}, vector{BUILD}); + + + * 定义单位属性 + * cost 造价(不需要) + * hp 血量 + * defence防御力 + * speed 速度 + * att 攻击力 + * att_r 攻击距离 + * vis_r 可视距离 + * * cost hp def sp att att_r vis_r + * */ + _units[RESOURCE] = _C(0, 1000, 1000, 0, 0, 0, 0, vector{0, 0, 0, 0}, vector{}, ATTR_INVULNERABLE); + _units[WORKER] = _C(50, 50, 0, 0.1, 2, 1, 1, vector{0, 10, 40, 40}, vector{MOVE, ATTACK, BUILD, GATHER}); + _units[MELEE_ATTACKER] = _C(50, 100, 1, 0.1, 15, 5, 0, vector{0, 15, 0, 0}, vector{ ATTACK}); + _units[RANGE_ATTACKER] = _C(100, 50, 0, 0.2, 10, 0, 4, vector{0, 10, 0, 0}, vector{MOVE, ATTACK}); + _units[BARRACKS] = _C(200, 200, 1, 0.0, 0, 0, 2, vector{0, 0, 0, 50}, vector{BUILD}); + _units[BASE] = _C(500, 500, 2, 0.0, 0, 0, 2, {0, 0, 0, 50}, vector{BUILD}); + + } vector > GameDef::GetInitCmds(const RTSGameOptions&) const{ @@ -70,6 +94,7 @@ vector > GameDef::GetInitCmds(const RTSGameOptions&) const{ return init_cmds; } +// 通过判断最后一个拥有基地的玩家来确定胜利者 PlayerId GameDef::CheckWinner(const GameEnv& env, bool /*exceeds_max_tick*/) const { return env.CheckBase(BASE); } diff --git a/rts/game_MC/python_wrapper.cc b/rts/game_MC/python_wrapper.cc index 40d932ed..7b622edb 100755 --- a/rts/game_MC/python_wrapper.cc +++ b/rts/game_MC/python_wrapper.cc @@ -33,7 +33,7 @@ class GameContext { GameDef::GlobalInit(); _context.reset(new GC{context_options, options}); - _num_frames_in_state = 1; + _num_frames_in_state = 1; for (const AIOptions& opt : options.ai_options) { _num_frames_in_state = max(_num_frames_in_state, opt.num_frames_in_state); } @@ -43,6 +43,8 @@ class GameContext { std::cout<<"--------------GameContext Start-----------"<Start( [this](int game_idx, const ContextOptions &context_options, const PythonOptions &options, const elf::Signal &signal, Comm *comm) { + if(game_idx == 1) + std::cout<<"game_"<GetParams(); this->_wrapper.thread_main(game_idx, context_options, options, signal, ¶ms, comm); }); @@ -50,8 +52,8 @@ class GameContext { std::map GetParams() const { return std::map{ - { "num_action", GameDef::GetNumAction() }, - { "num_unit_type", GameDef::GetNumUnitType() }, + { "num_action", GameDef::GetNumAction() }, // 9 + { "num_unit_type", GameDef::GetNumUnitType() }, // 6 { "num_planes_per_time_stamp", MCExtractor::Size() }, // 22 每一个时间戳中的 planes数? { "num_planes", MCExtractor::Size() * _num_frames_in_state }, // 22 每一个状态包含一帧的数据 { "resource_dim", 2 * NUM_RES_SLOT }, // 10 diff --git a/rts/game_MC/wrapper_callback.cc b/rts/game_MC/wrapper_callback.cc old mode 100644 new mode 100755 index 40a06ab4..13d7b26b --- a/rts/game_MC/wrapper_callback.cc +++ b/rts/game_MC/wrapper_callback.cc @@ -69,7 +69,7 @@ void WrapperCallbacks::OnGameInit(RTSGame *game, const std::map ais; for (const AIOptions &ai_opt : _options.ai_options) { - Context::AIComm *ai_comm = new Context::AIComm(_game_idx, _comm); + Context::AIComm *ai_comm = new Context::AIComm(_game_idx, _comm); //设置 AI 和 Main_Loop通信的工具 _ai_comms.emplace_back(ai_comm); initialize_ai_comm(*ai_comm, more_params); ais.push_back(get_ai(_game_idx, _context_options.mcts_options, ai_opt, ai_comm)); diff --git a/rts/game_MC/wrapper_callback.h b/rts/game_MC/wrapper_callback.h old mode 100644 new mode 100755 index 1cc4c87c..d4f5fd20 --- a/rts/game_MC/wrapper_callback.h +++ b/rts/game_MC/wrapper_callback.h @@ -36,7 +36,7 @@ class WrapperCallbacks { } void OnGameOptions(RTSGameOptions *rts_options); - void OnGameInit(RTSGame *game, const std::map *more_params); + void OnGameInit(RTSGame *game, const std::map *more_params,bool isPrint); void OnEpisodeStart(int k, std::mt19937 *rng, RTSGame *game); }; diff --git a/train_minirts.sh b/train_minirts.sh index 692956e3..fee80a44 100755 --- a/train_minirts.sh +++ b/train_minirts.sh @@ -1,3 +1,3 @@ #!/bin/bash -game=./rts/game_MC/game model=actor_critic model_file=./rts/game_MC/model python3 train.py --batchsize 64 --freq_update 1 --players "type=AI_NN,fs=50,args=backup/AI_SIMPLE|start/500|decay/0.99;type=AI_SIMPLE,fs=20" --num_games 1024 --tqdm --T 20 --additional_labels id,last_terminal --trainer_stats winrate --keys_in_reply V "$@" +game=./rts/game_MC/game model=actor_critic model_file=./rts/game_MC/model python3 train.py --batchsize 32 --freq_update 1 --players "type=AI_NN,fs=50,args=backup/AI_SIMPLE|start/500|decay/0.99;type=AI_SIMPLE,fs=20" --num_games 1024 --tqdm --T 20 --additional_labels id,last_terminal --trainer_stats winrate --keys_in_reply V "$@" From 602331f8daf052c172ec53387b436ead4fb32257 Mon Sep 17 00:00:00 2001 From: bc <729078846@qq.com> Date: Thu, 24 Dec 2020 16:19:16 +0800 Subject: [PATCH 04/24] Change GenerateUnit Cannot Train Now --- rts/engine/map.cc | 11 +++- rts/engine/map.h | 1 + rts/game_MC/cmd_specific.cc | 120 ++++++++++++++++++++++-------------- rts/game_MC/gamedef.cc | 10 +-- 4 files changed, 88 insertions(+), 54 deletions(-) mode change 100644 => 100755 rts/engine/map.h mode change 100644 => 100755 rts/game_MC/cmd_specific.cc diff --git a/rts/engine/map.cc b/rts/engine/map.cc index e8e7483f..a1559e75 100755 --- a/rts/engine/map.cc +++ b/rts/engine/map.cc @@ -31,8 +31,12 @@ bool RTSMap::find_two_nearby_empty_slots(const std::function& f, } bool RTSMap::GenerateImpassable(const std::function& f, int nImpassable) { - _map.assign(_m * _n * _level, MapSlot()); - for (int i = 0; i < nImpassable; ++i) { + std::cout<<"-------GenerateImpassable--------"<& f) { bool RTSMap::GenerateMap(const std::function& f, int nImpassable, int num_player, int init_resource) { // load a map for now simple format. bool success; + std::cout<<"GenerateMap nImpassable = "<GenerateMap(_num_obstacles, _init_resource) ? true : false; } @@ -24,6 +25,7 @@ bool CmdGenerateMap::run(GameEnv *env, CmdReceiver*) { bool CmdGameStartSpecific::run(GameEnv*, CmdReceiver* receiver) { + // std::cout<<"CmdGameStartSpecific"<GetRandomFunc(); - int lr_seed = f(2); - int ud_seed = f(2); - bool shuffle_lr = (lr_seed == 0); - bool shuffle_ud = (ud_seed == 0); - auto shuffle_loc = [&] (PointF p, bool b1, bool b2) -> PointF { - int x = b1 ? 19 - p.x : p.x; - int y = b2 ? 19 - p.y : p.y; - return PointF(x, y); - }; + std::cout<<"CmdGenerateTDUnit"<GetGameStats().PickBase(lr_seed * 2 + ud_seed); - for (const auto &info : env->GetMap().GetPlayerMapInfo()) { - PlayerId id = info.player_id; - _CREATE(BASE, shuffle_loc(PointF(info.base_coord), shuffle_lr, shuffle_ud), id); - _CREATE(RESOURCE, shuffle_loc(PointF(info.resource_coord), shuffle_lr, shuffle_ud), id); - _CHANGE_RES(id, info.initial_resource); - //base_locs[id] = PointF(info.base_coord); - } - // for (size_t i = 0; i < base_locs.size(); ++i) { - // std::cout << "[" << i << "] Baseloc: " << base_locs[i].x << ", " << base_locs[i].y << std::endl; - //} - auto gen_loc = [&] (int player_id) -> PointF { - // Note that we could not write - // PointF( f(8) + ..., f(8) + ...) - // since the result will depend on which f is evaluated first, and will yield different results on - // different platform/compiler (e.g., clang and gcc yields different results). - // The following implementation is uniquely determined. - int x = f(6) + player_id * 10 + 2; - int y = f(6) + player_id * 10 + 2; - return PointF(x, y); - }; - for (PlayerId player_id = 0; player_id < 2; player_id++) { - PlayerId id = player_id; - // Generate workers (up to three). - for (int i = 0; i < 3; i++) { - if (f(10) >= 5) { - _CREATE(WORKER, shuffle_loc(gen_loc(player_id), shuffle_lr, shuffle_ud), id); - } - } - if (f(10) >= 8) - _CREATE(BARRACKS, shuffle_loc(gen_loc(player_id), shuffle_lr, shuffle_ud), id); - if (f(10) >= 5) - _CREATE(MELEE_ATTACKER, shuffle_loc(gen_loc(player_id), shuffle_lr, shuffle_ud), id); - if (f(10) >= 5) - _CREATE(RANGE_ATTACKER, shuffle_loc(gen_loc(player_id), shuffle_lr, shuffle_ud), id); - } + // enemy + _CREATE(BASE,PointF(1, 1),enemy_id); return true; + } +//-----------------Test-------------------- +// bool CmdGenerateUnit::run(GameEnv *env, CmdReceiver *receiver) { +// std::cout<<"CmdGenerateUnit"<GetRandomFunc(); +// int lr_seed = f(2); +// int ud_seed = f(2); +// bool shuffle_lr = (lr_seed == 0); +// bool shuffle_ud = (ud_seed == 0); +// auto shuffle_loc = [&] (PointF p, bool b1, bool b2) -> PointF { +// int x = b1 ? 19 - p.x : p.x; +// int y = b2 ? 19 - p.y : p.y; +// return PointF(x, y); +// }; + +// receiver->GetGameStats().PickBase(lr_seed * 2 + ud_seed); +// for (const auto &info : env->GetMap().GetPlayerMapInfo()) { +// PlayerId id = info.player_id; +// _CREATE(BASE, shuffle_loc(PointF(info.base_coord), shuffle_lr, shuffle_ud), id); +// _CREATE(RESOURCE, shuffle_loc(PointF(info.resource_coord), shuffle_lr, shuffle_ud), id); +// _CHANGE_RES(id, info.initial_resource); +// //base_locs[id] = PointF(info.base_coord); +// } +// // for (size_t i = 0; i < base_locs.size(); ++i) { +// // std::cout << "[" << i << "] Baseloc: " << base_locs[i].x << ", " << base_locs[i].y << std::endl; +// //} +// auto gen_loc = [&] (int player_id) -> PointF { +// // Note that we could not write +// // PointF( f(8) + ..., f(8) + ...) +// // since the result will depend on which f is evaluated first, and will yield different results on +// // different platform/compiler (e.g., clang and gcc yields different results). +// // The following implementation is uniquely determined. +// int x = f(6) + player_id * 10 + 2; +// int y = f(6) + player_id * 10 + 2; +// return PointF(x, y); +// }; +// for (PlayerId player_id = 0; player_id < 2; player_id++) { +// PlayerId id = player_id; +// // Generate workers (up to three). +// for (int i = 0; i < 3; i++) { +// if (f(10) >= 5) { +// _CREATE(WORKER, shuffle_loc(gen_loc(player_id), shuffle_lr, shuffle_ud), id); +// } +// } +// if (f(10) >= 8) +// _CREATE(BARRACKS, shuffle_loc(gen_loc(player_id), shuffle_lr, shuffle_ud), id); +// if (f(10) >= 5) +// _CREATE(MELEE_ATTACKER, shuffle_loc(gen_loc(player_id), shuffle_lr, shuffle_ud), id); +// if (f(10) >= 5) +// _CREATE(RANGE_ATTACKER, shuffle_loc(gen_loc(player_id), shuffle_lr, shuffle_ud), id); +// } +// return true; +// } + #undef _CHANGE_RES #undef _CREATE diff --git a/rts/game_MC/gamedef.cc b/rts/game_MC/gamedef.cc index fa1b5f02..67e16b40 100755 --- a/rts/game_MC/gamedef.cc +++ b/rts/game_MC/gamedef.cc @@ -79,18 +79,18 @@ void GameDef::Init() { * */ _units[RESOURCE] = _C(0, 1000, 1000, 0, 0, 0, 0, vector{0, 0, 0, 0}, vector{}, ATTR_INVULNERABLE); _units[WORKER] = _C(50, 50, 0, 0.1, 2, 1, 1, vector{0, 10, 40, 40}, vector{MOVE, ATTACK, BUILD, GATHER}); - _units[MELEE_ATTACKER] = _C(50, 100, 1, 0.1, 15, 5, 0, vector{0, 15, 0, 0}, vector{ ATTACK}); - _units[RANGE_ATTACKER] = _C(100, 50, 0, 0.2, 10, 0, 4, vector{0, 10, 0, 0}, vector{MOVE, ATTACK}); + _units[MELEE_ATTACKER] = _C(50, 100, 1, 0.1, 15, 3, 0, vector{0, 15, 0, 0}, vector{MOVE,ATTACK}); + _units[RANGE_ATTACKER] = _C(100, 50, 0, 0.2, 0, 0, 4, vector{0, 0, 0, 0}, vector{MOVE}); _units[BARRACKS] = _C(200, 200, 1, 0.0, 0, 0, 2, vector{0, 0, 0, 50}, vector{BUILD}); - _units[BASE] = _C(500, 500, 2, 0.0, 0, 0, 2, {0, 0, 0, 50}, vector{BUILD}); + _units[BASE] = _C(500, 500, 2, 0.0, 0, 0, 1, {0, 0, 0, 50}, vector{BUILD}); } vector > GameDef::GetInitCmds(const RTSGameOptions&) const{ vector > init_cmds; - init_cmds.push_back(make_pair(CmdBPtr(new CmdGenerateMap(INVALID, 0, 200)), 1)); - init_cmds.push_back(make_pair(CmdBPtr(new CmdGenerateUnit(INVALID)), 2)); + init_cmds.push_back(make_pair(CmdBPtr(new CmdGenerateMap(INVALID, 0, 0)), 1)); // 障碍 资源 + init_cmds.push_back(make_pair(CmdBPtr(new CmdGenerateUnit(INVALID)), 2)); return init_cmds; } From 5dfea491428744052793d01ef7d9cb3d441e72ad Mon Sep 17 00:00:00 2001 From: wujie199 <403731462@qq.com> Date: Mon, 28 Dec 2020 10:12:32 +0800 Subject: [PATCH 05/24] edit js --- rts/frontend/game.js | 282 +++++++++++++++++++++++++++++-------------- 1 file changed, 193 insertions(+), 89 deletions(-) diff --git a/rts/frontend/game.js b/rts/frontend/game.js index 1e6b5604..0d21ba9b 100644 --- a/rts/frontend/game.js +++ b/rts/frontend/game.js @@ -6,19 +6,22 @@ * LICENSE file in the root directory of this source tree. */ -// Create the canvas +// 创建画布,仅仅是容器,需要调用脚本来执行绘图 var canvas = document.createElement("canvas"); +// 获得绘图环境,在该函数下绘图 var ctx = canvas.getContext("2d"); -canvas.width = 1400; -canvas.height = 1000; +canvas.width = 10700; // 1400 +canvas.height = 10500; //1000 var left_frame_width = 1000; -var cell_size = 50; -var rect_size = 50; -var unit_size = 32; +var cell_size = 30; // 50 +var rect_size = 30; // 50 +var unit_size = 32; // 32 var cell_colors = ['#404040', 'blue', 'black']; -var player_colors = ['blue', 'red', 'yellow'] +var player_colors = ['blue', 'red', 'yellow']; -var unit_names_minirts = ["RESOURCE", "WORKER", "MELEE_ATTACKER", "RANGE_ATTACKER", "BARRACKS", "BASE"]; +// 不同游戏的单位名称 +// var unit_names_minirts = ["RESOURCE", "WORKER", "MELEE_ATTACKER", "RANGE_ATTACKER", "BARRACKS", "BASE"]; +var unit_names_minirts = [["RESOURCE", "WORKER", "MELEE_ATTACKER1", "RANGE_ATTACKER1", "BARRACKS", "BASE"],["RESOURCE", "WORKER", "MELEE_ATTACKER2", "RANGE_ATTACKER2", "BARRACKS", "BASE"]]; var unit_names_flag = ["FLAG_BASE", "FLAG_ATHLETE", "FLAG"]; var unit_names_td = ["BASE", "WORKER", "RANGE_ATTACKER"]; var x_down = null; @@ -33,6 +36,7 @@ var speed = 0; var min_speed = -10; var max_speed = 5; +// FPS 进度条 var range2 = document.createElement("INPUT"); range2.type = "range"; range2.min = min_speed; @@ -60,8 +64,9 @@ range2.oninput = function(){ } } -document.body.appendChild(range2); +// document.body.appendChild(range2); +// 按钮 var addButton = function(text, cmd) { var button = document.createElement("button"); button.innerHTML = text; @@ -94,11 +99,13 @@ var addButton = function(text, cmd) { }); }; -addButton("Faster", "F"); -addButton("Slower", "W"); -addButton("Cycle", "C"); -addButton("Pause", "P"); +// 添加几个按键 +// addButton("Faster", "F"); +// addButton("Slower", "W"); +// addButton("Cycle", "C"); +// addButton("Pause", "P"); +// 第二个进度条 var range1 = document.createElement("INPUT"); range1.type = "range"; range1.min = 0; @@ -114,34 +121,42 @@ range1.style.height = "30px"; range1.oninput = function(){ send_cmd(tick + ' S ' + this.value); } -document.body.appendChild(range1); +// document.body.appendChild(range1); document.body.appendChild(canvas); +// 所有的 send_cmd 都通过此方法将数据发送到服务器 var send_cmd = function(s) { + //console.log("send_cmd----------------------"); + // 向后台发送命令 dealer.send(s); }; +// 单击右键执行 f canvas.oncontextmenu = function (e) { e.preventDefault(); }; +// 键盘按下 document.addEventListener("keydown", function (e) { send_cmd(tick + ' ' + e.key); }, false); +// 鼠标按下 canvas.addEventListener("mousedown", function (e) { if (e.button === 0) { var xy0 = convert_xy_back(e.pageX, e.pageY); - if (xy0[0] > 20 || xy0[1] > 20) return; + // console.log(xy0); + if (xy0[0] >350 || xy0[1] > 350) return; x_down = e.pageX; y_down = e.pageY; } }, false); +// 鼠标松开 canvas.addEventListener("mouseup", function (e) { var xy0 = convert_xy_back(e.pageX, e.pageY); - if (xy0[0] > 20 || xy0[1] > 20) return; + if (xy0[0] > 350 || xy0[1] > 350) return; if (e.button === 0) { var xy = convert_xy_back(x_down, y_down); if (dragging && x_down && y_down) { @@ -158,6 +173,7 @@ canvas.addEventListener("mouseup", function (e) { } }, false); +// 鼠标移动 canvas.addEventListener("mousemove", function (e) { if (x_down && y_down) { x_curr = e.pageX; @@ -168,21 +184,23 @@ canvas.addEventListener("mousemove", function (e) { } }, false); - +// game.rts_map var onMap = function(m) { + // 一帧是400,counter 最多是 400 var counter = 0; for (y = 0; y < m.height; y++) { for (x = 0; x < m.width; x++){ - var color = cell_colors[m.slots[counter]]; - var x1 = x * cell_size; - var y1 = y * cell_size; + // 战争迷雾 m.slots 是一个 400个数字的矩阵,每个数字对应不同的颜色,用来显示战争迷雾 + var color = cell_colors[m.slots[counter]]; // counter = 0 m.slots = #404040 + var x1 = x * cell_size; // 一个格子的长是 50 + var y1 = y * cell_size; // 宽 50 ctx.beginPath(); ctx.fillStyle = color; - ctx.lineWidth = 1; - ctx.rect(x1, y1, rect_size, rect_size); - ctx.strokeStyle = 'black'; - ctx.stroke(); - ctx.fillRect(x1, y1, rect_size, rect_size); + ctx.lineWidth = 1; // 格子之间的线宽 1 + ctx.rect(x1, y1, rect_size, rect_size); // 在位置 x1,y2 处 创建 长 宽 为 rect_size 的矩形 + ctx.strokeStyle = 'black'; // 矩形 用 black 填充 + ctx.stroke(); // 将上述定义绘制出来 + ctx.fillRect(x1, y1, rect_size, rect_size); // 绘制已填色的矩形 ctx.closePath(); counter += 1; } @@ -200,17 +218,24 @@ var draw_hp = function(bbox, states, font_color, player_color){ var margin = 2; ctx.fillStyle = 'black'; ctx.lineWidth = margin; + // 开始一条路径 ctx.beginPath(); + // 绘制一个矩阵 ctx.rect(x1, y1, x2 - x1, y2 - y1); ctx.fillRect(x1, y1, x2 - x1, y2 - y1); + // 血条边框颜色 ctx.strokeStyle = player_color; + // 前面的都是设置,绘图在此处 ctx.stroke(); ctx.closePath(); + // 控制血条颜色 var color = 'green'; if (hp_ratio <= 0.5) color = 'yellow'; if (hp_ratio <= 0.2) color = 'red'; ctx.fillStyle = color; ctx.fillRect(x1, y1, Math.floor((x2 - x1) * hp_ratio + 0.5), y2 - y1); + + // 如果单位有名字,则显示名字 if (state_str){ ctx.beginPath(); ctx.fillStyle = font_color; @@ -220,14 +245,17 @@ var draw_hp = function(bbox, states, font_color, player_color){ } } +// 单位的绘制实现 isSelected 是否被选中 u 是 unit var onUnit = function(u, isSelected) { - var player_color = player_colors[u.player_id]; - var p = u.p; - var last_p = u.last_p; - var diffx = p.x - last_p.x; + // 玩家血条边框颜色 + var player_color = player_colors[u.player_id]; // unit 内部的 player_id,用于区分单位是哪一方的 + var p = u.p; // 单位此刻的位置 + var last_p = u.last_p; // 上一刻的位置 + var diffx = p.x - last_p.x; // 用于判断使用哪种图片 var diffy = p.y - last_p.y; - var ori = "down"; - if (Math.abs(diffx) > Math.abs(diffy)) { + var ori = "down"; // 默认 向下 + // 绘制方向 + if (Math.abs(diffx) > Math.abs(diffy)) { // x 的改变 比 y 的大,优先向左或者向右 if (diffx >= 0) { ori = "right"; } else { @@ -241,13 +269,16 @@ var onUnit = function(u, isSelected) { } } var xy = convert_xy(p.x, p.y); + // 绘制各种单位的图片 + // u.player_id 判断绘制哪种图片 + draw_sprites(sprites[unit_names_minirts[u.player_id][u.unit_type]], xy[0], xy[1], ori); // u.unit_type 给数据,unit_names_minirts选择图片类型,sprites 选择对应地址,draw_sprites 加载图片 - draw_sprites(sprites[unit_names_minirts[u.unit_type]], xy[0], xy[1], ori); - - var hp_ratio = u.hp / u.max_hp; + var hp_ratio = u.hp / u.max_hp; // 掉血的比例 var state_str; + // 都执行 if ("cmd" in u) { if (u.cmd.cmd[0] != 'I') { + // 农民的名字 G1 G0 state_str = u.cmd.cmd[0] + u.cmd.state; } } @@ -255,6 +286,7 @@ var onUnit = function(u, isSelected) { var y1 = xy[1] - 27; var x2 = x1 + unit_size; var y2 = y1 + 5; + // 绘制血条。后两个参数:字体颜色、血条边框颜色 draw_hp([x1, y1, x2, y2], [hp_ratio, state_str], 'white', player_color); if (isSelected) { ctx.lineWidth = 2; @@ -266,11 +298,14 @@ var onUnit = function(u, isSelected) { } }; +// 绘制子弹 var onBullet = function(bullet) { var xy = convert_xy(bullet.p.x, bullet.p.y); + // 加载子弹图片 draw_sprites(bullets, xy[0], xy[1], bullet.state); } +// 显示 玩家资源的 文本信息 var onPlayerStats = function(player) { if (player.player_id == 2) { unit_names_minirts = unit_names_flag; @@ -285,21 +320,23 @@ var onPlayerStats = function(player) { ctx.closePath(); } -// Draw units that have been seen. +// 玩家视角 +// 该函数并未真正执行,进入该函数是为了从下一帧画面开始,接受某个玩家传来的信息 var onPlayerSeenUnits = function(m) { if ("units" in m) { + // 未执行 var oldAlpha = ctx.globalAlpha; ctx.globalAlpha = 0.3; for (var i in m.units) { onUnit(m.units[i], false); } - // console.log(m.units.length) ctx.globalAlpha = oldAlpha; } } +// 空白出显示游戏单位状态 var draw_state = function(u) { var x1 = left_frame_width + 10; var y1 = 150; @@ -339,7 +376,7 @@ var convert_xy_back = function(x, y){ }; var load_sprites = function(spec) { - // Default behavior. + // 默认行为 var specReady = false; var specImage = new Image(); specImage.onload = function () { @@ -350,22 +387,25 @@ var load_sprites = function(spec) { return spec; }; -var draw_sprites = function(spec, px, py, ori) { +// 绘制图片函数 +var draw_sprites = function(spec, px, py, ori) { // 图片 、 var image = spec["image"] var width = image.width; var height = image.height; - if (!("_sizes" in spec)) { - ctx.drawImage(image, px - width / 2, py - height / 2); + if (!("_sizes" in spec)) { // 判断是否需要对图片进行切割 + ctx.drawImage(image, px - width / 2, py - height / 2); // 图片,在画布上放的位置的x,y坐标 } else { - var sw = spec["_sizes"][0]; - var sh = spec["_sizes"][1]; + // 需要对图像进行切割 + var sw = spec["_sizes"][0]; // 原图像的宽度 + var sh = spec["_sizes"][1]; // 原图像的高度 var nw = Math.floor(width / sw); var nh = Math.floor(height/ sh); var xidx = spec[ori][0]; - var yidx = spec[ori][1]; - var cx = xidx[Math.floor(tick / 3) % xidx.length] * sw; - var cy = yidx[Math.floor(tick / 3) % yidx.length] * sh; - ctx.drawImage(image, cx, cy, sw, sh, px - sw / 2, py - sh / 2, sw, sh); + var yidx = spec[ori][1]; // + var cx = xidx[Math.floor(tick / 3) % xidx.length] * sw; // 开始剪切的x坐标 + var cy = yidx[Math.floor(tick / 3) % yidx.length] * sh; // 开始剪切的y坐标 + // px - sw / 2, py - sh / 2 代表图像在画布上的 x y 坐标 + ctx.drawImage(image, cx, cy, sw, sh, px - sw / 2, py - sh / 2, sw, sh); // 剪切图像,并在画布上定位被剪切的部分 } }; @@ -374,10 +414,44 @@ var myrange = function (j, k){ return Array.from(new Array(n), (x,i) => i + j); }; -// load pics +// 加载图片 var sprites = {}; -sprites["RANGE_ATTACKER"] = load_sprites({ +// sprites["RANGE_ATTACKER"] = load_sprites({ +// "up" : [myrange(15, 22), [0]], +// "down": [myrange(15, 22), [1]], +// "left": [[16], myrange(2, 9)], +// "right": [[15], myrange(2, 9)], +// "_file" : "imgs/tiles.png", +// "_sizes" : [32, 32] +// }); + +// sprites["MELEE_ATTACKER"] = load_sprites({ +// "up" : [myrange(15, 22), [9]], +// "down": [myrange(15, 22), [10]], +// "left": [[20], myrange(2, 9)], +// "right": [[21], myrange(2, 9)], +// "_file" : "imgs/tiles.png", +// "_sizes" : [32, 32] +// }); +sprites["RANGE_ATTACKER1"] = load_sprites({ + "up" : [myrange(15, 22), [0]], + "down": [myrange(15, 22), [1]], + "left": [[16], myrange(2, 9)], + "right": [[15], myrange(2, 9)], + "_file" : "imgs/tile11.png", + "_sizes" : [32, 32] +}); + +sprites["MELEE_ATTACKER1"] = load_sprites({ + "up" : [myrange(15, 22), [9]], + "down": [myrange(15, 22), [10]], + "left": [[20], myrange(2, 9)], + "right": [[21], myrange(2, 9)], + "_file" : "imgs/tile11.png", + "_sizes" : [32, 32] +}); +sprites["RANGE_ATTACKER2"] = load_sprites({ "up" : [myrange(15, 22), [0]], "down": [myrange(15, 22), [1]], "left": [[16], myrange(2, 9)], @@ -386,7 +460,7 @@ sprites["RANGE_ATTACKER"] = load_sprites({ "_sizes" : [32, 32] }); -sprites["MELEE_ATTACKER"] = load_sprites({ +sprites["MELEE_ATTACKER2"] = load_sprites({ "up" : [myrange(15, 22), [9]], "down": [myrange(15, 22), [10]], "left": [[20], myrange(2, 9)], @@ -395,18 +469,20 @@ sprites["MELEE_ATTACKER"] = load_sprites({ "_sizes" : [32, 32] }); +// 资源 sprites["RESOURCE"] = load_sprites({ "_file" : "imgs/mineral1.png", }); - +// 基地 sprites["BASE"] = load_sprites({ "_file" : "imgs/base.png" }); - +// 兵营 sprites["BARRACKS"] = load_sprites({ "_file" : "imgs/barracks.png", }); +// 未执行 var targets = load_sprites({ "attack" : [[11], [6]], "move" : [[14], [6]], @@ -423,9 +499,10 @@ sprites["WORKER"] = load_sprites({ "_sizes" : [32, 32] }); +// 子弹 var bullets = load_sprites({ - "BULLET_READY" : [[7], [0]], - "BULLET_EXPLODE1" : [[0], [0]], + "BULLET_READY" : [[7], [0]], // 子弹类型 + "BULLET_EXPLODE1" : [[0], [0]], // 三种状态 "BULLET_EXPLODE2" : [[1], [0]], "BULLET_EXPLODE3": [[2], [0]], "_file" : "imgs/tiles.png", @@ -451,36 +528,46 @@ sprites["FLAG_BASE"] = load_sprites({ }); +// 渲染 +// 每一次数据都渲染一次 var render = function (game) { tick = game.tick; - ctx.beginPath() - ctx.fillStyle = "Black"; - ctx.font = "15px Arial"; - var label = "Tick: " + tick; - ctx.fillText(label, left_frame_width + 10, 20); - ctx.closePath(); + // Tick + // ctx.beginPath() + // ctx.fillStyle = "Black"; + // ctx.font = "15px Arial"; + // var label = "Tick: " + tick; + // // tick 位置 + // ctx.fillText(label, left_frame_width + 10, 20); + // ctx.closePath(); + + // 加载地图 onMap(game.rts_map); - if (! game.spectator) { + if (! game.spectator) { // game.spectator = true + // 切换成玩家视角 + // rts_map 信息变为某个玩家传来的,下一帧画面生效 onPlayerSeenUnits(game.rts_map); } var all_units = {}; var selected = {}; - for (var i in game.players) { - onPlayerStats(game.players[i]); + for (var i in game.players) { // 两个字典,{player_id: 0; resource: 0} + onPlayerStats(game.players[i]); // {player_id: 1; resource: 0} {player_id: 0; resource: 0} } - for (var i in game.units) { + for (var i in game.units) { // 基地,坦克,兵,资源 的信息 var unit = game.units[i]; all_units[unit.id] = unit; - var s_units = game.selected_units; - var isSelected = (s_units && s_units.indexOf(unit.id) >= 0); + var s_units = game.selected_units; // 选中后执行 + var isSelected = (s_units && s_units.indexOf(unit.id) >= 0); if (isSelected) { selected[unit.id] = unit; } - + + // 绘制 game.units 信息 onUnit(unit, isSelected); } + // 用鼠标圈单位的时候执行 if (dragging && x_down && y_down) { ctx.lineWidth = 2; ctx.beginPath(); @@ -489,46 +576,63 @@ var render = function (game) { ctx.stroke(); ctx.closePath(); } + + // 显示子弹 for (var i in game.bullets) { + // console.log(game.bullets[i]); onBullet(game.bullets[i]); } - var len = Object.keys(selected).length; - if (len == 1) { - var idx = Object.keys(selected)[0]; - var unit = selected[idx]; - draw_state(unit); - } - ctx.beginPath(); - ctx.fillStyle = "Black"; - ctx.font = "15px Arial"; - if (len > 1) { - var label = len + " units"; - ctx.fillText(label ,left_frame_width + 50, 200); - } - var label = "Current FPS is " + Math.floor(50 * Math.pow(1.3, speed)); - ctx.fillText(label, left_frame_width + 50, 570); - if (game.replay_length) { - range1.value = 100 * game.tick / game.replay_length; - } - - var label = "Current progress_percent is " + range1.value; - ctx.fillText(label, left_frame_width + 50, 670); - ctx.closePath(); + var len = Object.keys(selected).length; // 选中几个单位 + // 选中某单位时,空白处显示当前选择单位的状态 + // if (len == 1) { + // var idx = Object.keys(selected)[0]; // 选中的单位的编号 + // var unit = selected[idx]; + // // console.log(unit); // 获取选中的单位的所有属性 + // draw_state(unit); // 在右边空白出显示具体信息 + // } + // ctx.beginPath(); + // ctx.fillStyle = "Black"; + // ctx.font = "15px Arial"; + // // 选中多个单位时,空白处显示 len + " units" + // if (len > 1) { + // var label = len + " units"; + // ctx.fillText(label ,left_frame_width + 50, 200); + // } + // var label = "Current FPS is " + Math.floor(50 * Math.pow(1.3, speed)); + // ctx.fillText(label, left_frame_width + 50, 570); + // if (game.replay_length) { + // range1.value = 100 * game.tick / game.replay_length; + // } + + // var label = "Current progress_percent is " + range1.value; + // ctx.fillText(label, left_frame_width + 50, 670); + // ctx.closePath(); }; + var main = function () { + // 建立连接 dealer = new WebSocket('ws://localhost:8000'); + // 连接建立成功调用的方法 dealer.onopen = function(event) { + // 连接成功后输出 console.log("WS Opened."); } + // 当收到来自服务器的消息时,被调用 dealer.onmessage = function (message) { - var s = message.data; + // message 是 HTTP所有的信息 + // s 是游戏中的所有信息 + var s = message.data; + // 将 s 转换为 json 存储在 game 中 var game = JSON.parse(s); + //console.log(game); + // 在画布内清空一个矩阵,用于渲染游戏 ctx.clearRect(0, 0, canvas.width, canvas.height); render(game); }; }; var then = Date.now(); +// 开始 main(); From 3f3592593dbc391c3bcbcf05680f0821032d48c0 Mon Sep 17 00:00:00 2001 From: bc <729078846@qq.com> Date: Mon, 28 Dec 2020 11:19:52 +0800 Subject: [PATCH 06/24] edit InitMap --- rts/backend/main_loop.cc | 3 + rts/engine/game.cc | 1 + rts/engine/game_env.cc | 3 + rts/engine/game_env.h | 1 + rts/engine/game_state.cc | 4 +- rts/engine/map.cc | 16 +- rts/engine/player.cc | 0 rts/engine/player.h | 2 +- rts/engine/python_common_options.h | 0 rts/frontend/game.js | 285 ++++++++++++++++++++--------- rts/game_MC/cmd_specific.cc | 18 +- rts/game_MC/python_wrapper.cc | 5 +- rts/game_MC/wrapper_callback.cc | 2 +- rts/game_MC/wrapper_callback.h | 2 +- 14 files changed, 232 insertions(+), 110 deletions(-) mode change 100644 => 100755 rts/backend/main_loop.cc mode change 100644 => 100755 rts/engine/game_env.h mode change 100644 => 100755 rts/engine/player.cc mode change 100644 => 100755 rts/engine/player.h mode change 100644 => 100755 rts/engine/python_common_options.h mode change 100644 => 100755 rts/frontend/game.js diff --git a/rts/backend/main_loop.cc b/rts/backend/main_loop.cc old mode 100644 new mode 100755 index 139c8402..ef62ac15 --- a/rts/backend/main_loop.cc +++ b/rts/backend/main_loop.cc @@ -435,7 +435,9 @@ int main(int argc, char *argv[]) { p.stop(true); std::cout << gstats.PrintInfo() << std::endl; } else { + std::cout<<"======RTSStateExtend===="< duration = chrono::system_clock::now() - time_start; cout << "Total time spent = " << duration.count() << "s" << endl; + std::cout<<"======MainLoop======="<(new RTSMap()); + std::cout<<"-------GameEnv-----------"<ClearMap(); _next_unit_id = 0; _winner_id = INVALID; diff --git a/rts/engine/game_env.h b/rts/engine/game_env.h old mode 100644 new mode 100755 index cfdb9584..186643e4 --- a/rts/engine/game_env.h +++ b/rts/engine/game_env.h @@ -89,6 +89,7 @@ class GameEnv { // Initialize different units for this game. void InitGameDef() { + std::cout<<"----------InitGameDef-------"<& f, int *x1, int *y1, int *x2, int *y2, int i) const { + // std::cout<<"find_two_nearby_empty_slots"<& f) { bool RTSMap::GenerateMap(const std::function& f, int nImpassable, int num_player, int init_resource) { // load a map for now simple format. bool success; - std::cout<<"GenerateMap nImpassable = "< 20 || xy0[1] > 20) return; + // console.log(xy0); + if (xy0[0] >350 || xy0[1] > 350) return; x_down = e.pageX; y_down = e.pageY; } }, false); +// 鼠标松开 canvas.addEventListener("mouseup", function (e) { var xy0 = convert_xy_back(e.pageX, e.pageY); - if (xy0[0] > 20 || xy0[1] > 20) return; + if (xy0[0] > 350 || xy0[1] > 350) return; if (e.button === 0) { var xy = convert_xy_back(x_down, y_down); if (dragging && x_down && y_down) { @@ -158,6 +172,7 @@ canvas.addEventListener("mouseup", function (e) { } }, false); +// 鼠标移动 canvas.addEventListener("mousemove", function (e) { if (x_down && y_down) { x_curr = e.pageX; @@ -168,21 +183,23 @@ canvas.addEventListener("mousemove", function (e) { } }, false); - +// game.rts_map var onMap = function(m) { + // 一帧是400,counter 最多是 400 var counter = 0; for (y = 0; y < m.height; y++) { for (x = 0; x < m.width; x++){ - var color = cell_colors[m.slots[counter]]; - var x1 = x * cell_size; - var y1 = y * cell_size; + // 战争迷雾 m.slots 是一个 400个数字的矩阵,每个数字对应不同的颜色,用来显示战争迷雾 + var color = cell_colors[m.slots[counter]]; // counter = 0 m.slots = #404040 + var x1 = x * cell_size; // 一个格子的长是 50 + var y1 = y * cell_size; // 宽 50 ctx.beginPath(); ctx.fillStyle = color; - ctx.lineWidth = 1; - ctx.rect(x1, y1, rect_size, rect_size); - ctx.strokeStyle = 'black'; - ctx.stroke(); - ctx.fillRect(x1, y1, rect_size, rect_size); + ctx.lineWidth = 1; // 格子之间的线宽 1 + ctx.rect(x1, y1, rect_size, rect_size); // 在位置 x1,y2 处 创建 长 宽 为 rect_size 的矩形 + ctx.strokeStyle = 'black'; // 矩形 用 black 填充 + ctx.stroke(); // 将上述定义绘制出来 + ctx.fillRect(x1, y1, rect_size, rect_size); // 绘制已填色的矩形 ctx.closePath(); counter += 1; } @@ -200,17 +217,24 @@ var draw_hp = function(bbox, states, font_color, player_color){ var margin = 2; ctx.fillStyle = 'black'; ctx.lineWidth = margin; + // 开始一条路径 ctx.beginPath(); + // 绘制一个矩阵 ctx.rect(x1, y1, x2 - x1, y2 - y1); ctx.fillRect(x1, y1, x2 - x1, y2 - y1); + // 血条边框颜色 ctx.strokeStyle = player_color; + // 前面的都是设置,绘图在此处 ctx.stroke(); ctx.closePath(); + // 控制血条颜色 var color = 'green'; if (hp_ratio <= 0.5) color = 'yellow'; if (hp_ratio <= 0.2) color = 'red'; ctx.fillStyle = color; ctx.fillRect(x1, y1, Math.floor((x2 - x1) * hp_ratio + 0.5), y2 - y1); + + // 如果单位有名字,则显示名字 if (state_str){ ctx.beginPath(); ctx.fillStyle = font_color; @@ -220,14 +244,17 @@ var draw_hp = function(bbox, states, font_color, player_color){ } } +// 单位的绘制实现 isSelected 是否被选中 u 是 unit var onUnit = function(u, isSelected) { - var player_color = player_colors[u.player_id]; - var p = u.p; - var last_p = u.last_p; - var diffx = p.x - last_p.x; + // 玩家血条边框颜色 + var player_color = player_colors[u.player_id]; // unit 内部的 player_id,用于区分单位是哪一方的 + var p = u.p; // 单位此刻的位置 + var last_p = u.last_p; // 上一刻的位置 + var diffx = p.x - last_p.x; // 用于判断使用哪种图片 var diffy = p.y - last_p.y; - var ori = "down"; - if (Math.abs(diffx) > Math.abs(diffy)) { + var ori = "down"; // 默认 向下 + // 绘制方向 + if (Math.abs(diffx) > Math.abs(diffy)) { // x 的改变 比 y 的大,优先向左或者向右 if (diffx >= 0) { ori = "right"; } else { @@ -241,13 +268,16 @@ var onUnit = function(u, isSelected) { } } var xy = convert_xy(p.x, p.y); + // 绘制各种单位的图片 + // u.player_id 判断绘制哪种图片 + draw_sprites(sprites[unit_names_minirts[u.player_id][u.unit_type]], xy[0], xy[1], ori); // u.unit_type 给数据,unit_names_minirts选择图片类型,sprites 选择对应地址,draw_sprites 加载图片 - draw_sprites(sprites[unit_names_minirts[u.unit_type]], xy[0], xy[1], ori); - - var hp_ratio = u.hp / u.max_hp; + var hp_ratio = u.hp / u.max_hp; // 掉血的比例 var state_str; + // 都执行 if ("cmd" in u) { if (u.cmd.cmd[0] != 'I') { + // 农民的名字 G1 G0 state_str = u.cmd.cmd[0] + u.cmd.state; } } @@ -255,6 +285,7 @@ var onUnit = function(u, isSelected) { var y1 = xy[1] - 27; var x2 = x1 + unit_size; var y2 = y1 + 5; + // 绘制血条。后两个参数:字体颜色、血条边框颜色 draw_hp([x1, y1, x2, y2], [hp_ratio, state_str], 'white', player_color); if (isSelected) { ctx.lineWidth = 2; @@ -266,11 +297,14 @@ var onUnit = function(u, isSelected) { } }; +// 绘制子弹 var onBullet = function(bullet) { var xy = convert_xy(bullet.p.x, bullet.p.y); + // 加载子弹图片 draw_sprites(bullets, xy[0], xy[1], bullet.state); } +// 显示 玩家资源的 文本信息 var onPlayerStats = function(player) { if (player.player_id == 2) { unit_names_minirts = unit_names_flag; @@ -285,21 +319,23 @@ var onPlayerStats = function(player) { ctx.closePath(); } -// Draw units that have been seen. +// 玩家视角 +// 该函数并未真正执行,进入该函数是为了从下一帧画面开始,接受某个玩家传来的信息 var onPlayerSeenUnits = function(m) { if ("units" in m) { + // 未执行 var oldAlpha = ctx.globalAlpha; ctx.globalAlpha = 0.3; for (var i in m.units) { onUnit(m.units[i], false); } - // console.log(m.units.length) ctx.globalAlpha = oldAlpha; } } +// 空白出显示游戏单位状态 var draw_state = function(u) { var x1 = left_frame_width + 10; var y1 = 150; @@ -339,7 +375,7 @@ var convert_xy_back = function(x, y){ }; var load_sprites = function(spec) { - // Default behavior. + // 默认行为 var specReady = false; var specImage = new Image(); specImage.onload = function () { @@ -350,22 +386,25 @@ var load_sprites = function(spec) { return spec; }; -var draw_sprites = function(spec, px, py, ori) { +// 绘制图片函数 +var draw_sprites = function(spec, px, py, ori) { // 图片 、 var image = spec["image"] var width = image.width; var height = image.height; - if (!("_sizes" in spec)) { - ctx.drawImage(image, px - width / 2, py - height / 2); + if (!("_sizes" in spec)) { // 判断是否需要对图片进行切割 + ctx.drawImage(image, px - width / 2, py - height / 2); // 图片,在画布上放的位置的x,y坐标 } else { - var sw = spec["_sizes"][0]; - var sh = spec["_sizes"][1]; + // 需要对图像进行切割 + var sw = spec["_sizes"][0]; // 原图像的宽度 + var sh = spec["_sizes"][1]; // 原图像的高度 var nw = Math.floor(width / sw); var nh = Math.floor(height/ sh); var xidx = spec[ori][0]; - var yidx = spec[ori][1]; - var cx = xidx[Math.floor(tick / 3) % xidx.length] * sw; - var cy = yidx[Math.floor(tick / 3) % yidx.length] * sh; - ctx.drawImage(image, cx, cy, sw, sh, px - sw / 2, py - sh / 2, sw, sh); + var yidx = spec[ori][1]; // + var cx = xidx[Math.floor(tick / 3) % xidx.length] * sw; // 开始剪切的x坐标 + var cy = yidx[Math.floor(tick / 3) % yidx.length] * sh; // 开始剪切的y坐标 + // px - sw / 2, py - sh / 2 代表图像在画布上的 x y 坐标 + ctx.drawImage(image, cx, cy, sw, sh, px - sw / 2, py - sh / 2, sw, sh); // 剪切图像,并在画布上定位被剪切的部分 } }; @@ -374,10 +413,44 @@ var myrange = function (j, k){ return Array.from(new Array(n), (x,i) => i + j); }; -// load pics +// 加载图片 var sprites = {}; -sprites["RANGE_ATTACKER"] = load_sprites({ +// sprites["RANGE_ATTACKER"] = load_sprites({ +// "up" : [myrange(15, 22), [0]], +// "down": [myrange(15, 22), [1]], +// "left": [[16], myrange(2, 9)], +// "right": [[15], myrange(2, 9)], +// "_file" : "imgs/tiles.png", +// "_sizes" : [32, 32] +// }); + +// sprites["MELEE_ATTACKER"] = load_sprites({ +// "up" : [myrange(15, 22), [9]], +// "down": [myrange(15, 22), [10]], +// "left": [[20], myrange(2, 9)], +// "right": [[21], myrange(2, 9)], +// "_file" : "imgs/tiles.png", +// "_sizes" : [32, 32] +// }); +sprites["RANGE_ATTACKER1"] = load_sprites({ + "up" : [myrange(15, 22), [0]], + "down": [myrange(15, 22), [1]], + "left": [[16], myrange(2, 9)], + "right": [[15], myrange(2, 9)], + "_file" : "imgs/tile11.png", + "_sizes" : [32, 32] +}); + +sprites["MELEE_ATTACKER1"] = load_sprites({ + "up" : [myrange(15, 22), [9]], + "down": [myrange(15, 22), [10]], + "left": [[20], myrange(2, 9)], + "right": [[21], myrange(2, 9)], + "_file" : "imgs/tile11.png", + "_sizes" : [32, 32] +}); +sprites["RANGE_ATTACKER2"] = load_sprites({ "up" : [myrange(15, 22), [0]], "down": [myrange(15, 22), [1]], "left": [[16], myrange(2, 9)], @@ -386,7 +459,7 @@ sprites["RANGE_ATTACKER"] = load_sprites({ "_sizes" : [32, 32] }); -sprites["MELEE_ATTACKER"] = load_sprites({ +sprites["MELEE_ATTACKER2"] = load_sprites({ "up" : [myrange(15, 22), [9]], "down": [myrange(15, 22), [10]], "left": [[20], myrange(2, 9)], @@ -395,18 +468,20 @@ sprites["MELEE_ATTACKER"] = load_sprites({ "_sizes" : [32, 32] }); +// 资源 sprites["RESOURCE"] = load_sprites({ "_file" : "imgs/mineral1.png", }); - +// 基地 sprites["BASE"] = load_sprites({ "_file" : "imgs/base.png" }); - +// 兵营 sprites["BARRACKS"] = load_sprites({ "_file" : "imgs/barracks.png", }); +// 未执行 var targets = load_sprites({ "attack" : [[11], [6]], "move" : [[14], [6]], @@ -423,9 +498,10 @@ sprites["WORKER"] = load_sprites({ "_sizes" : [32, 32] }); +// 子弹 var bullets = load_sprites({ - "BULLET_READY" : [[7], [0]], - "BULLET_EXPLODE1" : [[0], [0]], + "BULLET_READY" : [[7], [0]], // 子弹类型 + "BULLET_EXPLODE1" : [[0], [0]], // 三种状态 "BULLET_EXPLODE2" : [[1], [0]], "BULLET_EXPLODE3": [[2], [0]], "_file" : "imgs/tiles.png", @@ -451,36 +527,46 @@ sprites["FLAG_BASE"] = load_sprites({ }); +// 渲染 +// 每一次数据都渲染一次 var render = function (game) { tick = game.tick; - ctx.beginPath() - ctx.fillStyle = "Black"; - ctx.font = "15px Arial"; - var label = "Tick: " + tick; - ctx.fillText(label, left_frame_width + 10, 20); - ctx.closePath(); + // Tick + // ctx.beginPath() + // ctx.fillStyle = "Black"; + // ctx.font = "15px Arial"; + // var label = "Tick: " + tick; + // // tick 位置 + // ctx.fillText(label, left_frame_width + 10, 20); + // ctx.closePath(); + + // 加载地图 onMap(game.rts_map); - if (! game.spectator) { + if (! game.spectator) { // game.spectator = true + // 切换成玩家视角 + // rts_map 信息变为某个玩家传来的,下一帧画面生效 onPlayerSeenUnits(game.rts_map); } var all_units = {}; var selected = {}; - for (var i in game.players) { - onPlayerStats(game.players[i]); + for (var i in game.players) { // 两个字典,{player_id: 0; resource: 0} + onPlayerStats(game.players[i]); // {player_id: 1; resource: 0} {player_id: 0; resource: 0} } - for (var i in game.units) { + for (var i in game.units) { // 基地,坦克,兵,资源 的信息 var unit = game.units[i]; all_units[unit.id] = unit; - var s_units = game.selected_units; - var isSelected = (s_units && s_units.indexOf(unit.id) >= 0); + var s_units = game.selected_units; // 选中后执行 + var isSelected = (s_units && s_units.indexOf(unit.id) >= 0); if (isSelected) { selected[unit.id] = unit; } - + + // 绘制 game.units 信息 onUnit(unit, isSelected); } + // 用鼠标圈单位的时候执行 if (dragging && x_down && y_down) { ctx.lineWidth = 2; ctx.beginPath(); @@ -489,46 +575,63 @@ var render = function (game) { ctx.stroke(); ctx.closePath(); } + + // 显示子弹 for (var i in game.bullets) { + // console.log(game.bullets[i]); onBullet(game.bullets[i]); } - var len = Object.keys(selected).length; - if (len == 1) { - var idx = Object.keys(selected)[0]; - var unit = selected[idx]; - draw_state(unit); - } - ctx.beginPath(); - ctx.fillStyle = "Black"; - ctx.font = "15px Arial"; - if (len > 1) { - var label = len + " units"; - ctx.fillText(label ,left_frame_width + 50, 200); - } - var label = "Current FPS is " + Math.floor(50 * Math.pow(1.3, speed)); - ctx.fillText(label, left_frame_width + 50, 570); - if (game.replay_length) { - range1.value = 100 * game.tick / game.replay_length; - } - - var label = "Current progress_percent is " + range1.value; - ctx.fillText(label, left_frame_width + 50, 670); - ctx.closePath(); + var len = Object.keys(selected).length; // 选中几个单位 + // 选中某单位时,空白处显示当前选择单位的状态 + // if (len == 1) { + // var idx = Object.keys(selected)[0]; // 选中的单位的编号 + // var unit = selected[idx]; + // // console.log(unit); // 获取选中的单位的所有属性 + // draw_state(unit); // 在右边空白出显示具体信息 + // } + // ctx.beginPath(); + // ctx.fillStyle = "Black"; + // ctx.font = "15px Arial"; + // // 选中多个单位时,空白处显示 len + " units" + // if (len > 1) { + // var label = len + " units"; + // ctx.fillText(label ,left_frame_width + 50, 200); + // } + // var label = "Current FPS is " + Math.floor(50 * Math.pow(1.3, speed)); + // ctx.fillText(label, left_frame_width + 50, 570); + // if (game.replay_length) { + // range1.value = 100 * game.tick / game.replay_length; + // } + + // var label = "Current progress_percent is " + range1.value; + // ctx.fillText(label, left_frame_width + 50, 670); + // ctx.closePath(); }; + var main = function () { + // 建立连接 dealer = new WebSocket('ws://localhost:8000'); + // 连接建立成功调用的方法 dealer.onopen = function(event) { + // 连接成功后输出 console.log("WS Opened."); } + // 当收到来自服务器的消息时,被调用 dealer.onmessage = function (message) { - var s = message.data; + // message 是 HTTP所有的信息 + // s 是游戏中的所有信息 + var s = message.data; + // 将 s 转换为 json 存储在 game 中 var game = JSON.parse(s); + //console.log(game); + // 在画布内清空一个矩阵,用于渲染游戏 ctx.clearRect(0, 0, canvas.width, canvas.height); render(game); }; }; var then = Date.now(); -main(); +// 开始 +main(); \ No newline at end of file diff --git a/rts/game_MC/cmd_specific.cc b/rts/game_MC/cmd_specific.cc index 12227169..8088557c 100755 --- a/rts/game_MC/cmd_specific.cc +++ b/rts/game_MC/cmd_specific.cc @@ -54,17 +54,17 @@ bool CmdGenerateUnit::run(GameEnv *env, CmdReceiver *receiver) { const PlayerId player_id = 0; const PlayerId enemy_id = 1; // 保护目标 - _CREATE(BASE, PointF(9.5, 9.5), player_id); + _CREATE(BASE, PointF(9, 9), player_id); // 雷达 - _CREATE(RANGE_ATTACKER,PointF(4,9.5),player_id); - _CREATE(RANGE_ATTACKER,PointF(15,9.5),player_id); - _CREATE(RANGE_ATTACKER,PointF(9.5,4),player_id); - _CREATE(RANGE_ATTACKER,PointF(9.5,15),player_id); + _CREATE(RANGE_ATTACKER,PointF(4,9),player_id); + _CREATE(RANGE_ATTACKER,PointF(15,9),player_id); + _CREATE(RANGE_ATTACKER,PointF(9,4),player_id); + _CREATE(RANGE_ATTACKER,PointF(9,15),player_id); // 炮台 - _CREATE(MELEE_ATTACKER,PointF(6,9.5),player_id); - _CREATE(MELEE_ATTACKER,PointF(13,9.5),player_id); - _CREATE(MELEE_ATTACKER,PointF(9.5,6),player_id); - _CREATE(MELEE_ATTACKER,PointF(9.5,13),player_id); + _CREATE(MELEE_ATTACKER,PointF(6,9),player_id); + _CREATE(MELEE_ATTACKER,PointF(13,9),player_id); + _CREATE(MELEE_ATTACKER,PointF(9,6),player_id); + _CREATE(MELEE_ATTACKER,PointF(9,13),player_id); // enemy _CREATE(BASE,PointF(1, 1),enemy_id); diff --git a/rts/game_MC/python_wrapper.cc b/rts/game_MC/python_wrapper.cc index 7b622edb..013453f5 100755 --- a/rts/game_MC/python_wrapper.cc +++ b/rts/game_MC/python_wrapper.cc @@ -43,9 +43,10 @@ class GameContext { std::cout<<"--------------GameContext Start-----------"<Start( [this](int game_idx, const ContextOptions &context_options, const PythonOptions &options, const elf::Signal &signal, Comm *comm) { - if(game_idx == 1) - std::cout<<"game_"<GetParams(); + if(game_idx == 1){ + std::cout<<"game_"<_wrapper.thread_main(game_idx, context_options, options, signal, ¶ms, comm); }); } diff --git a/rts/game_MC/wrapper_callback.cc b/rts/game_MC/wrapper_callback.cc index 13d7b26b..a6c5ece6 100755 --- a/rts/game_MC/wrapper_callback.cc +++ b/rts/game_MC/wrapper_callback.cc @@ -65,7 +65,7 @@ void WrapperCallbacks::OnGameOptions(RTSGameOptions *rts_options) { rts_options->handicap_level = _options.handicap_level; } -void WrapperCallbacks::OnGameInit(RTSGame *game, const std::map *more_params) { +void WrapperCallbacks::OnGameInit(RTSGame *game, const std::map *more_params,bool isPrint) { // std::cout << "Initialize opponent" << std::endl; std::vector ais; for (const AIOptions &ai_opt : _options.ai_options) { diff --git a/rts/game_MC/wrapper_callback.h b/rts/game_MC/wrapper_callback.h index d4f5fd20..0700c918 100755 --- a/rts/game_MC/wrapper_callback.h +++ b/rts/game_MC/wrapper_callback.h @@ -36,7 +36,7 @@ class WrapperCallbacks { } void OnGameOptions(RTSGameOptions *rts_options); - void OnGameInit(RTSGame *game, const std::map *more_params,bool isPrint); + void OnGameInit(RTSGame *game, const std::map *more_params,bool isPrint = false); void OnEpisodeStart(int k, std::mt19937 *rng, RTSGame *game); }; From 3f1a0eb1b8812135bba80b96041f913a3a6e49f8 Mon Sep 17 00:00:00 2001 From: wujie199 <403731462@qq.com> Date: Mon, 28 Dec 2020 15:47:03 +0800 Subject: [PATCH 07/24] js --- rts/frontend/game.js | 40 ++++++++++++++++++++-------------------- 1 file changed, 20 insertions(+), 20 deletions(-) diff --git a/rts/frontend/game.js b/rts/frontend/game.js index 961a0692..9c9adc1a 100755 --- a/rts/frontend/game.js +++ b/rts/frontend/game.js @@ -9,8 +9,8 @@ var canvas = document.createElement("canvas"); // 获得绘图环境,在该函数下绘图 var ctx = canvas.getContext("2d"); -canvas.width = 10700; // 1400 -canvas.height = 10500; //1000 +canvas.width = 1200; // 1400 +canvas.height = 1200; //1000 var left_frame_width = 1000; var cell_size = 30; // 50 var rect_size = 30; // 50 @@ -146,7 +146,7 @@ canvas.addEventListener("mousedown", function (e) { if (e.button === 0) { var xy0 = convert_xy_back(e.pageX, e.pageY); // console.log(xy0); - if (xy0[0] >350 || xy0[1] > 350) return; + if (xy0[0] >35 || xy0[1] > 35) return; x_down = e.pageX; y_down = e.pageY; } @@ -155,7 +155,7 @@ canvas.addEventListener("mousedown", function (e) { // 鼠标松开 canvas.addEventListener("mouseup", function (e) { var xy0 = convert_xy_back(e.pageX, e.pageY); - if (xy0[0] > 350 || xy0[1] > 350) return; + if (xy0[0] > 35 || xy0[1] > 35) return; if (e.button === 0) { var xy = convert_xy_back(x_down, y_down); if (dragging && x_down && y_down) { @@ -305,19 +305,19 @@ var onBullet = function(bullet) { } // 显示 玩家资源的 文本信息 -var onPlayerStats = function(player) { - if (player.player_id == 2) { - unit_names_minirts = unit_names_flag; - } - var x1 = left_frame_width + 10; - var y1 = (player.player_id + 1) * 50; - var label = ["PlayerId", player.player_id, "Resource", player.resource].join(" "); - ctx.beginPath() - ctx.fillStyle = "Black"; - ctx.font = "15px Arial"; - ctx.fillText(label, x1, y1); - ctx.closePath(); -} +// var onPlayerStats = function(player) { +// if (player.player_id == 2) { +// unit_names_minirts = unit_names_flag; +// } +// var x1 = left_frame_width + 10; +// var y1 = (player.player_id + 1) * 50; +// var label = ["PlayerId", player.player_id, "Resource", player.resource].join(" "); +// ctx.beginPath() +// ctx.fillStyle = "Black"; +// ctx.font = "15px Arial"; +// ctx.fillText(label, x1, y1); +// ctx.closePath(); +// } // 玩家视角 // 该函数并未真正执行,进入该函数是为了从下一帧画面开始,接受某个玩家传来的信息 @@ -550,9 +550,9 @@ var render = function (game) { var all_units = {}; var selected = {}; - for (var i in game.players) { // 两个字典,{player_id: 0; resource: 0} - onPlayerStats(game.players[i]); // {player_id: 1; resource: 0} {player_id: 0; resource: 0} - } + // for (var i in game.players) { // 两个字典,{player_id: 0; resource: 0} + // onPlayerStats(game.players[i]); // {player_id: 1; resource: 0} {player_id: 0; resource: 0} + // } for (var i in game.units) { // 基地,坦克,兵,资源 的信息 var unit = game.units[i]; all_units[unit.id] = unit; From 59a6abfc66a8773c6642dce08b6056d7f36b3fc7 Mon Sep 17 00:00:00 2001 From: bc <729078846@qq.com> Date: Mon, 28 Dec 2020 16:49:11 +0800 Subject: [PATCH 08/24] change FOW --- rts/engine/game_state.cc | 3 ++- rts/engine/map.cc | 8 +++++--- rts/frontend/game.js | 4 ---- rts/game_MC/cmd_specific.cc | 18 +++++++++--------- rts/game_MC/gamedef.cc | 10 +++++----- 5 files changed, 21 insertions(+), 22 deletions(-) diff --git a/rts/engine/game_state.cc b/rts/engine/game_state.cc index 3e2028d8..141ea835 100755 --- a/rts/engine/game_state.cc +++ b/rts/engine/game_state.cc @@ -19,7 +19,8 @@ RTSState::RTSState() { } void RTSState::AppendPlayer(const string &name) { - _env.AddPlayer(name, PV_KNOW_ALL); + //_env.AddPlayer(name, PV_KNOW_ALL); + _env.AddPlayer(name, PV_NORMAL); } void RTSState::RemoveLastPlayer() { diff --git a/rts/engine/map.cc b/rts/engine/map.cc index d6743080..f0fbe20c 100755 --- a/rts/engine/map.cc +++ b/rts/engine/map.cc @@ -162,8 +162,8 @@ void RTSMap::load_default_map() { // _level = 1; // _map.assign(_m * _n * _level, MapSlot()); - _m = 30; - _n = 30; + _m = 35; + _n = 35; _level = 1; _map.assign(_m * _n * _level, MapSlot()); @@ -220,7 +220,9 @@ vector RTSMap::GetSight(const Loc& loc, int range) const { const int xmax = std::min(_m - 1, c.x + range); for (int x = xmin; x <= xmax; ++x) { - const int yrange = range - std::abs(c.x - x); + //const int yrange = range - std::abs(c.x - x); + const int x_1 = std::abs(c.x - x); + const int yrange = std::sqrt(range*range - x_1*x_1); const int ymin = std::max(0, c.y - yrange); const int ymax = std::min(_n - 1, c.y + yrange); for (int y = ymin; y <= ymax; ++y) { diff --git a/rts/frontend/game.js b/rts/frontend/game.js index 9c9adc1a..7a847625 100755 --- a/rts/frontend/game.js +++ b/rts/frontend/game.js @@ -634,8 +634,4 @@ var main = function () { var then = Date.now(); // 开始 -<<<<<<< HEAD main(); -======= -main(); ->>>>>>> 3f3592593dbc391c3bcbcf05680f0821032d48c0 diff --git a/rts/game_MC/cmd_specific.cc b/rts/game_MC/cmd_specific.cc index 8088557c..ccb67b74 100755 --- a/rts/game_MC/cmd_specific.cc +++ b/rts/game_MC/cmd_specific.cc @@ -54,17 +54,17 @@ bool CmdGenerateUnit::run(GameEnv *env, CmdReceiver *receiver) { const PlayerId player_id = 0; const PlayerId enemy_id = 1; // 保护目标 - _CREATE(BASE, PointF(9, 9), player_id); + _CREATE(BASE, PointF(17, 17), player_id); // 雷达 - _CREATE(RANGE_ATTACKER,PointF(4,9),player_id); - _CREATE(RANGE_ATTACKER,PointF(15,9),player_id); - _CREATE(RANGE_ATTACKER,PointF(9,4),player_id); - _CREATE(RANGE_ATTACKER,PointF(9,15),player_id); + //_CREATE(RANGE_ATTACKER,PointF(4,17),player_id); + //_CREATE(RANGE_ATTACKER,PointF(15,17),player_id); + //_CREATE(RANGE_ATTACKER,PointF(17,4),player_id); + _CREATE(RANGE_ATTACKER,PointF(15,17),player_id); // 炮台 - _CREATE(MELEE_ATTACKER,PointF(6,9),player_id); - _CREATE(MELEE_ATTACKER,PointF(13,9),player_id); - _CREATE(MELEE_ATTACKER,PointF(9,6),player_id); - _CREATE(MELEE_ATTACKER,PointF(9,13),player_id); + //_CREATE(MELEE_ATTACKER,PointF(6,9),player_id); + // _CREATE(MELEE_ATTACKER,PointF(13,9),player_id); + // _CREATE(MELEE_ATTACKER,PointF(9,6),player_id); + _CREATE(MELEE_ATTACKER,PointF(19,17),player_id); // enemy _CREATE(BASE,PointF(1, 1),enemy_id); diff --git a/rts/game_MC/gamedef.cc b/rts/game_MC/gamedef.cc index 67e16b40..84bca09e 100755 --- a/rts/game_MC/gamedef.cc +++ b/rts/game_MC/gamedef.cc @@ -78,11 +78,11 @@ void GameDef::Init() { * * cost hp def sp att att_r vis_r * */ _units[RESOURCE] = _C(0, 1000, 1000, 0, 0, 0, 0, vector{0, 0, 0, 0}, vector{}, ATTR_INVULNERABLE); - _units[WORKER] = _C(50, 50, 0, 0.1, 2, 1, 1, vector{0, 10, 40, 40}, vector{MOVE, ATTACK, BUILD, GATHER}); - _units[MELEE_ATTACKER] = _C(50, 100, 1, 0.1, 15, 3, 0, vector{0, 15, 0, 0}, vector{MOVE,ATTACK}); - _units[RANGE_ATTACKER] = _C(100, 50, 0, 0.2, 0, 0, 4, vector{0, 0, 0, 0}, vector{MOVE}); - _units[BARRACKS] = _C(200, 200, 1, 0.0, 0, 0, 2, vector{0, 0, 0, 50}, vector{BUILD}); - _units[BASE] = _C(500, 500, 2, 0.0, 0, 0, 1, {0, 0, 0, 50}, vector{BUILD}); + _units[WORKER] = _C(50, 50, 0, 0.1, 2, 1, 0, vector{0, 10, 40, 40}, vector{MOVE, ATTACK, BUILD, GATHER}); + _units[MELEE_ATTACKER] = _C(50, 100, 1, 0.1, 15, 10, 0, vector{0, 15, 0, 0}, vector{MOVE,ATTACK}); + _units[RANGE_ATTACKER] = _C(100, 50, 0, 0.2, 0, 0, 15, vector{0, 0, 0, 0}, vector{MOVE}); + _units[BARRACKS] = _C(200, 200, 1, 0.0, 0, 0, 0, vector{0, 0, 0, 50}, vector{BUILD}); + _units[BASE] = _C(500, 500, 2, 0.0, 0, 0, 0, {0, 0, 0, 50}, vector{BUILD}); } From b430115f1c4df31c206a9d101840aa5af2b4252f Mon Sep 17 00:00:00 2001 From: wujie199 <403731462@qq.com> Date: Tue, 29 Dec 2020 09:00:25 +0800 Subject: [PATCH 09/24] JS --- rts/frontend/game.js | 79 +++++++++++++++++--------------------------- 1 file changed, 30 insertions(+), 49 deletions(-) diff --git a/rts/frontend/game.js b/rts/frontend/game.js index 9c9adc1a..3a2d6ddb 100755 --- a/rts/frontend/game.js +++ b/rts/frontend/game.js @@ -104,7 +104,7 @@ var addButton = function(text, cmd) { // addButton("Cycle", "C"); // addButton("Pause", "P"); -// 第二个进度条 + var range1 = document.createElement("INPUT"); range1.type = "range"; range1.min = 0; @@ -124,24 +124,22 @@ range1.oninput = function(){ document.body.appendChild(canvas); -// 所有的 send_cmd 都通过此方法将数据发送到服务器 + var send_cmd = function(s) { - //console.log("send_cmd----------------------"); - // 向后台发送命令 dealer.send(s); }; -// 单击右键执行 f + canvas.oncontextmenu = function (e) { e.preventDefault(); }; -// 键盘按下 + document.addEventListener("keydown", function (e) { send_cmd(tick + ' ' + e.key); }, false); -// 鼠标按下 + canvas.addEventListener("mousedown", function (e) { if (e.button === 0) { var xy0 = convert_xy_back(e.pageX, e.pageY); @@ -152,7 +150,7 @@ canvas.addEventListener("mousedown", function (e) { } }, false); -// 鼠标松开 + canvas.addEventListener("mouseup", function (e) { var xy0 = convert_xy_back(e.pageX, e.pageY); if (xy0[0] > 35 || xy0[1] > 35) return; @@ -172,7 +170,7 @@ canvas.addEventListener("mouseup", function (e) { } }, false); -// 鼠标移动 + canvas.addEventListener("mousemove", function (e) { if (x_down && y_down) { x_curr = e.pageX; @@ -185,21 +183,19 @@ canvas.addEventListener("mousemove", function (e) { // game.rts_map var onMap = function(m) { - // 一帧是400,counter 最多是 400 var counter = 0; for (y = 0; y < m.height; y++) { for (x = 0; x < m.width; x++){ - // 战争迷雾 m.slots 是一个 400个数字的矩阵,每个数字对应不同的颜色,用来显示战争迷雾 var color = cell_colors[m.slots[counter]]; // counter = 0 m.slots = #404040 var x1 = x * cell_size; // 一个格子的长是 50 var y1 = y * cell_size; // 宽 50 ctx.beginPath(); ctx.fillStyle = color; ctx.lineWidth = 1; // 格子之间的线宽 1 - ctx.rect(x1, y1, rect_size, rect_size); // 在位置 x1,y2 处 创建 长 宽 为 rect_size 的矩形 + ctx.rect(x1, y1, rect_size, rect_size); ctx.strokeStyle = 'black'; // 矩形 用 black 填充 - ctx.stroke(); // 将上述定义绘制出来 - ctx.fillRect(x1, y1, rect_size, rect_size); // 绘制已填色的矩形 + ctx.stroke(); + ctx.fillRect(x1, y1, rect_size, rect_size); ctx.closePath(); counter += 1; } @@ -222,12 +218,9 @@ var draw_hp = function(bbox, states, font_color, player_color){ // 绘制一个矩阵 ctx.rect(x1, y1, x2 - x1, y2 - y1); ctx.fillRect(x1, y1, x2 - x1, y2 - y1); - // 血条边框颜色 ctx.strokeStyle = player_color; - // 前面的都是设置,绘图在此处 ctx.stroke(); ctx.closePath(); - // 控制血条颜色 var color = 'green'; if (hp_ratio <= 0.5) color = 'yellow'; if (hp_ratio <= 0.2) color = 'red'; @@ -244,17 +237,15 @@ var draw_hp = function(bbox, states, font_color, player_color){ } } -// 单位的绘制实现 isSelected 是否被选中 u 是 unit +// 单位的绘制实现 var onUnit = function(u, isSelected) { - // 玩家血条边框颜色 var player_color = player_colors[u.player_id]; // unit 内部的 player_id,用于区分单位是哪一方的 var p = u.p; // 单位此刻的位置 var last_p = u.last_p; // 上一刻的位置 - var diffx = p.x - last_p.x; // 用于判断使用哪种图片 + var diffx = p.x - last_p.x; var diffy = p.y - last_p.y; - var ori = "down"; // 默认 向下 - // 绘制方向 - if (Math.abs(diffx) > Math.abs(diffy)) { // x 的改变 比 y 的大,优先向左或者向右 + var ori = "down"; + if (Math.abs(diffx) > Math.abs(diffy)) { if (diffx >= 0) { ori = "right"; } else { @@ -268,13 +259,11 @@ var onUnit = function(u, isSelected) { } } var xy = convert_xy(p.x, p.y); - // 绘制各种单位的图片 - // u.player_id 判断绘制哪种图片 - draw_sprites(sprites[unit_names_minirts[u.player_id][u.unit_type]], xy[0], xy[1], ori); // u.unit_type 给数据,unit_names_minirts选择图片类型,sprites 选择对应地址,draw_sprites 加载图片 + + draw_sprites(sprites[unit_names_minirts[u.player_id][u.unit_type]], xy[0], xy[1], ori); var hp_ratio = u.hp / u.max_hp; // 掉血的比例 var state_str; - // 都执行 if ("cmd" in u) { if (u.cmd.cmd[0] != 'I') { // 农民的名字 G1 G0 @@ -319,8 +308,7 @@ var onBullet = function(bullet) { // ctx.closePath(); // } -// 玩家视角 -// 该函数并未真正执行,进入该函数是为了从下一帧画面开始,接受某个玩家传来的信息 + var onPlayerSeenUnits = function(m) { if ("units" in m) { // 未执行 @@ -391,18 +379,18 @@ var draw_sprites = function(spec, px, py, ori) { // 图片 、 var image = spec["image"] var width = image.width; var height = image.height; - if (!("_sizes" in spec)) { // 判断是否需要对图片进行切割 + if (!("_sizes" in spec)) { ctx.drawImage(image, px - width / 2, py - height / 2); // 图片,在画布上放的位置的x,y坐标 } else { - // 需要对图像进行切割 - var sw = spec["_sizes"][0]; // 原图像的宽度 - var sh = spec["_sizes"][1]; // 原图像的高度 + + var sw = spec["_sizes"][0]; + var sh = spec["_sizes"][1]; var nw = Math.floor(width / sw); var nh = Math.floor(height/ sh); var xidx = spec[ori][0]; var yidx = spec[ori][1]; // - var cx = xidx[Math.floor(tick / 3) % xidx.length] * sw; // 开始剪切的x坐标 - var cy = yidx[Math.floor(tick / 3) % yidx.length] * sh; // 开始剪切的y坐标 + var cx = xidx[Math.floor(tick / 3) % xidx.length] * sw; + var cy = yidx[Math.floor(tick / 3) % yidx.length] * sh; // px - sw / 2, py - sh / 2 代表图像在画布上的 x y 坐标 ctx.drawImage(image, cx, cy, sw, sh, px - sw / 2, py - sh / 2, sw, sh); // 剪切图像,并在画布上定位被剪切的部分 } @@ -413,7 +401,7 @@ var myrange = function (j, k){ return Array.from(new Array(n), (x,i) => i + j); }; -// 加载图片 + var sprites = {}; // sprites["RANGE_ATTACKER"] = load_sprites({ @@ -527,8 +515,7 @@ sprites["FLAG_BASE"] = load_sprites({ }); -// 渲染 -// 每一次数据都渲染一次 + var render = function (game) { tick = game.tick; // Tick @@ -553,7 +540,7 @@ var render = function (game) { // for (var i in game.players) { // 两个字典,{player_id: 0; resource: 0} // onPlayerStats(game.players[i]); // {player_id: 1; resource: 0} {player_id: 0; resource: 0} // } - for (var i in game.units) { // 基地,坦克,兵,资源 的信息 + for (var i in game.units) { var unit = game.units[i]; all_units[unit.id] = unit; @@ -563,10 +550,10 @@ var render = function (game) { selected[unit.id] = unit; } - // 绘制 game.units 信息 + onUnit(unit, isSelected); } - // 用鼠标圈单位的时候执行 + if (dragging && x_down && y_down) { ctx.lineWidth = 2; ctx.beginPath(); @@ -618,15 +605,13 @@ var main = function () { console.log("WS Opened."); } - // 当收到来自服务器的消息时,被调用 + dealer.onmessage = function (message) { - // message 是 HTTP所有的信息 - // s 是游戏中的所有信息 + var s = message.data; // 将 s 转换为 json 存储在 game 中 var game = JSON.parse(s); //console.log(game); - // 在画布内清空一个矩阵,用于渲染游戏 ctx.clearRect(0, 0, canvas.width, canvas.height); render(game); }; @@ -634,8 +619,4 @@ var main = function () { var then = Date.now(); // 开始 -<<<<<<< HEAD -main(); -======= main(); ->>>>>>> 3f3592593dbc391c3bcbcf05680f0821032d48c0 From 48acbcc773bf68486949b99daddf3171120d899f Mon Sep 17 00:00:00 2001 From: bc <729078846@qq.com> Date: Tue, 29 Dec 2020 12:08:38 +0800 Subject: [PATCH 10/24] edit fow --- elf/game_base.h | 9 +++++++++ rts/engine/game_env.cc | 16 ++++++++++++++-- rts/engine/game_env.h | 4 +++- rts/engine/game_state.cc | 6 +++--- rts/engine/map.cc | 4 +--- rts/engine/player.cc | 7 +++++-- rts/engine/player.h | 2 +- rts/game_MC/cmd_specific.cc | 6 +++--- rts/game_MC/gamedef.cc | 21 +++++++++++---------- rts/game_MC/wrapper_callback.cc | 7 ++++++- 10 files changed, 56 insertions(+), 26 deletions(-) diff --git a/elf/game_base.h b/elf/game_base.h index 47514d70..b7cd36fd 100755 --- a/elf/game_base.h +++ b/elf/game_base.h @@ -82,6 +82,10 @@ class GameBaseT { if(isPrint) std::cout<<"-------MainLoop----------"<Init(isPrint); // 初始化游戏 + // if(isPrint){ + // std::cout<<"--------Start PleyerInfo"<env().PrintPlayerInfo()<load()) break; @@ -89,6 +93,10 @@ class GameBaseT { // Send message to AIs. _act(false, done); _game_end(); + // if(isPrint){ + // std::cout<<"--------End PleyerInfo"<env().PrintPlayerInfo()<Finalize(); } @@ -124,6 +132,7 @@ class GameBaseT { bot.ai->GameEnd(); } if (_spectator != nullptr) { + std::cout<<"_spectator"<GameEnd(); } } diff --git a/rts/engine/game_env.cc b/rts/engine/game_env.cc index 2645cee8..b2e5d21b 100755 --- a/rts/engine/game_env.cc +++ b/rts/engine/game_env.cc @@ -11,9 +11,9 @@ GameEnv::GameEnv() { // Load the map. - std::cout<<"-------GameEnv-----------"<(new RTSMap()); - std::cout<<"-------GameEnv-----------"<PrintDebugInfo() << endl; return ss.str(); } + +string GameEnv::PrintPlayerInfo() const { + stringstream ss; + for (const auto& player : _players) { + ss << "Player " << player.GetId() << endl; + ss << player.PrintInfo()<< endl; + } + + ss << _map->Draw() << endl; + ss << _map->PrintDebugInfo() << endl; + return ss.str(); +} diff --git a/rts/engine/game_env.h b/rts/engine/game_env.h index 186643e4..60e8bc5a 100755 --- a/rts/engine/game_env.h +++ b/rts/engine/game_env.h @@ -89,7 +89,7 @@ class GameEnv { // Initialize different units for this game. void InitGameDef() { - std::cout<<"----------InitGameDef-------"<& f, } bool RTSMap::GenerateImpassable(const std::function& f, int nImpassable) { - std::cout<<"-------GenerateImpassable--------"<& f) { bool RTSMap::GenerateMap(const std::function& f, int nImpassable, int num_player, int init_resource) { // load a map for now simple format. bool success; - std::cout<<"-------GenerateMap nImpassable = "<second.get(); if (ExtractPlayerId(u->GetId()) != _player_id) { - Loc l = _filter_with_fow(*u); + Loc l = _filter_with_fow(*u); //判断该点的位置是否在视野范围内 // Add the unit info to the loc. - if (l != -1) _fogs[l].SaveUnit(*u); + if (l != -1) _fogs[l].SaveUnit(*u); //在迷雾格中存储该单位 } } } @@ -106,7 +107,9 @@ string Player::PrintInfo() const { stringstream ss; ss << "Map ptr = " << _map << endl; ss << "Player id = " << _player_id << endl; + ss << "Player name = "<< _name << endl; ss << "Resource = " << _resource << endl; + ss << "PlayerPrivilege = "<<_privilege< _prev_seen_units; + vector _prev_seen_units; // 该点可见单位 void MakeInvisible() { _fog = 100; } // 让该点不可见 void SetClear() { _fog = 0; _prev_seen_units.clear(); } diff --git a/rts/game_MC/cmd_specific.cc b/rts/game_MC/cmd_specific.cc index ccb67b74..3a7b8382 100755 --- a/rts/game_MC/cmd_specific.cc +++ b/rts/game_MC/cmd_specific.cc @@ -16,7 +16,7 @@ #include "cmd_specific.gen.h" bool CmdGenerateMap::run(GameEnv *env, CmdReceiver*) { - std::cout<<"CmdGenerateMap"<GenerateMap(_num_obstacles, _init_resource) ? true : false; } @@ -50,7 +50,7 @@ bool CmdGameStartSpecific::run(GameEnv*, CmdReceiver* receiver) { //-----------------Test-------------------- bool CmdGenerateUnit::run(GameEnv *env, CmdReceiver *receiver) { - std::cout<<"CmdGenerateTDUnit"<GetRandomFunc(); // int lr_seed = f(2); // int ud_seed = f(2); diff --git a/rts/game_MC/gamedef.cc b/rts/game_MC/gamedef.cc index 84bca09e..d10df842 100755 --- a/rts/game_MC/gamedef.cc +++ b/rts/game_MC/gamedef.cc @@ -57,16 +57,16 @@ void GameDef::Init() { _units.assign(GetNumUnitType(), UnitTemplate()); /** * int cost, int hp, int defense, float speed, int att, int att_r, int vis_r, - const vector &cds, const vector &l, UnitAttr attr + const vector &cds, const vector &l, UnitAttr attr**/ - _units[RESOURCE] = _C(0, 1000, 1000, 0, 0, 0, 0, vector{0, 0, 0, 0}, vector{}, ATTR_INVULNERABLE); - _units[WORKER] = _C(50, 50, 0, 0.1, 2, 1, 3, vector{0, 10, 40, 40}, vector{MOVE, ATTACK, BUILD, GATHER}); - _units[MELEE_ATTACKER] = _C(100, 100, 1, 0.1, 15, 1, 3, vector{0, 15, 0, 0}, vector{MOVE, ATTACK}); - _units[RANGE_ATTACKER] = _C(100, 50, 0, 0.2, 10, 5, 5, vector{0, 10, 0, 0}, vector{MOVE, ATTACK}); - _units[BARRACKS] = _C(200, 200, 1, 0.0, 0, 0, 5, vector{0, 0, 0, 50}, vector{BUILD}); - _units[BASE] = _C(500, 500, 2, 0.0, 0, 0, 5, {0, 0, 0, 50}, vector{BUILD}); + // _units[RESOURCE] = _C(0, 1000, 1000, 0, 0, 0, 0, vector{0, 0, 0, 0}, vector{}, ATTR_INVULNERABLE); + // _units[WORKER] = _C(50, 50, 0, 0.1, 2, 1, 3, vector{0, 10, 40, 40}, vector{MOVE, ATTACK, BUILD, GATHER}); + // _units[MELEE_ATTACKER] = _C(100, 100, 1, 0.1, 15, 1, 3, vector{0, 15, 0, 0}, vector{MOVE, ATTACK}); + // _units[RANGE_ATTACKER] = _C(100, 50, 0, 0.2, 10, 5, 5, vector{0, 10, 0, 0}, vector{MOVE, ATTACK}); + // _units[BARRACKS] = _C(200, 200, 1, 0.0, 0, 0, 5, vector{0, 0, 0, 50}, vector{BUILD}); + // _units[BASE] = _C(500, 500, 2, 0.0, 0, 0, 5, {0, 0, 0, 50}, vector{BUILD}); - + /** * 定义单位属性 * cost 造价(不需要) * hp 血量 @@ -76,7 +76,8 @@ void GameDef::Init() { * att_r 攻击距离 * vis_r 可视距离 * * cost hp def sp att att_r vis_r - * */ + * */ + _units[RESOURCE] = _C(0, 1000, 1000, 0, 0, 0, 0, vector{0, 0, 0, 0}, vector{}, ATTR_INVULNERABLE); _units[WORKER] = _C(50, 50, 0, 0.1, 2, 1, 0, vector{0, 10, 40, 40}, vector{MOVE, ATTACK, BUILD, GATHER}); _units[MELEE_ATTACKER] = _C(50, 100, 1, 0.1, 15, 10, 0, vector{0, 15, 0, 0}, vector{MOVE,ATTACK}); @@ -89,7 +90,7 @@ void GameDef::Init() { vector > GameDef::GetInitCmds(const RTSGameOptions&) const{ vector > init_cmds; - init_cmds.push_back(make_pair(CmdBPtr(new CmdGenerateMap(INVALID, 0, 0)), 1)); // 障碍 资源 + init_cmds.push_back(make_pair(CmdBPtr(new CmdGenerateMap(INVALID, 0, 200)), 1)); // 障碍 资源 init_cmds.push_back(make_pair(CmdBPtr(new CmdGenerateUnit(INVALID)), 2)); return init_cmds; } diff --git a/rts/game_MC/wrapper_callback.cc b/rts/game_MC/wrapper_callback.cc index a6c5ece6..80195b71 100755 --- a/rts/game_MC/wrapper_callback.cc +++ b/rts/game_MC/wrapper_callback.cc @@ -85,12 +85,17 @@ void WrapperCallbacks::OnGameInit(RTSGame *game, const std::mapAddBot(ais[idx], _options.ai_options[idx].fs); game->GetState().AppendPlayer("player " + std::to_string(idx)); } + // 输出玩家信息 + if(isPrint){ + std::cout<<"ais size = "<GetState().env().PrintPlayerInfo()< Date: Tue, 29 Dec 2020 13:56:23 +0800 Subject: [PATCH 11/24] js --- rts/frontend/game.js | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/rts/frontend/game.js b/rts/frontend/game.js index 3a2d6ddb..d956050d 100755 --- a/rts/frontend/game.js +++ b/rts/frontend/game.js @@ -9,18 +9,18 @@ var canvas = document.createElement("canvas"); // 获得绘图环境,在该函数下绘图 var ctx = canvas.getContext("2d"); -canvas.width = 1200; // 1400 -canvas.height = 1200; //1000 +canvas.width = 2000; // 1400 +canvas.height = 1750; //1000 var left_frame_width = 1000; -var cell_size = 30; // 50 -var rect_size = 30; // 50 +var cell_size = 25; // 50 +var rect_size = 25; // 50 var unit_size = 32; // 32 var cell_colors = ['#404040', 'blue', 'black']; var player_colors = ['blue', 'red', 'yellow']; // 不同游戏的单位名称 -// var unit_names_minirts = ["RESOURCE", "WORKER", "MELEE_ATTACKER", "RANGE_ATTACKER", "BARRACKS", "BASE"]; -var unit_names_minirts = [["RESOURCE", "WORKER", "MELEE_ATTACKER1", "RANGE_ATTACKER1", "BARRACKS", "BASE"],["RESOURCE", "WORKER", "MELEE_ATTACKER2", "RANGE_ATTACKER2", "BARRACKS", "BASE"]]; +// var unit_names_minirts = ["RESOURCE", "WORKER", "MELEE_ATTACKER", "RANGE_ATTACKER", "BARRACKS", "BASE"]; RANGE 雷达 范围大 +var unit_names_minirts = [["RESOURCE", "WORKER", "MELEE_ATTACKER2", "RANGE_ATTACKER2", "BARRACKS", "BASE"],["RESOURCE", "WORKER", "MELEE_ATTACKER1", "RANGE_ATTACKER1", "BARRACKS", "BASE"]]; var unit_names_flag = ["FLAG_BASE", "FLAG_ATHLETE", "FLAG"]; var unit_names_td = ["BASE", "WORKER", "RANGE_ATTACKER"]; var x_down = null; @@ -144,7 +144,7 @@ canvas.addEventListener("mousedown", function (e) { if (e.button === 0) { var xy0 = convert_xy_back(e.pageX, e.pageY); // console.log(xy0); - if (xy0[0] >35 || xy0[1] > 35) return; + if (xy0[0] >70 || xy0[1] > 70) return; x_down = e.pageX; y_down = e.pageY; } @@ -153,7 +153,7 @@ canvas.addEventListener("mousedown", function (e) { canvas.addEventListener("mouseup", function (e) { var xy0 = convert_xy_back(e.pageX, e.pageY); - if (xy0[0] > 35 || xy0[1] > 35) return; + if (xy0[0] > 70 || xy0[1] > 70) return; if (e.button === 0) { var xy = convert_xy_back(x_down, y_down); if (dragging && x_down && y_down) { From cf1a34f692f9b2fd7b958bb62544cacdae0e2c73 Mon Sep 17 00:00:00 2001 From: bc <729078846@qq.com> Date: Tue, 29 Dec 2020 14:06:15 +0800 Subject: [PATCH 12/24] Test --- README.md | 2 +- rts/game_MC/gamedef.cc | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) mode change 100644 => 100755 README.md diff --git a/README.md b/README.md old mode 100644 new mode 100755 index 55c1be22..35833659 --- a/README.md +++ b/README.md @@ -1,5 +1,5 @@ # ELF: An Extensive, Lightweight and Flexible Platform for Game Research - +######################==============########################### Overview =============== diff --git a/rts/game_MC/gamedef.cc b/rts/game_MC/gamedef.cc index d10df842..cb199805 100755 --- a/rts/game_MC/gamedef.cc +++ b/rts/game_MC/gamedef.cc @@ -81,7 +81,7 @@ void GameDef::Init() { _units[RESOURCE] = _C(0, 1000, 1000, 0, 0, 0, 0, vector{0, 0, 0, 0}, vector{}, ATTR_INVULNERABLE); _units[WORKER] = _C(50, 50, 0, 0.1, 2, 1, 0, vector{0, 10, 40, 40}, vector{MOVE, ATTACK, BUILD, GATHER}); _units[MELEE_ATTACKER] = _C(50, 100, 1, 0.1, 15, 10, 0, vector{0, 15, 0, 0}, vector{MOVE,ATTACK}); - _units[RANGE_ATTACKER] = _C(100, 50, 0, 0.2, 0, 0, 15, vector{0, 0, 0, 0}, vector{MOVE}); + _units[RANGE_ATTACKER] = _C(100, 50, 0, 0.2, 0, 0, 15, vector{0, 0, 0, 0}, vector{}); _units[BARRACKS] = _C(200, 200, 1, 0.0, 0, 0, 0, vector{0, 0, 0, 50}, vector{BUILD}); _units[BASE] = _C(500, 500, 2, 0.0, 0, 0, 0, {0, 0, 0, 50}, vector{BUILD}); From 779f91c7a63c5ba76c4d018116804783027363ea Mon Sep 17 00:00:00 2001 From: wujie199 <403731462@qq.com> Date: Tue, 29 Dec 2020 14:36:04 +0800 Subject: [PATCH 13/24] test --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 35833659..55c1be22 100755 --- a/README.md +++ b/README.md @@ -1,5 +1,5 @@ # ELF: An Extensive, Lightweight and Flexible Platform for Game Research -######################==============########################### + Overview =============== From c1100e5aa9df7475378e47d29486b07b3e482cda Mon Sep 17 00:00:00 2001 From: wujie199 <403731462@qq.com> Date: Tue, 29 Dec 2020 14:52:19 +0800 Subject: [PATCH 14/24] 700 --- rts/frontend/game.js | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/rts/frontend/game.js b/rts/frontend/game.js index d956050d..d3e81c8e 100755 --- a/rts/frontend/game.js +++ b/rts/frontend/game.js @@ -9,11 +9,11 @@ var canvas = document.createElement("canvas"); // 获得绘图环境,在该函数下绘图 var ctx = canvas.getContext("2d"); -canvas.width = 2000; // 1400 -canvas.height = 1750; //1000 +canvas.width = 30000; +canvas.height = 28000; var left_frame_width = 1000; -var cell_size = 25; // 50 -var rect_size = 25; // 50 +var cell_size = 40; // 50 +var rect_size = 40; // 50 var unit_size = 32; // 32 var cell_colors = ['#404040', 'blue', 'black']; var player_colors = ['blue', 'red', 'yellow']; @@ -144,7 +144,7 @@ canvas.addEventListener("mousedown", function (e) { if (e.button === 0) { var xy0 = convert_xy_back(e.pageX, e.pageY); // console.log(xy0); - if (xy0[0] >70 || xy0[1] > 70) return; + if (xy0[0] >700 || xy0[1] > 700) return; x_down = e.pageX; y_down = e.pageY; } @@ -153,7 +153,7 @@ canvas.addEventListener("mousedown", function (e) { canvas.addEventListener("mouseup", function (e) { var xy0 = convert_xy_back(e.pageX, e.pageY); - if (xy0[0] > 70 || xy0[1] > 70) return; + if (xy0[0] > 700 || xy0[1] > 700) return; if (e.button === 0) { var xy = convert_xy_back(x_down, y_down); if (dragging && x_down && y_down) { From 37df7b076775105253c00710b3f0728d67ff8903 Mon Sep 17 00:00:00 2001 From: wujie199 <403731462@qq.com> Date: Tue, 29 Dec 2020 15:20:35 +0800 Subject: [PATCH 15/24] JS --- rts/frontend/game.js | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/rts/frontend/game.js b/rts/frontend/game.js index d956050d..4114bfb3 100755 --- a/rts/frontend/game.js +++ b/rts/frontend/game.js @@ -9,11 +9,11 @@ var canvas = document.createElement("canvas"); // 获得绘图环境,在该函数下绘图 var ctx = canvas.getContext("2d"); -canvas.width = 2000; // 1400 -canvas.height = 1750; //1000 +canvas.width = 1250; // 1400 +canvas.height = 1050; //1000 var left_frame_width = 1000; -var cell_size = 25; // 50 -var rect_size = 25; // 50 +var cell_size = 30; // 50 +var rect_size = 30; // 50 var unit_size = 32; // 32 var cell_colors = ['#404040', 'blue', 'black']; var player_colors = ['blue', 'red', 'yellow']; @@ -144,7 +144,7 @@ canvas.addEventListener("mousedown", function (e) { if (e.button === 0) { var xy0 = convert_xy_back(e.pageX, e.pageY); // console.log(xy0); - if (xy0[0] >70 || xy0[1] > 70) return; + if (xy0[0] >35 || xy0[1] > 35) return; x_down = e.pageX; y_down = e.pageY; } @@ -153,7 +153,7 @@ canvas.addEventListener("mousedown", function (e) { canvas.addEventListener("mouseup", function (e) { var xy0 = convert_xy_back(e.pageX, e.pageY); - if (xy0[0] > 70 || xy0[1] > 70) return; + if (xy0[0] > 35 || xy0[1] > 35) return; if (e.button === 0) { var xy = convert_xy_back(x_down, y_down); if (dragging && x_down && y_down) { From 6058c423710ace5ddecadaac8a5fb9a4d9294dbb Mon Sep 17 00:00:00 2001 From: wujie199 <403731462@qq.com> Date: Tue, 29 Dec 2020 15:29:04 +0800 Subject: [PATCH 16/24] js --- README.md | 2 +- rts/frontend/game.js | 8 ++++---- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/README.md b/README.md index 35833659..55c1be22 100755 --- a/README.md +++ b/README.md @@ -1,5 +1,5 @@ # ELF: An Extensive, Lightweight and Flexible Platform for Game Research -######################==============########################### + Overview =============== diff --git a/rts/frontend/game.js b/rts/frontend/game.js index 4114bfb3..180d4cc1 100755 --- a/rts/frontend/game.js +++ b/rts/frontend/game.js @@ -9,11 +9,11 @@ var canvas = document.createElement("canvas"); // 获得绘图环境,在该函数下绘图 var ctx = canvas.getContext("2d"); -canvas.width = 1250; // 1400 -canvas.height = 1050; //1000 +canvas.width = 1400; +canvas.height = 1400; var left_frame_width = 1000; -var cell_size = 30; // 50 -var rect_size = 30; // 50 +var cell_size = 40; // 50 +var rect_size = 40; // 50 var unit_size = 32; // 32 var cell_colors = ['#404040', 'blue', 'black']; var player_colors = ['blue', 'red', 'yellow']; From 858ae85497a53c1aded4a6aec4e48078f8678fe5 Mon Sep 17 00:00:00 2001 From: bc <729078846@qq.com> Date: Tue, 29 Dec 2020 15:53:06 +0800 Subject: [PATCH 17/24] edit init --- rts/engine/map.cc | 4 ++-- rts/game_MC/cmd_specific.cc | 23 +++++++++++++---------- rts/game_MC/gamedef.cc | 8 +++++--- 3 files changed, 20 insertions(+), 15 deletions(-) diff --git a/rts/engine/map.cc b/rts/engine/map.cc index 4826e217..751f40ed 100755 --- a/rts/engine/map.cc +++ b/rts/engine/map.cc @@ -160,8 +160,8 @@ void RTSMap::load_default_map() { // _level = 1; // _map.assign(_m * _n * _level, MapSlot()); - _m = 35; - _n = 35; + _m = 70; + _n = 70; _level = 1; _map.assign(_m * _n * _level, MapSlot()); diff --git a/rts/game_MC/cmd_specific.cc b/rts/game_MC/cmd_specific.cc index 3a7b8382..719f77eb 100755 --- a/rts/game_MC/cmd_specific.cc +++ b/rts/game_MC/cmd_specific.cc @@ -54,26 +54,29 @@ bool CmdGenerateUnit::run(GameEnv *env, CmdReceiver *receiver) { const PlayerId player_id = 0; const PlayerId enemy_id = 1; // 保护目标 - _CREATE(BASE, PointF(17, 17), player_id); + _CREATE(BASE, PointF(34, 34), player_id); // 雷达 - //_CREATE(RANGE_ATTACKER,PointF(4,17),player_id); - //_CREATE(RANGE_ATTACKER,PointF(15,17),player_id); - //_CREATE(RANGE_ATTACKER,PointF(17,4),player_id); - _CREATE(RANGE_ATTACKER,PointF(15,17),player_id); + _CREATE(RANGE_ATTACKER,PointF(45,25),player_id); + _CREATE(RANGE_ATTACKER,PointF(25,25),player_id); + _CREATE(RANGE_ATTACKER,PointF(34,45),player_id); // 炮台 - //_CREATE(MELEE_ATTACKER,PointF(6,9),player_id); - // _CREATE(MELEE_ATTACKER,PointF(13,9),player_id); - // _CREATE(MELEE_ATTACKER,PointF(9,6),player_id); - _CREATE(MELEE_ATTACKER,PointF(19,17),player_id); + _CREATE(MELEE_ATTACKER,PointF(40,40),player_id); + _CREATE(MELEE_ATTACKER,PointF(40,30),player_id); + _CREATE(MELEE_ATTACKER,PointF(30,40),player_id); + _CREATE(MELEE_ATTACKER,PointF(30,30),player_id); // enemy _CREATE(BASE,PointF(1, 1),enemy_id); + // 敌方飞机 + _CREATE(RANGE_ATTACKER,PointF(34,20),enemy_id); + _CREATE(RANGE_ATTACKER,PointF(28,36),enemy_id); + _CREATE(RANGE_ATTACKER,PointF(29,35),enemy_id); return true; } //-----------------Test-------------------- -// bool CmdGenerateUnit::run(GameEnv *env, CmdReceiver *receiver) { +// bool CmdGenerateUnit::r un(GameEnv *env, CmdReceiver *receiver) { // // std::cout<<"CmdGenerateUnit"<GetRandomFunc(); // int lr_seed = f(2); diff --git a/rts/game_MC/gamedef.cc b/rts/game_MC/gamedef.cc index cb199805..f50f7ab6 100755 --- a/rts/game_MC/gamedef.cc +++ b/rts/game_MC/gamedef.cc @@ -80,10 +80,12 @@ void GameDef::Init() { _units[RESOURCE] = _C(0, 1000, 1000, 0, 0, 0, 0, vector{0, 0, 0, 0}, vector{}, ATTR_INVULNERABLE); _units[WORKER] = _C(50, 50, 0, 0.1, 2, 1, 0, vector{0, 10, 40, 40}, vector{MOVE, ATTACK, BUILD, GATHER}); - _units[MELEE_ATTACKER] = _C(50, 100, 1, 0.1, 15, 10, 0, vector{0, 15, 0, 0}, vector{MOVE,ATTACK}); - _units[RANGE_ATTACKER] = _C(100, 50, 0, 0.2, 0, 0, 15, vector{0, 0, 0, 0}, vector{}); + // 炮塔 + _units[MELEE_ATTACKER] = _C(50, 100, 1, 0.1, 15, 20, 0, vector{0, 15, 0, 0}, vector{ATTACK}); + // 雷达 飞机 + _units[RANGE_ATTACKER] = _C(100, 50, 0, 0.2, 0, 0, 30, vector{0, 0, 0, 0}, vector{}); _units[BARRACKS] = _C(200, 200, 1, 0.0, 0, 0, 0, vector{0, 0, 0, 50}, vector{BUILD}); - _units[BASE] = _C(500, 500, 2, 0.0, 0, 0, 0, {0, 0, 0, 50}, vector{BUILD}); + _units[BASE] = _C(500, 500, 2, 0.0, 0, 0, 0, {0, 0, 0, 50}, vector{}); } From d467fbf588ec3a11978b64ba222a71f0eba019e4 Mon Sep 17 00:00:00 2001 From: bc <729078846@qq.com> Date: Tue, 29 Dec 2020 16:27:51 +0800 Subject: [PATCH 18/24] edit init --- rts/game_MC/cmd_specific.cc | 5 +++-- rts/game_MC/gamedef.cc | 4 ++-- 2 files changed, 5 insertions(+), 4 deletions(-) diff --git a/rts/game_MC/cmd_specific.cc b/rts/game_MC/cmd_specific.cc index 719f77eb..c1979dc4 100755 --- a/rts/game_MC/cmd_specific.cc +++ b/rts/game_MC/cmd_specific.cc @@ -69,8 +69,9 @@ bool CmdGenerateUnit::run(GameEnv *env, CmdReceiver *receiver) { _CREATE(BASE,PointF(1, 1),enemy_id); // 敌方飞机 _CREATE(RANGE_ATTACKER,PointF(34,20),enemy_id); - _CREATE(RANGE_ATTACKER,PointF(28,36),enemy_id); - _CREATE(RANGE_ATTACKER,PointF(29,35),enemy_id); + _CREATE(RANGE_ATTACKER,PointF(20,36),enemy_id); + _CREATE(RANGE_ATTACKER,PointF(24,35),enemy_id); + return true; } diff --git a/rts/game_MC/gamedef.cc b/rts/game_MC/gamedef.cc index f50f7ab6..4d4c36e8 100755 --- a/rts/game_MC/gamedef.cc +++ b/rts/game_MC/gamedef.cc @@ -81,9 +81,9 @@ void GameDef::Init() { _units[RESOURCE] = _C(0, 1000, 1000, 0, 0, 0, 0, vector{0, 0, 0, 0}, vector{}, ATTR_INVULNERABLE); _units[WORKER] = _C(50, 50, 0, 0.1, 2, 1, 0, vector{0, 10, 40, 40}, vector{MOVE, ATTACK, BUILD, GATHER}); // 炮塔 - _units[MELEE_ATTACKER] = _C(50, 100, 1, 0.1, 15, 20, 0, vector{0, 15, 0, 0}, vector{ATTACK}); + _units[MELEE_ATTACKER] = _C(50, 100, 1, 0.1, 10, 20, 0, vector{0, 60, 0, 0}, vector{ATTACK}); // 雷达 飞机 - _units[RANGE_ATTACKER] = _C(100, 50, 0, 0.2, 0, 0, 30, vector{0, 0, 0, 0}, vector{}); + _units[RANGE_ATTACKER] = _C(100, 200, 1, 0.2, 0, 0, 30, vector{0, 0, 0, 0}, vector{}); _units[BARRACKS] = _C(200, 200, 1, 0.0, 0, 0, 0, vector{0, 0, 0, 50}, vector{BUILD}); _units[BASE] = _C(500, 500, 2, 0.0, 0, 0, 0, {0, 0, 0, 50}, vector{}); From d4b865868dcdcf66e3103fa32a6136988c728c25 Mon Sep 17 00:00:00 2001 From: wujie199 <403731462@qq.com> Date: Tue, 29 Dec 2020 16:28:16 +0800 Subject: [PATCH 19/24] js --- rts/frontend/game.js | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/rts/frontend/game.js b/rts/frontend/game.js index d3e81c8e..329c32bf 100755 --- a/rts/frontend/game.js +++ b/rts/frontend/game.js @@ -9,8 +9,8 @@ var canvas = document.createElement("canvas"); // 获得绘图环境,在该函数下绘图 var ctx = canvas.getContext("2d"); -canvas.width = 30000; -canvas.height = 28000; +canvas.width = 3000; +canvas.height = 2800; var left_frame_width = 1000; var cell_size = 40; // 50 var rect_size = 40; // 50 @@ -144,7 +144,7 @@ canvas.addEventListener("mousedown", function (e) { if (e.button === 0) { var xy0 = convert_xy_back(e.pageX, e.pageY); // console.log(xy0); - if (xy0[0] >700 || xy0[1] > 700) return; + if (xy0[0] >70 || xy0[1] > 70) return; x_down = e.pageX; y_down = e.pageY; } @@ -153,7 +153,7 @@ canvas.addEventListener("mousedown", function (e) { canvas.addEventListener("mouseup", function (e) { var xy0 = convert_xy_back(e.pageX, e.pageY); - if (xy0[0] > 700 || xy0[1] > 700) return; + if (xy0[0] > 70 || xy0[1] > 70) return; if (e.button === 0) { var xy = convert_xy_back(x_down, y_down); if (dragging && x_down && y_down) { From ea9fc546f6b9dcb92af94be9df79b5e79b0f26d1 Mon Sep 17 00:00:00 2001 From: bc <729078846@qq.com> Date: Wed, 30 Dec 2020 14:44:50 +0800 Subject: [PATCH 20/24] edit command --- rts/engine/bullet.cc | 20 +++++++------ rts/engine/bullet.h | 10 +++---- rts/engine/cmd.cc | 20 +++++++------ rts/engine/cmd.h | 6 ++-- rts/engine/cmd_interface.h | 2 +- rts/engine/cmd_specific.cc | 59 +++++++++++++++++++++----------------- rts/engine/common.h | 3 ++ rts/engine/gamedef.h | 14 ++++----- rts/game_MC/gamedef.cc | 14 +++++---- 9 files changed, 81 insertions(+), 67 deletions(-) mode change 100644 => 100755 rts/engine/bullet.cc mode change 100644 => 100755 rts/engine/bullet.h mode change 100644 => 100755 rts/engine/cmd.cc mode change 100644 => 100755 rts/engine/cmd.h mode change 100644 => 100755 rts/engine/cmd_interface.h mode change 100644 => 100755 rts/engine/cmd_specific.cc mode change 100644 => 100755 rts/engine/common.h diff --git a/rts/engine/bullet.cc b/rts/engine/bullet.cc old mode 100644 new mode 100755 index e1bf950d..53e9261a --- a/rts/engine/bullet.cc +++ b/rts/engine/bullet.cc @@ -9,7 +9,7 @@ #include "bullet.h" #include "cmd_specific.gen.h" -static constexpr float kDistBullet = 0.3; +static constexpr float kDistBullet = 0.3; // 子弹的体积? string Bullet::Draw() const { return make_string("u", _p, _state); @@ -17,6 +17,7 @@ string Bullet::Draw() const { // Unlike Unit, we don't do Act then PerformAct since collision check is not needed. CmdBPtr Bullet::Forward(const RTSMap&, const Units& units) { + // First check whether the attacker is dead, if so, remove _id_from to avoid issues. auto self_it = units.find(_id_from); if (self_it == units.end()) _id_from = INVALID; @@ -40,7 +41,7 @@ CmdBPtr Bullet::Forward(const RTSMap&, const Units& units) { if (_target_id != INVALID) { auto it = units.find(_target_id); if (it == units.end()) { - // The target is destroyed, destroy itself. + // The target is destroyed, destroy itself. 目标已经被摧毁,销毁子弹 _state = BULLET_DONE; return CmdBPtr(); } @@ -55,25 +56,26 @@ CmdBPtr Bullet::Forward(const RTSMap&, const Units& units) { float dist_sqr = PointF::L2Sqr(_p, target); - if (dist_sqr < kDistBullet * kDistBullet) { + if (dist_sqr < kDistBullet * kDistBullet) { // 如果子弹击中目标 // Hit the target. _state = BULLET_EXPLODE1; if (_target_id != INVALID) { - return CmdBPtr(new CmdMeleeAttack(_id_from, _target_id, _att)); + return CmdBPtr(new CmdMeleeAttack(_id_from, _target_id, _att)); // 造成一次攻击 } - } else { + } else { // 子弹飞向目标 // Fly // [TODO]: Randomize the flying procedure (e.g., curvy tracking). - PointF diff; + PointF diff; // 从 _p 指向 target 的方向 // Here it has to be true, otherwise there is something wrong. if (! PointF::Diff(target, _p, &diff)) { cout << "Bullet::Forward, target or _p is invalid! Target: " << target << " _p:" << _p << endl; return CmdBPtr(); } - - diff.Trunc(_speed); - _p += diff; + + diff.Trunc(_speed); // 移动的距离 + //std::cout<<"dist: "< 1.0) { // Do path planning. Coord first_block; @@ -107,7 +107,7 @@ float micro_move(Tick tick, const Unit& u, const GameEnv &env, const PointF& tar waypoint.y = first_block.y; } } - // cout << "micro_move: (" << curr << ") -> (" << waypoint << ") planning: " << planning_success << endl; + cout << "micro_move: (" << curr << ") -> (" << waypoint << ") planning: " << planning_success << endl; int ret = move_toward(m, property._speed, u.GetId(), curr, waypoint, &move); if (ret == MT_OK) { // Set actual move. @@ -119,6 +119,7 @@ float micro_move(Tick tick, const Unit& u, const GameEnv &env, const PointF& tar receiver->GetGameStats().RecordFailedMove(tick, 1.0); } } + return dist_sqr; } @@ -136,6 +137,7 @@ bool CmdDurative::Run(const GameEnv &env, CmdReceiver *receiver) { // ============= Commands ============== // ----- Move bool CmdTacticalMove::run(GameEnv *env, CmdReceiver*) { + //std::cout<<"===========CmdTacticalMove========="<GetUnit(_id); if (u == nullptr) return false; RTSMap &m = env->GetMap(); @@ -162,9 +164,9 @@ bool CmdEmitBullet::run(GameEnv *env, CmdReceiver*) { if (u == nullptr) return false; // cout << "Bullet: " << micro_cmd.PrintInfo() << endl; - Bullet b(_p, _id, _att, _speed); - b.SetTargetUnitId(_target); - env->AddBullet(b); + Bullet b(_p, _id, _att, _speed); // 生成一颗子弹 + b.SetTargetUnitId(_target); // 设置子弹的目标 + env->AddBullet(b); // 环境中添加这颗子弹 return true; } diff --git a/rts/engine/cmd.h b/rts/engine/cmd.h old mode 100644 new mode 100755 index 81bb9940..8e64e651 --- a/rts/engine/cmd.h +++ b/rts/engine/cmd.h @@ -51,7 +51,7 @@ class CmdBase { Tick _tick, _start_tick; // Main id. - UnitId _id; + UnitId _id; //执行命令的单位ID public: explicit CmdBase(UnitId iid = INVALID) { @@ -108,8 +108,8 @@ class CmdBase { // Durative commands. They do not directly change the game state, but issue other immediate commands. class CmdDurative : public CmdBase { protected: - bool _done; - virtual bool run(const GameEnv&, CmdReceiver *) { return true; } + bool _done; // 是否完成 + virtual bool run(const GameEnv&, CmdReceiver *) { return true; } //命令的执行方法 public: explicit CmdDurative(UnitId id = INVALID) : CmdBase(id), _done(false) { } diff --git a/rts/engine/cmd_interface.h b/rts/engine/cmd_interface.h old mode 100644 new mode 100755 index e2eac385..9e5df76e --- a/rts/engine/cmd_interface.h +++ b/rts/engine/cmd_interface.h @@ -58,7 +58,7 @@ struct CmdInput { void ApplyEnv(const GameEnv &env) { // Check unit id. - id = env.GetMap().GetClosestUnitId(unit_loc, 1.0); + id = env.GetMap().GetClosestUnitId(unit_loc, 1.0); target = env.GetMap().GetClosestUnitId(p, 1.0); base = INVALID; if (type == CI_GATHER && id != INVALID) base = env.FindClosestBase(Player::ExtractPlayerId(id)); diff --git a/rts/engine/cmd_specific.cc b/rts/engine/cmd_specific.cc old mode 100644 new mode 100755 index d3a8d69a..a48e41ab --- a/rts/engine/cmd_specific.cc +++ b/rts/engine/cmd_specific.cc @@ -42,6 +42,7 @@ CMD_DURATIVE(Gather, UnitId, base, UnitId, resource, int, state = 0); //////////// Durative Action /////////////////////// bool CmdMove::run(const GameEnv &env, CmdReceiver *receiver) { + std::cout<PrintInfo()<PrintInfo()<GetPlayerId()); + const Unit *target = env.GetUnit(_target); // 攻击目标单位 + const Player &player = env.GetPlayer(u->GetPlayerId()); // 执行命令单位的玩家 if (target == nullptr || (player.GetPrivilege() == PV_NORMAL && ! player.FilterWithFOW(*target))) { // The goal is destroyed or is out of FOW, back to idle. // FilterWithFOW is checked if the agent is not a KNOW_ALL agent. - // For example, for AI, they could cheat and attack wherever they want. - // For normal player you cannot attack a Unit outside the FOW. - // + // For example, for AI, they could cheat and attack wherever they want. AI无视FOW + // For normal player you cannot attack a Unit outside the FOW. 玩家无法攻击FOW外的敌方单位 + // _done = true; return true; } //const RTSMap &m = env.GetMap(); - const UnitProperty &property = u->GetProperty(); - const PointF &curr = u->GetPointF(); - const PointF &target_p = target->GetPointF(); + const UnitProperty &property = u->GetProperty(); + const PointF &curr = u->GetPointF(); // 执行单位位置 + const PointF &target_p = target->GetPointF(); // 目标单位位置 - int dist_sqr_to_enemy = PointF::L2Sqr(curr, target_p); - bool in_attack_range = (dist_sqr_to_enemy <= property._att_r * property._att_r); + int dist_sqr_to_enemy = PointF::L2Sqr(curr, target_p); // 距离 + bool in_attack_range = (dist_sqr_to_enemy <= property._att_r * property._att_r); // 判断是否在攻击范围内 // cout << "[" << _id << "] dist_sqr_to_enemy[" << _last_cmd.target_id << "] = " << dist_sqr_to_enemy << endl; // Otherwise attack. - if (property.CD(CD_ATTACK).Passed(_tick) && in_attack_range) { + if (property.CD(CD_ATTACK).Passed(_tick) && in_attack_range) { // 如果目标在攻击范围内且攻击就绪 // Melee delivers attack immediately, long-range will deliver attack via bullet. if (property._att_r <= 1.0) { receiver->SendCmd(CmdIPtr(new CmdMeleeAttack(_id, _target, -property._att))); } else { - receiver->SendCmd(CmdIPtr(new CmdEmitBullet(_id, _target, curr, -property._att, 0.2))); + receiver->SendCmd(CmdIPtr(new CmdEmitBullet(_id, _target, curr, -property._att, 0.1))); } - receiver->SendCmd(CmdIPtr(new CmdCDStart(_id, CD_ATTACK))); - } else if (! in_attack_range) { - micro_move(_tick, *u, env, target_p, receiver); + receiver->SendCmd(CmdIPtr(new CmdCDStart(_id, CD_ATTACK))); // 重置攻击CD + } else if (! in_attack_range) { // 不在攻击范围内时移动单位接近攻击目标 (不需要) + //micro_move(_tick, *u, env, target_p, receiver); + _done = true; } // In both case, continue this action. @@ -222,27 +226,28 @@ bool CmdMeleeAttack::run(GameEnv *env, CmdReceiver *receiver) { Unit *target = env->GetUnit(_target); if (target == nullptr) return true; - UnitProperty &p_target = target->GetProperty(); - if (p_target.IsDead()) return true; + UnitProperty &p_target = target->GetProperty(); // 获取目标属性 + if (p_target.IsDead()) return true; // 目标已经被销毁,取消攻击命令 - const auto &target_tp = env->GetGameDef().unit(target->GetUnitType()); + const auto &target_tp = env->GetGameDef().unit(target->GetUnitType()); // 获得target 单位UnitTemplate int changed_hp = _att; if (changed_hp < 0) { - changed_hp += p_target._def; - if (changed_hp > 0) changed_hp = 0; + changed_hp += p_target._def; // 考虑目标单位的防御力 + if (changed_hp > 0) changed_hp = 0; // 目标收到的伤害值最小不得低于0 } - p_target._hp += changed_hp; + p_target._hp += changed_hp; // 修改目标hp if (p_target.IsDead()) { - receiver->SendCmd(CmdIPtr(new CmdOnDeadUnit(_id, _target))); + receiver->SendCmd(CmdIPtr(new CmdOnDeadUnit(_id, _target))); // 目标死亡,执行环境命令处理目标尸体 } else if (changed_hp < 0) { + // 记录目标收到的伤害 p_target._changed_hp = changed_hp; p_target._damage_from = _id; - if (receiver->GetUnitDurativeCmd(_target) == nullptr && target_tp.CmdAllowed(ATTACK)) { - // Counter attack. - receiver->SendCmd(CmdDPtr(new CmdAttack(_target, _id))); - } + // if (receiver->GetUnitDurativeCmd(_target) == nullptr && target_tp.CmdAllowed(ATTACK)) { + // // Counter attack. + // receiver->SendCmd(CmdDPtr(new CmdAttack(_target, _id))); // 目标反击(不需要) + // } } return true; } diff --git a/rts/engine/common.h b/rts/engine/common.h old mode 100644 new mode 100755 index 1fcf7023..381951eb --- a/rts/engine/common.h +++ b/rts/engine/common.h @@ -121,6 +121,9 @@ struct PointF { y *= mag / l; } return *this; + // x = 0.1f; + // y = 0.1f; + // return *this; } PointF &operator+=(const PointF &p) { diff --git a/rts/engine/gamedef.h b/rts/engine/gamedef.h index 6cbc88e7..4d9a4bdb 100755 --- a/rts/engine/gamedef.h +++ b/rts/engine/gamedef.h @@ -15,23 +15,23 @@ // [TODO]: Make it more modular. // Define unit property. struct UnitProperty { - int _hp, _max_hp; + int _hp, _max_hp; // 当前hp 最大hp - int _att, _def; - int _att_r; - float _speed; + int _att, _def; // 攻击力 防御力(不需要) + int _att_r; // 射程 + float _speed; // 速度 - // Visualization range. 可视距离 + // Visualization range. 视野 int _vis_r; int _changed_hp; UnitId _damage_from; // Attributes - UnitAttr _attr; + UnitAttr _attr; // 单位类型 (普通/不可攻击) // All CDs. - vector _cds; + vector _cds; // CD MOVE ATTACK GATHER BUILD // Used for capturing the flag game. int _has_flag = 0; diff --git a/rts/game_MC/gamedef.cc b/rts/game_MC/gamedef.cc index 4d4c36e8..471ad7aa 100755 --- a/rts/game_MC/gamedef.cc +++ b/rts/game_MC/gamedef.cc @@ -79,13 +79,15 @@ void GameDef::Init() { * */ _units[RESOURCE] = _C(0, 1000, 1000, 0, 0, 0, 0, vector{0, 0, 0, 0}, vector{}, ATTR_INVULNERABLE); + // 飞机 移动 攻击 _units[WORKER] = _C(50, 50, 0, 0.1, 2, 1, 0, vector{0, 10, 40, 40}, vector{MOVE, ATTACK, BUILD, GATHER}); - // 炮塔 - _units[MELEE_ATTACKER] = _C(50, 100, 1, 0.1, 10, 20, 0, vector{0, 60, 0, 0}, vector{ATTACK}); - // 雷达 飞机 - _units[RANGE_ATTACKER] = _C(100, 200, 1, 0.2, 0, 0, 30, vector{0, 0, 0, 0}, vector{}); - _units[BARRACKS] = _C(200, 200, 1, 0.0, 0, 0, 0, vector{0, 0, 0, 50}, vector{BUILD}); - _units[BASE] = _C(500, 500, 2, 0.0, 0, 0, 0, {0, 0, 0, 50}, vector{}); + // 炮塔 攻击 + _units[MELEE_ATTACKER] = _C(50, 100, 1, 0.1, 10, 20, 0, vector{0, 60, 0, 0}, vector{MOVE, ATTACK}); + // 雷达 索敌 + _units[RANGE_ATTACKER] = _C(100, 200, 0, 0.2, 0, 0, 30, vector{0, 0, 0, 0}, vector{}); + // 导弹 移动 攻击(攻击范围很小) + _units[BARRACKS] = _C(200, 200, 1, 0.0, 0, 0, 0, vector{0, 0, 0, 50}, vector{MOVE,ATTACK}); + _units[BASE] = _C(500, 500, 0, 0.0, 0, 0, 0, {0, 0, 0, 50}, vector{}); } From 736689c86ee72fc7ac54395c0b6f1f9404d6acf2 Mon Sep 17 00:00:00 2001 From: wujie199 <403731462@qq.com> Date: Wed, 30 Dec 2020 17:41:50 +0800 Subject: [PATCH 21/24] js --- rts/frontend/game.js | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/rts/frontend/game.js b/rts/frontend/game.js index 329c32bf..903c61a5 100755 --- a/rts/frontend/game.js +++ b/rts/frontend/game.js @@ -259,7 +259,7 @@ var onUnit = function(u, isSelected) { } } var xy = convert_xy(p.x, p.y); - + draw_sprites(sprites[unit_names_minirts[u.player_id][u.unit_type]], xy[0], xy[1], ori); var hp_ratio = u.hp / u.max_hp; // 掉血的比例 @@ -466,7 +466,12 @@ sprites["BASE"] = load_sprites({ }); // 兵营 sprites["BARRACKS"] = load_sprites({ - "_file" : "imgs/barracks.png", + //"up" : [myrange(15, 22), [9]], + "down": [[9], [0]], + //"left": [[20], myrange(2, 9)], + //"right": [[21], myrange(2, 9)], + "_file" : "imgs/tiles.png", + "_sizes" : [32, 32] }); // 未执行 From 32aed701e0acb9d6183d830f034875c58d5003aa Mon Sep 17 00:00:00 2001 From: wujie199 <403731462@qq.com> Date: Thu, 31 Dec 2020 09:11:19 +0800 Subject: [PATCH 22/24] js png --- rts/frontend/game.js | 8 ++++---- rts/frontend/imgs/People4.png | Bin 24694 -> 248375 bytes 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/rts/frontend/game.js b/rts/frontend/game.js index 903c61a5..1ab2cc2c 100755 --- a/rts/frontend/game.js +++ b/rts/frontend/game.js @@ -483,10 +483,10 @@ var targets = load_sprites({ }); sprites["WORKER"] = load_sprites({ - "up" : [myrange(9, 12), [7]], - "down" : [myrange(9, 12), [4]], - "left" : [myrange(9, 12), [5]], - "right" : [myrange(9, 12), [6]], + "up" : [[9], [4]], + "down" : [[9], [7]], + "left" : [[9], [5]], + "right" : [[9], [6]], "_file" : "imgs/People4.png", "_sizes" : [32, 32] }); diff --git a/rts/frontend/imgs/People4.png b/rts/frontend/imgs/People4.png index a92748b491da99f6e4ba52310df54601b5b209f0..c673be9e84920ac97811ce6521ef8e1eea8561a9 100644 GIT binary patch literal 248375 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эnFfpCm>)3PZf-X;M{mUXI4GL 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

=n08#>Ly+Dzbrt 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 AoB#j- From 54fde32682d86d12c34a455456ab557411346f74 Mon Sep 17 00:00:00 2001 From: bc <729078846@qq.com> Date: Thu, 31 Dec 2020 09:50:00 +0800 Subject: [PATCH 23/24] edit Bullet --- .vscode/settings.json | 5 +++- rts/engine/bullet.cc | 3 ++- rts/engine/cmd.cc | 6 +++-- rts/engine/cmd_specific.cc | 52 +++++++++++++++++++++++++++++++------ rts/engine/map.cc | 2 +- rts/engine/unit.h | 2 ++ rts/game_MC/cmd_specific.cc | 9 +++++++ rts/game_MC/gamedef.cc | 16 +++++++----- 8 files changed, 75 insertions(+), 20 deletions(-) mode change 100644 => 100755 rts/engine/unit.h diff --git a/.vscode/settings.json b/.vscode/settings.json index c7cd746d..1e6478eb 100755 --- a/.vscode/settings.json +++ b/.vscode/settings.json @@ -85,7 +85,10 @@ "variant": "cpp", "vector": "cpp", "__functional_03": "cpp", - "filesystem": "cpp" + "filesystem": "cpp", + "*.tcc": "cpp", + "memory_resource": "cpp", + "cinttypes": "cpp" }, "python.pythonPath": "/usr/local/Caskroom/miniconda/base/envs/moRL/bin/python" } \ No newline at end of file diff --git a/rts/engine/bullet.cc b/rts/engine/bullet.cc index 53e9261a..2761a45b 100755 --- a/rts/engine/bullet.cc +++ b/rts/engine/bullet.cc @@ -9,7 +9,8 @@ #include "bullet.h" #include "cmd_specific.gen.h" -static constexpr float kDistBullet = 0.3; // 子弹的体积? +//static constexpr float kDistBullet = 0.3; // 子弹的体积? +static constexpr float kDistBullet = 0.003; // 子弹的体积? string Bullet::Draw() const { return make_string("u", _p, _state); diff --git a/rts/engine/cmd.cc b/rts/engine/cmd.cc index 5777f935..c407adcd 100755 --- a/rts/engine/cmd.cc +++ b/rts/engine/cmd.cc @@ -82,7 +82,7 @@ float micro_move(Tick tick, const Unit& u, const GameEnv &env, const PointF& tar const PointF &curr = u.GetPointF(); // 当前位置 const Player &player = env.GetPlayer(u.GetPlayerId()); - cout << "Micro_move: Current: " << curr << " Target: " << target << endl; + //cout << "Micro_move: Current: " << curr << " Target: " << target << endl; float dist_sqr = PointF::L2Sqr(target, curr); // 距离 (平方) const UnitProperty &property = u.GetProperty(); @@ -107,7 +107,7 @@ float micro_move(Tick tick, const Unit& u, const GameEnv &env, const PointF& tar waypoint.y = first_block.y; } } - cout << "micro_move: (" << curr << ") -> (" << waypoint << ") planning: " << planning_success << endl; + //cout << "micro_move: (" << curr << ") -> (" << waypoint << ") planning: " << planning_success << endl; int ret = move_toward(m, property._speed, u.GetId(), curr, waypoint, &move); if (ret == MT_OK) { // Set actual move. @@ -172,8 +172,10 @@ bool CmdEmitBullet::run(GameEnv *env, CmdReceiver*) { bool CmdCreate::run(GameEnv *env, CmdReceiver*) { // Create a unit at a location + std::cout<<"CmdCreate: "<AddUnit(_tick, _build_type, _p, _player_id)) { // If failed, money back! + //std::cout<<"failed"<GetPlayer(_player_id).ChangeResource(_resource_used); return false; } diff --git a/rts/engine/cmd_specific.cc b/rts/engine/cmd_specific.cc index a48e41ab..9ef3de3e 100755 --- a/rts/engine/cmd_specific.cc +++ b/rts/engine/cmd_specific.cc @@ -28,6 +28,7 @@ static constexpr float kBuildDist = 1; static constexpr float kGatherDistSqr = kGatherDist * kGatherDist; static constexpr float kBuildDistSqr = kBuildDist * kBuildDist; +static bool find_nearby_empty_place(const RTSMap &m, const PointF &curr, PointF *p_nearby); /* CMD_DURATIVE(Attack, UnitId, target); Durative attack. Will first move to target until in attack range. Then it issues melee attack if melee, and emits a bullet if ranged. @@ -42,7 +43,7 @@ CMD_DURATIVE(Gather, UnitId, base, UnitId, resource, int, state = 0); //////////// Durative Action /////////////////////// bool CmdMove::run(const GameEnv &env, CmdReceiver *receiver) { - std::cout<PrintInfo()<PrintInfo()<GetUnitType() == BARRACKS){ + // 如果是导弹,目标失活后直接销毁? + receiver->SendCmd(CmdIPtr(new CmdOnDeadUnit(_id, _id))); + } _done = true; return true; } @@ -80,19 +85,49 @@ bool CmdAttack::run(const GameEnv &env, CmdReceiver *receiver) { int dist_sqr_to_enemy = PointF::L2Sqr(curr, target_p); // 距离 bool in_attack_range = (dist_sqr_to_enemy <= property._att_r * property._att_r); // 判断是否在攻击范围内 // cout << "[" << _id << "] dist_sqr_to_enemy[" << _last_cmd.target_id << "] = " << dist_sqr_to_enemy << endl; - - // Otherwise attack. + + // Otherwise attack. if (property.CD(CD_ATTACK).Passed(_tick) && in_attack_range) { // 如果目标在攻击范围内且攻击就绪 // Melee delivers attack immediately, long-range will deliver attack via bullet. + // if (property._att_r <= 1.0) { + // receiver->SendCmd(CmdIPtr(new CmdMeleeAttack(_id, _target, -property._att))); + // } else { + // receiver->SendCmd(CmdIPtr(new CmdEmitBullet(_id, _target, curr, -property._att, 0.1))); + // } + // receiver->SendCmd(CmdIPtr(new CmdCDStart(_id, CD_ATTACK))); // 重置攻击CD + /** + * 飞机攻击 + * 锁定目标 + * 发射导弹 + * */ + if(u->GetUnitType() == WORKER){ // 如果是飞机 + // 制造一个导弹 + PointF build_p; //创造导弹的地点 + const RTSMap &m = env.GetMap(); + build_p.SetInvalid(); + find_nearby_empty_place(m, curr, &build_p); + if (! build_p.IsInvalid()) { + receiver->SendCmd(CmdIPtr(new CmdCreate(_id, BARRACKS, build_p, u->GetPlayerId(), 0))); + _done = true; + } + return true; + } + if (property._att_r <= 1.0) { receiver->SendCmd(CmdIPtr(new CmdMeleeAttack(_id, _target, -property._att))); } else { receiver->SendCmd(CmdIPtr(new CmdEmitBullet(_id, _target, curr, -property._att, 0.1))); } receiver->SendCmd(CmdIPtr(new CmdCDStart(_id, CD_ATTACK))); // 重置攻击CD - } else if (! in_attack_range) { // 不在攻击范围内时移动单位接近攻击目标 (不需要) - //micro_move(_tick, *u, env, target_p, receiver); - _done = true; + if(u->GetUnitType() == BARRACKS){ // 导弹执行攻击后销毁 + receiver->SendCmd(CmdIPtr(new CmdOnDeadUnit(_id, _id))); + } + } else if (! in_attack_range) { + if(u->GetUnitType() == BARRACKS){ + micro_move(_tick, *u, env, target_p, receiver); // 如果是导弹不在攻击范围内时移动单位接近攻击目标 + }else{ + _done = true; + } } // In both case, continue this action. @@ -173,6 +208,7 @@ static bool find_nearby_empty_place(const RTSMap &m, const PointF &curr, PointF } bool CmdBuild::run(const GameEnv &env, CmdReceiver *receiver) { + //cout << "CmdBuild cmd = " << PrintInfo() << endl; const Unit *u = env.GetUnit(_id); if (u == nullptr) return false; @@ -186,8 +222,8 @@ bool CmdBuild::run(const GameEnv &env, CmdReceiver *receiver) { // Otherwise move to nearby location of cmd.p and build at cmd.p // cout << "Build cd: " << property.CD(CD_BUILD).PrintInfo(tick) << endl; switch(_state) { - case kMoveToDest: - // cout << "build_act stage 0 cmd = " << PrintInfo() << endl; + case kMoveToDest: + //cout << "build_act stage 0 cmd = " << PrintInfo() << endl; if (_p.IsInvalid() || PointF::L2Sqr(curr, _p) < kBuildDistSqr) { // Note that when we are out of money, the command CmdChangePlayerResource will terminate this command. // cout << "Build cost = " << cost << endl; diff --git a/rts/engine/map.cc b/rts/engine/map.cc index 751f40ed..c35cd14b 100755 --- a/rts/engine/map.cc +++ b/rts/engine/map.cc @@ -177,7 +177,7 @@ void RTSMap::precompute_all_pair_distances() { // 增加单位 bool RTSMap::AddUnit(const UnitId &id, const PointF& new_p) { - if (_locality.Exists(id)) return false; // 位置已有单位,不可添加 + if (_locality.Exists(id)) return false; // 已有该单位,不可添加 if (! _locality.IsEmpty(new_p, kUnitRadius, INVALID)) return false; _locality.Add(id, new_p, kUnitRadius); diff --git a/rts/engine/unit.h b/rts/engine/unit.h old mode 100644 new mode 100755 index c2b31429..97edaead --- a/rts/engine/unit.h +++ b/rts/engine/unit.h @@ -29,10 +29,12 @@ class Unit { public: Unit() : Unit(INVALID, INVALID, WORKER, PointF(), UnitProperty()) { + // std::cout<<"Unit Constructor without args"<{0, 0, 0, 0}, vector{}, ATTR_INVULNERABLE); - // 飞机 移动 攻击 - _units[WORKER] = _C(50, 50, 0, 0.1, 2, 1, 0, vector{0, 10, 40, 40}, vector{MOVE, ATTACK, BUILD, GATHER}); + // 飞机 移动 发射导弹 + _units[WORKER] = _C(1, 100, 0, 0.03, 2, 10, 0, vector{0, 40, 0, 0}, vector{MOVE, ATTACK, BUILD}); // 炮塔 攻击 - _units[MELEE_ATTACKER] = _C(50, 100, 1, 0.1, 10, 20, 0, vector{0, 60, 0, 0}, vector{MOVE, ATTACK}); + _units[MELEE_ATTACKER] = _C(50, 100, 0, 0.1, 10, 20, 0, vector{0, 40, 0, 0}, vector{ATTACK}); // 雷达 索敌 - _units[RANGE_ATTACKER] = _C(100, 200, 0, 0.2, 0, 0, 30, vector{0, 0, 0, 0}, vector{}); + _units[RANGE_ATTACKER] = _C(100, 100, 0, 0.2, 0, 0, 30, vector{0, 0, 0, 0}, vector{}); // 导弹 移动 攻击(攻击范围很小) - _units[BARRACKS] = _C(200, 200, 1, 0.0, 0, 0, 0, vector{0, 0, 0, 50}, vector{MOVE,ATTACK}); - _units[BASE] = _C(500, 500, 0, 0.0, 0, 0, 0, {0, 0, 0, 50}, vector{}); + _units[BARRACKS] = _C(200, 10, 0, 0.03, 10, 0.01, 0, vector{0, 40, 0, 50}, vector{ATTACK}); + // 保护目标 + _units[BASE] = _C(500, 500, 0, 0.0, 0, 0, 0, {0, 0, 0, 50}, vector{BUILD}); } vector > GameDef::GetInitCmds(const RTSGameOptions&) const{ vector > init_cmds; - init_cmds.push_back(make_pair(CmdBPtr(new CmdGenerateMap(INVALID, 0, 200)), 1)); // 障碍 资源 + init_cmds.push_back(make_pair(CmdBPtr(new CmdGenerateMap(INVALID, 0, 0)), 1)); // 障碍 资源 init_cmds.push_back(make_pair(CmdBPtr(new CmdGenerateUnit(INVALID)), 2)); return init_cmds; } From 35b891391623180d6aafcd365da8363b47f0cc13 Mon Sep 17 00:00:00 2001 From: wujie199 <403731462@qq.com> Date: Thu, 31 Dec 2020 11:41:50 +0800 Subject: [PATCH 24/24] js --- rts/frontend/game.js | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/rts/frontend/game.js b/rts/frontend/game.js index 1ab2cc2c..0d89797c 100755 --- a/rts/frontend/game.js +++ b/rts/frontend/game.js @@ -466,10 +466,10 @@ sprites["BASE"] = load_sprites({ }); // 兵营 sprites["BARRACKS"] = load_sprites({ - //"up" : [myrange(15, 22), [9]], + "up" : [[9], [0]], "down": [[9], [0]], - //"left": [[20], myrange(2, 9)], - //"right": [[21], myrange(2, 9)], + "left": [[9], [0]], + "right": [[9], [0]], "_file" : "imgs/tiles.png", "_sizes" : [32, 32] });