Java课程设计项目《简单五子棋》-基础源代码

闲来无事,简单整理了一下以前做的Java课设。当时是借鉴学习了大佬的代码,然后稍稍改动了一些东西。比较普通,可以再加些功能。

百度网盘链接https://pan.baidu.com/s/106ifjqCVSHsoNyDs7gGdJQ?pwd=hikq

使用的是Eclipse,源码可以参考视频里的操作,正常应该是没啥问题的,注解也比较详细。

B站【Java课程设计项目《简单五子棋》-基础源代码】

效果展示:

ButtonListener类

//实现对JPanel的监听接口处理
public class ButtonListener implements GoBangconfig,ActionListener{
	public GoBangframe gf;
	static int q=0;
	public ButtonListener(GoBangframe gf) {
		this.gf=gf;//获取左半部分的画板
	}
	//当界面发生操作时进行处理
	public void actionPerformed(ActionEvent e) {
		//获取当前被点击按钮的内容,判断是不是"开始新游戏"这个按钮
		if(e.getActionCommand().equals("开始新游戏")) {
			//如果是开始新游戏的按钮,再为左半部分设置监听方法
			    q++;
			    gf.textA.setText("  开始新游戏!");
				frameListener fl=new frameListener();
			    fl.setGraphics(gf);//获取画笔对象
		        gf.addMouseListener(fl);
		}
		//判断当前点击的按钮是不是悔棋
		else if(e.getActionCommand().equals("悔棋")) {
			if(gf.ChessPositonList.size()>1) {
				//把棋子数组相应的位置置为0;
				ChessPosition l=new ChessPosition();
				//获取最后一个棋子的对象信息
				l=gf.ChessPositonList.remove(gf.ChessPositonList.size()-1);
				//把相应的数组位置置为0
				gf.isAvail[l.Listi][l.Listj]=0;
				//把玩家还原为上一步的玩家
				if(gf.turn==1) gf.turn++;
				else gf.turn--;
				gf.textA.setText(" ");
				
				//直接调用gf的重绘方法,重绘方法的画笔应该是在棋盘页面还没生成的时候就要获取
				//调用repaint会自动调用paint方法,而且不用给参数
				gf.repaint();
				//gf.paint(gf.getGraphics());
			}
			else { 
				gf.textA.setText("   不能悔棋!");
				//System.out.println("不能悔棋!");
			}
		}
		else if(e.getActionCommand().equals("认输")) {
			if(gf.turn==1) gf.textA.setText("    白方赢!");//System.out.println("白方赢");
			else gf.textA.setText("    黑方赢!"); //System.out.println("黑方赢");
		}
	}
}

ChessPosition类

//新建一个棋子类ChessPosition保存每一步棋子所在的位置
public class ChessPosition {
	public int Listi,Listj;
	
	public ChessPosition() {
		
	}
	public ChessPosition(int Listi,int Listj) {
		this.Listi=Listi;
		this.Listj=Listj;
	}
}

frameListener类

//实现对GoBangframe下棋界面的监听接口处理
public class frameListener implements GoBangconfig,MouseListener{
	public GoBangframe gf;
	//public int turn;//判断当前轮到谁了,1表示黑方,2表示白方
	//动态数组对象的实例化
	//public ArrayList<ChessPosition>ChessPositonList=new ArrayList<ChessPosition>();
	
