java五子棋游戏源码.docx_第1页
java五子棋游戏源码.docx_第2页
java五子棋游戏源码.docx_第3页
java五子棋游戏源码.docx_第4页
java五子棋游戏源码.docx_第5页
已阅读5页,还剩6页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

这款五子棋小游戏是我五六年前在培训学习JAVA的时候花了一整个下午时间即兴写出来的,功能很简单,实现了五子棋的电脑对战,主要就是为了研究下电脑下棋算法,所以其他的功能和细节都没考虑,比如电脑最后的落子点我是直接用图片标示出来的,最好是另建一个线程来闪烁最后落子点,还有智能等级也是可以调节的,偏重于防守和进攻都可以修改代码中权值的设定来实现的,有兴趣的朋友可以在此基础上扩展一下。因为没有写谁先下棋的功能,可以模拟下电脑先下子,只需要你在边角上先下一子就可以了,相比下来,电脑先下的话,电脑赢的几率更大点,一共用到了三张图片,都在附件中。下面是全部的代码,写了一些注释,希望能对你阅读代码起到一点帮助import java.awt.*;import java.awt.event.*;import .URL;import javax.swing.*;public class GobangGame public static void main(String args) GameF game = new GameF(); game.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); game.show(); class GameF extends JFrame public GameF() Container contentPane = getContentPane(); final Panel panel = new Panel(); panel.setBackground(new Color(255, 182, 147); contentPane.setBackground(new Color(255, 182, 147); contentPane.add(panel); setSize(560, 560); setTitle(杨雷的五子棋游戏 版本1.0); setResizable(false); panel.setCursor(new Cursor(Cursor.HAND_CURSOR); JMenuBar menuBar=new JMenuBar(); JMenu menu=new JMenu(选项); JMenuItem menuStart=new JMenuItem(开始游戏); menuStart.addActionListener(new ActionListener() public void actionPerformed(ActionEvent e) panel.ResetGame(); panel.repaint(); ); JMenuItem menuExit =new JMenuItem(退出); menuExit.addActionListener(new ActionListener() public void actionPerformed(ActionEvent e) System.exit(0); ); menuBar.add(menu); menu.add(menuStart); menu.add(menuExit); this.setJMenuBar(menuBar); class Panel extends JPanel private URL blackImgURL = GobangGame.class.getResource(black.gif);private ImageIcon black=new ImageIcon(blackImgURL);private URL whiteImgURL = GobangGame.class.getResource(white.gif);private ImageIcon white=new ImageIcon(whiteImgURL);private URL currentImgURL = GobangGame.class.getResource(current.gif);private ImageIcon current=new ImageIcon(currentImgURL);private int i, j, k, m, n, icount;private int board = new int 1616;private boolean ptable = new boolean1616672;private boolean ctable = new boolean1616672;private int cgrades = new int1616;private int pgrades = new int1616;private int cgrade,pgrade;private int win = new int2672;private int oldx,oldy;private int bout=1;private int pcount,ccount;private boolean player,computer,over,pwin,cwin,tie,start;private int mat,nat,mde,nde;public Panel() addMouseListener(new Xiazi(); this.ResetGame(); public void paintComponent(Graphics g) super.paintComponent(g); for (int i = 0; i 16; i+) for (int j = 0; j 16; j+) g.drawLine(50, 50 + j * 30, 500, 50 + j * 30); for (int i = 0; i 16; i+) for (int j = 0; j 16; j+) g.drawLine(50 + j * 30, 50, 50 + j * 30, 500); for (int i = 0; i 16; i+) String number = Integer.toString(i); g.drawString(number, 46 + 30 * i, 45); for (int i = 1; i 16; i+) String number = Integer.toString(i); g.drawString(number, 33, 53 + 30 * i); updatePaint(g); class Xiazi extends MouseAdapter public void mouseClicked(MouseEvent e) if(!over) oldx = e.getX(); oldy = e.getY(); mouseClick(); repaint(); / 游戏初始化 public void ResetGame() /初始化棋盘for(i=0;i16;i+)for(j=0;j16;j+)this.pgradesij = 0;this.cgradesij = 0;this.boardij = 2;/遍历所有的五连子可能情况的权值/横for(i=0;i16;i+)for(j=0;j12;j+)for(k=0;k5;k+)this.ptablej+kiicount = true;this.ctablej+kiicount = true;icount+;/竖for(i=0;i16;i+)for(j=0;j12;j+)for(k=0;k5;k+)this.ptableij+kicount = true;this.ctableij+kicount = true;icount+;/右斜for(i=0;i12;i+)for(j=0;j12;j+)for(k=0;k5;k+)this.ptablej+ki+kicount = true;this.ctablej+ki+kicount = true;icount+;/左斜for(i=0;i=4;j-)for(k=0;k5;k+)this.ptablej-ki+kicount = true;this.ctablej-ki+kicount = true;icount+;for(i=0;i=1;i+) /初始化黑子白子上的每个权值上的连子数for(j=0;j672;j+)this.winij = 0; this.player = true;this.icount = 0;this.ccount = 0;this.pcount = 0;this.start = true;this.over = false;this.pwin = false;this.cwin = false;this.tie = false;this.bout=1; public void ComTurn() /找出电脑(白子)最佳落子点 for(i=0;i=15;i+) /遍历棋盘上的所有坐标for(j=0;j=15;j+) this.pgradesij=0; /该坐标的黑子奖励积分清零if(this.boardij = 2) /在还没下棋子的地方遍历for(k=0;k672;k+) /遍历该棋盘可落子点上的黑子所有权值的连子情况,并给该落子点加上相应奖励分if(this.ptableijk)switch(this.win0k) case 1: /一连子this.pgradesij+=5;break;case 2: /两连子this.pgradesij+=50;break;case 3: /三连子this.pgradesij+=180;break;case 4: /四连子this.pgradesij+=400;break;this.cgradesij=0;/该坐标的白子的奖励积分清零if(this.boardij = 2) /在还没下棋子的地方遍历for(k=0;k672;k+) /遍历该棋盘可落子点上的白子所有权值的连子情况,并给该落子点加上相应奖励分if(this.ctableijk)switch(this.win1k) case 1: /一连子this.cgradesij+=5;break;case 2: /两连子this.cgradesij+=52;break;case 3: /三连子this.cgradesij+=100;break;case 4: /四连子this.cgradesij+=400;break;if(this.start) /开始时白子落子坐标if(this.board44=2)m = 4;n = 4;elsem = 5;n = 5;this.start = false;elsefor(i=0;i16;i+)for(j=0;j=this.cgrade)this.cgrade = this.cgradesij; this.mat = i;this.nat = j;if(this.pgradesij=this.pgrade)this.pgrade = this.pgradesij; this.mde = i;this.nde = j;if(this.cgrade=this.pgrade) /如果白子的最佳落子点的权值比黑子的最佳落子点权值大,则电脑的最佳落子点为白子的最佳落子点,否则相反m = mat;n = nat;elsem = mde;n = nde;this.cgrade = 0;this.pgrade = 0;this.boardmn = 1; /电脑下子位置 ccount+;if(ccount = 50) & (pcount = 50) /平局判断this.tie = true;this.over = true;for(i=0;i672;i+)if(this.ctablemni & this.win1i != 7)this.win1i+; /给白子的所有五连子可能的加载当前连子数if(this.ptablemni)this.ptablemni = false;this.win0i=7;this.player = true; /该人落子puter = false; /电脑落子结束 public void mouseClick() if(!this.over)if(this.player)if(this.oldx520 & this.oldy520) int m1=m,n1=n; m = (oldx-33)/30;n = (oldy-33)/30; if(this.boardmn = 2) this.bout+;this.boardmn = 0;pcount+;if(ccount = 50) & (pcount = 50)this.tie = true;this.over = true;for(i=0;i672;i+)if(this.ptablemni & this.win0i != 7)this.win0i+; /给黑子的所有五连子可能的加载当前连子数if(this.ctablemni)this.ctablemni = false;this.win1i=7;this.player = false; puter = true;else m=m1;n=n1; public void updatePaint(Graphics g) if(!this.over) /如果是轮到电脑下 if(puter)this.ComTurn(); /得到最佳下子点 /遍历当前棋盘上的五连子情况,判断输赢for(i=0;i=1;i+)for(j=0;j672;j+) if(this.winij = 5)if(i=0) /人赢this.pwin = true;this.over = true; /游戏结束break;elsethis.cwin = true; /电脑赢this.over = true;break;if(this.over) /一遇到五连子退出棋盘遍历break; g.setFont(new Font(华文行楷,0,20); g.setColor(Color.RED);/画出当前棋盘所有棋子for(i=0;i=15;i+)for(j=0;j=15;j+) /如果board元素值为0,则该坐标处为黑子if(this.boardij = 0) g.drawImage(black.getImage(),i*30+31,j*30+31,black.getImage().getWidth(black.getImageObserver()-3,black.getImage().getHeight(black.getImage

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论