admin管理员组文章数量:1567915
2024年5月24日发(作者:)
JAVA课程设计
设计题目:五子棋游戏
一. 简要的介绍五子棋
1. 五子棋的起源
五子棋,又被称为“连五子、五子连、串珠、五目、五目碰、五格、
五石、五法、五联、京棋”。五子棋相传起源于四千多年前的尧帝时
期,比围棋的历史还要悠久,可能早在“尧造围棋”之前,民间就已
有五子棋游戏。有关早期五子棋的文史资料与围棋有相似之处,因为
古代五子棋的棋具与围棋是完全相同的。
2.现在五子棋标准棋盘(如图所示)
3.五子棋的棋子
五子棋采用两种颜色棋子,黑色棋子和白色棋子,和围棋相同,
4.五子棋规则
五子棋就是五个棋子连在一起就算赢,黑棋先行,下棋下在棋盘交叉线
上,由于黑棋先行,优势太大,所以对黑棋设了禁手,又规定了“三手交换”,
就是黑棋下第 2 手棋,盘面第 3 着棋之后,白方在应白 2 之前,如感觉
黑方棋形不利于己方,可出交换,即执白棋一方变为执黑棋一方。和“五手
两打法”,就是黑棋在下盘面上关键的第 5 手时,必须下两步棋,让白方在
这两步棋中任选一步,然后再续下。不过一般爱好者不需要遵循这么多规则。
二.程序流程
三.代码设计与分析
main方法创建了ChessFrame类的一个实例对象(cf),
并启动屏幕显示显示该实例对象。
public class FiveChessAppletDemo {
public static void main(String args[]){
ChessFrame cf = new ChessFrame();
();
}
}
用类ChessFrame创建五子棋游戏主窗体和菜单
import .*;
import .*;
import .*;
import .*;
import tream;
import nent;
import ;
class ChessFrame extends JFrame implements ActionListener {
private String[] strsize={"标准棋盘","改进棋盘","扩大棋盘"};
private String[] strmode={"人机对战","人人对战"};
public static boolean iscomputer=true,checkcomputer=true;
private int width,height;
private ChessModel cm;
private MainPanel mp;
构造五子棋游戏的主窗体
public ChessFrame() {
le("五子棋游戏");
cm=new ChessModel(1);
mp=new MainPanel(cm);
Container con=tentPane();
(mp,"Center");
izable(false);
dowListener(new ChessWindowEvent());
MapSize(14,14);
JMenuBar mbar = new JMenuBar();
nuBar(mbar);
JMenu gameMenu = new JMenu("游戏");
(makeMenu(gameMenu, new Object[] {
"开局", null,"棋盘",null,"模式", null, "退出"
}, this));
JMenu lookMenu =new JMenu("外观");
(makeMenu(lookMenu,new Object[] {
"类型一","类型二","类型三"
},this));
JMenu helpMenu = new JMenu("版本");
(makeMenu(helpMenu, new Object[] {
"关于"
}, this));
}
构造五子棋游戏的主菜单
public JMenu makeMenu(Object parent, Object items[], Object target){
JMenu m = null;
if(parent instanceof JMenu)
m = (JMenu)parent;
else if(parent instanceof String)
m = new JMenu((String)parent);
else
return null;
for(int i = 0; i < ; i++)
if(items[i] == null)
arator();
else if(items[i] == "棋盘"){
JMenu jm = new JMenu("棋盘");
ButtonGroup group=new ButtonGroup();
JRadioButtonMenuItem rmenu;
for (int j=0;j<;j++){
rmenu=makeRadioButtonMenuItem(strsize[j],target);
if (j==0)
ected(true);
(rmenu);
(rmenu);
}
(jm);
}else if(items[i] == "模式"){
JMenu jm = new JMenu("模式");
ButtonGroup group=new ButtonGroup();
JRadioButtonMenuItem rmenu;
for (int h=0;h<;h++){
rmenu=makeRadioButtonMenuItem(strmode[h],target);
if(h==0)
ected(true);
(rmenu);
(rmenu);
}
(jm);
}else
(makeMenuItem(items[i], target));
return m;
}
构造五子棋游戏的菜单项
public JMenuItem makeMenuItem(Object item, Object target){
JMenuItem r = null;
if(item instanceof String)
r = new JMenuItem((String)item);
else if(item instanceof JMenuItem)
r = (JMenuItem)item;
else
return null;
if(target instanceof ActionListener)
ionListener((ActionListener)target);
return r;
}
构造五子棋游戏的单选按钮式菜单项
public JRadioButtonMenuItem makeRadioButtonMenuItem(
Object item, Object target){
JRadioButtonMenuItem r = null;
if(item instanceof String)
r = new JRadioButtonMenuItem((String)item);
else if(item instanceof JRadioButtonMenuItem)
r = (JRadioButtonMenuItem)item;
else
return null;
if(target instanceof ActionListener)
ionListener((ActionListener)target);
return r;
}
public void MapSize(int w,int h){
setSize(w * 24, h * 27);
if(omputer)
uter=true;
else
uter=false;
el(cm);
t();
}
public boolean getiscomputer(){
return uter;
}
public void restart(){
int modeChess = eChess();
if(modeChess <= 3 && modeChess >= 0){
cm = new ChessModel(modeChess);
MapSize(th(),ght());
}
}
public void actionPerformed(ActionEvent e){
String arg=ionCommand();
try{
if (("类型三"))
kAndFeel(
"sLookAndFeel");
else if(("类型二"))
kAndFeel(
"ookAndFeel");
else
kAndFeel(
"ookAndFeel" );
ComponentTreeUI(this);
}catch(Exception ee){}
if(("标准棋盘")){
=14;
=14;
cm=new ChessModel(1);
MapSize(,);
ComponentTreeUI(this);
}
if(("改进棋盘")){
=18;
=18;
cm=new ChessModel(2);
MapSize(,);
ComponentTreeUI(this);
}
if(("扩大棋盘")){
=22;
=22;
cm=new ChessModel(3);
MapSize(,);
ComponentTreeUI(this);
}
if(("人机对战")){
omputer=true;
uter=true;
cm=new ChessModel(eChess());
MapSize(th(),ght());
ComponentTreeUI(this);
}
if(("人人对战")){
omputer=false;
uter=false;
cm=new ChessModel(eChess());
MapSize(th(),ght());
ComponentTreeUI(this);
}
if(("开局")){
restart();
}
if(("关于"))
ssageDialog(null, "第一版", "版本
",_MESSAGE );
if(("退出"))
(0);
}
}
用类ChessModel实现了整个五子棋程序算法的核心
import .*;
import .*;
import .*;
import .*;
import tream;
import nent;
import ;
class ChessModel {
规定棋盘的宽度、高度、棋盘的模式
private int width,height,modeChess;
规定棋盘方格的横向、纵向坐标
private int x=0,y=0;
棋盘方格的横向、纵向坐标所对应的棋子颜色,
数组arrMapShow只有3个值:1,2,3,-1,
其中1代表该棋盘方格上下的棋子为黑子,
2代表该棋盘方格上下的棋子为白子,
3代表为该棋盘方格上没有棋子,
-1代表该棋盘方格不能够下棋子
private int[][] arrMapShow;
交换棋手的标识,棋盘方格上是否有棋子的标识符
private boolean isOdd,isExist;
public ChessModel() {}
该构造方法根据不同的棋盘模式(modeChess)来构建对应大小的
棋盘
public ChessModel(int modeChess){
=true;
if(modeChess == 1){
PanelInit(14, 14, modeChess);
}
if(modeChess == 2){
PanelInit(18, 18, modeChess);
}
if(modeChess == 3){
PanelInit(22, 22, modeChess);
}
}
按照棋盘模式构建棋盘大小
private void PanelInit(int width, int height, int modeChess){
= width;
= height;
ess = modeChess;
arrMapShow = new int[width+1][height+1];
for(int i = 0; i <= width; i++){
for(int j = 0; j <= height; j++){
arrMapShow[i][j] = -1;
}
}
}
获取是否交换棋手的标识符
public boolean getisOdd(){
return ;
}
设置交换棋手的标识符
public void setisOdd(boolean isodd){
if(isodd)
=true;
else
=false;
}
获取某棋盘方格是否有棋子的标识值
public boolean getisExist(){
return t;
}
获取棋盘宽度
public int getWidth(){
return ;
}
获取棋盘高度
public int getHeight(){
return ;
}
获取棋盘模式
public int getModeChess(){
return ess;
}
获取棋盘方格上棋子的信息
public int[][] getarrMapShow(){
return arrMapShow;
}
判断下子的横向、纵向坐标是否越界
private boolean badxy(int x, int y){
if(x >= width+20 || x < 0)
return true;
return y >= height+20 || y < 0;
}
计算棋盘上某一方格上八个方向棋子的最大值,
这八个方向分别是:左、右、上、下、左上、左下、右上、右下
public boolean chessExist(int i,int j){
if(Show[i][j]==1 || Show[i][j]==2)
return true;
return false;
}
判断该坐标位置是否可下棋子
public void readyplay(int x,int y){
if(badxy(x,y))
return;
if (chessExist(x,y))
return;
Show[x][y]=3;
}
在该坐标位置下棋子
public void play(int x,int y){
if(badxy(x,y))
return;
if(chessExist(x,y)){
t=true;
return;
}else
t=false;
if(getisOdd()){
setisOdd(false);
Show[x][y]=1;
}else{
setisOdd(true);
Show[x][y]=2;
}
}
计算机走棋
说明:用穷举法判断每一个坐标点的四个方向的的最大棋子数,
最后得出棋子数最大值的坐标,下子
public void computerDo(int width,int height){
int max_black,max_white,max_temp,max=0;
setisOdd(true);
n("计算机走棋 ...");
for(int i = 0; i <= width; i++){
for(int j = 0; j <= height; j++){
算法判断是否下子
if(!chessExist(i,j)){
判断白子的最大值
max_white=checkMax(i,j,2);
判断黑子的最大值
max_black=checkMax(i,j,1);
max_temp=(max_white,max_black);
if(max_temp>max){
max=max_temp;
this.x=i;
this.y=j;
}
}
}
}
setX(this.x);
setY(this.y);
Show[this.x][this.y]=2;
}
记录电脑下子后的横向坐标
public void setX(int x){
this.x=x;
}
记录电脑下子后的纵向坐标
public void setY(int y){
this.y=y;
}
获取电脑下子的横向坐标
public int getX(){
return this.x;
}
获取电脑下子的纵向坐标
public int getY(){
return this.y;
}
计算棋盘上某一方格上八个方向棋子的最大值,
这八个方向分别是:左、右、上、下、左上、左下、右上、右下
public int checkMax(int x, int y,int black_or_white){
int num=0,max_num,max_temp=0;
int x_temp=x,y_temp=y;
int x_temp1=x_temp,y_temp1=y_temp;
判断右边
for(int i=1;i<5;i++){
x_temp1+=1;
if(x_temp1>)
break;
if(Show[x_temp1][y_temp1]==black_or_white)
num++;
else
break;
}
判断左边
x_temp1=x_temp;
for(int i=1;i<5;i++){
x_temp1-=1;
if(x_temp1<0)
break;
if(Show[x_temp1][y_temp1]==black_or_white)
num++;
else
break;
}
if(num<5)
max_temp=num;
判断上面
x_temp1=x_temp;
y_temp1=y_temp;
num=0;
for(int i=1;i<5;i++){
y_temp1-=1;
if(y_temp1<0)
break;
if(Show[x_temp1][y_temp1]==black_or_white)
num++;
else
break;
}
判断下面
y_temp1=y_temp;
for(int i=1;i<5;i++){
y_temp1+=1;
if(y_temp1>)
break;
if(Show[x_temp1][y_temp1]==black_or_white)
num++;
else
break;
}
if(num>max_temp&&num<5)
max_temp=num;
判断左上方
x_temp1=x_temp;
y_temp1=y_temp;
num=0;
for(int i=1;i<5;i++){
x_temp1-=1;
y_temp1-=1;
if(y_temp1<0 || x_temp1<0)
break;
if(Show[x_temp1][y_temp1]==black_or_white)
num++;
else
break;
}
判断右下方
x_temp1=x_temp;
y_temp1=y_temp;
for(int i=1;i<5;i++){
x_temp1+=1;
y_temp1+=1;
if(y_temp1> || x_temp1>)
break;
if(Show[x_temp1][y_temp1]==black_or_white)
num++;
else
break;
}
if(num>max_temp&&num<5)
max_temp=num;
判断右上方
x_temp1=x_temp;
y_temp1=y_temp;
num=0;
for(int i=1;i<5;i++){
x_temp1+=1;
y_temp1-=1;
if(y_temp1<0 || x_temp1>)
break;
if(Show[x_temp1][y_temp1]==black_or_white)
num++;
else
break;
}
判断左下方
x_temp1=x_temp;
y_temp1=y_temp;
for(int i=1;i<5;i++){
x_temp1-=1;
y_temp1+=1;
if(y_temp1> || x_temp1<0)
break;
if(Show[x_temp1][y_temp1]==black_or_white)
num++;
else
break;
}
if(num>max_temp&&num<5)
max_temp=num;
max_num=max_temp;
return max_num;
}
判断胜负
public boolean judgeSuccess(int x,int y,boolean isodd){
int num=1;
int arrvalue;
int x_temp=x,y_temp=y;
if(isodd)
arrvalue=2;
else
arrvalue=1;
int x_temp1=x_temp,y_temp1=y_temp;
判断右边胜负
for(int i=1;i<6;i++){
x_temp1+=1;
if(x_temp1>)
break;
if(Show[x_temp1][y_temp1]==arrvalue)
num++;
else
break;
}
判断左边胜负
x_temp1=x_temp;
for(int i=1;i<6;i++){
x_temp1-=1;
if(x_temp1<0)
break;
if(Show[x_temp1][y_temp1]==arrvalue)
num++;
else
break;
}
if(num==5)
return true;
判断上方胜负
x_temp1=x_temp;
y_temp1=y_temp;
num=1;
for(int i=1;i<6;i++){
y_temp1-=1;
if(y_temp1<0)
break;
if(Show[x_temp1][y_temp1]==arrvalue)
num++;
else
break;
}
判断下方胜负
y_temp1=y_temp;
for(int i=1;i<6;i++){
y_temp1+=1;
if(y_temp1>)
break;
if(Show[x_temp1][y_temp1]==arrvalue)
num++;
else
break;
}
if(num==5)
return true;
判断左上胜负
x_temp1=x_temp;
y_temp1=y_temp;
num=1;
for(int i=1;i<6;i++){
x_temp1-=1;
y_temp1-=1;
if(y_temp1<0 || x_temp1<0)
break;
if(Show[x_temp1][y_temp1]==arrvalue)
num++;
else
break;
}
判断右下胜负
x_temp1=x_temp;
y_temp1=y_temp;
for(int i=1;i<6;i++){
x_temp1+=1;
y_temp1+=1;
if(y_temp1> || x_temp1>)
break;
if(Show[x_temp1][y_temp1]==arrvalue)
num++;
else
break;
}
if(num==5)
return true;
判断右上胜负
x_temp1=x_temp;
y_temp1=y_temp;
num=1;
for(int i=1;i<6;i++){
x_temp1+=1;
y_temp1-=1;
if(y_temp1<0 || x_temp1>)
break;
if(Show[x_temp1][y_temp1]==arrvalue)
num++;
else
break;
}
判断左下胜负
x_temp1=x_temp;
y_temp1=y_temp;
for(int i=1;i<6;i++){
x_temp1-=1;
y_temp1+=1;
if(y_temp1> || x_temp1<0)
break;
if(Show[x_temp1][y_temp1]==arrvalue)
num++;
else
break;
}
if(num==5)
return true;
return false;
}
赢棋后的提示
public void showSuccess(JPanel jp){
ssageDialog(jp,"你赢了","结果",
ATION_MESSAGE);
}
输棋后的提示
public void showDefeat(JPanel jp){
ssageDialog(jp,"你输了","结果",
ATION_MESSAGE);
}
}
用类MainPanel主要完成如下功能:
1、构建一个面板,在该面板上画上棋盘;
2、处理在该棋盘上的鼠标事件(如鼠标左键点击、鼠标右键点击、
鼠标拖动等)
import .*;
import .*;
import .*;
import .*;
import tream;
import nent;
import ;
class MainPanel extends JPanel
implements MouseListener,MouseMotionListener{
设定棋盘的宽度和高度
private int width,height;
private ChessModel cm;
根据棋盘模式设定面板的大小
MainPanel(ChessModel mm){
cm=mm;
width=th();
height=ght();
addMouseListener(this);
}
根据棋盘模式设定棋盘的宽度和高度
public void setModel(ChessModel mm){
cm = mm;
width = th();
height = ght();
}
根据坐标计算出棋盘方格棋子的信息(如白子还是黑子),
然后调用draw方法在棋盘上画出相应的棋子
public void paintComponent(Graphics g){
omponent(g);
for(int j = 0; j <= height; j++){
for(int i = 0; i <= width; i++){
int v = MapShow()[i][j];
draw(g, i, j, v);
}
}
}
根据提供的棋子信息(颜色、坐标)画棋子
public void draw(Graphics g, int i, int j, int v){
int x = 20 * i+20;
int y = 20 * j+20;
画棋盘
if(i!=width && j!=height){
or(ay);
ct(x,y,20,20);
}
画黑色棋子
if(v == 1 ){
or();
al(x-8,y-8,16,16);
or();
al(x-8,y-8,16,16);
}
画白色棋子
if(v == 2 ){
or();
al(x-8,y-8,16,16);
or();
al(x-8,y-8,16,16);
}
if(v ==3){
or();
al(x-8,y-8,16,16);
}
}
响应鼠标的点击事件,根据鼠标的点击来下棋,
根据下棋判断胜负等
public void mousePressed(MouseEvent evt){
int x = (()-10) / 20;
int y = (()-10) / 20;
n(x+" "+y);
if (ifiers()==1_MASK){
(x,y);
n(dd()+" "+MapShow()[x][y]);
repaint();
if(uccess(x,y,dd())){
ccess(this);
e();
uter=false;
}
判断是否为人机对弈
if(uter&&!xist()){
erDo(th(),ght());
repaint();
if(uccess((),(),dd())){
feat(this);
e();
}
}
}
}
public void mouseClicked(MouseEvent evt){}
public void mouseReleased(MouseEvent evt){}
public void mouseEntered(MouseEvent mouseevt){}
public void mouseExited(MouseEvent mouseevent){}
public void mouseDragged(MouseEvent evt){}
响应鼠标的拖动事件
public void mouseMoved(MouseEvent moveevt){
int x = (()-10) / 20;
int y = (()-10) / 20;
lay(x,y);
repaint();
}
}
import Adapter;
import Event;
响应退出窗口
class ChessWindowEvent extends WindowAdapter{
public void windowClosing(WindowEvent e){
(0);
}
ChessWindowEvent()
{
}
}
四.程序调试与运行
运行:
标准棋盘
改进棋盘:
扩大棋盘:
外观类型二:
外观类型三:
人机对战:
结果:
五.结论
通过对五子棋游戏的编写,使自己对java语言有了更深的了解。也更加熟悉
和了解了java开发工具Eclipse的使用。不过还有很多不足之处,比如没有能
设置禁手,没有能设置悔棋,还有很多东西可以扩充完善。
完整源代码:
import .*;
import .*;
import .*;
import .*;
import tream;
import nent;
import ;
class ChessFrame extends JFrame implements ActionListener {
private String[] strsize={"标准棋盘","改进棋盘","扩大棋盘"};
private String[] strmode={"人机对战","人人对战"};
public static boolean iscomputer=true,checkcomputer=true;
private int width,height;
private ChessModel cm;
private MainPanel mp;
public ChessFrame() {
le("五子棋游戏");
cm=new ChessModel(1);
mp=new MainPanel(cm);
Container con=tentPane();
(mp,"Center");
izable(false);
dowListener(new ChessWindowEvent());
MapSize(14,14);
JMenuBar mbar = new JMenuBar();
nuBar(mbar);
JMenu gameMenu = new JMenu("游戏");
(makeMenu(gameMenu, new Object[] {
"开局", null,"棋盘",null,"模式", null, "退出"
}, this));
JMenu lookMenu =new JMenu("外观");
(makeMenu(lookMenu,new Object[] {
"类型一","类型二","类型三"
},this));
JMenu helpMenu = new JMenu("版本");
(makeMenu(helpMenu, new Object[] {
"关于"
}, this));
}
public JMenu makeMenu(Object parent, Object items[], Object target){
JMenu m = null;
if(parent instanceof JMenu)
m = (JMenu)parent;
else if(parent instanceof String)
m = new JMenu((String)parent);
else
return null;
for(int i = 0; i < ; i++)
if(items[i] == null)
arator();
else if(items[i] == "棋盘"){
JMenu jm = new JMenu("棋盘");
ButtonGroup group=new ButtonGroup();
JRadioButtonMenuItem rmenu;
for (int j=0;j<;j++){
rmenu=makeRadioButtonMenuItem(strsize[j],target);
if (j==0)
ected(true);
(rmenu);
(rmenu);
}
(jm);
}else if(items[i] == "模式"){
JMenu jm = new JMenu("模式");
ButtonGroup group=new ButtonGroup();
JRadioButtonMenuItem rmenu;
for (int h=0;h<;h++){
rmenu=makeRadioButtonMenuItem(strmode[h],target);
if(h==0)
ected(true);
(rmenu);
(rmenu);
}
(jm);
}else
(makeMenuItem(items[i], target));
return m;
}
public JMenuItem makeMenuItem(Object item, Object target){
JMenuItem r = null;
if(item instanceof String)
r = new JMenuItem((String)item);
else if(item instanceof JMenuItem)
r = (JMenuItem)item;
else
return null;
if(target instanceof ActionListener)
ionListener((ActionListener)target);
return r;
}
public JRadioButtonMenuItem makeRadioButtonMenuItem(
Object item, Object target){
JRadioButtonMenuItem r = null;
if(item instanceof String)
r = new JRadioButtonMenuItem((String)item);
else if(item instanceof JRadioButtonMenuItem)
r = (JRadioButtonMenuItem)item;
else
return null;
if(target instanceof ActionListener)
ionListener((ActionListener)target);
return r;
}
public void MapSize(int w,int h){
setSize(w * 24, h * 27);
if(omputer)
uter=true;
else
uter=false;
el(cm);
t();
}
public boolean getiscomputer(){
return uter;
}
public void restart(){
int modeChess = eChess();
if(modeChess <= 3 && modeChess >= 0){
cm = new ChessModel(modeChess);
MapSize(th(),ght());
}
}
public void actionPerformed(ActionEvent e){
String arg=ionCommand();
try{
if (("类型三"))
kAndFeel(
"sLookAndFeel");
else if(("类型二"))
kAndFeel(
"ookAndFeel");
else
kAndFeel(
"ookAndFeel" );
ComponentTreeUI(this);
}catch(Exception ee){}
if(("标准棋盘")){
=14;
=14;
cm=new ChessModel(1);
MapSize(,);
ComponentTreeUI(this);
}
if(("改进棋盘")){
=18;
=18;
cm=new ChessModel(2);
MapSize(,);
ComponentTreeUI(this);
}
if(("扩大棋盘")){
=22;
=22;
cm=new ChessModel(3);
MapSize(,);
ComponentTreeUI(this);
}
if(("人机对战")){
omputer=true;
uter=true;
cm=new ChessModel(eChess());
MapSize(th(),ght());
ComponentTreeUI(this);
}
if(("人人对战")){
omputer=false;
uter=false;
cm=new ChessModel(eChess());
MapSize(th(),ght());
ComponentTreeUI(this);
}
if(("开局")){
restart();
}
if(("关于"))
ssageDialog(null, " 第一版 ", "版本
",_MESSAGE );
if(("退出"))
(0);
}
}
import .*;
import .*;
import .*;
import .*;
import tream;
import nent;
import ;
class ChessModel {
private int width,height,modeChess;
private int x=0,y=0;
private int[][] arrMapShow;
private boolean isOdd,isExist;
public ChessModel() {}
public ChessModel(int modeChess){
=true;
if(modeChess == 1){
PanelInit(14, 14, modeChess);
}
if(modeChess == 2){
PanelInit(18, 18, modeChess);
}
if(modeChess == 3){
PanelInit(22, 22, modeChess);
}
}
private void PanelInit(int width, int height, int modeChess){
= width;
= height;
ess = modeChess;
arrMapShow = new int[width+1][height+1];
for(int i = 0; i <= width; i++){
for(int j = 0; j <= height; j++){
arrMapShow[i][j] = -1;
}
}
}
public boolean getisOdd(){
return ;
}
public void setisOdd(boolean isodd){
if(isodd)
=true;
else
=false;
}
public boolean getisExist(){
return t;
}
public int getWidth(){
return ;
}
public int getHeight(){
return ;
}
public int getModeChess(){
return ess;
}
public int[][] getarrMapShow(){
return arrMapShow;
}
private boolean badxy(int x, int y){
if(x >= width+20 || x < 0)
return true;
return y >= height+20 || y < 0;
}
public boolean chessExist(int i,int j){
if(Show[i][j]==1 || Show[i][j]==2)
return true;
return false;
}
public void readyplay(int x,int y){
if(badxy(x,y))
return;
if (chessExist(x,y))
return;
Show[x][y]=3;
}
public void play(int x,int y){
if(badxy(x,y))
return;
if(chessExist(x,y)){
t=true;
return;
}else
t=false;
if(getisOdd()){
setisOdd(false);
Show[x][y]=1;
}else{
setisOdd(true);
Show[x][y]=2;
}
}
public void computerDo(int width,int height){
int max_black,max_white,max_temp,max=0;
setisOdd(true);
n("计算机走棋 ...");
for(int i = 0; i <= width; i++){
for(int j = 0; j <= height; j++){
if(!chessExist(i,j)){
max_white=checkMax(i,j,2);
max_black=checkMax(i,j,1);
max_temp=(max_white,max_black);
if(max_temp>max){
max=max_temp;
this.x=i;
this.y=j;
}
}
}
}
setX(this.x);
setY(this.y);
Show[this.x][this.y]=2;
}
public void setX(int x){
this.x=x;
}
public void setY(int y){
this.y=y;
}
public int getX(){
return this.x;
}
public int getY(){
return this.y;
}
public int checkMax(int x, int y,int black_or_white){
int num=0,max_num,max_temp=0;
int x_temp=x,y_temp=y;
int x_temp1=x_temp,y_temp1=y_temp;
for(int i=1;i<5;i++){
x_temp1+=1;
if(x_temp1>)
break;
if(Show[x_temp1][y_temp1]==black_or_white)
num++;
else
break;
}
x_temp1=x_temp;
for(int i=1;i<5;i++){
x_temp1-=1;
if(x_temp1<0)
break;
if(Show[x_temp1][y_temp1]==black_or_white)
num++;
else
break;
}
if(num<5)
max_temp=num;
x_temp1=x_temp;
y_temp1=y_temp;
num=0;
for(int i=1;i<5;i++){
y_temp1-=1;
if(y_temp1<0)
break;
if(Show[x_temp1][y_temp1]==black_or_white)
num++;
else
break;
}
y_temp1=y_temp;
for(int i=1;i<5;i++){
y_temp1+=1;
if(y_temp1>)
break;
if(Show[x_temp1][y_temp1]==black_or_white)
num++;
else
break;
}
if(num>max_temp&&num<5)
max_temp=num;
x_temp1=x_temp;
y_temp1=y_temp;
num=0;
for(int i=1;i<5;i++){
x_temp1-=1;
y_temp1-=1;
if(y_temp1<0 || x_temp1<0)
break;
if(Show[x_temp1][y_temp1]==black_or_white)
num++;
else
break;
}
x_temp1=x_temp;
y_temp1=y_temp;
for(int i=1;i<5;i++){
x_temp1+=1;
y_temp1+=1;
if(y_temp1> || x_temp1>)
break;
if(Show[x_temp1][y_temp1]==black_or_white)
num++;
else
break;
}
if(num>max_temp&&num<5)
max_temp=num;
x_temp1=x_temp;
y_temp1=y_temp;
num=0;
for(int i=1;i<5;i++){
x_temp1+=1;
y_temp1-=1;
if(y_temp1<0 || x_temp1>)
break;
if(Show[x_temp1][y_temp1]==black_or_white)
num++;
else
break;
}
x_temp1=x_temp;
y_temp1=y_temp;
for(int i=1;i<5;i++){
x_temp1-=1;
y_temp1+=1;
if(y_temp1> || x_temp1<0)
break;
if(Show[x_temp1][y_temp1]==black_or_white)
num++;
else
break;
}
if(num>max_temp&&num<5)
max_temp=num;
max_num=max_temp;
return max_num;
}
public boolean judgeSuccess(int x,int y,boolean isodd){
int num=1;
int arrvalue;
int x_temp=x,y_temp=y;
if(isodd)
arrvalue=2;
else
arrvalue=1;
int x_temp1=x_temp,y_temp1=y_temp;
for(int i=1;i<6;i++){
x_temp1+=1;
if(x_temp1>)
break;
if(Show[x_temp1][y_temp1]==arrvalue)
num++;
else
break;
}
x_temp1=x_temp;
for(int i=1;i<6;i++){
x_temp1-=1;
if(x_temp1<0)
break;
if(Show[x_temp1][y_temp1]==arrvalue)
num++;
else
break;
}
if(num==5)
return true;
x_temp1=x_temp;
y_temp1=y_temp;
num=1;
for(int i=1;i<6;i++){
y_temp1-=1;
if(y_temp1<0)
break;
if(Show[x_temp1][y_temp1]==arrvalue)
num++;
else
break;
}
y_temp1=y_temp;
for(int i=1;i<6;i++){
y_temp1+=1;
if(y_temp1>)
break;
if(Show[x_temp1][y_temp1]==arrvalue)
num++;
else
break;
}
if(num==5)
return true;
x_temp1=x_temp;
y_temp1=y_temp;
num=1;
for(int i=1;i<6;i++){
x_temp1-=1;
y_temp1-=1;
if(y_temp1<0 || x_temp1<0)
break;
if(Show[x_temp1][y_temp1]==arrvalue)
num++;
else
break;
}
x_temp1=x_temp;
y_temp1=y_temp;
for(int i=1;i<6;i++){
x_temp1+=1;
y_temp1+=1;
if(y_temp1> || x_temp1>)
break;
if(Show[x_temp1][y_temp1]==arrvalue)
num++;
else
break;
}
if(num==5)
return true;
x_temp1=x_temp;
y_temp1=y_temp;
num=1;
for(int i=1;i<6;i++){
x_temp1+=1;
y_temp1-=1;
if(y_temp1<0 || x_temp1>)
break;
if(Show[x_temp1][y_temp1]==arrvalue)
num++;
else
break;
}
x_temp1=x_temp;
y_temp1=y_temp;
for(int i=1;i<6;i++){
x_temp1-=1;
y_temp1+=1;
if(y_temp1> || x_temp1<0)
break;
if(Show[x_temp1][y_temp1]==arrvalue)
num++;
else
break;
}
if(num==5)
return true;
return false;
}
public void showSuccess(JPanel jp){
ssageDialog(jp,"你赢了","结果",
ATION_MESSAGE);
}
public void showDefeat(JPanel jp){
ssageDialog(jp,"你输了","结果",
ATION_MESSAGE);
}
}
import Adapter;
import Event;
class ChessWindowEvent extends WindowAdapter{
public void windowClosing(WindowEvent e){
(0);
}
ChessWindowEvent()
{
}
}
public class FiveChessAppletDemo {
public static void main(String args[]){
ChessFrame cf = new ChessFrame();
();
}
}
import .*;
import .*;
import .*;
import .*;
import tream;
import nent;
import ;
class MainPanel extends JPanel
implements MouseListener,MouseMotionListener{
private int width,height;
private ChessModel cm;
MainPanel(ChessModel mm){
cm=mm;
width=th();
height=ght();
addMouseListener(this);
}
public void setModel(ChessModel mm){
cm = mm;
width = th();
height = ght();
}
public void paintComponent(Graphics g){
omponent(g);
for(int j = 0; j <= height; j++){
for(int i = 0; i <= width; i++){
int v = MapShow()[i][j];
draw(g, i, j, v);
}
}
}
public void draw(Graphics g, int i, int j, int v){
int x = 20 * i+20;
int y = 20 * j+20;
if(i!=width && j!=height){
or(ay);
ct(x,y,20,20);
}
if(v == 1 ){
or();
al(x-8,y-8,16,16);
or();
al(x-8,y-8,16,16);
}
if(v == 2 ){
or();
al(x-8,y-8,16,16);
or();
al(x-8,y-8,16,16);
}
if(v ==3){
or();
al(x-8,y-8,16,16);
}
}
public void mousePressed(MouseEvent evt){
int x = (()-10) / 20;
int y = (()-10) / 20;
n(x+" "+y);
if (ifiers()==1_MASK){
(x,y);
n(dd()+" "+MapShow()[x][y]);
repaint();
if(uccess(x,y,dd())){
ccess(this);
e();
uter=false;
}
if(uter&&!xist()){
erDo(th(),ght());
repaint();
if(uccess((),(),dd())){
feat(this);
e();
}
}
}
}
public void mouseClicked(MouseEvent evt){}
public void mouseReleased(MouseEvent evt){}
public void mouseEntered(MouseEvent mouseevt){}
public void mouseExited(MouseEvent mouseevent){}
public void mouseDragged(MouseEvent evt){}
public void mouseMoved(MouseEvent moveevt){
int x = (()-10) / 20;
int y = (()-10) / 20;
lay(x,y);
repaint();
}
}
版权声明:本文标题:JAVA课程设计 五子棋(内附完整代码) 内容由热心网友自发贡献,该文观点仅代表作者本人, 转载请联系作者并注明出处:https://www.elefans.com/dongtai/1716506057a506404.html, 本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容,一经查实,本站将立刻删除。
发表评论