	public void setGraphics(GoBangframe gf) {
		this.gf=gf;
		//清除棋盘的全部信息
		for(int i=0;i<row;i++) 
			for(int j=0;j<column;j++) {
				gf.isAvail[i][j]=0;
				
			}
		gf.ChessPositonList.clear();
		gf.turn=1;
		gf.repaint();
	}
	
	
	  public void mouseClicked(java.awt.event.MouseEvent e) {
		  int x=e.getX();
		  int y=e.getY();
		  //计算棋子要落在棋盘的哪个交叉点上
		  int countx=(x/40)*40+20;
		  int county=(y/40)*40+20;
		  Graphics g=gf.getGraphics();
		  
		 // System.out.println(gf.isAvail[0][0]);
		  
		  if(gf.isAvail[(countx-20)/40][(county-20)/40]!=0) {
			  if(ButtonListener.q>1) {
				  return;
			  }
			  gf.textA.setText("此处已经有棋子了,请下在其它地方");
			  //System.out.println("此处已经有棋子了,请下在其它地方");
		  }
		  else {
			  //计算棋盘上棋子在数组中相应的位置
			  int colu=(countx-20)/40;
			  int ro=(county-20)/40;
			  
			  if(gf.turn==1) {
				  //先获取要落的地方
				  g.setColor(Color.black);
				  //落子
				  g.fillOval(countx-size/2, county-size/2, size, size);
				  //设置当前位置已经有棋子了,棋子为黑子
				  gf.isAvail[colu][ro]=1;
				  //把当前所下的棋子位置保存在动态数组中
				  gf.ChessPositonList.add(new ChessPosition(colu,ro));
				  gf.turn++;
				  gf.textA.setText("黑方已下:白方手");
				  //判断是否已经出现五颗棋子了
				  //列判断
				  //首先界定数组范围,防止越界
				  int imin=colu-4,imax=colu+4;
				  if(imin<0) imin=0;
				  if(imax>18) imax=18;
				  int count1=0;//判断相连的黑棋子数
				  for(int i=imin;i<=imax;i++) {
					  if(gf.isAvail[i][ro]==1) count1++;
					  //如果出现了其他棋子,或者是没有棋子时,就重新开始计数
					  else count1=0;
					  if(count1==5) { 
						  gf.textA.setText("    黑方赢!");
						  return;
					  }
				  }
				  //行判断
				  //首先界定数组范围,防止越界
				  int jmin=ro-4,jmax=ro+4;
				  if(jmin<0) jmin=0;
				  if(jmax>18) jmax=18;
				  int count2=0;//判断相连的棋子数
				  for(int j=jmin;j<=jmax;j++) {
					  if(gf.isAvail[colu][j]==1) count2++;
					  else count2=0;
					  if(count2==5) {
						  gf.textA.setText("    黑方赢!");
						  return;
					  }
					//如果出现了其他棋子,或者是没有棋子时,就重新开始计数
					  
				  }
				  //左对角线判断
				  //首先界定数组范围,防止越界
				  int count3=0;//判断相连的棋子数
				  for(int i=-4;i<=4;i++) {
					  if((colu+i>=0)&&(ro+i>=0)&&(colu+i<=18)&&(ro+i<=18)) {
						  if(gf.isAvail[colu+i][ro+i]==1) count3++;
							//如果出现了其他棋子,或者是没有棋子时,就重新开始计数
						  else count3=0;
						  if(count3==5) {
							  gf.textA.setText("    黑方赢!");
							  return;
						  }
					  }
				  }
				  //右对角线判断
				  int count4=0;//判断相连的棋子数
				  for(int i=-4;i<=4;i++) {
					  if((colu+i>=0)&&(ro-i>=0)&&(colu+i<=18)&&(ro-i<=18)) {
						  //System.out.print("count4:"+count4);
						  if(gf.isAvail[colu+i][ro-i]==1) count4++;
							//如果出现了其他棋子,或者是没有棋子时,就重新开始计数
						  else count4=0;
						  if(count4==5) {
							  gf.textA.setText("    黑方赢!");
							  return;
						  }
					  }
				  }
			  }
			  else {
				  g.setColor(Color.white);
				  g.fillOval(countx-size/2, county-size/2, size, size);
				  //设置当前位置已经有棋子了,棋子为白子
				  gf.ChessPositonList.add(new ChessPosition(colu,ro));
				  gf.isAvail[colu][ro]=2;
				  gf.turn--;
				  gf.textA.setText("白方已下:黑方手");
				  //列判断
				  //首先界定数组范围,防止越界
				  int imin=colu-4,imax=colu+4;
				  if(imin<0) imin=0;
				  if(imax>18) imax=18;
				  int count1=0;//判断相连的白棋子数
				  for(int i=imin;i<=imax;i++) {
					  if(gf.isAvail[i][ro]==2) count1++;
					//如果出现了其他棋子,或者是没有棋子时,就重新开始计数
					  else count1=0;
					  if(count1==5) {
						  gf.textA.setText("    白方赢!");
						  return;
					  }
				  }
				  //行判断
				  //首先界定数组范围,防止越界
				  int jmin=ro-4,jmax=ro+4;
				  if(jmin<0) jmin=0;
				  if(jmax>18) jmax=18;
				  int count2=0;//判断相连的棋子数
				  for(int j=jmin;j<=jmax;j++) {
					  if(gf.isAvail[colu][j]==2) count2++;
					  //如果出现了其他棋子,或者是没有棋子时,就重新开始计数
					  else count2=0;
					  if(count2==5) {
						  gf.textA.setText("    白方赢!");
						  return;
					  } 
				  }
				  //左对角线判断
				  //首先界定数组范围,防止越界
				  int count3=0;//判断相连的棋子数
				  for(int i=-4;i<=4;i++) {
					  if((colu+i>=0)&&(ro+i>=0)&&(colu+i<=18)&&(ro+i<=18)) {
						  if(gf.isAvail[colu+i][ro+i]==2) count3++;
						  //如果出现了其他棋子,或者是没有棋子时,就重新开始计数
						  else count3=0;
						  if(count3==5) {
							  gf.textA.setText("    白方赢!");
							  return;
						  }
					  }
				  }
				  //右对角线判断
				  int count4=0;//判断相连的棋子数
				  for(int i=-4;i<=4;i++) {
					  if((colu+i>=0)&&(ro-i>=0)&&(colu+i<=18)&&(ro-i<=18)) {
						  if(gf.isAvail[colu+i][ro-i]==2) count4++;
						  //如果出现了其他棋子,或者是没有棋子时,就重新开始计数
						  else count4=0;
						  if(count4==5) {
							  gf.textA.setText("    白方赢!");
							  return;
						  }
					  }
				  }
			  }
		  }
	  }
	  
