其实这篇学习总结应该早就要写的,但是对技术博客确实把握的不到位,总觉得语言不够生动,表达也略显牵强,除了贴几行代码,中间的技术点就透漏的不太多了,经过一个多月的沉沦之后,这篇本来要被毙掉的心得又被我拿出来炒一炒剩饭了。(源代码已在下面分享)

老师曾说过,学习还真的不是越学越进步的,现在回头想想,之前所熟练的知识现在还真的慢慢的生疏起来了,我们在公司学习了如何制作java五子棋,经过反反复复的锤磨打炼,我也算是好汉一条了,但是之前由于不够自信就一直在找借口不给自己寻找问题,就像老师说的,我们看到身边有越来越多的牛人,相反我们却变得更加懒惰了。

这个问题是我女朋友留给我的,我在去公司学习了不到一个月java的时间里,就大言不谗的答应她:“寒假我写个游戏给你玩。”新手都是这样的,我们在成长的过程中,最奇怪的事情就是,明明比以前要厉害了,胆子却越来越小了,只有小时候是什么都不怕的。作为一个新手,刚写了一个登陆界面就说自己要写一个QQ程序,路漫漫其修远兮,绝知此事要躬行(PS:这句话是出自两首诗哦)。

刚一开始也没有什么想法,看了下书上有一章介绍连连看的,心里想着,女生一般都比较喜欢玩连连看(我曾经就与她一起在网吧玩了两个多小时的连连看),心里不经的也乐了一下,不过在那天玩五子棋的时候,突然间想起了很小的时候在妈妈手机上玩的一款游戏,依稀的还记得名字好像是,没错,是黑白棋,在百度上面一搜索,还真的有,下面百科一下。

黑白棋,又叫Othello棋,反棋(Reversi)、苹果棋或翻转棋,借用莎士比亚名剧奥赛罗为其重命名。

下子的方法:

把自己颜色的棋子放在空格上,当上下左右或者斜方向上有一个自己的棋子时,夹在中间的棋子都会翻转变成自己的棋子,并且,只有可以翻转的地方才能下棋子。

棋盘如图所示:

起初觉得这游戏跟五子棋应该差不了多少,反正都是黑白色的,熟不知,同样的包装下,却是不一样的内核,就像你去商店买一个蛋黄派,包装上面明明说好了两个的,结果打开一看,却有四个。好的,闲话就不扯这么多了,下面分享一下人人对战的代码,由于是专门为女朋友准备的,所以界面也做了很大的改革哦,代码有点长,解释我尽量的添加详细了,中间被注释掉的内容是当初建模的时候用的,大家有兴趣的慢慢的看一下吧,如有错误,还请指点:

以下是界面类:

