急求:五子棋的源代码(数据结构),每一步都要有解释的!!!

急求:五子棋的源代码(数据结构),每一步都要有解释的!!!,第1张

#include<iostream.h>#include<stdlib.h>#define Num 15//********************************************************//类class T//定义类用来封装所有相关函数和变量{ char board[Num][Num]//用数组board[Num][Num]来定义棋盘public: void PrintMenu() //打印菜单 说明游戏规则和方法void PrintBoard() //打印棋盘 void GameStart(char*,int &,int &,char) //下棋 int whichwin(int,int,char) //判断那个选手赢 void Choice(char &) //是否再玩 void Setboard() //重置棋盘}//****************************************************************//main主函数void main ()//主函数{ T s//说明类的一个对象ss.PrintMenu()//通过s调用PrintMenu函数提示如何游戏 char player1[20],player2[20]//玩家姓名 int FirstWin=0,SecondWin=0,Draws=0,x,y,N//说明变量,赋初值为0以待计算输赢结果 char choice='Y' cin.ignore(20,'\n')//输入输出流,前面如果有输入把输入行所有字符取空,以便后面的输入从新的一行开始 cout<<"请输入第一个玩家姓名:" cin.getline(player1,20)//连续读取数据 cout<<"请输入第二个玩家姓名:" cin.getline(player2,20) while(choice=='Y'||choice=='y')//条件成立,执行 { s.Setboard()//调用Setboard函数 N=0 while(N<=(Num*Num)) { s.PrintBoard()//打印棋盘 s.GameStart(player1,x,y,'O') N++//记录已下棋子数 if(s.whichwin(x-1,y-1,'O'))//返回值不为0则条件成立 { s.PrintBoard() cout<<player1<<"赢了。"<<endl FirstWin++//记录赢局数 break//终止本次循环 } s.PrintBoard()//同上 s.GameStart(player2,x,y,'X') N++ if(s.whichwin(x-1,y-1,'X')) { s.PrintBoard() cout<<player2<<"赢了。"<<endl SecondWin++ break } if(N==(Num*Num)) { cout<<"和棋!" Draws++//记录平局数 break } } s.Choice(choice)//给玩家提供一次选择是否再玩的机会 } //输出游戏输赢次数 cout<<player1<<"赢了"<<FirstWin<<"次"<<endl cout<<player2<<"赢了"<<SecondWin<<"次"<<endl cout<<"和"<<Draws<<"次"<<endl cout<<"谢谢使用。"<<endl cout<<"任意键继续。"<<endl cin.get()//很必要的,目的是空度换行字符}//*******************************************************************//定义公有成员函数void T::PrintMenu(){ cout<<"欢迎进入五子棋游戏!\n" cout<<"******************************************"<<endl cout<<"\t游戏说明:"<<endl<<endl cout<<"1.第一个玩家用O第二个玩家用X;"<<endl cout<<"2.请根据提示输入所要走的行和列;"<<endl cout<<"3.按<Enter>下棋。"<<endl cout<<"

js代码:

定义canvas及黑白棋变量

<font color="#2f4f4f" face="微软雅黑" size="3">var canvas

var context

var isWhite = true//设置是否该轮到白棋

var isWell = false//设置该局棋盘是否赢了,如果赢了就不能再走了

var img_b = new Image()

img_b.src = "images/b.png"//白棋图片

var img_w = new Image()

img_w.src = "images/c.png"//黑棋图片</font>

为棋盘的二维数组用来保存棋盘信息

<font color="#2f4f4f" face="微软雅黑" size="3">var chessData = new Array(15)//初始化0为没有走过的,1为白棋走的,2为黑棋走的

for (var x = 0x <15x++) {

chessData[x] = new Array(15)

for (var y = 0y <15y++) {

chessData[x][y] = 0

}

}</font>

绘制棋盘的线

<font color="#2f4f4f" face="微软雅黑" size="3"> for (var i = 0i <= 640i += 40) {

context.beginPath()

context.moveTo(0, i)

context.lineTo(640, i)

context.closePath()

context.stroke()

context.beginPath()

context.moveTo(i, 0)

context.lineTo(i, 640)

context.closePath()

context.stroke()

}

}</font>

判断该棋局的输赢

<font color="#2f4f4f" face="微软雅黑" size="3">if (count1 >= 5 || count2 >= 5 || count3 >= 5 || count4 >= 5) {

if (chess == 1) {

alert("白棋赢了")

}

else {

alert("黑棋赢了")

}

isWell = true//设置该局棋盘已经赢了,不可以再走了

}</font>

html代码:

<font color="#2f4f4f" face="微软雅黑" size="3"><body onload="drawRect()">

<div>

<canvas width="640" id="canvas" onmousedown="play(event)" height="640">你的浏览器不支持HTML5 canvas ,请使用 google chrome 浏览器 打开.

</canvas>

</div>

</body></font>

好的程序还是很复杂的,一般的可以看flash格式的动画小游戏,把它拆了就可以了,技术好点就要去研究黑石的算法了,很复杂,逻辑+算法+拓扑+人工智能。

网上的源代码还是很多,自己好好看看吧。

黑石计算很全面,当然10级很垃圾。你只要认真一点,战胜应该不是问题。

一般都用3dan。

所谓计算实际上是抽象记忆,你首先要在脑子里面形成一副图。黑棋走这里,白棋走哪里,然后黑棋又走哪里。。。。

计算得越多,计算的步数越远。

当然那只是单一变化,算完了,再算另一种变化,如果黑棋不走那里,那白棋有哪些点可走,每个点结果会怎么样。

这就是计算的过程。

五子棋很复杂的,努力吧。。

不见然是这样的

黑石的开局是逻辑+算法+拓扑+人工智能,

中盘一般是先判断优势区域,或者叫块,采用正负加和算法,

尽量做到多区域链接,

终盘,一般是反复的线性算法,做VCF,

整个过程有一定的棋谱支持,但人工智能不强,这方面不如fiver6,

估计五子棋的所有棋谱的坐标文件是2000TB,但有效下发在1TB左右,这是我个人估计,围棋由于可以反复,棋谱没有终结的,

所以,毕竟五子棋的每个棋子是永久放在棋盘上的,可以穷尽的

网上有很多棋谱的搜索引擎,黑石毕竟不是最强的,她的开局比较厉害,终盘的算法也还可以,但时间太长,但中盘的布局和谋虑不是很好,大局观就是没有人的好。

要编写一个优秀的软件,你首先必须是一个连珠高手,把人的智能转移到程序上


欢迎分享,转载请注明来源:内存溢出

原文地址:https://www.54852.com/tougao/8027285.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2023-04-12
下一篇2023-04-12

发表评论

登录后才能评论

评论列表(0条)

    保存