	  public void mousePressed(java.awt.event.MouseEvent e) {
	  }
	  public void mouseReleased(java.awt.event.MouseEvent e) {
	  }
	  public void mouseEntered(java.awt.event.MouseEvent e) {
	  }
	  public void mouseExited(java.awt.event.MouseEvent e) {
	  }
}

GoBangconfig类

//定义GoBangconfig接口
//定义与棋盘数据相关的接口,保存棋盘的起点,格子大小,行数列数等信息
public interface GoBangconfig {
	int x=20,y=20,size=40,row=19,column=19;
}

GoBangframe类

public class GoBangframe extends JPanel implements GoBangconfig{
	public Graphics g;//定义一支画笔
	public int[][] isAvail=new int [19][19];//定义一个二维数组来储存棋盘的落子情况
	public ArrayList<ChessPosition>ChessPositonList=new ArrayList<ChessPosition>();//保存每一步的落子情况
	public int turn=1;
	JTextArea textA = new JTextArea("点击:开始新游戏(才能开始!!!)",10,15);
	JTextArea textB = new JTextArea(" 设计人:xxx",0,15);
	Font f1= new Font("宋体",Font.BOLD,15);
	Font f2= new Font("宋体",Font.BOLD,15);
	
	//主函数入口
	
	public static void main(String args[]) {
		GoBangframe gf=new GoBangframe();//初始化一个五子棋界面的对象
		gf.initUI();//调用方法进行界面的初始化
	}
	