import java.awt.Dimension;
import java.awt.Font;
import java.awt.Graphics;
import java.awt.GridLayout;
import java.awt.Image;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;import javax.swing.ImageIcon;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
@SuppressWarnings("serial")
public class Chess extends JFrame {public static void main(String args[]){Chess ch=new Chess();ch.showframe();}//显示游戏界面public void showframe(){//--------------------游戏界面----------------------JPanel gamejp=new JPanel();//--------------------组件界面----------------------JPanel buttonjp=new JPanel();//按钮图标ImageIcon ali=new ImageIcon("image/阿狸.jpg");ImageIcon taozi=new ImageIcon("image/桃子.jpg");ImageIcon ali1=new ImageIcon("image/阿狸1.jpg");ImageIcon taozi1=new ImageIcon("image/桃子1.jpg");JButton alibu=new JButton(ali);JButton taozibu=new JButton(taozi);alibu.setRolloverIcon(ali1);taozibu.setRolloverIcon(taozi1);alibu.setPressedIcon(ali1);taozibu.setPressedIcon(taozi1);Dimension di=new Dimension(100,100);alibu.setPreferredSize(di);taozibu.setPreferredSize(di);//-----------------------当前下棋的人---------------------final JLabel jilu=new JLabel("  阿狸下  ");//设置字体Font jilufont=new Font("黑体",Font.BOLD,30);jilu.setFont(jilufont);//用来记录阿狸与桃子的数目final JLabel alila=new JLabel("2");final JLabel taozila=new JLabel("2");//设置Label的字体和大小Font font=new Font("宋体",Font.BOLD,42);alila.setFont(font);taozila.setFont(font);//-----------------重新开局的方法------------------ImageIcon img=new ImageIcon("image/restart.jpg");JButton bu=new JButton(img);bu.setPreferredSize(new Dimension(100,40));buttonjp.add(jilu);buttonjp.add(alibu);buttonjp.add(alila);buttonjp.add(taozibu);buttonjp.add(taozila);buttonjp.add(bu);this.setLayout(new GridLayout(1,2,600,0));this.add(gamejp);this.add(buttonjp);this.setTitle("阿狸&桃子");this.setSize(1000,650);this.setResizable(false);this.setLocationRelativeTo(null);this.setDefaultCloseOperation(3);//显示窗口this.setVisible(true);//获取画布权限Graphics g=this.getGraphics();chess[3][3]=1;chess[4][4]=1;chess[3][4]=-1;chess[4][3]=-1;ChessListener lis=new ChessListener(g,this,jilu,alila,taozila);this.addMouseListener(lis);//按钮监听器----------------重新开始ActionListener bulis=new ActionListener(){public void actionPerformed(ActionEvent e){clear();//重绘的方法repaint();//绘制初始的四个图片chess[3][3]=1;chess[4][4]=1;chess[3][4]=-1;chess[4][3]=-1;//将状态改为初始状态ChessListener.stata=1;jilu.setText("  阿狸下  ");alila.setText("2");taozila.setText("2");}};//如果点击阿狸则阿狸下ActionListener alilis=new ActionListener(){public void actionPerformed(ActionEvent e){ChessListener.stata=1;jilu.setText("  阿狸下  ");}};//如果点击桃子则桃子下ActionListener taozilis=new ActionListener(){public void actionPerformed(ActionEvent e){ChessListener.stata=-1;jilu.setText("  桃子下  ");}};alibu.addActionListener(alilis);taozibu.addActionListener(taozilis);bu.addActionListener(bulis);}/*** 清空棋盘的方法*/public void clear(){for(int i=0;i<chess.length;i++){for(int j=0;j<chess[i].length;j++){chess[i][j]=0;}}}/*** 重写父类的paint方法*/public void paint(Graphics g){super.paint(g);Image back=new ImageIcon("image/棋盘.jpg").getImage();g.drawImage(back, 10,30,800,600, null);//重绘棋盘//划横线
//      for(int i=0;i<rows;i++){
//          g.setColor(Color.BLUE);
//          g.drawLine(x,y+i*size,x+size*(rows-1,y+i*size);
//      }
//      //划竖线
//      for(int j=0;j<cols;j++){
//          g.setColor(Color.BLUE);
//          g.drawLine(x+j*size,y,x+j*size,y+size*(cols-1));
//      }//绘制棋子for(int i=0;i<rows-1;i++){for(int j=0;j<cols-1;j++){int X=x+size/2+size*i;//棋子的横坐标int Y=y+size/2+size*j;//棋子的纵坐标if(chess[i][j]==1){//画黑棋Image b=new ImageIcon("image/ali.jpg").getImage();g.drawImage(b, X-Chess_size/2, Y-Chess_size/2, Chess_size, Chess_size, null);//g.fillOval(X-size/2,Y-size/2,Chess_size,Chess_size);}else if(chess[i][j]==-1){//画白棋Image w=new ImageIcon("image/taozi.jpg").getImage();g.drawImage(w, X-Chess_size/2, Y-Chess_size/2, Chess_size, Chess_size, null);//g.fillOval(X-size/2,Y-size/2,Chess_size,Chess_size);}}}}public final static int x=79;    //棋盘初始点横坐标public final static int y=83;    //棋盘初始点纵坐标public final static int rows=9;  //棋盘行数public final static int cols=9;  //棋盘列数public final static int size=61;//棋盘格子大小public final static int Chess_size=56;//棋子大小public final static int chess[][]=new int[rows-1][cols-1];//定义一个8*8的数组,用来保存棋子
}

