四国军棋布局全面技巧_教程技巧_棋类_棋谱收藏站
&|&&|&&|&&|&&|&&|&&|&&|&&|&&|&&|&&|&&|&
位置:&&&&&&&&&&&&&&&&&正文
四国军棋布局全面技巧
作者:佚名
文章来源:棋谱收藏站
浏览次数:
更新时间:
我认为玩四国最重要的三个因素分别是布局,走棋技巧,以及玩家的心理素质。
排-军-旅-兵-团
师-O-兵-O-弹
连-连-O-旅-师
营- O -连- O-兵
雷-营-雷-雷-弹
司-旗-排-排-团
千万不要动最后两排.攻击的话从右边攻击 1、进攻型布局
针对对手的防守体系,以进攻为目的的排兵布阵属于进攻型布局,主要特点是进攻侧重兵囤积或出奇制胜。进攻中减少了对大本营的防护,军旗摆在非进攻一侧较多见。
以夺取军旗为进攻目的的进攻型布局往往将大部分兵力都集中在进攻侧,急攻不停(见中局阶段中的闪电内容)。另外的进攻型布局是以自己的进攻换取局部利益为目的来布阵的,获得便宜以后通过其他的攻防保持并扩大已经获得的优势进而赢棋。
图1-3是一种被称作“推土机”的进攻布局,也是一种最典型的闪电布局。在一侧边路集中全部大子以期快速拿下对手的军旗,另一侧靠中层干部和炸弹防守军旗,自己连续的进攻会带动对手的行棋,使对手无暇对自己另一侧和中路展开攻击。由于这种布局被大多数棋手所熟悉,几步行棋以后被对手知道自己子的大小就难下了。
图1-4布局左右相对均衡,两侧都可以采取进攻方式。左侧进攻实力稍弱,军长在左肋能够协助各面的进攻与防守;右侧司令可以首攻或前行控势,也可以等待时机出击。
图1-5是一种相对均衡型布局,司令在中间兼顾两边,可以不动也可以直接杀敌或者出来控势。右侧是主攻方向,用大、中子急攻,军长出击后五线护旗力量单薄。
2、防守型布局
棋子在自己的阵营里阻击对手的进攻为防守,针对对手进攻自己而布的阵是防守型布局,重兵多陈于旗侧,其关键在于周密。在自己有足够的防守实力的情况下,防守型布局在局部防守战斗中不吃亏,这是防守型布局的特点。一般的防守型布局在军旗一侧能够经得起对手两个司令的进攻,大多拥有两炸或一炸一令的实力。
防守型布局在各方力量消耗、子力的价值有所变化之后,可以具有进攻性和半攻半守性,由一些子在防守体系以外作战,另外的一些子力组合重新构成防守体系。
图1-6是特别实用的一种防守阵型,师后跟炸,司令压线,军长守家。初学者采用该阵防守不会在局部明显吃亏,许多老手也经常用类似的阵法防守。右侧相对薄弱,一般以右侧小子试探对手在九宫的实力,如果该侧遭到攻击,眉毛处的司令横出,以免被对手吃光一路。明确敌人的攻击方向及攻击实力后,利用层层有力的防守阻击对手。
图1-7两侧比较均衡,在军旗侧加强了大子的力量,最容易破坏对手司令、军长的进攻。两个炸弹的位置在险要处,自己的子轻易不容易出击。
图1-8囤积重兵在后方,前面用司令与敌周旋,司令阵亡后迅速收缩子力,在五线与对手展开嘶杀。缺点是前方大子少,对家遭受攻击很难救援。
图1-9是针对对手司令首攻闪电的布局,对手如果小子来犯能够用上眉毛处的旅长,对手没有发动攻势,炸弹进营。用过司令和军长后,旅长与炸弹组成防线。布局可以决定你下这盘棋的立场,是以攻击为主,主动出击;还是以防御为主,诱敌深入。 我下四国得到了一点布局经验,纪录在这里。 1:关于军旗摆放位置 经过我百折不挠的观察和研究发现,除了极少数的玩家,在和上盘一起下过棋的敌家继续下棋时,会变换布局把军旗改变位置,98%的人喜欢把军旗放在自己的左边。这样2个对家的军旗是错开的,而大家又习惯把大棋放在军旗那边防守,在对着对家军旗的那一面都是没有攻击性的小子,所以在对家受到敌家猛烈进攻时,要想去帮助对家都不是很方便,小子冲上去挡一般也都是被吃的命~所以为了和对家更好的配合,最好把自己的军旗放在右边,这样2个对家军旗在一边的几率就很大了,有利于互相配合。而且也能更好的进攻你上家,因为他的军旗是靠在你实力强的一面的。 2:关于40摆放位置 40不光是全棋的统帅,对玩家来说也算一个精神支柱,相信大家每次40牺牲后,都会有点心灰和胆怯了。 有的人喜欢把军旗放在布局的上角,便与抵挡和进攻。但是同时这种布局会使40很早暴露,成为真假炸弹追逐的目标。 还有人喜欢把40放在第一排最中间,这样40被炸弹威胁到的可能就小了很多,但是40放在这个位置进攻性和防御性都不如把40放在布局2边高。 40放在倒数第2排的边上也是很常见的。这种摆放也有它的缺点,就是40不好发挥作用,通常前面的棋走完,该40出场的时候,前面的棋已经被攻击的无抵抗之力了,40没有发挥他大王的作用,也很可惜,何况到了最后,走棋都很谨慎,40很容易被炸到。 还有人喜欢把40放的很隐蔽,大家应该结合自己下棋的特点去摆放40,如果进攻性强,就把40尽量放在隐蔽的地方。不要让40早早暴露目标,成为炸弹追击的目标。 3:关于工兵的摆放位置。 我一直认为工兵的作用仅次与38,因为工兵具有其他任何棋子都没有的灵活性,也是地雷的唯一克星。有时候一个工兵能挽救明显实力弱小的一队。 大家一般都喜欢把工兵摆放在第一排最中间2旁的2个位置,或者是2个大本营的上方,因为这2个位置明显能很好的保护工兵,也能让工兵能抓住时机飞出。其实下棋比较保守的人也可以尝试把工兵放在边上2排第3.4行的布局,上面放置37.38抵御敌家突然的进攻,保护工兵,也能随时出击。把工兵放在这个位置还能在确定对方军旗位置后,冒充非工兵的棋子去试探敌家军旗边上的雷,很具有迷惑性。 4:关于排长的摆放位置。 很多人认为排长是个可有可无的角色,因为他只能制服工兵,而灵活的工兵也不是那么容易让排长抓住的。其实排长还有个很重要的作用,就是可以去对炸弹,我经常把排长放在边上第2.3行,如果发现对方走出较大的类似37 38的子,下面很可能就埋伏着炸弹,这个时候就可以让排长勇猛的撞上去,即使撞上的不是炸,也不是很亏。 5:关于地雷的摆放位置。 经典的保守布局就是三角雷,3颗地雷包围住军旗,看似对军旗保护的很好,但是这种布局极易遭到敌家“双飞”的摧毁,不管你四周还有多强的实力,只要你不小心给了敌家双飞的机会,就会马上被灭掉,所以这种布局一般被初学者用的比较多,玩的多点的就能很清楚的看出三角雷的弊端了。 堡垒型地雷也是很多保守派喜欢用的阵型,就是把倒数第2排最2边的位置用地雷护住。其实这样的“堡垒”很容易被攻破,所以也要谨慎使用。 我个人喜欢把2颗地雷围在军旗的上边和一边,另一边置放较大的子,这样可以避免死于敌家双飞,还能保存实力,但是还有有缺陷的。因为每种阵型都不会是完美的,都有自己独到的优点和不可避免的缺陷。 6:关于炸弹的摆放位置。 炸弹该怎么样放置一直是我最头疼的难题,因为我习惯把炸弹放在边上第2排,然后把第三排的装做炸弹进营,让敌家以为我的炸弹在军营里就放松警惕,轻易的暴露40,然后看准就炸。我自以为这是很好的战术,也经常会在一盘开始不久就炸掉敌家一个甚至2个40,但是也有很多很多次,我的2个炸弹都很快被敌家的小子轻易费掉了。因为很多人下军旗都不会去研究对方的布局和走棋,而会习惯性的把这个位置的子当作炸弹去对,所以很多次开局我的炸弹都没了了,而对方的40就开始肆无忌惮进攻,让人无力抵抗。 就先写这么多了,关于四国,还有很多很多的技巧可以去研究,你可以尝试各种各样的布局,找出最适合自己的阵型。
上篇文章: 下篇文章:
&相关文章:
&相关下载:
【】【】【】【】【】【读者群征文活动】
随便聊聊军棋
不知道各位开发人员,有没有四国军棋的爱好者?本人是一位四国军棋爱好者,一直玩四暗。玩军棋大概有 6~7 年的时间了,儿时的东西到了上班期间才慢慢的找回。
从玩游戏之初到现在,各种军棋的游戏平台都摸过一遍,感觉下来,无论是从游戏的界面上、操作的动态效果上,还是方便性,我觉得腾讯的四国军棋平台是做的最好的(简洁、清爽)。其它的平台不是过于花哨,就是迟钝的响应和交互。
现在很多原来中游、联众平台里面的高手也有部分转到了腾讯游戏平台,比如:张硕闪电、联众老菜鸟、老头脸上飞红等等。腾讯平台也有很多大师级人物,比如:欠你幸福、蚊子、戏子无义(2014年个人军棋赛冠军)等。
萌生开发此工具想法的原因
经常在网上下军棋的人都知道,我们都需要很多布局以备使用。当征战的时候,在游戏界面上直接 import 一个指定的布局文件可以快速的调整作战布局,而不用临时摆棋。就拿腾讯的四国军棋平台来说,临时摆棋:一来,浪费一桌四个玩家的时间,而且如果和你坐一桌的人有蓝钻,很有可能当你调整到一半的时候就被踢了,前面的调整前功尽弃;二来,如果你调整的慢,还没等你调整完,都有可能因长时间未“完成调度”而导致系统超时,把你踢出棋桌。我身边碰到不少的棋手就是这样的。
目前为止,腾讯都没有一个工具来方便而又直接的查看、编辑自己的布局文件。我不知道其它有没有第三方的工具去做这件事情。出于兴趣爱好,以及为了方便大家布局的编辑调整,自己在网上查找了一点资料后就开始着手开发这个小工具了,腾讯的四国军棋布局文件的后缀名是 JQL(PS:可能是 Jun Qi Layout 的缩写)。
投入使用和更新
“QQ 四国军棋布局编辑器(Jql Editor)”我大概早在一年半以前就写成了第一个版本,后来在公司的四国军棋俱乐部中,以及比赛中,发布给大家使用,反响不错,大家都挺喜欢的。
之后,又对其进行了功能上的强化和丰富,包括Drag & Drop、Undo-Redo、Copy As Image、Y-Flip 等方面的功能。然后在一些 QQ 军棋群里面分享给一些棋手,方便他们使用。
在最新的版本里(3.0.0),又对其动了一次“手术”。这次改动把原先使用的 Dev Express 组件去除了,原先使用该组件的目的是为了美化界面和丰富样式,后来经过思虑,鉴于 Windows 7+ 的界面都做的不错,所以决定移除这个UI上的锦上添花。其次,将界面底部的具有一定厚度的按钮组整个去掉,换成 Context Menu,使得 UI 看上去更加的简洁。
QQ 四国军棋布局编辑器一览
下面先让大家看一下这款工具的总体界面(一共有四种颜色):
每次打开这个小工具的时候,默认是以这样大体上对称的布局将25个棋子摊在台面上的。
在这张图中,大家所看到的棋子均采自QQ四国军棋,从中进行截取、修改和拼接。墨绿色的棋盘也同样来源于QQ四国军棋,通过PS对QQ四国军棋的棋盘进行技术处理,通过截边、着色、渐进等处理获取这个迷你布局盘面。如下图所示。话说,由于本人PS技术能力有限,在这图片的制作上,花了不少功夫,其中还包括后面会看到的获得焦点棋子(Focused Chessman)及选中棋子(Selected Chessman)的高亮发光效果。
所有操作均放在了右键上下文菜单上,当右键菜单打开就会一目了然。下面是截图。
这个布局编辑器程序的几个关键点在于:
GDI+ 图形图像的绘制和处理
棋子位置的判断和计算
二进制JQL文件的解析
鼠标及键盘事件的响应和处理
合理随机布阵的生成算法
核心类的设计
在 QQ 四国军棋布局编辑器中,有四个核心的类,如下图:
(1) JqlChessman:全盘 25 个棋子对象,盘面上的“主角”,被它们的大管家 JqlChessmanCollection 管着。
(2) JqlChessmanCollection:棋盘上所有棋子的容器。负责整体处理棋子位置的关系、特殊位置的判断、棋子之间的交换等操作。
(3) JqlChessmanSwap:两棋子之间的交换和整个盘面的翻转。
(4) JqlInfo:读取并解析 JQL 文件的类,镇守程序的入口(数据的读取、校验和解析),如果没有它,上面三位都只是打酱油的。
枚举的设计
一个工具无论大小,都会有枚举类型的存在,这款工具也不例外。
(1) ChessmanSwapType:棋子间的交换或者整个盘面的左右翻转。
(2) SpecialPosition:指示军棋布局中的特殊位置,玩军棋的人都知道,军棋有几个限定摆放位置的棋子:地雷、炸弹、军旗。其中“军旗”只能放在最后一排的两个大本营里面(Base),“地雷”只能放在最后两排(LastTwoRows),“炸弹”不能放在第一排(FirstRow)。另外还有五个特殊的位置,那就是“行营”(Bunk),在 QQ 军棋里面,就是橙色圈圈代表的位置,行营在布局中是用不到的,而且鼠标点击这些位置也应该直接忽略,初始布阵时,行营是不能放子的。那除了这些以外,剩余的其他位置就是非特殊(NonSpecial)位置。下面再贴一下棋盘,让大家看起来直观一点:
(3) ChessmanType:顾名思义,棋子类型,为了给每一个军衔取英文名,我在网上搜索了很多,各有说法,最终我得出以下对应的英文军衔。
(注:Cmdr = Commander)
棋子类型直接决定了界面的显示和布局的内容。
(4) ChessmanColor:子颜色这个类在当前这个小工具中是一个锦上添花的东西,因为对于这个布局而言,我完全可以只用一种颜色,但是考虑到每个人喜好的颜色不同,就扩展了更换棋子颜色的这么个功能。但是因为考虑到这个工具目前只针对腾讯的四国军棋,所以界面的棋子和颜色均取自 QQ 的四国军棋游戏。
有人可能会问,为什么不让用户自己选择颜色呢?原因是如果这么做,我就无法使用 QQ 的军棋图片了,需要使用 Label 去做一个 Chessman Control,这样才能自定义 background color,衡量了一下,觉得没有必要,虽然 25 个 Label 放在台面上可以省掉麻烦的 Mouse Move 事件,但是这样一来,就有几个缺点:
无法对焦点棋子进行高亮光环特效显示。
棋子的美观上不如图片来的好。
JQL 布局文件分析
JQL 文件是一个二进制文件,用 UltraEdit 或者 Notepad++(HexEditor 插件)打开,可以看到二进制文本,该文本一共50个字节:
前20个字节是一串固定的文字,类似于“QQ 四国军棋游戏”这样的字符串的二进制byte数组。
后 30 个字节,每一个字节代表一个棋子面值(包括25个棋子 + 5个行营),棋子的字面值就是军衔等级,对应如下:(行营是00)。PS:在腾讯该款游戏的设计里,并未用到 01。
前面提到,处理文件主要由 JqlFile 来负责,这里面包含三个主要的属性:ChessmanCollection、HeaderBytes、LayoutBytes。
HeaderBytes 用来存储二进制 JQL 文件开头部分的一段说明字符串;LayoutBytes 用来存储布局的二进制字节数组,读取这个 byte 数组之后,会将每一个byte通过一定的规则转化成 Chessman 对象(一个 byte 就是一个 chessman,后面会说到这个文件的结构),进而形成ChessmanCollection 对象。下面的代码是读取文件的内容:
HeaderBytes = new byte[JqlConsts.JqlFileHeaderLength];
Array.Copy(bytes, 0, HeaderBytes, 0, JqlConsts.JqlFileHeaderLength);
LayoutBytes = new byte[JqlConsts.JqlFileLayoutLength];
Array.Copy(bytes, JqlConsts.JqlFileHeaderLength, LayoutBytes, 0, JqlConsts.JqlFileLayoutLength);
ChessmanCollection = new JqlChessmanCollection(this);
与棋子位置相关的判断和计算
首先,是对于某个棋子位置的检测,这个位置的检测在 CheckPosition 方法里面:
internal static SpecialPosition CheckPosition(int row, int col)
if (!IsValidPosition(row, col)) return SpecialPosition.N
// 判断是不是第一排
if (row == 0) return SpecialPosition.FirstR
// 判断是不是大本营
if (row == JqlConsts.LayoutRowCount - 1 && (col == 1 || col == 3))
return SpecialPosition.B
// 判断是不是最后两排
if (row == JqlConsts.LayoutRowCount - 2 || row == JqlConsts.LayoutRowCount - 1)
return SpecialPosition.LastTwoR
// 判断是不是行营
if (row & 0 && row & JqlConsts.LayoutColCount &&
col & 0 && col & JqlConsts.LayoutColCount)
if (row == col || row + col == 4)
return SpecialPosition.B
// 以上都不是,那就是非特殊位置
return SpecialPosition.NonS
在这个方法里面,需要说明的是:大本营的判断必须放在后两排的判断前面,因为大本营本身也是属于后两排的。
接下来 CanSwap 方法会调用 CheckPosition 方法来获取当前 Mouse Click 或者 Mouse Over 的位置类型,随后,判断待交换的两个棋子能否交换,比如:第二排的炸弹和第一排的工兵交换,这就是不合理的交换。代码比较长,就不贴了,有兴趣的可以看看源代码。这里放一张特殊位置图,大家可以参考比对一下:
和棋子相关的一些算法方法中涉及到一些常量:
布局矩形区域相对于窗体客户区的左上角水平、垂直偏移量
public static readonly int OffsetLeft = 30;
public static readonly int OffsetTop = 30;
布局的行、列数
public static readonly int LayoutColCount = 5;
public static readonly int LayoutRowCount = 6;
棋子和棋子之间的水平、垂直间距
public static readonly int HoriMargin = 3;
public static readonly int VertMargin = 20;
高亮发光边的简单实现
在界面上,鼠标可以直观的选择两个棋子进行交换。如下图,当选中一个棋子时,其边缘呈现蓝色发光边;当鼠标悬浮经过棋子,即呈现***发光边。
如何高亮显示,主要就是如何判定鼠标是否移动到棋子的客户区范围之上。
private Point GetPositionInLayout(Point mouseLocation)
int horiSpan = JqlConsts.ChessmanWidth + JqlConsts.HoriM
int vertSpan = JqlConsts.ChessmanHeight + JqlConsts.VertM
int x = (mouseLocation.X - JqlConsts.OffsetLeft) / horiS
int y = (mouseLocation.Y - JqlConsts.OffsetTop) / vertS
return new Point(x, y);
上面方法用来将鼠标的位置转化成一个6*5矩阵中的位置,即哪一个棋子。接着,对该位置进行上述的特殊位置判断,此处仅判断是不是行营,如果不是则需要有发光效果,所以需要获取棋子的矩形客户区。
private Rectangle GetChessmanRectangleInBoard(Point layoutPosition)
layoutPosition.X = layoutPosition.X * (JqlConsts.ChessmanWidth + JqlConsts.HoriMargin)
+ JqlConsts.OffsetL
layoutPosition.Y = layoutPosition.Y * (JqlConsts.ChessmanHeight + JqlConsts.VertMargin)
+ JqlConsts.OffsetT
return new Rectangle(layoutPosition.X, layoutPosition.Y,
JqlConsts.ChessmanWidth, JqlConsts.ChessmanHeight);
现在可以判断当前鼠标是不是在棋子位。
private bool IsMouseOverChessman(Point mouseLocation, out Point positionInLayout)
positionInLayout = GetPositionInLayout(mouseLocation);
SpecialPosition position = JqlChessmanCollection.CheckPosition(
positionInLayout.Y, positionInLayout.X);
if (position == SpecialPosition.None || position == SpecialPosition.Bunker)
Rectangle rect = GetChessmanRectangleInBoard(positionInLayout);
return rect.Contains(mouseLocation);
最后需要将发光效果应用到棋子所在的矩形上,通过下面的方法可以根据数组中的位置确定具体的棋子矩形客户区的位置:
private Rectangle GetFrameRectangleInBoard(Point layoutPosition)
layoutPosition.X = layoutPosition.X * (JqlConsts.ChessmanWidth + JqlConsts.HoriMargin)
+ JqlConsts.OffsetL
layoutPosition.Y = layoutPosition.Y * (JqlConsts.ChessmanHeight + JqlConsts.VertMargin)
+ JqlConsts.OffsetT
layoutPosition.Offset(-10, -10);
return new Rectangle(layoutPosition.X, layoutPosition.Y,
JqlConsts.FrameWidth, JqlConsts.FrameHeight);
界面上所有图形的绘制均放在 Paint 事件中处理,在该事件中,除绘制棋子以外,另外需要判断是否有焦点棋子,如有,则需绘制高亮边框。
随机合理布局的生成
随机生成布局,首先,需要生成军旗的位置,因为军旗就俩大本营可以选择,不是左边就是右边。其次,需要生成地雷的位置,因为地雷的位置的限制也是仅次于军旗的,地雷只能放在最后两排;然后,我们需要随机生成炸弹的位置,炸弹不能放第一排,是仅次于地雷的。之后随机生成其他子力的布局位。
接着当全部摆放完25个棋子之后,需要对除军旗外的另一个大本营的子力进行微调,比如司令放到了大本营,这显然不是一个合理的布局,当然也不是没有人这么放过,但是通常来说不是很合理。所以需要将这个子力和某一个排长进行互换。
最后,得到一个较为合理的军棋布局,军棋的布局和打法变化多端,地雷下放司令、炸弹的,一线司令后面跟炸弹的,都屡见不鲜,所以除了上述的情况以外,出其不意的奇葩布阵也会有意想不到的效果。
这个工具可以在
下载到,有兴趣的可以使用,该工具总的来说不是很大,主要就是用来处理军棋布局,方便玩家游戏,使用 .NET Reflector 可以查看全部源代码。
欢迎提出宝贵意见。谢谢。
这算 外挂 吗?
这是标准的 传统黑客的 行为了。 赞