	public void initUI() {
		//初始化一个界面,并设置标题大小等属性
		JFrame jf=new JFrame();
		jf.setTitle("五子棋");
		jf.setSize(927,800);
		jf.setLocationRelativeTo(null);
		jf.setDefaultCloseOperation(3);
		
		jf.setLayout(new BorderLayout());//设置顶级容器JFrame为框架布局
		
		Dimension dim1=new Dimension(150,0);//设置右半部分的大小
		Dimension dim3=new Dimension(800,0);//设置左半部分的大小
		Dimension dim2=new Dimension(140,40);//设置右边按钮组件的大小
		
		//实现左边的界面,把GoBangframe的对象添加到框架布局的中间部分
		this.setPreferredSize(dim3);//设置下棋界面的大小
		this.setBackground(Color.GRAY);//设置下棋界面的颜色
		//这里的话直接把左边的画板添加上去,指明是在框架布局的中间版块
		//若放在其他版块会有一些小问题
		jf.add(this,BorderLayout.CENTER);//添加到框架布局的中间部分
		
		//实现右边的JPanel容器界面
		JPanel jp=new JPanel();
		jp.setPreferredSize(dim1);//设置JPanel的大小
		jp.setBackground(Color.white);//设置右边的界面颜色为白色
		jf.add(jp,BorderLayout.EAST);//添加到框架布局的东边部分
		jp.setLayout(new FlowLayout());//设置JPanel为流式布局
		
		//添加作者
		textB.setFont(f2);
		jp.add(textB);
		
		//接下来我们需要把按钮等组件依次加到那个JPanel上面
		//设置按钮数组
		String[] butname= {"开始新游戏","悔棋","认输"};
		JButton[] button=new JButton[3];
		
		//依次把三个按钮组件加上去
		for(int i=0;i<butname.length;i++) {
			button[i]=new JButton(butname[i]);
			button[i].setPreferredSize(dim2);
			jp.add(button[i]);
		}
		
		//添加文本框
		textA.setFont(f1);
		textA.setLineWrap(true);//设置自动换行
		jp.add(textA);
		
		//按钮监控类
		ButtonListener butListen=new ButtonListener(this);
		//对每一个按钮都添加状态事件的监听处理机制
		for(int i=0;i<butname.length;i++) {
			button[i].addActionListener(butListen);//添加发生操作的监听方法
		}
		
		jf.setVisible(true);
	}
	
	
	//重写重绘方法,这里重写的是第一个大的JPanel的方法
	public void paint(Graphics g) {
		super.paint(g);
		
		//重绘出棋盘
		g.setColor(Color.black);
		for(int i=0;i<row;i++) {
			g.drawLine(x, y+size*i, x+size*(column-1), y+size*i);
		}
		for(int j=0;j<column;j++) {
			g.drawLine(x+size*j, y, x+size*j, y+size*(row-1));
		}
		
		//重绘出棋子
		for(int i=0;i<row;i++) {
			for(int j=0;j<column;j++) {
				if(isAvail[i][j]==1) {
					int countx=size*i+20;
					int county=size*j+20;
					g.setColor(Color.black);
					g.fillOval(countx-size/2, county-size/2, size, size);
				}
				else if(isAvail[i][j]==2) {
					int countx=size*i+20;
					int county=size*j+20;
					g.setColor(Color.white);
					g.fillOval(countx-size/2, county-size/2, size, size);
				}
			}
		}
	}
}

  • 1
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 6
    评论
