📄 chessboard.java
字号:
package 五子棋2;import javax.swing.JPanel;import java.awt.*;import javax.swing.JOptionPane;public class ChessBoard extends JPanel{ public ChessBoard(Image o, Image x, Color bg) { //构造函数,初始化参数; this.x = x; this.o = o; setBackground(bg); table=new int [15][15]; road=new int [225]; //按顺序存放所有以下的棋的位置; NewGame(); } public void size(int w, int h) { //设置棋盘的大小; width = w; height = h; tw = (width-14*lw)/15; th = (height-14*lw)/15; } public void paintComponent(Graphics g) { //绘制棋盘 this.g = g; super.paintComponent(g); //paint background Insets insets = getInsets(); int x0 = insets.left; int y0 = insets.top; int w = getWidth() - x0 - insets.right; int h = getHeight() - y0 - insets.bottom; size(w, h); g.setColor(Color.black); // foreground color drawBoard(); draw(); } protected void drawBoard() { //在panel上画棋盘,15*15; g.drawLine(tw, y0, tw, height); for(int i=1;i<14;i++) g.drawLine((i+1)*tw+i*lw, y0, (i+1)*tw+i*lw, height); g.drawLine(x0, th, width, th); for(int j=1;j<14;j++) g.drawLine(x0, (j+1)*th+j*lw, width, (j+1)*th+j*lw); } public void drawPiece(int player, int c,int r) { //在棋盘上画“o”或“X” if(player==Player) { //如果该位置是玩家的棋,则在该位置画“x” g.drawImage( x ,c*(tw+lw)+1, r*(th+lw)+1, tw-1, th-1, this); } else if(player==Computer) { //如果该位置是电脑的棋,则在该位置画“o” g.drawImage( o ,c*(tw+lw)+1, r*(th+lw)+1, tw-1, th-1, this); } } public void draw() { //绘制棋盘 for(int i=0;i<15;i++) { for(int j=0;j<15;j++) { if(table[i][j]==2) drawPiece(Player,j,i); if(table[i][j]==1) drawPiece(Computer,j,i); } } } void StartGame(int x,int y) { //进行游戏; if(first==0) { //如果没选择谁先下棋,则弹出提示框; JOptionPane.showMessageDialog(this, "请选择谁先下棋!", "Warning",JOptionPane.WARNING_MESSAGE); NewGame(); } else { //进行游戏 if(!PlayerMove(x,y))return ; //如果要走的这部出现错误,如该步已有棋子、玩家已经胜利、棋盘已满等,则跳出,以免电脑多走; CMove(); } } boolean PlayerMove(int x,int y) { //玩家走棋; int r=setRow(y); //将读入鼠标的坐标转化为棋盘的下标; int c=setCol(x); if(table[r][c]!=0)return false;//如果棋盘已经有棋子,则表示出错,跳出函数; table[r][c]=2;//将玩家所下棋的位置社为2; repaint();//重新绘制棋盘; road[mcount]=r*20+c;//保存下起的位置; mcount++;//所走步数加1; if(IsWin(Player,c,r)){//判断玩家是否已经赢,如果是则提示,且开始新游戏; JOptionPane.showMessageDialog(this, "玩家胜出!", "Warning",JOptionPane.WARNING_MESSAGE); NewGame(); return false; } if(mcount==226){//判断棋盘是否已经满,如果是则提示和棋; JOptionPane.showMessageDialog(this, "和棋!", "Warning",JOptionPane.WARNING_MESSAGE); NewGame(); return false; } return true; } public int setCol(int x) { //转化列下表 return (int) ((x * 15) / width) ; } public int setRow(int y) { //转化行下表 return (int)((y * 15) / height) ; } void NewGame() { //新游戏 int i,j,k; for(i=0;i<15;i++) //初始化棋盘 for(j=0;j<15;j++) table[i][j]=0; first=0; //谁先下棋标志设为0; mcount=0; //把下起步数设为0; repaint(); //重绘棋盘 } void CFirst() {//电脑先下,把first设为1; first=Computer; } void PFirst() {//玩家先下,把first设为2; first=Player; } void UnMove() { //悔棋 if(mcount==1&&first==1) { int temp,i,j; temp=road[mcount-1];//退掉电脑走的棋 i=temp/15; j=temp%15; table[i][j]=0; mcount=0; } if(mcount>=2){ int temp,i,j; temp=road[mcount-1];//退掉电脑走的棋 i=temp/15; j=temp%15; table[i][j]=0; temp=road[mcount-2];//退掉玩家走的棋 i=temp/15; j=temp%15; table[i][j]=0; mcount=mcount-2;//总步数减2; } repaint();//重绘棋盘 } boolean IsWin(int player,int x,int y) { //下一步棋,判断是否会赢; int index; int c; c=0; for(index=x-4;index<x+5;index++) { //判断水平方向是否存在连续的5个棋 if(index>=0){ if(index<15){ if(table[y][index]==player){ c++; if(c==5)break; } else { c=0; continue; } } else break; } } if(c==5)return true; c=0; for(index=y-4;index<y+5;index++){////判断竖直方向是否存在连续的5个棋 if(index>=0){ if(index<15){ if(table[index][x]==player){ c++; if(c==5)break; } else { c=0; continue; } } else break; } } if(c==5)return true; c=0; int index1=x-4; for(index=y-4;index<y+5;index++){//判断135度斜线方向是否存在连续的5个棋 if(index>=0&&index1>=0){ if(index<15&&index1<15){ if(table[index][index1]==player){ c++; if(c==5)break; } else { c=0; index1++; continue; } } else break; } index1++; } if(c==5)return true; c=0; index1=y+4; for(index=x-4;index<x+5;index++){//判断45度斜线方向是否存在连续的5个棋 if(index>=0&&index1<15){ if(index<15&&index1>=0){ if(table[index1][index]==player){ c++; if(c==5)break; } else { c=0; index1--; continue; } } else break; } index1--; } if(c==5)return true; return false; } void CMove() { //电脑走棋!(这里为测试,所以用随机数产生行列坐标;) if(mcount==0){ table[7][7]=1; } else{ cmax=evaluate(1); System.out.println(cmax); ci=id; cj=jd; pmax=evaluate(2); System.out.println(pmax); pi=id; pj=jd; if(cmax>=pmax){ cx=cj; cy=ci; } else { cx=pj; cy=pi; } //evaluate3(1); table[cy][cx]=1; } road[mcount]=cy*15+cx; mcount++; repaint(); if(IsWin(Computer,cx,cy)){ JOptionPane.showMessageDialog(this, "电脑胜出!", "Warning",JOptionPane.WARNING_MESSAGE); NewGame(); } if(mcount==226){ JOptionPane.showMessageDialog(this, "和棋!", "Warning",JOptionPane.WARNING_MESSAGE); NewGame(); } } //************************************************************************************ void counter1(int m,int n,int p) //计算水平方向上个数和死活状态{ int a1,a2; a1=a2=0; if(table[m][n]==0) { b=0; //table[m][n]==k;b=0表示双死,b==1表示单活,b==2双活 int i,j; i=j=0; num=0; while(n-1-i>=0&&table[m][n-1-i]==p) { i++; } num=i; a1=n-1-i; if(n-2-i>=0) if(table[m][n-1-i]==0&&table[m][n-2-i]==p) { i++; a1--; a1--; } while(n+1+j<15&&table[m][n+1+j]==p) { j++; } a2=n+1+j; if(n+2+j<15) if(table[m][n+1+j]==0&&table[m][n+1+j+1]==p) { j++; a2++; a2++; } num=i+j+1; if(a1>=0) if(table[m][a1]==0) b++; if(a2<15) if(table[m][a2]==0) b++; if(b==2) huo[num]++; if(b==1) si[num]++; if(num==5) si[num]=huo[num]=1; } } void counter2(int m,int n,int p) //计算竖直方向上个数和死活状态{ int a1,a2; a1=a2=0; if(table[m][n]==0) { b=0; //table[m][n]==k;b=0表示双死,b==1表示单活,b==2双活 int i,j; i=j=0; num=0; while(m-1-i>=0&&table[m-1-i][n]==p) { i++; } a1=m-1-i;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -