【五子棋简介】
五子棋是一种两人对弈的纯策略型棋类游戏,是起源于中国古代的传统黑白棋种之一。发展于日本,流行于欧美。
五子棋容易上手,老少皆宜,而且趣味横生,引人入胜;不仅能增强思维能力,提高智力,而且富含哲理,有助于修身养性。
传统五子棋:
传统五子棋的棋子分为黑白两色,采用围棋棋盘,棋子放置于棋盘线交叉点上。两人对局,各执一色,轮流下一子,先将横、竖或斜线的5个或5个以上同色棋子连成不间断的一排者为胜。
因为传统五子棋在落子后不能移动或拿掉,所以也可以用纸和笔来进行游戏。
称谓:
五子棋,日文亦有“连五子、五子连、串珠、五目、五目碰、五格、五石、五法、五联、京棋”等多种称谓,英文则称之为“FIR (Five In A Row的缩写)、Gomoku(日语“五目”的罗马拼音)、Gobang、connect 5、mo-rphion”。捷克语piskvorky,韩语omok……
许多国家的人对五子棋都有不同的爱称,例如,韩国人把五子棋称为“情侣棋”,暗示情人之间下五子棋有利于增加情感的交流;欧洲人称其为“绅士棋”,代表下五子棋的君子风度胜似绅士;日本人则称其为“中老年棋”,说明五子棋适合中老年人的生理特点和思维方式;美国人喜欢将五子棋称为“商业棋”,也就是说,商人谈生意时可边下棋边谈生意,棋下完了生意也谈成了。
起源:
五子棋相传起源于四千多年前的尧帝时期,比围棋的历史还要悠久,可能早在“尧造围棋”之前,民间就已有五子棋游戏。有关早期五子棋的文史资料与围棋有相似之处,因为古代五子棋的棋具与围棋是完全相同的。在上古的神话传说中有“女娲造人,伏羲做棋”一说,《增山海经》中记载:“休舆之山有石焉,名曰帝台之棋,五色而文状鹑卵。”李善注引三国魏邯郸淳《艺经》中曰:“棋局,纵横各十七道,合二百八十九道,白黑棋子,各一百五十枚”。可见,五子棋颇有渊源。亦有传说,五子棋最初流行于少数民族地区,以后渐渐演变成围棋并在炎黄子孙后代中遍及开来。
在古代,五子棋棋具虽然与围棋相类同,但是下法却是完全不同的。正如《辞海》中所言,五子棋是“棋类游戏,棋具与围棋相同,两人对局,轮流下子,先将五子连成一行者为胜。”。
[编辑本段]【五子棋的发展】
日本
据日本史料文献记载,中国古代的五子棋先由中国传到高丽(朝鲜),然后于公元1688年至1704年日本的元禄时代再从高丽传到日本,最初在皇宫和贵族大家庭中流行,到元禄末期,开始在民间盛行。1899年,对传统五子棋进行规则改良后,经过公开征名,“联珠”这一名称才被正式确定下来。取意于“日月如合璧,五星如联珠”。现写做“连珠”。
欧洲
20世纪初传统五子棋及连珠从日本传入欧洲,五子棋称为“Five In A Row”(缩写为FIR),同时根据日语的罗马拼音,“五目、五目碰”称为"Gomoku、Gobang",“连珠”则称之为“Renju”。
1958年以及1979年,瑞典和前苏联分别成立了连珠联盟。1988年,日本、前苏联以及瑞典三个国家的连珠组织在瑞典成立国际连珠联盟(Renju International Federation,简称RIF).
20世纪90年代欧洲一些国家将传统五子棋引入“交换”等规则后,经过发展逐渐形成一系列的Gomoku新规则,中欧一些国家成立了Gomoku组织,并和六子棋共同成立了国际联盟(GCIF)。
21世纪初在举办世界连珠(renju)锦标赛的同时也举办世界Gomoku锦标赛(GT)及六子棋国际公开赛(CT)。
2009年8月在捷克共和国(CzechRepublic)帕尔杜比采市(Pardubice)将举行第11届世界连珠锦标赛和第3届世界Gomoku锦标赛。
中国
长久以来五子棋在中国一直没有得到发展。
2001年,国家体育总局批准中国棋院试办全国性五子棋比赛。
2002年8月2-4日,中国棋院举办了首届全国五子棋个人邀请赛,此后每年举办一次。
2003年,国家体育总局批准了中国棋院审定的《中国五子棋竞赛规则》(试行)(参考资料[1])和《中国五子棋段级位制》(试行)(参考资料[2])。
2006年2月,国家体育总局对五子棋正式立项,作为围棋下的一个二级项目。全国各地相继成立了新的五子棋俱乐部。
2007年5月和10月中国棋院先后举办了首届全国五子棋团体锦标赛和首届全国五子棋个人锦标赛。
2008年6月和12月中国棋院先后举办了第二届全国五子棋团体锦标赛和第二届全国五子棋个人锦标赛。
2009年5月28-30日中国棋院举办了第三届全国五子棋团体锦标赛。
2009年11月,首届全国智力运动会将五子棋作为的正式比赛项目(参考资料[3])。
[编辑本段]【现代五子棋】
随着五子棋的发展,逐步发现先手优势非常大,最后得出“先手必胜”。五子棋要成为竞技运动,核心问题是怎样解决传统五子棋下法中“先手必胜”的问题。
“交换”思维
“交换”思维有个形象的比喻:一个人切蛋糕,一个人选蛋糕。即:一人开局,另一人选择黑方还是白方。此方法最为公平、最有效率,且最为简洁实用。不过此方法使开局者不走已知的必胜,把棋艺的较量演化为对局者开局的博弈,而“先手必胜”依然存在。
如:欧洲的Swap2、Swap1;中国的Swap3、第一手交换规则等。
“禁手”思维
禁止以某种手段取胜。为了平衡先后手之间的差距,削弱先手优势,日本连珠提出“禁手”。后来连珠的发展证明禁手并不能平衡先后手之间的差距,依然是“先手必胜”。
“泡沫”原理
像泡沫一样会破灭。如“吃子”五子棋。连成5个后消失,同时拿掉对方一个棋子,自己再补一子。此原理的的特点是:把五子棋金球制改成了“进球制”,同时也最大效率地利用了棋盘和棋子,带来了全新的思维。问题是怎样计算胜负。
“井字游戏”原理
井字游戏又叫圈叉棋,圈叉棋是和棋,原因是空间很小。
通过缩小棋盘来抑制五子棋先手的优势。如:15路棋盘,13路棋盘等等。问题是多大的棋盘才能是和棋,知道和棋后还能成为竞技运动吗。
“跷跷板”原理
五子棋始终是先手领先一子。如果双方轮流领先一子呢?
台湾教授发明的六子棋,就如“跷跷板”一样。先手先下一子,然后双方轮流下两子,先连成6子者胜利。六子棋为第11届奥林匹亚计算机游戏程序竞赛项目,验证其公平性与复杂性。
综合效应
“禁手”思维+“交换”思维+“井字游戏”原理=连珠
如:RIF规则、Sakata规则、Yamaguchi规则Tarannikov规则等。
现代五子棋的现状
五子棋、六子棋、连珠已经成为欧洲现代五子棋的组成部分,举行了很多次大大小小的比赛,并且将三种棋的世界锦标赛联合举行。
中国的现代五子棋还处于起步阶段。2003年中国棋院《中国五子棋竞赛规则》参考了RIF规则,同时兼顾发展传统五子棋。
[编辑本段]【五子棋段级位制】
中国五子棋段级位制 (试行) (具体内容见参考资料[2])
五子棋的段级位对象:参加中国棋院认可的国内外五子棋比赛的五子棋爱好者。
第四条 段位共分九个等级,最高是九段,以下分别是八段、七段、六段、五段、四段、三段、二段、初段。段位以下共分十个等级,最高是一级,以下分别是二级、三级、四级、五级、六级、七级、八级、九级、十级。
第五条 根据中国五子棋爱好者在国内、国际交流中所体现出来的实际水平,在五子棋段级位制度实施初期,对爱好者授予的最高段位暂定为六段。随着中国棋手参与国内外交流机会的增加和技术水平的提高,逐步增加所授予段位的上限,直至九段。
[编辑本段]【棋盘、棋子与记谱方法】
相传中华民族的祖先轩辕黄帝无意之中画下了十七条横线十条竖线,这无意中的发明造就出了五子棋。早在公元595年古人就用瓷来烧制五子棋盘了。千百年来,人们用各种材质来制造围棋的棋子,如:玻璃、瓷器、玉、玛瑙、铜等等。
古代五子棋棋盘与围棋棋盘是通用的,汉魏时为十七路(17×17)棋盘,至南北朝时即已流行十九路(19×19)棋盘,直至1931年,才出现所谓五子棋专用棋盘,如图所示,为十五路(15×15)棋盘,形状近于正方形,平面上画横竖各15条平行线,线路为黑色,构成225个交叉点,邻近两个交点的距离纵线约为2.5厘米,横线约为2.4厘米。棋盘正中一点为“天元”。棋盘两端的横线称端线,棋盘左右最外边的两条纵线称边线。从两条端线和两条边线向正中发展而纵横交叉在第四条线形成的四个点称为“星”。天元和星应在棋盘上用直径约为0.5厘米的实心小圆点标出。
五子棋棋子亦称“棋石”分黑、白两色,形状为扁圆形,有一面凸起或两面凸起等形状,厚度不超过0.8厘米,直径为2.0~2.3厘米;一副棋子总数为225枚,其中黑子113枚,白子112枚。按质地的不同,可分为玻璃、陶瓷、塑料、智石、磁铁、蛤贝、烧料、水晶、玛瑙、玉石等棋子。
五子棋正规的记谱方法为用“五子棋稿纸”,即专供五子棋爱好者记录对局或着法的稿纸。其上印有正规专用棋盘图形,记录时只要按相应位置在纸上标明行棋的先后,即可反映对局的进行过程。非正规的记谱方法为用格子纸记录,即用单数1、3、5等记录黑方的走法,用双数2、4、6记录白方的走法,同样可反映对局的进行过程。另外还有北京京都五子棋协会为了推广盲人下五子棋,以及正常人下盲棋并背诵五子棋棋谱,专门设计的盲棋记谱法等。
[编辑本段]【相关术语】
【对局相关术语】
〖黑方〗执黑棋一方的简称。
〖白方〗执白棋一方的简称。
〖胜局〗有一方获胜的对局。
〖和局〗分不出胜负的对局。
〖终局〗对局结束。
〖复盘〗对局双方将本盘对局全过程的再现。
【行棋相关术语】
〖阳线〗即:直线,棋盘上可见的横纵直线。
〖交叉点〗阳线垂直相交的点,简称“点”。
〖阴线〗即:斜线,由交叉点构成的与阳线成45°夹角的隐形斜线。
〖落子〗棋子直接落于棋盘的空白交叉点上。
〖轮走方〗即“行棋方”,有权利落子的黑方或白方。
〖着〗在对局过程中,行棋方把棋子落在棋盘无子的点上,不论落子的手是否脱离棋子,均被视为一着。
〖回合〗双方各走一着,称为一个回合。
〖开局〗在对局开始阶段形成的布局。
〖连〗同色棋子在一条阳线或阴线上相邻成一排。
〖长连〗五枚以上同色棋子在一条阳线或阴线上相邻成一排。
〖五连〗只有五枚同色棋子在一条阳线或阴线上相邻成一排。
〖成五〗含有五枚同色棋子所形成的连,包括五连和长连。
〖四〗在一条阳线或阴线上连续相邻的5个点上只有四枚同色棋子的棋型。
〖活四〗有两个点可以成五的四。
〖冲四〗只有一个点可以成五的四。
〖死四〗不能成五的四。
〖三〗在一条阳线或阴线上连续相邻的5个点上只有三枚同色棋子的棋型。
〖活三〗再走一着可以形成活四的三。
〖连活三〗即:连的活三(同色棋子在一条阳线或阴线上相邻成一排的活三)。简称“连三”。
〖跳活三〗中间隔有一个空点的活三。简称“跳三”。
〖眠三〗再走一着可以形成冲四的三。
〖死三〗不能成五的三。
〖二〗在一条阳线或阴线上连续相邻的5个点上只有两枚同色棋子的棋型。
〖活二〗再走一着可以形成活三的二。
〖连活二〗即:连的活二(同色棋子在一条阳线或阴线上相邻成一排的活二)。简称“连二”。
〖跳活二〗中间隔有一个空点的活二。简称“跳二”。
〖大跳活二〗中间隔有两个空点的活二。简称“大跳二”。
〖眠二〗再走一着可以形成眠三的二。
〖死二〗不能成五的二。
〖先手〗对方必须应答的着法,相对于先手而言,冲四称为“绝对先手”。
〖三三〗一子落下同时形成两个活三。也称“双三”。
〖四四〗一子落下同时形成两个冲四。也称“双四”。
〖四三〗一子落下同时形成一个冲四和一个活三。
【战术相关术语】
〖风车轮〗指在一定区域内来回地绕着连续进攻的战术或技巧,就像一个风车轮一直在转着似的,这样的取胜方法也称之为“风车胜”。
〖二头蛇〗指某一方以活三进攻时,无论对方防守于哪一头都难免被蛇头咬伤,因为此时的活三如同二头蛇一样,两头都有厉害的杀着。也称“两头蛇”。
〖一子双杀〗一子落下同时形成两种取胜方法而对方无法同时防守的取胜技巧。
〖一子多杀〗一子落下同时形成两种以上取胜方法而对方无法同时防守的取胜技巧。
〖一子双防〗一子落下同时形成防守两种取胜方法的防守技巧。
〖八卦阵〗以“日”字的一组对角点为棋型,互为马步的防守阵型。构成五子棋八卦阵。
〖VCF〗英文 Victory of Continuous Four 的字头缩写,是利用连续不断地冲四这种绝对先手,直至最终取得胜利的战术技巧。
〖VCT〗英文 Victory of Continuous Threat 的字头缩写,是利用连续不断地活三、冲四、做杀等先手,直至最终取得胜利的战术技巧。
【比赛相关术语】
〖个人赛〗计算个人成绩的比赛。
〖团体赛〗计算运动队团体成绩的比赛。
〖轮空〗赛制中部分选手直接从中间某轮开始参加比赛,某轮未比赛的安排就叫轮空。
〖节〗一个比较集中的比赛单位时间(如一个上午或一个下午或一个晚上)称一“节”。
〖轮〗参赛的各队(团体赛)或各名棋手(个人赛)普遍出场比赛一次(个别轮空者除外)称一“轮”。
〖次〗团体赛中的同一轮两队之间完成的比赛称为一“次”比赛。
〖场〗两名棋手之间完成的两局制或多局制的一次比赛称为一“场”比赛。
〖局〗两名棋手之间完成的一盘比赛称为一“局”比赛。
[编辑本段]【那氏五子兵法】
中国现代五子棋的开拓者那威荣誉九段,多年钻研五子棋,潜心发掘五子棋的中国民间阵法,他总结了五子棋行棋的要领和临阵对局的经验,得出一套“ 秘诀 ” ,谓之《那氏五子兵法》:
先手要攻,后手要守,以攻为守,以守待攻。
攻守转换,慎思变化,先行争夺,地破天惊。
守取外势,攻聚内力,八卦易守,成角易攻。
阻断分隔,稳如泰山,不思争先,胜如登天。
初盘争二,终局抢三,留三不冲,变化万千。
多个先手,细算次先,五子要点,次序在前。
斜线为阴,直线为阳,阴阳结合,防不胜防。
连三连四,易见为明,跳三跳四,暗剑深藏。
己落一子,敌增一兵,攻其要点,守其必争。
势已形成,败即降临,五子精华,一子输赢。
[编辑本段]【五子棋的开局】
五子棋的开局也称布局,一般在3~7手左右完成。五子棋的开局是十分重要的。一般情况下,一局五子棋的着数在20至40着之间,因此,它的开局阶段是非常短暂的,大约在七八着至十几着之间。在这一阶段的争夺中,双方的布局、应答将对以后的胜负起着关键的作用。一般来说,黑棋以攻为主,而白棋则以防为主。
在开局阶段,双方主要是二的争夺。双方必须设法创造自己的连二、活二、跳二或大跳二等,同时要阻挡对方的活二。无论哪种开局,均体现出这一规律。
可以说,哪一方的二做得多 ( 有两个以上的活二 ) ,或者有效地阻挡住对方的活二,那么,哪一方的胜率就比较大。另外,开局时每一个次序、每一种节奏都不能忽视,输赢就在一步之差。
直止打法开局为了便于记忆、区分以及比赛。只对前3步组成的棋形进行了部分取名。
中国五子棋竞赛规则的五子棋开局
开局形状均以“星”和“月”命名。(参考资料[1]中“第三条”)
斜止打法开局全国正式比赛均采用26种开局,包括斜指开局的长星局、峡月局、恒星局、水月局、流星局、云月局、浦月局、岚月局、银月局、明星局、斜月局、名月局、慧星局和直指开局的寒星局、溪月局、疏星局、花月局、残月局、雨月局、金星局、松月局、丘月局、新月局、瑞星局、山月局、游星局。
黑方必负开局
可用《彭氏口诀》进行记忆:
二十六局先弃二,直指游星斜慧星。
寒星溪月疏星首,花残二月并白莲,
雨月金星追黑玉,松丘新宵瑞山腥。
星月长峡恒水流,白莲垂俏云浦岚,
黑玉银月倚明星,斜月名月堪称朋。
[编辑本段]【五子棋的数学思考】
可能很少有人注意到,五子连珠游戏其中包含着一个极为深刻的数学问题。为什么不是四子连珠,或者是六子连珠?你可能会说,四子连珠,那就太容易啦,下几步就胜了。而六子连珠呢,则太难了,谁也别想连成。这就说明,五子连珠极可能是一个最佳攻守平衡值,一个达成连珠的最大值。增一子、减一子都会打破这个平衡。四子连珠太易,攻方处于绝对优势;而六子连珠太难,守方处于绝对优势。而游戏规则必须是让游戏双方处于平等的位置才可能进行,否则游戏就不成其为游戏。要想黑白棋连珠成为一种符合游戏规则的智力游戏,五子连珠无疑是一个最佳方案。中华民族的祖先在发明五子连珠的过程中,猜想肯定也不是一撮而就,而是极可能经历了四子连珠、六子连珠的尝试过程,最后才确定为五子连珠,并流行开来。
这个问题,被当代科普作家傅小松称之为五子连珠问题,又称五子连珠猜想。其准确表述是:
在以横线、竖线互相交叉(一般各为15条)的方形平面(棋盘)中,黑白两种“点’(棋子)先后沿横线、竖线排列(行棋),在平面(棋盘)横线、竖线、斜线(无实线连接)上形成连续的同色“点”(棋子),五个“点”(棋子)为可能达成连珠的最大值。
五子连珠是黑白棋连珠的一个最佳方案,这在实际中早已不会有人怀疑。并且,五子连珠已经存在并发展了几千年,成为了一种趣味性强,同时技巧比较复杂、竞争激烈的棋类游戏,与围棋、国际象棋、中国象棋的巧妙性、复杂性也有一拼。这似乎足以证明五子连珠的最佳性。但从科学真理的角度看,一万次实践的证明也不能代替逻辑和数学上的证明。要确定五子连珠是黑白棋连珠的一个最佳方案,五子连珠是一个最佳值、最大值,必须进行数学上的证明。
“五子连珠问题”的证明可能非常复杂,这是因为,第一,它不是一个静态的问题,而是一个动态的问题。棋盘是一个静态的二维平面,但行棋博弈是一个的动态的过程。第二,这不是一个线性和确定性问题的,而是一个非线性和模糊性问题。所谓“五子连珠”的最佳值,是在千变万化的攻与防中达到的一种默契。因此,要解决“五子连珠猜想”,可能要运用到博弈论、模糊数学等工具。
[编辑本段]五子棋攻防策略
五子棋源于中国,后传入日本名为“连珠”。学从中国,传至中国。
下五子棋须得法,法中变化有莫测;五子之变如水势,因势避高而趋下.战不过攻守,法不过奇正,奇正之法:往复循环,“不竭如江海,无穷如天地”。
其祥法如下 :围、击虚、就实、寡众
(围)由于五子棋源于围棋,故下五子棋若想立于不败之地,须以围棋之法行棋,说白了就是“包饺子”,试想:如果对方的棋子被围住了,左冲右突都不行,前闯后退更不见效,此时他心理极度郁闷,已无斗志,棋还能下好吗?只能是输的份了!!!此招用于防守。
(击虚)兵法有云:“避实击虚”,下五子棋之精髓也在其理。不过此举贵在进攻,进攻若能攻其空虚之处,且得法,将会以迅雷不及掩耳之势而破竹将对手击败。此招用于进攻。
(就实)老子《道德经》中讲了万物正反两个方面及消长之理,攻守亦不过如此,故有“避实击虚”则就有“就实让虚”。“就实让虚”就是对方往哪里走棋,咱就往哪里走棋,好比随形附影一般。这招要把握好火候,不能过度也不能失度,因为下棋很容易攻守易势(攻之极乃守时,守之极乃攻时;攻中生守,守中生攻),此招用于防守。
(寡众)《孙子●虚实》中曰:“......备前则后寡,备后则前寡,备左则右寡,备右则左寡,无所不备,则无所不寡......”此招用在五子棋中则反其道而行,则会收到意想不到的效果,具体招法是“堵了前面则堵后面,堵了后面则堵前面,堵了左边则堵右边,堵了右边则堵左边”,前后左右四面八方都堵,则对方则无路可逃,无棋可下!此招和(围)连用。无所不胜,用在防守。
另外,有时在有计算的前提下,连续冲三、冲四(vct、vcf)有可能创造新的进攻机会;反之,一味的VC,只能迟滞败亡的步伐,反而使自己被“围”陷入铁桶阵(一般叫马桶阵)中。除了这些外,八卦阵是防守的无二秘宝,只是明八卦太过明显,因此暗八卦(用部分八卦点做主力,少量杂子作障眼)的功底就成了衡量技术的重要指标。
参考【棋经十三篇】
【五子棋贡献分析法】
五子棋作为民间游戏来说,也是颇有智力韵味的,下面介绍一下理论中的五子棋的贡献问题与法则:
设以围棋棋盘左下角为坐标原点建立直角坐标系xOy,若(9,10)(9,11)(10,10)(11,9)上有黑子,(8,12)(10,9)(11,8)上有白子,现在到白棋走子,若走(10,12)(11,11)就属于斜向走子,但是通常直向的(紧贴着棋子走的)走子要比斜向的走子对防守的贡献大,若走(8,11)(8,10)(8,9)(9,9)其中一个的均属于单侧走子,而另一侧则空虚,所以也不好,若走(11,10)也不好,因为在(11,8)的子已经对防守有了一定的贡献了,同理走(10,11)的也不好,因为(10,9)的子也对防守有了一定的贡献.所以说此时最佳的走子方法就是走(9,12)
若(8,10)有白子,(10,10)(11,10)(12,10)有黑子,到白子走,由于(8,10)对防守贡献了一部分,所以应该走(13,10)而不走(9,10)。若为黑走,就应该走(13,10)而不走(9,10),因为白子的(8,10)会削弱它对攻的贡献
#include
#define MAX 20
#define TextWidth 200
#define Time1 1
#define Time2 2
#define times 1
#define NO1 1
#define NO2 2
#define ERROR 0
#define NO 0
#define OK 1
int leng=1;
#define DEFAULT 0;
HDC hdc,hdc1,hdc2;
int xw,yw;
int iGame[MAX][MAX];
POINT point;
enum {Default,Player1,Player2}play;
enum {Stop,Play,Paush}plays;
void Init(HWND hwnd);
void paint(int play,int x,int y);
void chagePlayer();
int Look(int x,int y,int play);
void over(HWND hwnd,int play);
void timechage(HWND hwnd);
LRESULT CALLBACK WindowProcedure (HWND, UINT, WPARAM, LPARAM);
char szClassName[ ] = "五子棋 -WIN32版";
int WINAPI WinMain (HINSTANCE hThisInstance,
HINSTANCE hPrevInstance,
LPSTR lpszArgument,
int nFunsterStil)
{
HWND hwnd;
MSG messages;
WNDCLASSEX wincl;
wincl.hInstance = hThisInstance;
wincl.lpszClassName = szClassName;
wincl.lpfnWndProc = WindowProcedure;
wincl.style = CS_DBLCLKS;
wincl.cbSize = sizeof (WNDCLASSEX);
wincl.hIcon = LoadIcon (NULL, IDI_APPLICATION);
wincl.hIconSm = LoadIcon (NULL, IDI_APPLICATION);
wincl.hCursor = LoadCursor (NULL, IDC_ARROW);
wincl.lpszMenuName = NULL;
wincl.cbClsExtra = 0;
wincl.cbWndExtra = 0;
wincl.hbrBackground = (HBRUSH) COLOR_BACKGROUND;
if (!RegisterClassEx (&wincl))
return 0;
hwnd = CreateWindowEx (
1,
szClassName,
szClassName,
WS_OVERLAPPEDWINDOW,
CW_USEDEFAULT,
CW_USEDEFAULT,
800,
600,
HWND_DESKTOP,
NULL,
hThisInstance,
NULL
);
ShowWindow (hwnd, nFunsterStil);
while (GetMessage (&messages, NULL, 0, 0))
{
TranslateMessage(&messages);
DispatchMessage(&messages);
}
return messages.wParam;
}
LRESULT CALLBACK WindowProcedure (HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
{
PAINTSTRUCT ps;
static HPEN hpen,hpen1,hpen2;
static HBRUSH hbrush,hbrush1,hbrush2;
int x,y;
switch (message) /* handle the messages */
{
case WM_KEYDOWN:
switch (wParam)
{
case VK_F5:
Init(hwnd);
Rectangle(hdc,0,0,xw,yw);
for(x=0;x
Rectangle(hdc,x*xw/MAX,y*yw/MAX,(x+1)*xw/MAX,(y+1)*yw/MAX) ;
iGame[x][y]=Default;
}
SetTimer(hwnd,Time1,times,NULL);
leng=1;
plays=Play;
break;
case VK_F1:
break;
case VK_F2:
SetTimer(hwnd,Time1,times,NULL);
leng=1;
plays=Play;
break;
case VK_F3:
if(plays==Play)
{
KillTimer(hwnd,Time1);
plays=Paush;
}
else
if(plays==Paush)
{
SetTimer(hwnd,Time1,times,NULL);
plays=Play;
}
break;
}
break;
case WM_TIMER:
switch (wParam)
{
case Time1:
timechage(hwnd);
break;
}
break;
case WM_CREATE:
plays=Stop;
play=Player1;
break;
case WM_SIZE:
xw=LOWORD(lParam);
yw=HIWORD(lParam);
xw-=TextWidth;
InvalidateRect(hwnd,NULL,TRUE);
break;
case WM_LBUTTONDOWN:
//获取但前鼠标坐标
point.x=LOWORD(lParam);
point.y=HIWORD(lParam);
//初始化设备DC
Init(hwnd);
//鼠标坐标换为数组坐标
x=(point.x)/(xw/MAX);
y=(point.y)/(yw/MAX);
if(plays==Stop)break;
if(x
if(iGame[x][y]==Default&&plays==Play)//判断但前位置是否有棋子覆盖
{
leng=1;
paint(play,x,y);
if(Look(x,y,play))
over(hwnd,play);
chagePlayer();
}
}
break;
case WM_PAINT:
hdc=BeginPaint(hwnd,&ps);
Init(hwnd);
Rectangle(hdc,0,0,xw,yw);
for(x=0;x
Rectangle(hdc,x*xw/MAX,y*yw/MAX,(x+1)*xw/MAX,(y+1)*yw/MAX) ;
paint(iGame[x][y],x,y);
}
EndPaint(hwnd,&ps);
break;
case WM_DESTROY:
PostQuitMessage (0); /* send a WM_QUIT to the message queue */
break;
default: /* for messages that we don't deal with */
return DefWindowProc (hwnd, message, wParam, lParam);
}
return 0;
}
void Init(HWND hwnd)
{
hdc1=GetDC(hwnd);
hdc2=GetDC(hwnd);
//初始背景
SelectObject(hdc,CreatePen(0,1,RGB(255,0,0)));
SelectObject(hdc,CreateSolidBrush(RGB(0,0,0)));
//初始玩家一图形
SelectObject(hdc1,CreatePen(0,1,RGB(0,0,0)));
SelectObject(hdc1,CreateSolidBrush(RGB(0,255,0)));
//初始玩家二图形
SelectObject(hdc2,CreatePen(0,1,RGB(0,0,0)));
SelectObject(hdc2,CreateSolidBrush(RGB(0,0,255)));
SetBkMode(hdc,0);
Rectangle(hdc,xw+1,1,xw+30,yw);
Rectangle(hdc,xw+31,29,xw+200,30);
TextOut(hdc,xw+80,10,"五子棋",6);
TextOut(hdc,xw+45,100,"F2 - 开始游戏",13);
TextOut(hdc,xw+45,120,"F3 - 暂停/继续游戏",18);
TextOut(hdc,xw+45,140,"F5 -重新开始游戏",16);
Rectangle(hdc,xw+31,180,xw+200,181);
TextOut(hdc,xw+49,189," 帮助文档 ",15);
TextOut(hdc,xw+45,210,"*建议最大化窗口游戏",19);
TextOut(hdc,xw+45,240," 1) 按 F2启动游戏",18);
TextOut(hdc,xw+45,260," 2) 鼠标点击棋盘",17);
TextOut(hdc,xw+30,320,"注意:滚动条为限制时间",22);
}
void timechage(HWND hwnd)
{
if(play==Player1)
{
Rectangle(hdc1,xw+1,leng++,xw+30,yw);
TextOut(hdc1,xw+33,30,"当前下棋主动权:玩家一",22);
if(leng>yw)
{
KillTimer(hwnd,Time1);
MessageBox(NULL,"时间到!玩家一您输了!","TimeOver",0);
SendMessage(hwnd,WM_KEYDOWN,VK_F5,NULL);
KillTimer(hwnd,Time1);
}
}
else
{
TextOut(hdc2,xw+33,30,"当前下棋主动权:玩家二",22);
Rectangle(hdc2,xw+1,leng++,xw+30,yw);
if(leng>yw)
{
KillTimer(hwnd,Time1);
MessageBox(NULL,"时间到!玩家二您输了!","TimeOver",0);
SendMessage(hwnd,WM_KEYDOWN,VK_F5,NULL);
KillTimer(hwnd,Time1);
}
}
}
void paint(int play,int x,int y) //画棋子
{
switch (play)
{
case Player1:
if(iGame[x][y]!=Default) ;
Ellipse(hdc1,x*xw/MAX,y*yw/MAX,(x+1)*xw/MAX,(y+1)*yw/MAX) ;
iGame[x][y]=Player1;
break;
case Player2:
if(iGame[x][y]!=Default) ;
Ellipse(hdc2,x*xw/MAX,y*yw/MAX,(x+1)*xw/MAX,(y+1)*yw/MAX) ;
iGame[x][y]=Player2;
break;
}
}
void chagePlayer() //改变玩家
{
if(play==Player1) play=Player2;
else
play=Player1;
}
int Look(int x,int y,int play) // 检查模块
{
int i,tempx,tempy;
tempx=x;tempy=y;
for(i=0;i<5&&iGame[tempx][tempy]==play;tempy--,i++); if(i>=5) return OK; //向上核对
tempx=x;tempy=y;
for(i=0;i<5&&iGame[tempx][tempy]==play;tempy++,i++); if(i>=5) return OK; //向下核对
tempx=x;tempy=y;
for(i=0;i<5&&iGame[tempx][tempy]==play;tempx--,i++); if(i>=5) return OK; //向左核对
tempx=x;tempy=y;
for(i=0;i<5&&iGame[tempx][tempy]==play;tempx++,i++); if(i>=5) return OK; //向右核对
tempx=x;tempy=y;
for(i=0;i<5&&iGame[tempx][tempy]==play;tempx--,tempy--,i++); if(i>=5) return OK; //向左上核对
tempx=x;tempy=y;
for(i=0;i<5&&iGame[tempx][tempy]==play;tempx++,tempy--,i++); if(i>=5) return OK; //向右上核对
tempx=x;tempy=y;
for(i=0;i<5&&iGame[tempx][tempy]==play;tempx--,tempy++,i++); if(i>=5) return OK; //向左下核对
tempx=x;tempy=y;
for(i=0;i<5&&iGame[tempx][tempy]==play;tempx++,tempy++,i++); if(i>=5) return OK; //向右下核对
return NO;
}
void over(HWND hwnd,int play)
{
switch(play)
{
case Player1:
KillTimer(hwnd,Time1);
MessageBox(hwnd,"恭喜玩家一获得胜利","胜利",0);
SendMessage(hwnd,WM_KEYDOWN,VK_F5,NULL);
KillTimer(hwnd,Time1);
plays=Stop;
break;
case Player2:
KillTimer(hwnd,Time1);
MessageBox(hwnd,"恭喜玩家二获得胜利","胜利",0);
SendMessage(hwnd,WM_KEYDOWN,VK_F5,NULL);
KillTimer(hwnd,Time1);
plays=Stop;
break;
}
}
20分也高?