晓庄学院 《JAVA程序设计》课程设计报告 "题 目: " 五子棋游戏的设计与实现 " "姓 名: "野 " "学 号: "12130818 " "班 级: "12软件工程转本2班 " "指导教师: "王峥 " "完成时间 "7月1日 " "成 绩: " " 信息工程学院 2015年6月 目录 1引言1 1.1系统开发背景2 1.1系统开发的目的和意义3 1.2完成的主要工作4 2需求分析和总体设计4 2.1需求分析与设计思路5 2.1.1关键技术说明5 2.1.2需求分析5 2.1.3系统设计方案与思路5 2.1.4系统目录结构说明5 2.2系统功能结构6 3详细设计7 3.1系统模块实现9 4系统运行结果10 5课程设计总结12 五子棋游戏的设计与实现 引言 五子棋相传起源于四千多年前的尧帝时期,比围棋的历史还要悠久,可能早在"尧 造围棋"之前,民间就已有五子棋游戏。有关早期五子棋的文史资料与围棋有相似之 处,因为古代五子棋的棋具与围棋是完全相同的。在上古的神话传说中有"女娲造人 ,伏羲做棋"一说,《增山海经》中记载:"休舆之山有石焉,名曰帝台之棋,五色而文 状鹑卵。"善注引三国淳《艺经》中曰:"棋局,纵横各十七道,合二百八十九道,白黑 棋子,各一百五十枚"。这段虽没明讲是何种棋类,但至少知道远古就以漂亮的石头 为棋子。因而规则简单五子棋也可能出自当时,并是用石子作棋子。亦有传说,五 子棋最初流行于少数民族地区,以后渐渐演变成围棋并在炎黄子后代中遍及开来。 1 系统开发背景 在计算机逐步渗入社会生活各个层面的今天,计算机已经成为了人们日常生活中 的一部分,越来越多的人使用计算机办公、娱乐等等。在这其中,系统自带的小游戏 也占据了相当重要的地位,与那些网络游戏和3D游戏相比,它有编写简单容易上手等 特点,非常适合人们在完成工作的时候适当的娱乐要求。这些小游戏大都是以益智和 娱乐为目的,不仅给紧工作的人们以放松,还可以让人们的大脑得到开发。 2 完成的主要工作 设计一个15 15围棋棋盘,由两玩家交替进行对战,并可以实现以下功能: 1.选择黑子先下 2.设置双方下棋总共时长 3.刷新重新开始 4.悔棋 5.认输 6.退出提示 实现一个简单的多用户五子棋的游戏程序,包括如下两个界面 (1)选择对弈桌(执黑、执白)。 (2)在游戏界面,有开始,退出(游戏未结束、点退出自动判负); 1.3需求分析与设计思路 1. 用户需求调查分析 2. 构思代码模块 3. 总体设计 4. 详细设计 5. 代码编写 2需求分析和总体设计 1. 2. 4 需求分析与设计思路 此系统为智力游戏,采用JAVA的MVC模式,根据不同功能划分不同模块,该五子棋 游戏功能虽然简单,然是实现了人机对战,所以从这个角度来说,此款游戏能准确的 计算棋局。虽然系统不大,但是可以实现基本的五子棋功能,以及悔棋。 2.1.2需求分析 五子棋,是一种两人对弈的纯策略型棋类游戏,亦称"串珠"、"连五子";是中国 民间非常熟知的一个古老棋种。相传,它起源于四千多年前的尧帝时期,比围棋的历 史还要悠久。亦有传说,五子棋最初流行于少数民族地区,以后渐渐演变成围棋并在 炎黄子后代中遍及开来。 五子棋发展于日本,流行于欧美。容易上手,老少皆宜,而且趣味横生,引人入胜; 不仅能增强思维能力,提高智力,而且富含哲理,有助于修身养性。 2.1.3设计方案与思路 传统五子棋的棋具与围棋相同,棋子分为黑白两色,棋盘为15X15,棋子放置于棋 盘线交叉点上。两人对局,各执一色,轮流下一子,先将横、竖或斜线的5个或5个以 上同色棋子连成不间断的一排者为胜。因为传统五子棋在落子后不能移动或拿掉,所 以也可以用纸和笔来进行游戏。 2.1.4系统目录结构说明 对系统包结构、文件结构列表说明,如表2-1、2-2所示。 表2-1主页面表 "包名 "作用 " "src "容纳所有文件 " 表2-2文件表 "文件名 "作用 " "Game.java "运行文件 " "GameFrame.java " " "Cheerup.java " " "PaintPanel.java " " 5 系统功能结构 3.1详细设计 1. 系统模块实现 "按钮 "事件 " "悔棋事件 "class Back implements ActionListener " "认输事件 "class Fail extends JFrame implementsActionListener" "关于事件 "class About extends JFrame implements " " "ActionListener " "设置事件 "class Set implements ActionListener " "退出事件 "classExite
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值