`
lsx111
  • 浏览: 14280 次
  • 性别: Icon_minigender_1
最近访客 更多访客>>
文章分类
社区版块
存档分类
最新评论

五子棋总结

 
阅读更多
五子棋总结:
首先定义下棋的基本信息:棋盘的行数和列数,棋子的大小,棋盘的大小。由于这些信息是不变的,
而且为了改变信息时的方便,把这些信息定义在接口中。
public interface Config {
public static final int x0=25; //棋盘的开始点
public static final int y0=25;
public static final int ROWS=15; //棋盘的行数
public static final int COLUMNS=15; //棋盘的列数
public static final int Chess_Size=35; //棋子的大小
public static final int Size=40; //棋盘每一格的大小
}
然后建立窗体,在窗体上画棋盘。
1  在窗体上加一个面板
ChessTable ct=new ChessTable();
ct.setBackground(Color.yellow ); //设置面板颜色
ct.setPreferredSize(new Dimension(600,600)); //设置面板大小
this.add(ct);           //将面板加到窗体上
....
Graphics g=ct.getGraphics();//在面板上获取画布
for(int i=0;i<Config.ROWS;i++){
     g.drawLine(Config.x0+i*Config.Size,Config.y0,
            Config.x0+i*Config.Size,Config.y0+(Config.ROWS-1)*Config.Size);
} //画竖向直线
for(int i=0;i<Config.COLUMNS;i++){
     g.drawLin(Config.x0,Config.y0+i*Config.Size,
           Config.x0+(Config.COLUMNS-1)*Config.Size,Config.y0+i*Config.Size);
} //画横向直线

当窗体显示时看不见棋盘
原因:窗体在显示时会进行重绘。
将画棋盘的方法加到重绘的方法中:
public void paint(Graphics g){
super.paint(g);
for(int i=0;i<Config.ROWS;i++){
     g.drawLine(Config.x0+i*Config.Size,Config.y0,
            Config.x0+i*Config.Size,Config.y0+(Config.ROWS-1)*Config.Size);
} //画竖向直线
for(int i=0;i<Config.COLUMNS;i++){
     g.drawLin(Config.x0,Config.y0+i*Config.Size,
           Config.x0+(Config.COLUMNS-1)*Config.Size,Config.y0+i*Config.Size);
} //画横向直线
}
再显示窗体时棋盘会出现

然后是画棋子

人人对战:
黑白交替并且下过棋的地方不能下棋,而且棋要下在交点上
定义一个标记数组public chess[][]=new chess[15][15];

然后给棋盘面板加鼠标监听器
Mouselistener l=new Mouselistener(chess,g,ct);
ct.addMouseListener(l);
...
public Mouselistener(int chess[][],Graphics g,ChessTable ct){
this.chess=chess;
this.g=g;
this.ct=ct;
}
public void mouseClicked(MouseEvent e){
x1=e.getX();
y1=e.getY();
x2=(x1-Config.x0)/Config.Size;
y2=(y1-Config.y0)/Config.Size;
if(chess[x2][y2]==0){ //chess【】【】=0时表示此处没下过棋
if(count==0){ //count=0表示下黑棋
g.setColor(Color.black)
g.fillOval(Config.x0+Config.Size*x2-Config.Size/2,
Config.y0+Config.Size*y2-Config.Size/2, Config.Chess_Size,
Config.Chess_Size); //棋下在交点上
chess[x2][y2]=1;
count++;
}else if(count==1){
g.setColor(Color.white)
g.fillOval(Config.x0+Config.Size*x2-Config.Size/2,
Config.y0+Config.Size*y2-Config.Size/2, Config.Chess_Size,
Config.Chess_Size);
chess[x2][y2]=2;
count--;
}
}
重绘棋子
public void drawchess(Graphics g){
for(int i=0;i<chess.length;i++){
for(int j=0;j<chess[i].length;j++){
if(chess[i][j]==1){
g.setColor(Color.black);
g.fillOval(Config.x0+i*Config.Size-Config.Size/2,
Config.y0+j*Config.Size-Config.Size/2,
Config.Chess_Size, Config.Chess_Size);
}else if(chess[i][j]==2){
g.setColor(Color.white);
g.fillOval(Config.x0+i*Config.Size-Config.Size/2,
Config.y0+j*Config.Size-Config.Size/2,
Config.Chess_Size, Config.Chess_Size);
}
}
}
}
判断输赢:
下一颗棋子,就要在它的四个方向进行判断(水平,竖直,左斜,右斜),当有5个或5个以上的相同颜色的棋子相连时,一方获胜。
public class Win(){
int chess[][];
public Win(int chess[][]){
this.chess=chess;
}
public boolean check(int x,int y){
boolean state=false;
if(checkrow(x,y)||checkcolumn(x,y)||checkleft(x,y)||checkright(x,y)){
state=true;
}
return state;
}
//判断行
public boolean checkrow(int x,int y){
int count=1;
for(int i=x+1;i<chess.length;i++){
if(chess[i][y]==chess[x][y]){
count++;
}else break;
}
for(int i=x-1;i>=0;i--){
if(chess[i][y]==chess[x][y]){
count++;
}else break;
}
if(count>=5){
return true;
}else return false;
}
//判断列
public boolean checkcolumn(int x,int y){
int count=1;
for(int i=y+1;i<chess.length;i++){
if(chess[x][i]==chess[x][y]){
count++;
}else break;
}
for(int i=y-1;i>=0;i--){
if(chess[x][i]==chess[x][y]){
count++;
}else break;
}
if(count>=5){
return true;
}else return false;
}
//判断右斜
public boolean checkright(int x,int y){
int count=1;
for(int i=x+1,j=y+1;i<chess.length&&j<chess.length;i++,j++){
if(chess[i][j]==chess[x][y]){
count++;
}else break;
}
for(int i=x-1,j=y-1;i>=0&&j>=0;i--,j--){
if(chess[i][j]==chess[x][y]){
count++;
}else break;
}
if(count>=5){
return true;
}else return false;
}
//判断左斜
public boolean checkleft(int x,int y){
int count=1;
for(int i=x+1,j=y-1;i<chess.length&&j>=0;i++,j--){
if(chess[i][j]==chess[x][y]){
count++;
}else break;
}
for(int i=x-1,j=y+1;i>=0&&j<chess.length;i--,j++){
if(chess[i][j]==chess[x][y]){
count++;
}else break;
}
if(count>=5){
return true;
}else return false;
}
}
在下棋的时候调用判断输赢的类
if(chess[x2][y2]==0){ //chess【】【】=0时表示此处没下过棋
if(count==0){ //count=0表示下黑棋
g.setColor(Color.black)
g.fillOval(Config.x0+Config.Size*x2-Config.Size/2,
Config.y0+Config.Size*y2-Config.Size/2, Config.Chess_Size,
Config.Chess_Size); //棋下在交点上
chess[x2][y2]=1;
if(win.check()){
javax.swing.JOptionPane.showMessageDialog(null,"黑棋赢了!!!");
}
count++;
}else if(count==1){
g.setColor(Color.white)
g.fillOval(Config.x0+Config.Size*x2-Config.Size/2,
Config.y0+Config.Size*y2-Config.Size/2, Config.Chess_Size,
Config.Chess_Size);
chess[x2][y2]=2;
if(win.check()){
java.swing.JOptionPane.showMessageDialog(null,"白棋赢了!!!");
}
count--;
}
人机对战:
思路:人下一颗棋子,电脑下一颗。而电脑下棋的位置与人下棋子的位置有关,所以考虑到在棋子周围加权值,是电脑下的棋在
权值最大的位置。
首先考虑防守:
定义一个数组用来存放权值。
int com[][]=new int[15][15];
public class defend(){
public Buju(int chess[][], int com[][],int coma[][], Graphics g) {
this.chess = chess;
this.com = com;
this.g = g;
this.coma=coma;
win=new Win(chess);
at=new Attrack(chess,coma,com,g);
}
然后下一颗棋子,就统计一次,根据棋子的布局(即相连的个数)来给它周围的点赋权值。
首先判断棋子相连情况(与判断输赢的方法相同)
// 统计行相连
public void row(int x, int y) {
int count = 1;
int i, j;
int a = 0; //a用来标记棋子周围是否有不同颜色的棋子
for (i = x + 1; i < chess.length; i++) {
if (chess[i][y] == chess[x][y]) {
count++;
} else if (chess[x][y] != chess[i][y] && chess[i][y] != 0) { // 棋子颜色不同且此处有棋子
a++;
break;
} else if (chess[i][y] != chess[x][y]) {
break;
}
}
for (j = x - 1; j > 0; j--) {
if (chess[j][y] == chess[x][y]) {
count++;
} else if (chess[x][y] != chess[j][y] && chess[j][y] != 0) {
a++;
break;
} else if (chess[j][y] != chess[x][y]) {
break;
}
}
com[i][y] = statement(a, count); //赋权值
com[j][y] = statement(a, count); //赋权值
}

// 统计列相连
public void column(int x, int y) {
int count = 1;
int i, j;
int a = 0;
for (i = y + 1; i < chess.length; i++) {
if (chess[x][i] == chess[x][y]) {
count++;
} else if (chess[x][y] != chess[x][i] && chess[x][i] != 0) { // 棋子颜色不同且此处有棋子
a++;
break;
} else if (chess[x][i] != chess[x][y]) {
break;
}
}
for (j = y - 1; j > 0; j--) {
if (chess[x][j] == chess[x][y]) {
count++;
} else if (chess[x][y] != chess[x][j] && chess[x][j] != 0) {
a++;
break;
} else if (chess[x][j] != chess[x][y]) {
break;
}
}
// 加权值
com[x][i] = statement(a, count); //赋权值
com[x][j] = statement(a, count); //赋权值

}

// 统计左斜
public void left(int x, int y) {
int count = 1;
int i, j, k, l;
int a = 0;
for (i = x + 1, j = y - 1; i < chess.length && j >= 0; i++, j--) {
if (chess[i][j] == chess[x][y]) {
count++;
} else if (chess[i][j] != chess[x][y] && chess[i][j] != 0) {
a++;
break;
} else
break;
}
for (k = x - 1, l = y + 1; k >= 0 && l < chess.length; k--, l++) {
if (chess[k][l] == chess[x][y]) {
count++;
} else if (chess[k][l] != chess[x][y] && chess[k][l] != 0) {
a++;
break;
} else
break;
}
com[i][j] = statement(a, count); //赋权值
com[k][l] = statement(a, count); //赋权值
}

public void right(int x, int y) {
int count = 1;
int i, j, k, l;
int a = 0;
for (i = x + 1, j = y + 1; i < chess.length && j < chess.length; i++, j++) {
if (chess[i][j] == chess[x][y]) {
count++;
} else if (chess[i][j] != chess[x][y] && chess[i][j] != 0) {
a++;
break;
} else
break;
}
for (k = x - 1, l = y - 1; k >= 0 && l >= 0; k--, l--) {
if (chess[k][l] == chess[x][y]) {
count++;
} else if (chess[k][l] != chess[x][y] && chess[k][l] != 0) {
a++;
break;
} else
break;
}

com[i][j] = statement(a, count); //赋权值
com[k][l] = statement(a, count); //赋权值
}
根据a和state的值来给棋子赋权值
//返回权值
private int statement(int a, int count) {
if (a == 0 && count == 1) {
return 30;
} else if (a == 1 && count == 1) {
return 10;
} else if (a == 0 && count == 2) {
return 50;
} else if (a == 1 && count == 2) {
return 25;
} else if (a == 0 && count == 3) {
return 100;
} else if (a == 1 && count == 3) {
return 40;
} else if (a == 0 && count == 4) {
return 500;
} else if (a == 1 && count == 4) {
return 500;
}
return 0;
}
赋完权值后,遍历整个棋盘,将电脑要下棋子的位置设为最大权值的位置
// 得到最大权值
public int Countmax(int x, int y) {
int max;
row(x, y);
column(x, y);
left(x, y);
right(x, y);
max = com[0][0];
for (int i = 0; i < com.length; i++) { //在数组中找最大权值
for (int j = 0; j < com[i].length; j++) {
if (max < com[i][j]&&chess[i][j]==0) {
max = com[i][j];
}
}
}
return max;
}
输出下完棋子后的二维数组
public void printcom(){
for(int i=0;i<com.length;i++){
for(int j=0;j<com[i].length;j++){
System.out.print(com[i]+"\t");
}
System.out.println("");
}
System.out.println("*********************************");
}
电脑下棋的方法:
public void printchess(int x,int y,Graphics g){
//调用Countmax方法,找出二维数组中权值最大的点
int count =Countmax(x,y,g);
for(int i=0;i<com.length;i++){
for(int j=0;j<com[i].length;j++){
if(count==com[i][j]&&chess[i][j]==0){
g.setColor(Color.white);
g.fillOval(i*Config.Size+Config.x0-Config.Size/2,
j*Config.Size+Config.y0-Config.Size/2,
Config.Chess_Size, Config.Chess_Size);
chess[i][j]=2;
if(win.check(i,j)){
java.swing.JOptionPane.showMessageDialog(null,"白棋赢了!!!");
}

return 0;
}
}
}
return 0;
}
}
电脑进攻:
public void printchess(int x,int y,Graphics g){
//调用Countmax方法,找出二维数组中权值最大的点
int count =Countmax(x,y,g);
for(int i=0;i<com.length;i++){
for(int j=0;j<com[i].length;j++){
if(count==com[i][j]&&chess[i][j]==0){
g.setColor(Color.white);
g.fillOval(i*Config.Size+Config.x0-Config.Size/2,
j*Config.Size+Config.y0-Config.Size/2,
Config.Chess_Size, Config.Chess_Size);
chess[i][j]=2;
Countmax(i,j); //人下完棋后马上给电脑下棋位置的周围赋权值
if(win.check(i,j)){
java.swing.JOptionPane.showMessageDialog(null,"白棋赢了!!!");
}

return 0;
}
}
}
return 0;
}
}
进攻和防守的权值放在一个数组中保存,便于比较,哪个权值大,电脑下在哪,但进攻和防守的权值相同,不便于使电脑下棋偏于进攻或防守。
基本的五子棋完成,目前的五子棋还是最基本的,还有待优化。





分享到:
评论

相关推荐

    五子棋社团工作计划总结总结.doc

    【五子棋社团工作计划与总结】文档主要涵盖了五子棋社团的工作计划和活动总结,旨在通过五子棋这项活动来提升学生的综合素质,包括智力、情操和团队合作能力等。 1. **指导思想**: 五子棋作为一门校本课程,旨在...

    【毕业设计】MATLAB实战应用案例小游戏(附MATLAB代码):围五子棋.zip

    《MATLAB实战应用案例:围五子棋游戏》 MATLAB,全称为“Matrix Laboratory”,是一种功能强大的数学计算软件,广泛应用于科学计算、数据分析、算法开发以及图形化界面设计等领域。在毕业设计中,MATLAB常常被学生...

    java_五子棋 实习报告

    【Java五子棋实习报告】主要探讨了使用Java编程语言设计和实现五子棋游戏的过程,包括人机对战和玩家间的联网对战功能。在报告中,作者详细阐述了五子棋游戏的背景和历史,以及选择Java作为开发语言的原因。Java因其...

    matlab-wuziqi.rar_matlab五子棋gui_五子棋_五子棋matlab_五子棋matlan_五子棋算法

    总结来说,这个项目提供了一个用MATLAB实现的五子棋游戏,其中的核心是五子棋的算法,包括棋盘状态的管理、合法落子的判断以及胜负的自动检测。通过GUI,用户可以直观地进行游戏,体验到与计算机或其他玩家的对弈。...

    Java五子棋设计报告.doc

    【Java五子棋游戏设计与实现】 五子棋游戏,源于中国古代,历史悠久,深受各年龄段玩家喜爱。在当今计算机普及的时代,将这种经典棋类游戏搬到电脑屏幕上,既能满足人们的娱乐需求,又能锻炼思维能力。本项目是晓庄...

    网络五子棋设计报告

    五子棋与其他三大棋类(围棋、中国象棋、国际象棋)的主要区别在于它没有“吃子”的概念,而是强调通过连续放置己方棋子以形成特定的排列来获胜,这种机制使得五子棋更加侧重于发展与限制的策略思想。 #### 算法...

    C语言五子棋实验报告.docx

    总结来说,这份实验报告详细阐述了一个C语言实现的五子棋游戏,涉及了图形界面开发、人机对战的AI算法实现,以及游戏设计的基本流程。通过这样的课程设计,学生不仅能深入理解C语言,还能接触到游戏编程领域的前沿...

    基于L inux的嵌入式五子棋游戏_ 6818开 发板五子棋,基于linux

    在本项目中,我们关注的是一个基于Linux的嵌入式五子棋游戏,它特别针对6818开发板设计。这个项目的核心是利用Linux操作系统的能力,在嵌入式硬件平台上实现一个可玩的五子棋游戏,允许玩家与计算机进行对弈。下面将...

    五子棋实训报告(c语言)

    本文档是关于大学本科课程实训的一个项目,是用c语言写的一个关于五子棋的实训报告,并且可视化

    MFC 五子棋 一个简单的五子棋游戏

    总结来说,这个基于MFC的五子棋游戏集成了基础的数据结构设计、高效的计算机对弈算法以及严谨的胜负判断机制,为玩家提供了一个良好的对战环境。通过深入理解这些核心内容,我们可以进一步改进游戏,例如引入更智能...

    模拟连五子棋游戏,五子棋经典算法

    总结,模拟五子棋游戏的开发涵盖了数据结构(如二维数组)、基础算法(如合法落子判断、Minimax和Alpha-Beta剪枝)、高级算法(如神经网络强化学习)以及用户界面设计等多个方面。通过这样的项目实践,开发者不仅能...

    五子棋grid布局五子棋

    总结来说,"五子棋grid布局五子棋"是一个结合HTML5、CSS和JavaScript技术的项目,通过HTML构建页面结构,CSS Grid实现棋盘布局,JavaScript处理游戏逻辑和用户交互。这种技术栈的运用展示了现代Web开发中静态页面的...

    python课程设计完整 五子棋

    在本项目中,"python课程设计完整 五子棋"是一个使用Python编程语言实现的五子棋游戏。这个课程设计旨在帮助学生掌握Python的基础知识,理解面向对象编程的概念,并通过实际项目来提升编程技巧和问题解决能力。以下...

    C#五子棋游戏示例

    总结来说,《C#五子棋游戏示例》展示了C#在游戏开发中的应用,涵盖了数据结构、算法、图形界面设计、用户交互和资源管理等多个重要领域。通过学习和分析这个项目,开发者可以加深对C#编程的理解,并提升在游戏开发...

    五子棋(网页版)

    总结,这个五子棋网页版项目不仅展示了JavaScript在游戏开发中的应用,也体现了开发者在HTML、CSS、逻辑设计以及性能优化方面的技能。通过学习这样的项目,我们可以深入了解网页游戏的开发流程,并掌握相关技术。

    vb五子棋_VB五子棋_源码

    总结来说,VB五子棋项目是一个很好的学习实践,它涵盖了基础的GUI编程、事件处理、数据结构、算法设计以及简单的游戏逻辑。对于初学者而言,这个项目可以帮助理解VB编程的基本概念,同时也能锻炼到问题解决和算法...

    Java五子棋设计报告.pdf

    从提供的文件内容来看,这是一个关于Java五子棋游戏设计的报告,内容中涉及了游戏的多个关键技术和实现细节。由于文档内容不完整且存在一些扫描错误,以下知识点将基于文档中可辨识的信息进行整理。 1. MVC设计模式...

    基于JAVA的升级版五子棋项目总结(PPT版)

    【标题】基于JAVA的升级版五子棋项目总结(PPT版) 在Java编程领域,五子棋项目是一个常见的教学实例,它可以帮助开发者巩固基础知识,理解面向对象编程、图形用户界面设计以及游戏逻辑的实现。这个升级版的五子棋...

    基于FPGA的五子棋算法

    **总结** 此项目提升了团队合作、FPGA 工程设计和时间管理的能力。在实践中,通过查阅资料、合作和请教老师,加深了对 Verilog 语言的理解,熟练掌握了工程软件的使用。实践证明,理论知识只有在实际应用中才能真正...

    五子棋AI python实现

    使用python写的基于两层博弈树的五子棋AI。加入了阿尔法贝塔剪枝。 python版本:3+,应该可以在命令行里直接跑。 电脑执黑,玩家执白。无禁手。 因为只有两层博弈树,请大家不要嫌他菜哈哈哈,仅供大家学习参考。 ...

Global site tag (gtag.js) - Google Analytics