五子棋开局6步必胜服务端

Sina Visitor System网络编程异步五子棋游戏
一. 实验要求
参考教材第五章第个游戏程序,按以下要求进行改编,要求如下:
1)将游戏改为双方对弈,而不是系统自动下棋;
2)修改游戏规则,如五子棋的游戏规则;
3)同步改异步;
二. 设计思路
1.首先,本次实验主要是修改性的实验,所以思路的第一步,就是看懂原有代码的结构,并对新代码的结构进行分析,分析如下
()服务器负责提供多个游戏桌的服务,可选择人数限制(),游戏桌限制()
()服务器有“启动服务”和“停止服务”的功能,只有在启动服务之后才允许客户端连接游戏
()客户端登陆之后可点击游戏厅有空位的桌子进入游戏桌,每个游戏桌可容纳两名玩家,同一桌的双方点击准备就绪之后,游戏才开始。
()如果有一方先让五子连珠情况(行、列、对角线)出现,便算胜利,游戏结束。
()同一桌的玩家可以聊天。
2.然后,正式开始编码,首先是同步改异步:
服务器端异步接收客户端连接:
/// &summary&接收客户端连接
private void ListenClientConnect()
TcpClient newClient =
while (true)
ListenClientDelegate d = new ListenClientDelegate(ListenClient);
IAsyncResult result = d.BeginInvoke(out newClient, null, null);
while (result.IsCompleted == false)
if (normalExit)
Thread.Sleep(50);
d.EndInvoke(out newClient, result);
//每接受一个客户端连接就创建一个对应的线程循环接收该客户端发来的信息
if (newClient != null)
ParameterizedThreadStart pts = new ParameterizedThreadStart(ReceiveData);//使用创建可以 传递参数的线程
Thread threadReceive = new Thread(pts);
User user = new User(newClient);
threadReceive.Start(user);
userList.Add(user);
service.AddItem(string.Format("{0}进入
service.AddItem(string.Format("当前连接用户数:
private delegate void ListenClientDelegate(out TcpClient newClient);
private void ListenClient(out TcpClient newClient)
//等待用户进入
newClient = myListener.AcceptTcpClient();
//当单击“停止监听”或者退出此窗体时会产生异常
//因此可以利用此异常退出循环
newClient =
客户端异步向服务器发送信息:
public void SendToServer(string str)
sendmessageDelegate d = new sendmessageDelegate(sendmessage);
IAsyncResult result = d.BeginInvoke(str, null, null);
while (result.IsCompleted == false)
Thread.Sleep(50);
d.EndInvoke(result);
delegate void sendmessageDelegate(string message);
public void sendmessage(string message)
sw.WriteLine(message);
sw.Flush();
AddItemToListBox("发送数据失败
3.然后是去掉并且规定出手次序,也就是说当一方行动过后,必须等待另外一方也行动完成,才能进行下子。
if (gameTable[tableIndex].ifStart == true && gameTable[tableIndex].CanSetDot[side] == true)
gameTable[tableIndex].CanSetDot[side] = false;
gameTable[tableIndex].CanSetDot[(side + 1) % 2] = true;
gameTable[tableIndex].SetDot(xi, xj, color);
这一段原本是要“双方都要确定开始,游戏才进行开始”,的功能,我在后面加了一段,用以确定到谁出手,出手后立刻将其设定为,将另一方设定为,以此确定谁出手。
4.接下来是判断胜利的条件,这里我采用的是嵌套循环,从逐横,逐纵,右斜,左斜,逐一检查,若凑足了“”,则返回胜利者的颜色(无人胜出,黑方胜出,白方胜出)
private int CheckX(int y)//检测横向
for (int x = 0; x &= 10; x++)
int color = grid[x, y];
if (color == -1)
if (grid[x + 1, y] == color &&
grid[x+2,y] == color &&
grid[x+3,y] == color &&
grid[x+4,y] == color)
return -1;
private int CheckY(int x)//检测纵向
for (int y = 0; y &= 10; y++)
int color = grid[x, y];
if (color == -1)
if (grid[x, y+1] == color &&
grid[x, y+2] == color &&
grid[x, y+3] == color &&
grid[x, y+4] == color)
return -1;
private int CheckAddX(int y)//检测右斜
for (int x = 0; x &= 10; x++)
int color = grid[x, y];
if (color == -1)
if (grid[x+1, y + 1] == color &&
grid[x+2, y + 2] == color &&
grid[x+3, y + 3] == color &&
grid[x+4, y + 4] == color)
return -1;
private int CheckSubX(int y)//检测左斜
for (int x = 4; x &= 14; x++)
int color = grid[x, y];
if (color == -1)
if (grid[x-1, y + 1] == color &&
grid[x-2, y + 2] == color &&
grid[x-3, y + 3] == color &&
grid[x-4, y + 4] == color)
return -1;
三. 程序运行效果图
1.服务器启动
2.客户端启动
3.双方游戏界面
4.获胜界面
下面附上代码的下载链接
http://download.csdn.net/detail/u00297
没有更多推荐了,
加入CSDN,享受更精准的内容推荐,与500万程序员共同成长!由""直接销售和发货,并提供售后服务
客户端购买
立即查看&&
{{if (sku.promotionInfo != "")}}
{{sku.promotionInfo}}
&{{sku.price}}
{{if (sku.promotionInfo != "")}}
{{sku.promotionInfo}}
{{if (i+1)%htmlnum == 0 || (i+1) == skus.length}}
您的云钻暂时不足,攒足云钻再来刮
200云钻刮一次
200云钻刮一次
恭喜获得1张券!
今天的机会已经全部用完了,请明天再来
恭喜刮出两张券,请选择一张领取
小苏正在为您抽奖...
会员打开苏宁易购wap端、PC端、苏宁易购APP端方可参与活动。
活动方式为云钻刮券,每次刮券需要扣除200云钻。奖励分为无敌券和店铺云券两种,100%刮出无敌券,最低2元。店铺券由店铺提供,用户可以根据购物需求,在无敌券和店铺云券之间二选一。如因为网络、用户关闭等原因,造成页面关闭,导致用户没有或无法选择,系统将在5分钟内自动按照获得的无敌券面额发放到用户账户。
每人每天参与刮券次数上限为3次。活动每日限量,如用户参与时已达到活动最高上限,则不能再继续参与,次日可以继续参与。
如会员在刮券时选择了店铺云券,券发至账户后则无法再更改为平台的无敌券;如会员在刮券时选择了平台的无敌券,券发至账户后则无法再更改为店铺云券。
云钻刮券获得的不固定面值的券,会随机获得无敌券:2~2.2元、5元、10元、20元、50元的无敌券或不同面额的店铺云券。
券是否成功发放,可在“我的优惠券”中查询。
如活动受政府机关指令需要停止举办的,或活动遭受严重网络攻击需暂停举办的,或者系统故障导致的其它意外问题,苏宁无需为此承担赔偿或者进行补偿。
券使用规则
不同面额的无敌券有不同的使用门槛,2~2.2元、5元、10元、20元、50元无敌券为无门槛使用,具体以实际发放券说明为准。配送方式仅限选择配送使用,不能抵扣运费部分。
用户刮券获得的店铺云券可与店铺内领取的店铺易券叠加使用。
店铺云券使用门槛等具体信息以商家在其店铺内的设置使用说明为准。
无敌券可用于单件商品的付款,也可用于购物车合并下单付款,同时支持在跨店铺订单中使用。店铺云券仅可使用在指定店铺中,注:部分店铺活动商品不支持用券,以订单实际提交为准。
云钻刮券获得的无敌券可以购买大聚惠、抢购、团购、手机专享价,但不可购买闪拍、预售、S码、名品特卖、海外购、秒杀、虚拟产品、法律规定限制产品如一段奶粉(包括但不仅限列出的商品)等、云钻加钱兑及云钻全额兑。
在购物时,点击购买后,页面会提示可使用易购券,只要点击选择易购券即可抵用扣除对应金额。云钻刮券获得无敌券或店铺云券使用时可用于抵扣商品金额,不能抵扣运费、运费险、增值服务等非商品金额。
云钻刮券获得的无敌券或店铺云券可与店铺页面领取的店铺易券叠加使用,付款时默认优先使用力度较大的店铺优惠券,如使用店铺易券后的订单金额仍然满足云钻刮券所获得店铺云券使用条件,可继续叠加使用店铺云券。(举例:店铺在页面设置满199减50元的店铺易券,同时用户在店铺刮券获得一张满20元减20元的店铺云券,如商品订单金额为200元,会员在用已使用领取的50元店铺易券情况下,仍然可以使用云钻刮券获得20元店铺云券)
云钻刮券获得的无敌券或店铺云券不得提现,不得转赠他人,不得为他人付,不得拆分使用。
一个订单最多使用6张易购券。
云钻刮券获得的有效期为:自获得之日起7天内有效(部分活动券可能存在不同有效期,具体详见“我的优惠券”内易购券有效期说明)。
在获取和使用券过程中,如果出现违规行为(如作弊领取、恶意套现、刷取信誉、虚假交易等),苏宁将取消用户的中奖资格,并有权撤销违规交易、收回易购券(含已使用的易购券及未使用的易购券),必要时追究法律责任。
使用易购券的订单若交易未成功或发生退款及售后,在交易所使用的易购券有效期内订单取消完成的,易购券将退回用户账户,退回后的易购券有效期不变。如在使用的易购券有效期之外发生退款,所使用的券退回当天有效,过期不予退还。如发生售后退款,易购券退回当天有效,过期不予退还。
一片书叶图书专营店
1分钱畅读全场,海量书籍不限量任你看
出版社:江苏科学技术出版社
出版时间:2013.01
装帧:平装
版权提供:江苏科学技术出版社
暂时没有内容
五子棋在日本得到很大的发展,我认为这与日本国的地理人文特征有关,在五子棋的术语中有许多火山和群岛的痕迹。火山分为活火山和死火山,而活火山的休眠期就是死火山,所以,五子棋的术语活三和眠三就产生。由于火山和海面的障碍,人们的往来比较困难,联合就是胜利,这是五子棋有别于围棋吃掉对方棋子的地方。要想知道梨的滋味就得亲口尝一尝,要想体会五子棋的乐趣,你也得自己学会。下面我们将带你进入五子棋的世界,你一定会感到其乐无穷。
该商品在当前城市正在进行
抢购价:& 38.00
易购价:& 38.00
注:参加抢购将不再享受其他优惠活动
亲,很抱歉,您购买的宝贝销售异常火爆,让小苏措手不及,请稍后再试~
看不清楚?
亲,大宗购物请点击小苏的服务会更贴心!
亲,很抱歉,您购买的宝贝销售异常火爆让小苏措手不及,请稍后再试~
您已成功将商品加入收藏夹
非常抱歉,您前期未参加预订活动,无法支付尾款哦!
抱歉,您暂无任性付资格C语言制作简单五子棋游戏
C语言制作简单的五子棋游戏
学习C语言的人很多,但是用C语言很少,而用来为自己所用,来做游戏的人就更少了,很多人都是跟着学校学习,学校讲到哪就坐到哪,但是以后却还是不会做项目。今天我就来写一段,如何用C语言来写一个五子棋游戏。(PS:代码有点长,所以前面的字体以及框架怎么写,我就不写下来了,主要是写游戏操作设置以及游戏界面。)
代码如下:
#include &graphics.h&//图形库
#include &stdio.h&//C语言std头文件
#include &conio.h&//kbhit()//按键响应
#include &mmsystem.h&
#pragma comment(lib,"winmm.lib")
void PlayGame()
//鼠标操作
int chess[N][N] = { 0 };//标志没有棋子的标志
while (true)
//矫正鼠标坐标
int x, y,i,j;
m = GetMouseMsg();
switch (m.uMsg)
case WM_LBUTTONDOWN:
//鼠标左键按下画器
if (m.x &= 10 && m.x &= 530 && m.y &= 10 && m.y &= 530)
x = m.x % 20;
if (x &= 10)
m.x = m.x -
m.x = m.x - x + 20;
y = m.y % 20;
if (y &= 10)
m.y = m.y -
m.y = m.y - y + 20;
i = m.x / 20;
j = m.y / 20;
if (chess[i][j] != 0)
setlinecolor(BLACK);
setfillcolor(BLACK);
fillcircle(m.x + 10, m.y - 10, 8);
chess[i][j] = 1; //有黑棋1
if (GameOver1(chess, 1) == 1)
settextcolor(RED);
settextstyle(50, 50, L"锐字云字库行楷体1.0");
outtextxy(200, 200, L"此局黑棋胜出");
case WM_RBUTTONDOWN:
if (m.x &= 10 && m.x &= 530 && m.y &= 10 && m.y &= 530)
x = m.x % 20;
if (x &= 10)
m.x = m.x -
m.x = m.x - x + 20;
y = m.y % 20;
if (y &= 10)
m.y = m.y -
m.y = m.y - y + 20;
i = m.x / 20;
j = m.y / 20;
if (chess[i][j] != 0)
setlinecolor(WHITE);
setfillcolor(WHITE);
fillcircle(m.x + 10, m.y - 10, 8);
chess[i][j] = 2;
if (GameOver1(chess, 2) == 1)
settextcolor(WHITE);
settextstyle(50, 50, L"锐字云字库行楷体1.0");
outtextxy(200, 200, L"此局白棋胜出");
//游戏界面
void GameBackground()
IMAGE GameBackgroundI
loadimage(&GameBackgroundImage, L"GameBackground.jpg");
int width = GameBackgroundImage.getwidth();
int height = GameBackgroundImage.getheight();
initgraph(width, height);
putimage(0, 0, &GameBackgroundImage);
setlinecolor(BLACK);
for (int i = 10; i &= 530; i += 20)
//x,y x1 ,y1
line(10, i, 530, i);
line(i, 10, i, 530);
//调整棋盘
//调整边框---加粗
setlinestyle(PS_SOLID, 4);
line(10, 10, 10, 530); //上边加粗
line(10, 530, 530, 530);//下边加粗
line(10, 10, 530, 10);//左边
line(530, 10, 530, 530);//右边
//画点 圆心坐标 +半径
fillcircle(270, 270, 2);
//左上270-9*20
fillcircle(90, 270, 2);
fillcircle(270, 90, 2);
//右下角 270+9*20
fillcircle(450, 90, 2);
fillcircle(90, 450, 2);
fillcircle(450, 450, 2);
fillcircle(90, 90, 2);
fillcircle(450, 270, 2);
fillcircle(270, 450, 2);
messageBox();
PlayGame();
int main()
GameBegin();
GameBackground();
closegraph();
代码就是这么多,但是不要直接就复制粘贴咯,因为这串代码是没有前面些窗口的代码的,这个需要你们自己去写,代码只能给你们一些学习的思路,希望你们能学到些东西。
想成为一个合格的C/C++程序员,需要学习哪些内容
首先,学习C/C++肯定要学习C语言(当然,不学习C语言直接学习C++也可以,但是学习C语言把基础打好对以后学习其他编程语言都是会有帮助的)
今天就先来讲讲从基础到进阶,C语言基础该怎么学习
——初级阶段,对于完全不懂的小白来说,首先需要了解计算机的组成原理(当然在如今这个时代,一般的都是知道的)然后开始学习理论,编程的启蒙思维(当然这前两个都是了解下就差不多了,不用太着重去学习)然后就需要开始学习内容了——首先先学习一些基本的数据类型,然后还有运算符,顺序结构,分支结构,循环结构,当你已经能运用这些基础的知识内容写一个小程序,恭喜你,你开始入门了,但是仅仅只是个开始。。。
——现在进入中级阶段,学习的内容会比较多,需要学习数组,函数,指针(指针方面包含很多内容,这方面需要着重的学习,对后续的学习方面帮助会很大),预处理指令,结构体与公用体,枚举,位运算,联合。。这些是中级阶段的学习内容,虽然打出来显得很少,但是接触的内容会很多,大家要多多着重学习(加群:,学习C/C++)
——最后就是进入高级学习阶段了,学习的分类比较少,但是每个分类里面包含的内容确实最难的,千万不要因为文字打出来这么简单就懈怠咯。。高级部分包含的内容主要就是数据结构,动态储存管理,高级图形编程,Socket通信编程,其中数据结构包含了数据结构--线性表,数据结构--栈和队列,数据结构--串,数据结构--常用算法,这些内容对你们以后往C++方面或者是嵌入式方面发展都有着不可小觑的作用
关注微信公众号:编程语言
如果对这方面感兴趣或者在学习C/C++的过程中有什么问题的话,可以加群:,群内有大量C/C++资料,也会有人解答问题,大家一起学习,一起交流。希望每位学习C/C++的人都能学有所成。
有更多(C/C++语言,linux,JAVA语言)高手帮助你解决难题,一起互动,提高大家的编程水平
责任编辑:
声明:该文观点仅代表作者本人,搜狐号系信息发布平台,搜狐仅提供信息存储空间服务。
今日搜狐热点Socket游戏编程-五子棋(服务器+多客户端)
转载自:http://blog.csdn.net/andrew_wx/article/details/6642517#comments
最近两天发的博文较少。。因为这个例子太长啦。
下面引用下书上的话,来引导这个例子:
游戏规则如下:
(1)玩家通过 internet 和 坐在同一桌的另外一个玩家对弈,一个玩家选择黑方,另一个玩家选择白方。
(2)游戏开始后,计算机自动在15x15的棋盘方格内,以固定的时间间隔,不停的在未放置棋子的位置随机产生黑色棋子或白色棋子。
(3)玩家的目标是快速单击自动出现在棋盘上的自己所选颜色的棋子,让棋子从棋盘上小时,以避免自己的棋子出现在相邻的位置。
(4)每当棋子从棋盘上小时,具有相应颜色的玩家既得1分。注意,如果玩家单击了对方的棋子,则对方得1分。
(5)如果棋盘上出现两个或者两个以上相邻的同色棋子,游戏就结束了,改颜色对应的玩家就是失败者。
游戏功能要求如下:
(1)服务器可以同时服务多桌,每桌允许两个玩家通过internet 对弈。
(2)允许玩家自由选择坐哪一桌的哪一方。如果两个玩家坐在同一桌,双方应都能看到对方的状态。两个玩家均单击‘开始’按钮后,游戏才开始。
(3)某桌游戏开始后,服务器以固定的时间间隔同时在15x15的棋盘方格内向该桌随机地发送黑白两种颜色的棋子的位置,客户端程序接收到服务器发送的棋子位置和颜色后,在15x15棋盘相应的位置显示棋子。
(4)玩家坐到游戏桌座位上后,不论游戏是否开始,该玩家都可以随时调整服务器发送棋子位置的时间间隔。
(5)游戏开始后,客户端程序响应鼠标单击,并根据游戏规则计算玩家的得分。
(6)如果两个相同颜色的棋子在水平方向或垂直方向是相邻的,那么就认为这两个棋子是相邻的,这里不考虑对角线相邻的情况。
(7)如果相同颜色的棋子出现在相邻的位置,本局游戏结束。
(8)同一桌的两个玩家可以聊天。
这个游戏虽然比较小,但却是“麻雀虽小,五脏俱全”。如果读者真正理解了编写的方法,就可以轻松编写其他各类基于TCP的应用程序。
(打字挺累的,一字一字的照着打下来的。)
------------------------------------------
上面介绍完了,下面直接上图 传代码。。
另外有一点要说的是 这个程序(客户端和服务端)已经测试过了。
并不是很完美,但是并不影响学习socket TCP编程。挺不错的一个例子。
先上图吧,不唠叨了。
图为两个客户端和一个服务端运行的状况。。。
完整代码下载(免积分):
注:再次说下,关于代码的是否完美,这里不作讨论。仅用于学习socket编程。
没有更多推荐了,
加入CSDN,享受更精准的内容推荐,与500万程序员共同成长!

我要回帖

更多关于 五子棋先手必胜 的文章

 

随机推荐