轮流下子是双方的权利,但允许任何一方放弃下子权,先形成5子连线者获胜。
五子棋有两种玩法。玩法一:双方分别使用黑白两色的棋子,下在棋盘直线与横线的交叉点上,先形成五子连线者获胜。
玩法二:自己形成五子连线就替换对方任意一枚棋子。被替换的棋子可以和对方交换棋子。最后以先出完所有棋子的一方为胜。
五子棋的棋具与围棋通用,是一种传统的棋种。
棋盘:
棋盘可用木料、硬纸、塑料、布料、石料或环保材料等制成。棋盘由横纵各15条等距离,垂直交叉的平行线构成,在棋盘上,横纵线交叉形成了225个交叉点为对弈时的落子点。邻近两个交叉点的距离要略大于棋子的直径,纵线距离约为2.5厘米,横线约为2.4厘米。
以对局开始时的黑方为准,棋盘上的纵行线从近到远用阿拉伯数字1—15标记,横行线从左到右用英文字母A—O按字母顺序标记。由于每个英文字母都对应着一条纵线,每个阿拉伯数字都对应着一条横线,所以,棋盘上的每一个交叉点都可用英文字母和阿拉伯数字的组合来标示出来。
多用户五子棋游戏 JAVA编程
五子棋是全国智力运动会竞技项目之一,是一种两人对弈的纯策略型棋类游戏。双方分别使用黑白两色的棋子,下在棋盘直线与横线的交叉点上,先形成五子连珠者获胜。
许多国家的人对五子棋都有不同的爱称,例如,韩国人把五子棋称为“情侣棋”,表示情人之间下五子棋有利于增加情感的交流;欧洲人称其为“绅士棋”,代表下五子棋的君子风度胜似绅士;日本人则称其为“中老年棋”,说明五子棋适合中老年人的生理特点和思维方式。
一、五子棋有两种玩法:
玩法一:双方分别使用黑白两色的棋子,下在棋盘直线与横线的交叉点上,先形成五子连线者获胜。
玩法二:自己形成五子连线就替换对方任意一枚棋子。被替换的棋子可以和对方交换棋子。最后以先出完所有棋子的一方为胜。
二、正规五子棋的主要规则:开局猜子、第一颗子、禁手规则、胜负规则等。
开局猜子是五子棋正规比赛必须经过的步骤之一,主要是为了决定哪方执黑子。而第一棋子必须下在棋盘中心,同时黑子方只能以“四、三”取胜,否则则被判输。
1、开局猜子
开局猜子是五子棋正规比赛必须经过的步骤之一,指的是一方手握若干棋子,另一方猜奇偶数,猜对一方执黑子,另一方执白子,并且黑子优先下子,第二局换对方先下子。
2、第一颗子
正规比赛中,第1颗下在棋盘上的棋子一定是黑子,且第一颗黑子一定是下在棋盘最中心的位置,这个位置在棋盘内叫做天元。
3、禁手规则
正规五子棋存在禁手规则,但这种规则只针对黑子方,对白子方无效。指的是黑子形成双活三、双四、五子以上长连,则判黑子方输,主要是为了限制黑子先行的优势。但黑子禁手时,需要由白子方指出才能判黑子输。
4、胜负规则
黑子只能以“四、三”取胜,若禁手与五连同时形成,先完成五连则为胜方。
三、棋具:
1、棋盘:
棋盘可用木料、硬纸、塑料、布料、石料或环保材料等制成。棋盘由横纵各15条等距离,垂直交叉的平行线构成,在棋盘上,横纵线交叉形成了225个交叉点为对弈时的落子点。邻近两个交叉点的距离要略大于棋子的直径,纵线距离约为2.5厘米,横线约为2.4厘米。
以对局开始时的黑方为准,棋盘上的纵行线从近到远用阿拉伯数字1—15标记,横行线从左到右用英文字母A—O按字母顺序标记。由于每个英文字母都对应着一条纵线,每个阿拉伯数字都对应着一条横线,所以,棋盘上的每一个交叉点都可用英文字母和阿拉伯数字的组合来标示出来。在标示各点时,要将英文字母放在前边,阿拉伯数字放在后边。如“L6”“F4”等,不可以标示成“6L”“4F”。
在棋盘上有5个比较特殊的交叉点,用直径约为0.5厘米的,和棋盘横纵线颜色相同的实心小圆点标示出来,这5个点称为“星”。中间的星也称天元,位置在H8,表示棋盘的正中心。其他4个星,也叫小星,分别在D12、L12、D4、L4位置。星在棋盘上起标示位置的作用,利于在行棋、复盘、记录等时,更清晰、迅速地找到所需位置。
2、棋子:
棋子分黑白两色。棋子形状为扁圆形,有一面凸起或两面凸起均可。棋子厚度一般不超过0.8厘米,直径应比棋盘上邻近点间的距离略小些,以免影响在棋盘上的行棋。以2.0—2.3厘米为宜。
平时下棋,棋子数量不限,以下棋时够用为准。正规的标准数一般定为黑子113枚,白子112枚。
棋子材质,重量不限。但以硬质,不易磨损,且放在棋盘上具有一定稳定性为好。
棋具,主要指上面论述的棋盘和棋子,有了这两样,开始下棋已够用了。
3、谱纸
谱纸也可称记谱纸,顾名思义,它是用来记录对局或着法时所用的稿纸,主要用在比赛或练习时,记录对局双方行棋顺序和位置的专用纸。谱纸的图形应是按比例缩小的棋盘图形。
4、棋钟
棋钟是在练习或比赛时,计算棋类对局双方时间的专用钟。棋钟分机械钟和电子钟等,均能用倒计时的方法,准确地分别显示出对局双方采用时限减去自己累计用时所剩余的时间。棋钟要求尽量避免刺眼,运行时声响应很低弱或无声。
四、五子棋取胜的技巧
1、开局技巧
五子棋的开局也被称为布局,一般在3~7手左右完成,五子棋的开局十分重要,一般情况下,一局五子棋的着数在20~40着之间,因此,它的开局阶段是十分短暂的,大约在七、八着之间,在这一阶段的争夺中,双方的布局、围堵将对之后的胜负起着关键性的作用,一般黑子以攻为主,白子以防为主。
2、四空摆法
有两头空、边二空、跳二空、中二空,这些名字是比较形象的叫法,也是一些基本的摆法。最常见的取胜法:一子双杀,即为落下一子,同时形成两条棋路,使对手封住一条就来不及封住另一条路,从而取胜。当然我们在做局的时候要布局很久,因为一般对手也能察觉到你的意图,所以实施起来困难很大,不可强求,只能尽力。
3、攻防选择
该进攻时,不要防守。
越是积极的进攻,越容易获得取胜的机会。古话有云:最好的防守就是进攻。当你的对手走棋不积极时,你大可看一下自己的棋是否可以进攻。进攻始于活二,要尽可能地利用好棋盘上的每一个棋子,强行拓展外势,更容易取胜。
我们应该遵守一个原则:落下一个子,形成的活二越多越好,一子三通点往往是好点。任何时候的落子都应该要有助于自己的进攻。我们每个的落子都应该有助于后续的进攻,在必须做出放手后,要盘算出对手和自己后续的进攻,而后选择出正确的防点。
防守不要总是挡,有时采取牵制的手段更好。在防守时如果局面趋于平衡,最好的防守就是运用牵制的手段,让对方趋于被动,更利获胜。
4、看准时机
当我们已经处于包围的势态时,不要盲目冲刺四,很容易让棋局处于无法挽回的地步,棋语有云:盲目冲四非胜算,在攻击的时机尚不成熟的情况下,这些进攻材料要尽量保留,不攻则已,一攻必中。
五、残局技巧:
从取胜的途径来分类,五子棋的残局技巧可分为两类:四三取胜和抓禁手取胜。由这两类技巧又可派生出一子双杀、一子多杀、一子杀禁、VCF、VCT等等精妙的入局方式。
1、一子双杀
所谓“一子双杀”是指对局中出现一方有两个叫杀点(一般是有两个冲四活三点),而对方无法同时防守的情形。对局中,人们往往发现,并非每一步棋都必须是先手(特指活三或冲四)才能赢棋。有时候,某一步棋本身并不是先手,但是,有了这步棋,就出现了两个胜点或两种获胜着法,迫使对方来不及防守或无法防守而获胜,这就是“一子双杀”。可以说,“一子双杀”的技巧是五子棋技术的一层新阶梯,如果掌握了这种技巧,就表明了你的五子棋技术已经有一定的水平。
2、一子双禁
所谓“一子双禁”是指白方利用禁手的规则,通过一着妙棋使黑方陷入同时面临两个禁手点的困境,黑方将无法同时避免两个禁手点的情形。从另一种意义上说,这是白棋的一子双杀。
3、一杀一禁
所谓“一杀一禁”是指对局中出现白方有两个取胜点,其中一个为冲四活三叫杀,另一个为抓禁手取胜的棋形。
4、一子多杀
所谓“一子多杀”是指对局中出现一方有两个以上(如三个、四个或五个)的叫杀点,而对方无法同时防守的情形,其实质也是一子双杀。
5、必胜
所谓“必胜”是指某一方行至某一手后,针对对方以后的每一个防点都有一套或一套以上的胜法的着,比一子多杀的范围广。
6、必败
所谓“必败”是指某一方行至某一手后,对方针对这一手拥有一套或一套以上的胜法的着。
7、VCT
所谓VCT是英文Victory by Continuous Threat的缩写,不断利用冲四、活三、做杀等先手进攻最后取得胜利。
8、VCF
所谓VCF是英文Victory of Continuous Four的缩写,亦称追四,即以连续不断的冲四取得胜利。VCF是五子棋残局和各种排局中一个非常重要的取胜技术。所以,学习并掌握VCF技术是对于提高五子棋爱好者的棋艺水平来说是十分重要的。五子棋排局是人为排列出来的局面习题。
它虽然不是实战对局的产物,但是,其主题的构思往往接近于实战残局;而且,绝大多数是由字、数、形等图案构成的VCF练习题,给人以美的享受及解谜的魅力。精彩的排局和字谜往往构思精到深奥,变化引人入胜。拟制排局和拆解排局有助于锻炼全局观念和残局中攻击点的选择,培养思考和想像能力,有助于提高棋艺水平。
9、自由取胜
自由取胜,也就是复合取胜或混合取胜,利用一切手段,无论是活三,冲四,还是做杀,抓禁手等等方法,自由取得最后胜利的技术。最常见的自由取胜包括“风车轮”、“二头蛇”等等。
六、取胜口诀,谓之《那氏五子兵法》
1、先手要攻,后手要守,以攻为守,以守待攻。
2、攻守转换,慎思变化, 先行争夺,地破天惊。
3、守取外势,攻聚内力,八卦易守,成角易攻。
4、阻断分隔,稳如泰山,不思争先,胜如登天。
5、初盘争二,终局抢三, 留三不冲,变化万千。
6、多个先手,细算次先,五子要点,次序在前。
7、斜线为阴,直线为阳,阴阳结合,防不胜防。
8、连三连四,易见为明, 跳三跳四,暗剑深藏。
9、己落一子,敌增一兵,攻其要点,守其必争。
10、势已形成,败即降临,五子精华,一子输赢。
《彭氏口诀》
二十六局先弃二,直指游星斜慧星。
寒星溪月疏星首,花残二月并白莲,
雨月金星追黑玉,松丘新宵瑞山腥。
星月长峡恒水流,白莲垂俏云浦岚,
黑玉银月倚明星,斜月名月堪称朋。
七、段级位制:
五子棋的段级位对象:参加中国棋院认可的国内外五子棋比赛的五子棋爱好者。
第四条段位共分九个等级,最高是九段,以下分别是八段、七段、六段、五段、四段、三段、二段、初段。段位以下共分十个等级,最高是一级,以下分别是二级、三级、四级、五级、六级、七级、八级、九级、十级。
第五条根据中国五子棋爱好者在国内、国际交流中所体现出来的实际水平,在五子棋段级位制度实施初期,对爱好者授予的最高段位暂定为六段。随着中国棋手参与国内外交流机会的增加和技术水平的提高,逐步增加所授予段位的上限,直至九段。
在中国,获得段级位的主要渠道是通过比赛。在全国五子棋邀请赛等国内大赛中获得一定名次,即可获得相应段位。
八、相关术语:
1、对局语
〖黑方〗执黑棋一方的简称。
〖白方〗执白棋一方的简称。
〖胜局〗有一方获胜的对局。
〖和局〗分不出胜负的对局。
〖终局〗对局结束。
〖复盘〗对局双方将本盘对局全过程的再现。
2、行棋语
〖阳线〗即:直线,棋盘上可见的横纵直线。
〖交叉点〗阳线垂直相交的点,简称“点”。
〖阴线〗即:斜线,由交叉点构成的与阳线成45°夹角的隐形斜线。
〖落子〗棋子直接落于棋盘的空白交叉点上。
〖轮走方〗即“行棋方”,有权利落子的黑方或白方。
〖着〗在对局过程中,行棋方把棋子落在棋盘无子的点上,不论落子的手是否脱离棋子,均被视为一着。
〖回合〗双方各走一着,称为一个回合。
〖开局〗在对局开始阶段形成的布局。
〖连〗同色棋子在一条阳线或阴线上相邻成一排。
〖长连〗五枚以上同色棋子在一条阳线或阴线上相邻成一排。是禁手的一种。
〖五连〗只有五枚同色棋子在一条阳线或阴线上相邻成一排。
〖成五〗一般包括五连和长连,指含有五枚同色棋子所形成的连;在有禁手规则中,黑方形成长连不称为“成五”。
〖四〗在一条阳线或阴线上连续相邻的5个点上只有四枚同色棋子的棋型。
〖活四〗有两个点可以成五的四。
〖冲四〗只有一个点可以成五的四。
〖死四〗不能成五的四。
〖三〗在一条阳线或阴线上连续相邻的5个点上只有三枚同色棋子的棋型。
〖活三〗再走一着可以形成活四的三。
〖连活三〗连续、中间不隔空点的活三(同色棋子在一条阳线或阴线上相邻成一排的活三)。简称“连三”。
〖跳活三〗中间隔有一个空点的活三。简称“跳三”。
〖眠三〗再走一着可以形成冲四的三。
〖死三〗不能成五的三。
〖二〗在一条阳线或阴线上连续相邻的5个点上只有两枚同色棋子的棋型。
〖活二〗再走一着可以形成活三的二。
〖连活二〗连续、中间不隔空点的活二(同色棋子在一条阳线或阴线上相邻成一排的活二)。简称“连二”。
〖跳活二〗中间隔有一个空点的活二。简称“跳二”。
〖大跳活二〗中间隔有两个空点的活二。简称“大跳二”。
〖眠二〗再走一着可以形成眠三的二。
〖死二〗不能成五的二。
〖先手〗对方必须应答的着法,相对于先手而言,冲四称为“绝对先手”。
〖三三〗一子落下同时形成两个或两个以上的活三。也称“双三”或“双活三”。是禁手的一种。
〖四四〗一子落下同时形成两个或两个以上的冲四或活四。也称“双四”。是禁手的一种。
〖四三〗一子落下同时形成一个冲四和一个活三。
〖做杀〗落下一子,使己方下一手可以形成双三、双四、四三等杀法。
〖禁手〗部分规则中为削弱黑方先行优势而禁止其使用的战术,包括双三、双四、长连。白方无禁手。
〖禁手点〗黑方禁手的点。
3、战术语
〖VCT〗英文Victory by Continuous Threat的缩写,即通过连续不断的冲四、活三、做杀等先手进攻取得胜利。
〖VCF〗英文Victory of Continuous Four的缩写,即以连续不断的冲四取得胜利。又称“追四”。
〖风车轮〗指在一定区域内来回地绕着连续进攻的战术或技巧,就像一个风车轮一直在转着似的,这样的取胜方法也称之为“风车胜”。
〖二头蛇〗指某一方以活三进攻时,无论对方防守于哪一头都难免被蛇头咬伤,因为此时的活三如同二头蛇一样,两头都有厉害的杀招。也称“两头蛇”。
〖一子双杀〗一子落下,同时形成两种取胜方法。
〖一子双防〗一子落下,同时防守两种取胜方法。
〖八卦阵〗以“日”字的一组对角点为棋型,互为马步的防守阵型。
〖抓禁手〗有禁手规则中,白方通过冲四等手段迫使黑方在禁手点落子的取胜方法。也称“追下取胜”。
4、比赛语
〖个人赛〗计算个人成绩的比赛。
〖团体赛〗计算运动队团体成绩的比赛。
〖轮空〗赛制中部分选手直接从中间某轮开始参加比赛,某轮未比赛的安排就叫轮空。
〖节〗一个比较集中的比赛单位时间(如一个上午或一个下午或一个晚上)称一“节”。
〖轮〗参赛的各队(团体赛)或各名棋手(个人赛)普遍出场比赛一次(个别轮空者除外)称一“轮”。
〖次〗团体赛中的同一轮两队之间完成的比赛称为一“次”比赛。
〖场〗两名棋手之间完成的两局制或多局制的一次比赛称为一“场”比赛。
〖局〗两名棋手之间完成的一盘比赛称为一“局”比赛。
九、其他玩法:
夹:两子单独夹住一子,同线上两子外不能有其他子。
挑:一子走入两子中间,同线上两子外不能有其他子。
双夹:走为四子对称夹住一子,同线上四子外不能有其他子。
双挑:一子走入对称四子中间,同线上四子外不能有其他子。
扫四:一子走到连续四子两头,同线上四子外不能有其他子。
java网络五子棋
下面的源代码分为4个文件;
chessClient.java:客户端主程序。
chessInterface.java:客户端的界面。
chessPad.java:棋盘的绘制。
chessServer.java:服务器端。
可同时容纳50个人同时在线下棋,聊天。
没有加上详细注释,不过绝对可以运行,j2sdk1.4下通过。
import java.awt.*;
import java.awt.event.*;
import java.io.*;
import java.net.*;
import java.util.*;
class clientThread extends Thread
{
chessClient chessclient;
clientThread(chessClient chessclient)
{
this.chessclient=chessclient;
}
public void acceptMessage(String recMessage)
{
if(recMessage.startsWith("/userlist "))
{
StringTokenizer userToken=new StringTokenizer(recMessage," ");
int userNumber=0;
chessclient.userpad.userList.removeAll();
chessclient.inputpad.userChoice.removeAll();
chessclient.inputpad.userChoice.addItem("所有人");
while(userToken.hasMoreTokens())
{
String user=(String)userToken.nextToken(" ");
if(userNumber>0 && !user.startsWith("[inchess]"))
{
chessclient.userpad.userList.add(user);
chessclient.inputpad.userChoice.addItem(user);
}
userNumber++;
}
chessclient.inputpad.userChoice.select("所有人");
}
else if(recMessage.startsWith("/yourname "))
{
chessclient.chessClientName=recMessage.substring(10);
chessclient.setTitle("Java五子棋客户端 "+"用户名:"+chessclient.chessClientName);
}
else if(recMessage.equals("/reject"))
{
try
{
chessclient.chesspad.statusText.setText("不能加入游戏");
chessclient.controlpad.cancelGameButton.setEnabled(false);
chessclient.controlpad.joinGameButton.setEnabled(true);
chessclient.controlpad.creatGameButton.setEnabled(true);
}
catch(Exception ef)
{
chessclient.chatpad.chatLineArea.setText("chessclient.chesspad.chessSocket.close无法关闭");
}
chessclient.controlpad.joinGameButton.setEnabled(true);
}
else if(recMessage.startsWith("/peer "))
{
chessclient.chesspad.chessPeerName=recMessage.substring(6);
if(chessclient.isServer)
{
chessclient.chesspad.chessColor=1;
chessclient.chesspad.isMouseEnabled=true;
chessclient.chesspad.statusText.setText("请黑棋下子");
}
else if(chessclient.isClient)
{
chessclient.chesspad.chessColor=-1;
chessclient.chesspad.statusText.setText("已加入游戏,等待对方下子...");
}
}
else if(recMessage.equals("/youwin"))
{
chessclient.isonChess=false;
chessclient.chesspad.chessVictory(chessclient.chesspad.chessColor);
chessclient.chesspad.statusText.setText("对方退出,请点放弃游戏退出连接");
chessclient.chesspad.isMouseEnabled=false;
}
else if(recMessage.equals("/OK"))
{
chessclient.chesspad.statusText.setText("创建游戏成功,等待别人加入...");
}
else if(recMessage.equals("/error"))
{
chessclient.chatpad.chatLineArea.append("传输错误:请退出程序,重新加入 n");
}
else
{
chessclient.chatpad.chatLineArea.append(recMessage+"n");
chessclient.chatpad.chatLineArea.setCaretPosition(
chessclient.chatpad.chatLineArea.getText().length());
}
}
public void run()
{
String message="";
try
{
while(true)
{
message=chessclient.in.readUTF();
acceptMessage(message);
}
}
catch(IOException es)
{
}
}
}
public class chessClient extends frame implements ActionListener,KeyListener
{
userPad userpad=new userPad();
chatPad chatpad=new chatPad();
controlPad controlpad=new controlPad();
chessPad chesspad=new chessPad();
inputPad inputpad=new inputPad();
Socket chatSocket;
DataInputStream in;
DataOutputStream out;
String chessClientName=null;
String host=null;
int port=4331;
boolean isonChat=false; //在聊天?
boolean isonChess=false; //在下棋?
boolean isGameConnected=false; //下棋的客户端连接?
boolean isServer=false; //如果是下棋的主机
boolean isClient=false; //如果是下棋的客户端
Panel southPanel=new Panel();
Panel northPanel=new Panel();
Panel centerPanel=new Panel();
Panel westPanel=new Panel();
Panel eastPanel=new Panel();
chessClient()
{
super("Java五子棋客户端");
setLayout(new BorderLayout());
host=controlpad.inputIP.getText();
westPanel.setLayout(new BorderLayout());
westPanel.add(userpad,BorderLayout.NORTH);
westPanel.add(chatpad,BorderLayout.CENTER);
westPanel.setBackground(Color.pink);
inputpad.inputWords.addKeyListener(this);
chesspad.host=controlpad.inputIP.getText();
centerPanel.add(chesspad,BorderLayout.CENTER);
centerPanel.add(inputpad,BorderLayout.SOUTH);
centerPanel.setBackground(Color.pink);
controlpad.connectButton.addActionListener(this);
controlpad.creatGameButton.addActionListener(this);
controlpad.joinGameButton.addActionListener(this);
controlpad.cancelGameButton.addActionListener(this);
controlpad.exitGameButton.addActionListener(this);
controlpad.creatGameButton.setEnabled(false);
controlpad.joinGameButton.setEnabled(false);
controlpad.cancelGameButton.setEnabled(false);
southPanel.add(controlpad,BorderLayout.CENTER);
southPanel.setBackground(Color.pink);
addWindowListener(new WindowAdapter()
{
public void windowClosing(WindowEvent e)
{
if(isOnChat)
{
try
{
chatSocket.close();
}
catch(Exception ed)
{
}
}
if(isonChess || isGameConnected)
{
try
{
chesspad.chessSocket.close();
}
catch(Exception ee)
{
}
}
System.exit(0);
}
public void windowActivated(WindowEvent ea)
{
}
});
add(westPanel,BorderLayout.WEST);
add(centerPanel,BorderLayout.CENTER);
add(southPanel,BorderLayout.SOUTH);
pack();
setSize(670,548);
setVisible(true);
setResizable(false);
validate();
}
public boolean connectServer(String serverIP,int serverPort) throws Exception
{
try
{
chatSocket=new Socket(serverIP,serverPort);
in=new DataInputStream(chatSocket.getInputStream());
out=new DataOutputStream(chatSocket.getOutputStream());
clientThread clientthread=new clientThread(this);
clientthread.start();
isonChat=true;
return true;
}
catch(IOException ex)
{
chatpad.chatLineArea.setText("chessClient:connectServer:无法连接,建议重新启动程序 n");
}
return false;
}
public void actionPerformed(ActionEvent e)
{
if(e.getSource()==controlpad.connectButton)
{
host=chesspad.host=controlpad.inputIP.getText();
try
{
if(connectServer(host,port))
{
chatpad.chatLineArea.setText("");
controlpad.connectButton.setEnabled(false);
controlpad.creatGameButton.setEnabled(true);
controlpad.joinGameButton.setEnabled(true);
chesspad.statusText.setText("连接成功,请创建游戏或加入游戏");
}
}
catch(Exception ei)
{
chatpad.chatLineArea.setText("controlpad.connectButton:无法连接,建议重新启动程序 n");
}
}
if(e.getSource()==controlpad.exitGameButton)
{
if(isOnChat)
{
try
{
chatSocket.close();
}
catch(Exception ed)
{
}
}
if(isonChess || isGameConnected)
{
try
{
chesspad.chessSocket.close();
}
catch(Exception ee)
{
}
}
System.exit(0);
}
if(e.getSource()==controlpad.joinGameButton)
{
String selectedUser=userpad.userList.getSelectedItem();
if(selectedUser==null || selectedUser.startsWith("[inchess]") ||
selectedUser.equals(chessClientName))
{
chesspad.statusText.setText("必须先选定一个有效用户");
}
else
{
try
{
if(!isGameConnected)
{
if(chesspad.connectServer(chesspad.host,chesspad.port))
{
isGameConnected=true;
isonChess=true;
isClient=true;
controlpad.creatGameButton.setEnabled(false);
controlpad.joinGameButton.setEnabled(false);
controlpad.cancelGameButton.setEnabled(true);
chesspad.chessthread.sendMessage("/joingame "+userpad.userList.getSelectedItem()+" "+chessClientName);
}
}
else
{
isonChess=true;
isClient=true;
controlpad.creatGameButton.setEnabled(false);
controlpad.joinGameButton.setEnabled(false);
controlpad.cancelGameButton.setEnabled(true);
chesspad.chessthread.sendMessage("/joingame "+userpad.userList.getSelectedItem()+" "+chessClientName);
}
}
catch(Exception ee)
{
isGameConnected=false;
isonChess=false;
isClient=false;
controlpad.creatGameButton.setEnabled(true);
controlpad.joinGameButton.setEnabled(true);
controlpad.cancelGameButton.setEnabled(false);
chatpad.chatLineArea.setText("chesspad.connectServer无法连接 n"+ee);
}
}
}
if(e.getSource()==controlpad.creatGameButton)
{
try
{
if(!isGameConnected)
{
if(chesspad.connectServer(chesspad.host,chesspad.port))
{
isGameConnected=true;
isonChess=true;
isServer=true;
controlpad.creatGameButton.setEnabled(false);
controlpad.joinGameButton.setEnabled(false);
controlpad.cancelGameButton.setEnabled(true);
chesspad.chessthread.sendMessage("/creatgame "+"[inchess]"+chessClientName);
}
}
else
{
isonChess=true;
isServer=true;
controlpad.creatGameButton.setEnabled(false);
controlpad.joinGameButton.setEnabled(false);
controlpad.cancelGameButton.setEnabled(true);
chesspad.chessthread.sendMessage("/creatgame "+"[inchess]"+chessClientName);
}
}
catch(Exception ec)
{
isGameConnected=false;
isonChess=false;
isServer=false;
controlpad.creatGameButton.setEnabled(true);
controlpad.joinGameButton.setEnabled(true);
controlpad.cancelGameButton.setEnabled(false);
ec.printStackTrace();
chatpad.chatLineArea.setText("chesspad.connectServer无法连接 n"+ec);
}
}
if(e.getSource()==controlpad.cancelGameButton)
{
if(isOnChess)
{
chesspad.chessthread.sendMessage("/giveup "+chessClientName);
chesspad.chessVictory(-1*chesspad.chessColor);
controlpad.creatGameButton.setEnabled(true);
controlpad.joinGameButton.setEnabled(true);
controlpad.cancelGameButton.setEnabled(false);
chesspad.statusText.setText("请建立游戏或者加入游戏");
}
if(!isOnChess)
{
controlpad.creatGameButton.setEnabled(true);
controlpad.joinGameButton.setEnabled(true);
controlpad.cancelGameButton.setEnabled(false);
chesspad.statusText.setText("请建立游戏或者加入游戏");
}
isClient=isServer=false;
}
}
public void keyPressed(KeyEvent e)
{
TextField inputWords=(TextField)e.getSource();
if(e.getKeyCode()==KeyEvent.VK_ENTER)
{
if(inputpad.userChoice.getSelectedItem().equals("所有人"))
{
try
{
out.writeUTF(inputWords.getText());
inputWords.setText("");
}
catch(Exception ea)
{
chatpad.chatLineArea.setText("chessClient:KeyPressed无法连接,建议重新连接 n");
userpad.userList.removeAll();
inputpad.userChoice.removeAll();
inputWords.setText("");
controlpad.connectButton.setEnabled(true);
}
}
else
{
try
{
out.writeUTF("/"+inputpad.userChoice.getSelectedItem()+" "+inputWords.getText());
inputWords.setText("");
}
catch(Exception ea)
{
chatpad.chatLineArea.setText("chessClient:KeyPressed无法连接,建议重新连接 n");
userpad.userList.removeAll();
inputpad.userChoice.removeAll();
inputWords.setText("");
controlpad.connectButton.setEnabled(true);
}
}
}
}
public void keyTyped(KeyEvent e)
{
}
public void keyReleased(KeyEvent e)
{
}
public static void main(String args[])
{
chessClient chessClient=new chessClient();
}
}
import java.awt.*;
import java.awt.event.*;
import java.io.*;
import java.net.*;
class userPad extends Panel
{
List userList=new List(10);
userPad()
{
setLayout(new BorderLayout());
for(int i=0;i<50;i++)
{
userList.add(i+"."+"没有用户");
}
add(userList,BorderLayout.CENTER);
}
}
class chatPad extends Panel
{
textarea chatLineArea=new textarea("",18,30,textarea.SCROLLBARS_VERTICAL_ONLY);
chatPad()
{
setLayout(new BorderLayout());
add(chatLineArea,BorderLayout.CENTER);
}
}
class controlPad extends Panel
{
Label IPlabel=new Label("IP",Label.LEFT);
TextField inputIP=new TextField("localhost",10);
Button connectButton=new Button("连接主机");
Button creatGameButton=new Button("建立游戏");
Button joinGameButton=new Button("加入游戏");
Button cancelGameButton=new Button("放弃游戏");
Button exitGameButton=new Button("关闭程序");
controlPad()
{
setLayout(new FlowLayout(FlowLayout.LEFT));
setBackground(Color.pink);
add(IPlabel);
add(inputIP);
add(connectButton);
add(creatGameButton);
add(joinGameButton);
add(cancelGameButton);
add(exitGameButton);
}
}
class inputPad extends Panel
{
TextField inputWords=new TextField("",40);
Choice userChoice=new Choice();
inputPad()
{
setLayout(new FlowLayout(FlowLayout.LEFT));
for(int i=0;i<50;i++)
{
userChoice.addItem(i+"."+"没有用户");
}
userChoice.setSize(60,24);
add(userChoice);
add(inputWords);
}
}
import java.awt.*;
import java.awt.event.*;
import java.io.*;
import java.net.*;
import java.util.*;
class chessThread extends Thread
{
chessPad chesspad;
chessThread(chessPad chesspad)
{
this.chesspad=chesspad;
}
public void sendMessage(String sndMessage)
{
try
{
chesspad.outData.writeUTF(sndMessage);
}
catch(Exception ea)
{
System.out.println("chessThread.sendMessage:"+ea);
}
}
public void acceptMessage(String recMessage)
{
if(recMessage.startsWith("/chess "))
{
StringTokenizer userToken=new StringTokenizer(recMessage," ");
String chessToken;
String[] chessOpt={"-1","-1","0"};
int chessOptNum=0;
while(userToken.hasMoreTokens())
{
chessToken=(String)userToken.nextToken(" ");
if(chessOptNum>=1 && chessOptNum<=3)
{
chessOpt[chessOptNum-1]=chessToken;
}
chessOptNum++;
}
chesspad.netChessPaint(Integer.parseInt(chessOpt[0]),Integer.parseInt(chessOpt[1]),Integer.parseInt(chessOpt[2]));
}
else if(recMessage.startsWith("/yourname "))
{
chesspad.chessSelfName=recMessage.substring(10);
}
else if(recMessage.equals("/error"))
{
chesspad.statusText.setText("错误:没有这个用户,请退出程序,重新加入");
}
else
{
//System.out.println(recMessage);
}
}
public void run()
{
String message="";
try
{
while(true)
{
message=chesspad.inData.readUTF();
acceptMessage(message);
}
}
catch(IOException es)
{
}
}
}
class chessPad extends Panel implements MouseListener,ActionListener
{
int chessPoint_x=-1,chessPoint_y=-1,chessColor=1;
int chessBlack_x[]=new int[200];
int chessBlack_y[]=new int[200];
int chessWhite_x[]=new int[200];
int chessWhite_y[]=new int[200];
int chessBlackCount=0,chessWhiteCount=0;
int chessBlackWin=0,chessWhiteWin=0;
boolean isMouseEnabled=false,isWin=false,isInGame=false;
TextField statusText=new TextField("请先连接服务器");
Socket chessSocket;
DataInputStream inData;
DataOutputStream outData;
String chessSelfName=null;
String chessPeerName=null;
String host=null;
int port=4331;
chessThread chessthread=new chessThread(this);
chessPad()
{
setSize(440,440);
setLayout(null);
setBackground(Color.pink);
addMouseListener(this);
add(statusText);
statusText.setBounds(40,5,360,24);
statusText.setEditable(false);
}
public boolean connectServer(String ServerIP,int ServerPort) throws Exception
{
try
{
chessSocket=new Socket(ServerIP,ServerPort);
inData=new DataInputStream(chessSocket.getInputStream());
outData=new DataOutputStream(chessSocket.getOutputStream());
chessthread.start();
return true;
}
catch(IOException ex)
{
statusText.setText("chessPad:connectServer:无法连接 n");
}
return false;
}
public void chessVictory(int chessColorWin)
{
this.removeAll();
for(int i=0;i<=chessBlackCount;i++)
{
chessBlack_x[i]=0;
chessBlack_y[i]=0;
}
for(int i=0;i<=chessWhiteCount;i++)
{
chessWhite_x[i]=0;
chessWhite_y[i]=0;
}
chessBlackCount=0;
chessWhiteCount=0;
add(statusText);
statusText.setBounds(40,5,360,24);
if(chessColorWin==1)
{ chessBlackWin++;
statusText.setText("黑棋胜,黑:白为"+chessBlackWin+":"+chessWhiteWin+",重新开局,等待白棋下子...");
}
else if(chessColorWin==-1)
{
chessWhiteWin++;
statusText.setText("白棋胜,黑:白为"+chessBlackWin+":"+chessWhiteWin+",重新开局,等待黑棋下子...");
}
}
public void getLocation(int a,int b,int color)
{
if(color==1)
{
chessBlack_x[chessBlackCount]=a*20;
chessBlack_y[chessBlackCount]=b*20;
chessBlackCount++;
}
else if(color==-1)
{
chessWhite_x[chessWhiteCount]=a*20;
chessWhite_y[chessWhiteCount]=b*20;
chessWhiteCount++;
}
}
public boolean checkWin(int a,int b,int checkColor)
{
int step=1,chesslink=1,chesslinkTest=1,chessCompare=0;
if(checkColor==1)
{
chesslink=1;
for(step=1;step<=4;step++)
{
for(chessCompare=0;chessCompare<=chessBlackCount;chessCompare++)
{
if(((a+step)*20==chessBlack_x[chessCompare]) && ((b*20)==chessBlack_y[chessCompare]))
{
chesslink=chesslink+1;
if(chesslink==5)
{
return(true);
}
}
}
if(chesslink==(chesslinkTest+1))
chesslinkTest++;
else
break;
}
for(step=1;step<=4;step++)
{
for(chessCompare=0;chessCompare<=chessBlackCount;chessCompare++)
{
if(((a-step)*20==chessBlack_x[chessCompare]) && (b*20==chessBlack_y[chessCompare]))
{
chesslink++;
if(chesslink==5)
{
return(true);
}
}
}
if(chesslink==(chesslinkTest+1))
chesslinkTest++;
else
break;
}
chesslink=1;
chesslinkTest=1;
for(step=1;step<=4;step++)
{
for(chessCompare=0;chessCompare<=chessBlackCount;chessCompare++)
{
if((a*20==chessBlack_x[chessCompare]) && ((b+step)*20==chessBlack_y[chessCompare]))
{
chesslink++;
if(chesslink==5)
{
return(true);
}
}
}
if(chesslink==(chesslinkTest+1))
chesslinkTest++;
else
break;
}
for(step=1;step<=4;step++)
{
for(chessCompare=0;chessCompare<=chessBlackCount;chessCompare++)
{
if((a*20==chessBlack_x[chessCompare]) && ((b-step)*20==chessBlack_y[chessCompare]))
{
chesslink++;
if(chesslink==5)
{
return(true);
}
}
}
if(chesslink==(chesslinkTest+1))
chesslinkTest++;
else
break;
}
chesslink=1;
chesslinkTest=1;
for(step=1;step<=4;step++)
{
for(chessCompare=0;chessCompare<=chessBlackCount;chessCompare++)
{
if(((a-step)*20==chessBlack_x[chessCompare]) && ((b+step)*20==chessBlack_y[chessCompare]))
{
chesslink++;
if(chesslink==5)
{
return(true);
}
}
}
if(chesslink==(chesslinkTest+1))
chesslinkTest++;
else
break;
}
for(step=1;step<=4;step++)
{
for(chessCompare=0;chessCompare<=chessBlackCount;chessCompare++)
{
if(((a+step)*20==chessBlack_x[chessCompare]) && ((b-step)*20==chessBlack_y[chessCompare]))
{
chesslink++;
if(chesslink==5)
{
return(true);
}
}
}
if(chesslink==(chesslinkTest+1))
chesslinkTest++;
else
break;
}
chesslink=1;
chesslinkTest=1;
for(step=1;step<=4;step++)
{
for(chessCompare=0;chessCompare<=chessBlackCount;chessCompare++)
{
if(((a+step)*20==chessBlack_x[chessCompare]) && ((b+step)*20==chessBlack_y[chessCompare]))
{
chesslink++;
if(chesslink==5)
{
return(true);
}
}
}
if(chesslink==(chesslinkTest+1))
chesslinkTest++;
else
break;
}
for(step=1;step<=4;step++)
{
for(chessCompare=0;chessCompare<=chessBlackCount;chessCompare++)
{
if(((a-step)*20==chessBlack_x[chessCompare]) && ((b-step)*20==chessBlack_y[chessCompare]))
{
chesslink++;
if(chesslink==5)
{
return(true);
}
}
免责声明:本平台仅供信息发布交流之途,请谨慎判断信息真伪。如遇虚假诈骗信息,请立即举报
举报