下面监听类,主要方法都在这里面:

import java.awt.Graphics;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;import javax.swing.JLabel;
import javax.swing.JOptionPane;public class ChessListener extends MouseAdapter{private Graphics g;        //将画布对象传过来private int xiafa;         //记录当前棋子的下法public  static int stata=1;//判断下黑棋还是白棋(黑棋阿狸,白棋桃子)private int x1,y1;         //记录点击处的横坐标和纵坐标private JLabel jilu;       //当前下棋子的人private JLabel alila;      //阿狸棋子数private JLabel taozila;    //桃子棋子数private Chess ch;          //用来刷新棋盘private int   te=0;        //特殊情况private int   change;      //记录改变的棋子数目public ChessListener(Graphics g,Chess ch,JLabel jilu,JLabel alila,JLabel taozila){this.g=g;this.ch=ch;this.jilu=jilu;this.alila=alila;this.taozila=taozila;}//点击下棋子public void mouseClicked(MouseEvent e){int a=1;          //记录所下的子String s = null;       x1=e.getX();y1=e.getY();for(int i=0;i<Chess.rows-1;i++){for(int j=0;j<Chess.cols-1;j++){int x2=Chess.x+Chess.size/2+Chess.size*i;//得到棋盘中棋子所在点的横坐标int y2=Chess.y+Chess.size/2+Chess.size*j;//得到棋盘中棋子所在点的纵坐标//将棋子下在棋盘格子的正中央if(Math.abs(x1-x2)<Chess.size/3&&Math.abs(y1-y2)<Chess.size/3){if(Chess.chess[i][j]==0){if(stata==1){//Image b=new ImageIcon("image/ali.jpg").getImage();//g.drawImage(b, x2-Chess.Chess_size/2, y2-Chess.Chess_size/2, Chess.Chess_size, Chess.Chess_size, null);//g.setColor(Color.BLACK);stata=-1;}else if(stata==-1){//Image w=new ImageIcon("image/ali.jpg").getImage();//g.drawImage(w, x2-Chess.Chess_size/2, y2-Chess.Chess_size/2, Chess.Chess_size, Chess.Chess_size, null);//g.setColor(Color.WHITE);stata=1;}Chess.chess[i][j]=-stata;//将棋子存入棋盘//g.fillOval(x2-Chess.size/2, y2-Chess.size/2, Chess.Chess_size, Chess.Chess_size);//--------------如果8个方向都不能改变棋子则不改变棋盘状态--------------if (hengYou(i, j) == null && hengZuo(i, j) == null&& hengShang(i, j) == null&& hengXia(i, j) == null&& xieyouS(i, j) == null&& xieyouX(i, j) == null&& xiezuoS(i, j) == null&& xiezuoX(i, j) == null){Chess.chess[i][j]=0;if(stata==1){stata=-1;}else if(stata==-1){stata=1;}//刷新棋盘ch.update(g);JOptionPane.showMessageDialog(null, "不能放子");}else{// 改变中间子颜色hengYou1(i, j);hengZuo1(i, j);hengShang1(i, j);hengXia1(i, j);xieyou1(i, j);xieyou2(i, j);xiezuo1(i, j);xiezuo2(i, j);// 以坐标为圆心画圆//g.fillOval(x2-Chess.size/2, y2-Chess.size/2, Chess.Chess_size, Chess.Chess_size);//g.setColor(Color.BLACK);ch.update(g);//改变棋子记录框里面的数字alila.setText(judge()[0]+"");taozila.setText(judge()[1]+"");System.out.println("改变了"+change+"个子");change=0;//判断当前下棋的人if(stata==1){jilu.setText("  阿狸下  ");a=1;s="阿狸";}else if(stata==-1){jilu.setText("  桃子下  ");a=-1;s="桃子";}xiafa=Check(a);//输出当前下棋的人还有几种下法System.out.println(s+"有"+xiafa+"种下法");if(xiafa==0&&full()==false){//如果不能下子并且棋盘未满te++;JOptionPane.showMessageDialog(null, s+"不能下子,跳过!");if(stata==1){//如果阿狸不能下子则跳过,桃子下stata=-1;jilu.setText("  桃子下  ");a=-1;s="桃子";}else if(stata==-1){//如果桃子不能下子则跳过,阿狸下stata=1;jilu.setText("  阿狸下  ");a=1;s="阿狸";}xiafa=Check(a);System.out.println(s+"有"+xiafa+"种下法");if(xiafa==0){te++;//如果无子可下,则特殊情况记录加1}else te=0;}//----------------胜负判断----------------if(judge()[0]==0){//如果阿狸没子了则桃子获胜JOptionPane.showMessageDialog(null,"游戏结束,桃子获胜");}else if(judge()[1]==0){//如果桃子没子了则阿狸获胜JOptionPane.showMessageDialog(null, "游戏结束,阿狸获胜");}if(full()){if(judge()[0]>judge()[1]){//如果阿狸的子较多,则阿狸获胜JOptionPane.showMessageDialog(null, "游戏结束,阿狸获胜");}else if(judge()[0]<judge()[1]){//如果桃子的子较多,则桃子获胜JOptionPane.showMessageDialog(null, "游戏结束,桃子获胜");}else if(judge()[0]==judge()[1]){JOptionPane.showMessageDialog(null, "平局");}}}return;}}}}}/*** 判断输赢的方法,如果黑棋多则黑棋获胜,否则白棋获胜* @return 黑棋和白棋的数目*/public int[] judge(){int count[]=new int[2];for(int i=0;i<Chess.rows-1;i++){for(int j=0;j<Chess.cols-1;j++){if(Chess.chess[i][j]==1){count[0]++;}else if(Chess.chess[i][j]==-1){count[1]++;}}}return count;}/*** 判断棋盘是否已满的方法*/public boolean full(){if(te==2){        //如果双方都不能下子,则游戏结束return true;}else{for(int i=0;i<Chess.rows-1;i++){for(int j=0;j<Chess.cols-1;j++){//如果有一个地方是空的则返回falseif(Chess.chess[i][j]==0){return false;}}}}return true;}/*** 判断当前棋子的下法还有多少种* @param return 返回下法的总数 */public int Check(int a){int n=0;for(int i=0;i<Chess.chess.length;i++){for(int j=0;j<Chess.chess[i].length;j++){if(Chess.chess[i][j]!=0){continue;}else{Chess.chess[i][j]=a;if(hengYou(i, j) != null || hengZuo(i, j) != null|| hengShang(i, j) != null || hengXia(i, j) != null|| xieyouS(i, j)   != null || xieyouX(i, j) != null|| xiezuoS(i, j)   != null || xiezuoX(i, j) != null){Chess.chess[i][j]=0;n++;              //如果有一个地方可以下子,则n+1}else{Chess.chess[i][j]=0;}}}}return n;}/*********************************************** 检测相同颜色 *******************************//*** 改变两棋子之间的棋子的颜色——直线*/public void paintChess(int r1, int c1, int r2, int c2) {// 横向if (c1 == c2) {for (int k = Math.min(r1, r2) + 1; k < Math.max(r1, r2); k++) {Chess.chess[k][c1] = Chess.chess[r1][c1];change++;}}// 纵向if (r1 == r2) {for (int k = Math.min(c1, c2) + 1; k < Math.max(c1, c2); k++) {Chess.chess[r1][k] = Chess.chess[r1][c1];change++;}}}/*** 改变两棋子之间的棋子的颜色——斜线——右上*/public void paintChess1(int r1, int c1, int r2, int c2) {for (int k = Math.min(r1, r2) + 1, v = Math.max(c1, c2) - 1; k < Math.max(r1, r2); k++, v--) {Chess.chess[k][v] = Chess.chess[r1][c1];change++;}}/*** 改变两棋子之间的棋子的颜色——斜线——右下*/public void paintChess2(int r1, int c1, int r2, int c2) {for (int k = Math.min(r1, r2) + 1, v = Math.min(c1, c2) + 1; k < Math.max(r1, r2); k++, v++) {Chess.chess[k][v] = Chess.chess[r1][c1];change++;}}/*** 改变两棋子之间的棋子的颜色——斜线——左上*/public void paintChess3(int r1, int c1, int r2, int c2) {for (int k = Math.max(r1, r2) - 1, v = Math.max(c1, c2) - 1; k > Math.min(r1, r2); k--, v--) {Chess.chess[k][v] = Chess.chess[r1][c1];change++;}}/*** 改变两棋子之间的棋子的颜色——斜线——左下*/public void paintChess4(int r1, int c1, int r2, int c2) {for (int k = Math.min(r1, r2) + 1, v = Math.max(c1, c2) - 1; k <= Math.max(r1, r2); k++, v--) {Chess.chess[k][v] = Chess.chess[r1][c1];change++;}}/*** 向右检测是否有相同颜色棋子,如果有且不相邻,改变中间棋子颜色,否则返回NULL* @param x* @param y* @return*/public int[] hengYou(int x, int y) {int r = -2;int i;// 向右for (i = x + 1; i < Chess.rows-1; i++) {if (Chess.chess[i][y] != 1 && Chess.chess[i][y] != -1) {break;}if (Chess.chess[i][y] == Chess.chess[x][y]) {r = i;break;}}if (r != -2 && Chess.chess[x + 1][y] != Chess.chess[i][y]) {return new int[] { r, y };} else {// System.out.println("向右不能");return null;}}/*** 向左检测是否有相同颜色棋子,如果有且不相邻,改变中间棋子颜色,否则返回NULL*/public int[] hengZuo(int x, int y) {int r = -2;int i;// 向左for (i = x - 1; i >= 0; i--) {if (Chess.chess[i][y] != 1 && Chess.chess[i][y] != -1) {break;}if (Chess.chess[i][y] == Chess.chess[x][y]) {r = i;break;}}if (r != -2 && Chess.chess[x - 1][y] != Chess.chess[i][y]) {return new int[] { r, y };} else {// System.out.println("向左不能");return null;}}/*** 向上检测是否有相同颜色棋子,如果有且不相邻,改变中间棋子颜色,否则返回NULL*/public int[] hengShang(int x, int y) {int r = -2;int i;// 向上for (i = y - 1; i >= 0; i--) {if (Chess.chess[x][i] == 0) {break;}if (Chess.chess[x][i] == Chess.chess[x][y]) {r = i;break;}}if (r != -2 && Chess.chess[x][y - 1] != Chess.chess[x][i]) {return new int[] { x, r };} else {// System.out.println("向上不能");return null;}}/*** 向上检测是否有相同颜色棋子,如果有且不相邻,改变中间棋子颜色,否则返回NULL*/public int[] hengShang1(int x, int y) {int r = -2;int i;// 向上for (i = y - 1; i >= 0; i--) {if (Chess.chess[x][i] == 0) {break;}if (Chess.chess[x][i] == Chess.chess[x][y]) {r = i;break;}}if (r != -2 && Chess.chess[x][y - 1] != Chess.chess[x][i]) {// 改变中间的子paintChess(x, y, x, r);return new int[] { x, r };} else {return null;}}/*** 向下检测是否有相同颜色棋子,如果有且不相邻,改变中间棋子颜色,否则返回NULL*/public int[] hengXia(int x, int y) {int r = -2;int i;// 向下for (i = y + 1; i < Chess.rows-1; i++) {if (Chess.chess[x][i] == 0) {break;}if (Chess.chess[x][i] == Chess.chess[x][y]) {r = i;break;}}if (r != -2 && Chess.chess[x][y + 1] != Chess.chess[x][i]) {return new int[] { x, r };} else {// System.out.println("向下不能");return null;}}/*** 向下检测是否有相同颜色棋子,如果有且不相邻,改变中间棋子颜色,否则返回NULL*/public int[] hengXia1(int x, int y) {int r = -2;int i;// 向下for (i = y + 1; i < Chess.rows-1; i++) {if (Chess.chess[x][i] == 0) {break;}if (Chess.chess[x][i] == Chess.chess[x][y]) {r = i;break;}}if (r != -2 && Chess.chess[x][y + 1] != Chess.chess[x][i]) {// 改变中间的子paintChess(x, y, x, r);return new int[] { x, r };} else {return null;}}/*** 斜右上方向* @param x* @param y* @return*/public int[] xieyouS(int x, int y) {// 向上int r = -2, s = -2;int i, j;for (i = x + 1, j = y - 1; i < Chess.rows-1 && j >= 0; i++, j--) {if (Chess.chess[i][j] == 0) {break;}if (Chess.chess[i][j] == Chess.chess[x][y]) {r = i;s = j;break;}}if (r != -2 && s != -2&& Chess.chess[x + 1][y - 1] != Chess.chess[i][j]) {return new int[] { r, s };} else {// System.out.println("向右上不能");return null;}}/*** 斜右下方向* * @param x* @param y* @return*/public int[] xieyouX(int x, int y) {// 向下int r = -2, s = -2;int i, j;for (i = x + 1, j = y + 1; i < Chess.rows-1 && j < Chess.cols-1; i++, j++) {if (Chess.chess[i][j] == 0) {break;}if (Chess.chess[i][j] == Chess.chess[x][y]) {r = i;s = j;break;}}if (r != -2 && s != -2&& Chess.chess[x + 1][y + 1] != Chess.chess[i][j]) {return new int[] { r, s };} else {// System.out.println("向右下不能");return null;}}/*** 斜左上方向* * @param x* @param y* @return*/public int[] xiezuoS(int x, int y) {// 向上int r = -2, s = -2;int i, j;for (i = x - 1, j = y - 1; i >= 0 && j >= 0; i--, j--) {if (Chess.chess[i][j] == 0) {break;}if (Chess.chess[i][j] == Chess.chess[x][y]) {r = i;s = j;break;}}if (r != -2 && s != -2&& Chess.chess[x - 1][y - 1] != Chess.chess[i][j]) {return new int[] { r, s };} else {return null;}}/*** 斜左下方向* @param x* @param y* @return*/public int[] xiezuoX(int x, int y) {// 向下int r = -2, s = -2;int i, j;for (i = x - 1, j = y + 1; i >= 0 && j < Chess.cols-1; i--, j++) {if (Chess.chess[i][j] == 0) {break;}if (Chess.chess[i][j] == Chess.chess[x][y]) {r = i;s = j;break;}}if (r != -2 && s != -2&& Chess.chess[x - 1][y + 1] != Chess.chess[i][j]) {return new int[] { r, s };} else {return null;}}/*** 向右检测是否有相同颜色棋子,如果有且不相邻,改变中间棋子颜色,否则返回NULL*/public int[] hengYou1(int x, int y) {int r = -2;int i;// 向右for (i = x + 1; i < Chess.cols-1; i++) {if (Chess.chess[i][y] != 1 && Chess.chess[i][y] != -1) {break;}if (Chess.chess[i][y] == Chess.chess[x][y]) {r = i;break;}}if (r != -2 && Chess.chess[x + 1][y] != Chess.chess[i][y]) {// 改变中间的子paintChess(x, y, r, y);return new int[] { r, y };} else {return null;}}/*** 向左检测是否有相同颜色棋子,如果有且不相邻,改变中间棋子颜色,否则返回NULL*/public int[] hengZuo1(int x, int y) {int r = -2;int i;// 向左for (i = x - 1; i >= 0; i--) {if (Chess.chess[i][y] != 1 && Chess.chess[i][y] != -1) {break;}if (Chess.chess[i][y] == Chess.chess[x][y]) {r = i;break;}}if (r != -2 && Chess.chess[x - 1][y] != Chess.chess[i][y]) {// 改变中间的子paintChess(x, y, r, y);return new int[] { r, y };} else {return null;}}/*** 斜右上方向 * @param x* @param y* @return*/public int[] xieyou1(int x, int y) {// 向上int r = -2, s = -2;int i, j;for (i = x + 1, j = y - 1; i < Chess.rows-1 && j >= 0; i++, j--) {if (Chess.chess[i][j] == 0) {break;}if (Chess.chess[i][j] == Chess.chess[x][y]) {r = i;s = j;break;}}if (r != -2 && s != -2&& Chess.chess[x + 1][y - 1] != Chess.chess[i][j]) {// 改变中间的子paintChess1(x, y, i, j);return new int[] { r, s };} else {return null;}}/*** 斜右下方向* * @param x* @param y* @return*/public int[] xieyou2(int x, int y) {// 向下int r = -2, s = -2;int i, j;for (i = x + 1, j = y + 1; i < Chess.rows-1 && j < Chess.cols-1; i++, j++) {if (Chess.chess[i][j] == 0) {break;}if (Chess.chess[i][j] == Chess.chess[x][y]) {r = i;s = j;break;}}if (r != -2 && s != -2&& Chess.chess[x + 1][y + 1] != Chess.chess[i][j]) {// 改变中间的子paintChess2(x, y, i, j);return new int[] { r, s };} else {return null;}}/*** 斜左上方向* * @param x* @param y* @return*/public int[] xiezuo1(int x, int y) {// 向上int r = -2, s = -2;int i, j;for (i = x - 1, j = y - 1; i >= 0 && j >= 0; i--, j--) {if (Chess.chess[i][j] == 0) {break;}if (Chess.chess[i][j] == Chess.chess[x][y]) {r = i;s = j;break;}}if (r != -2 && s != -2&& Chess.chess[x - 1][y - 1] != Chess.chess[i][j]) {// 改变中间的子paintChess3(x, y, i, j);return new int[] { r, s };} else {return null;}}/*** 斜左下方向 * @param x* @param y* @return*/public int[] xiezuo2(int x, int y) {// 向下int r = -2, s = -2;int i, j;for (i = x - 1, j = y + 1; i >= 0 && j < Chess.cols-1; i--, j++) {if (Chess.chess[i][j] == 0) {break;}if (Chess.chess[i][j] == Chess.chess[x][y]) {r = i;s = j;break;}}if (r != -2 && s != -2&& Chess.chess[x - 1][y + 1] != Chess.chess[i][j]) {// 改变中间的子paintChess4(x, y, i, j);return new int[] { r, s };} else {return null;}}
}

所使用到的图片素材都在附件中提供,喜欢黑白棋的朋友们不妨自己来做一做吧。

黑白棋(Othello)相关推荐

  1. UVA220 黑白棋 Othello

    题目 你的任务是模拟黑白棋游戏的进程.黑白棋的规则为:黑白双方轮流放棋子,每次必 须让新放的棋子"夹住"至少一枚对方棋子,然后把所有被新放棋子"夹住"的对方棋子 ...

  2. 《算法竞赛入门经典》习题4-3 黑白棋(Othello, ACM、ICPC World Finals 1992, UVa220)

    原题及翻译 Othello is a game played by two people on an 8 x 8 board, using disks that are white on one si ...

  3. 黑白棋,又叫翻转棋(Reversi)、苹果棋或奥赛罗棋(Othello)。棋盘共有8行8列共64格。开局时,棋盘正中央的4格先置放黑白相隔的4枚棋子。双方轮流落子,只要落子和棋盘上任一枚己方的棋子

    黑白棋,又叫翻转棋(Reversi).苹果棋或奥赛罗棋(Othello).棋盘共有8行8列共64格. 开局时,棋盘正中央的4格先置放黑白相隔的4枚棋子.双方轮流落子,只要落子和棋盘上任一枚己方的棋子在 ...

  4. android 双人黑白棋开发博客,黑白棋 - 软件资讯 - 课堂党年级博客

    黑白棋叫反棋(Reversi).奥赛罗棋(Othello)苹棋翻转棋黑白棋西本流行游戏通相互翻转棋棋盘谁棋判断胜负 黑白棋棋盘8*8格棋盘棋棋空格间像围棋交叉点始棋盘两白两黑四棋交叉放置黑棋总先 自颜 ...

  5. Visual C++实现黑白棋游戏项目实战二:界面的设计与实现(附源码和资源 超详细)

    需要源码和资源请点赞关注收藏后评论区留言私信~~~ 黑白棋游戏的Visual C++工程采用MFC对话框模式进行开发,下面对它进行详细介绍 一.游戏菜单的实现 首先要在工程资源中添加一个菜单资源类,菜 ...

  6. JAVA黑白棋之算法浅析

     引言   本为主要对我在开发JAVA黑白棋人机算法过程中所用的博弈思想.估值函数.搜索算法分3个方面进行了阐述,由于本人水平有限,如果大家希望了解更多有关黑白棋博弈策略以及人机算法的深入的理论研究, ...

  7. 黑白棋(人人对战)——C语言实现方法之一

    黑白棋(人人对战)--C语言实现方法之一 黑白棋,又叫翻转棋(Reversi).奥赛罗棋(Othello).苹果棋或正反棋(Anti reversi).黑白棋在西方和日本很流行.游戏通过相互翻转对方的 ...

  8. [Python] 黑白棋(翻转棋)小游戏

    [Python] 黑白棋(翻转棋)小游戏 游戏介绍 黑白棋(Reversi or Othello)在西方和日本很流行.游戏通过相互翻转对方的棋子,最后以棋盘上谁的棋子多来判断胜负. 规则 黑白棋的每颗 ...

  9. 吴昊品游戏核心算法 Round 9 —— 正统黑白棋AI(博弈树)

    黑白棋程式简史 在1980年代,电脑并不普及,在黑白棋界里,最强的仍然是棋手(人类). 到了1990年代初,电脑的速度以几何级数增长,写出来的黑白棋程式虽然仍然有点笨拙,但由于计算深度(电脑的速度快) ...

最新文章

  1. 人脑动态功能网络连接模式能够鉴别个体并预测其认知功能
  2. 如何在jupyter notebook中运行markdown文件(脚本、代码)
  3. Oracle数据库中闪回恢复的详细分析
  4. 《科学》公布2018十大科学突破技术
  5. 函数的参数个数是不固定_EXCEL这些序号技巧,你还真不一定都知道
  6. fastjson 判断是否包含_Fastjson, Gson, org.json.JSON三者对于JSONObject及JSONArray的判断
  7. okhttp3+retrofit2+rxjava2
  8. Java 复制Excel工作表
  9. 恒生电子软件工程师面试
  10. 14.css中的定位的参照物
  11. 读书感受 之 《如何说客户才会听,怎么听客户才肯说》
  12. 用Mothur制作OTUtable
  13. matlab中如何写出图像第一行到第十行_第一列到第十列之间的数据,Excel中表示从第3列的1行到第10行的单元格引用为()。...
  14. 苹果6运行内存是多少_安卓手机和苹果手机的最大不同,运行大小不同决定速度的快慢!|安卓手机|苹果手机|智能手机|手机|内存|闪存...
  15. pygal画世界地图
  16. C语言复习知识点汇总2--计算机二级(C语言)
  17. 羊了个羊微信小游戏开发技术解析
  18. 人工客服 计算机英语怎么说,人工服务用英文怎么说? 电话上的。。。谢谢
  19. 戴森AB09洗烘一体机到底贵在哪儿?拆开看看!
  20. RS232转PROFINET网关通讯协议应用网关模块远创智控

热门文章

  1. 【windows】设置远程桌面连接?多用户登录设置?取消登录密码
  2. 2010年显卡行业大事
  3. elk怎么读的_elk,elk的英文意思和翻译,elk的音标读音,用法,例句,发音,含义讲解
  4. Java、Android工具整理 - 单位换算
  5. 如何向icloud上传文件_怎样用icloud把手机文件传到电脑上?
  6. colorkey口红怎么样_colorkey口红推荐什么颜色
  7. 第六章 Wi-Fi扫描流程
  8. 商城后台管理React+Springboot
  9. 将yolov2-tiny模型部署到前端
  10. JAVA跨考_考研人的2019——一战跨考清华计算机的血泪史