`
XY1991
  • 浏览: 36926 次
  • 性别: Icon_minigender_2
  • 来自: 长沙
社区版块
存档分类
最新评论

五子棋小结(人人对战)

阅读更多

五子棋是我学习Java后写的第二个小游戏,初步实现了五子棋的人人对战。
 下面简单介绍一下我的五子棋及其我在编写过程中遇到的一些问题,但愿大家可以避免我走的一些弯路
 
 我的五子棋经历了如下四个步骤:
 一、将五子棋的界面做出来(  棋盘  棋子)
 二、对棋子进行一些设置 ( 如黑白分明  棋子下在棋盘的交点上    已下棋子的位置不能再下等)
 三、判断输赢
 四、悔棋和重新开局


 五子棋的界面    
  主要是重写父类中的paint方法,及其重绘  由于之前做过画板的重绘,这步没花费太多时间
 对棋子进行基本的设置
  就开始接触最最基本的算法了,也是我第一次写算法,在磕磕碰碰中实现了,主要是根据获取鼠标点击的坐标,判断距离最近的棋盘交点,把棋子放在最近的交点上


 判断输赢
  从这步开始就有点纠结了,总是自己很清楚算法是怎样的,就是无法用Java语言准确的表达出来
  横向纵向判断还好,因为坐标的i j值只有一个变化,用一个for循环就可以解决了
  到斜着的两个方向,i j值则变成了同增同减  或者  此消彼长的关系,我以前写的for循环里面只有一个变量,由于对for语句了解的局限性,
  耗费了很多功夫,最后只能一个for循环设置两个变量,这么一试,问题解决了,松了一口气
  判断输赢时还要注意数组越界的问题
  四个方向计算连在一起的最大棋子数时最好分别计数,避免互相干扰

 

//横向判断
	public int XWin(int i,int  j){
		ch = cl.getChess();
		value = ch[i][j];
		s1=1;
		for (int b=j+1; b<ch[0].length; b++) {
			int temp = ch[i][b];
			if (temp == value) {
				s1++;
			}else{
				break;
			}
		}
		for (int b=j-1; b>=0; b--) {
			int temp = ch[i][b];
			if (temp == value) {
				s1++;
			}else{
				break;
			}
		}
		return s1;
	}
	
	//纵向判断
	public int YWin(int i,int  j){
		ch = cl.getChess();
		value = ch[i][j];
		s2 = 1; 
		for (int b=i+1; b<ch[0].length; b++) {
			int temp = ch[b][j];
			if (temp == value) {
				s2++;
			}else{
				break;
			}
		}
		for (int b=i-1; b>=0; b--) {
			int temp = ch[b][j];
			if (temp == value) {
				s2++;
			}else{
				 
				break;
			}
		}
		return s2;
	}
	
	//斜向判断1
	public int XYWin(int i,int  j){
		ch = cl.getChess();
		value = ch[i][j];
		s3 = 1;
		for (int b=j+1, a=i+1; b<ch[0].length&&a<ch[0].length; b++,a++){ 
			int temp = ch[a][b];
			if (temp == value) {
				s3++;
			}else{
				break;
			}
		}
		for (int b=j-1, a=i-1; b>=0&&a>=0; b--,a--){
			 int temp = ch[a][b];
			if (temp == value) {
				 s3++;
			}else{
			 
				break;
			}
		}
		return s3;
	}
	
	//斜向判断2
	public int YXWin(int i,int  j){
		ch = cl.getChess();
		value = ch[i][j];
		s4 = 1;
		for (int a=i+1,b=j-1; a<ch[0].length&&b>=0;a++,b--) {
			int temp = ch[a][b];
			if (temp == value) {
				s4++;
			}else{
				break;
			}
		}
		for (int a=i-1, b=j+1; a>=0&&b<ch[0].length; a--,b++) {
			 int temp = ch[a][b];
			if (temp == value) {
				s4++;
			}else{
				break;
			}
		}
		return s4;
	}

  
 悔棋
  悔棋的算法有很多,我用的是数组,也可以用堆栈的方法
  用一个n行2列的数组保存已下棋子的ij值,n值取决于棋盘能容纳的最大棋子数
  前面在区别黑白棋时,用一个二维数组 ch[][]白棋保存1  黑子保存2,悔棋就是把保存的数值赋为0,然后重绘
  由于我只悔棋一步,悔棋后下白子还是黑子要判断一下

//实现悔棋
	public void stepBack(){ 
		//得到保存棋子种类的数组
		ch=cl.getChess();
		//得到保存棋子坐标的数组
		chi = cl.getChi();
		chj = cl.getChj();
		
		for(int m=0;m<1;m++){
			//获取已下的棋子数
			n=cl.getN();
			i=chi[n][1];
			j=chj[n][1];
			//悔棋后将棋子的坐标等参数重置为0
			ch[i][j]=0;
 			chi[n][1]=0;
			chj[n][1]=0;
			n--;
		}
		
		//悔棋后仍下该颜色的棋子
		count = cl.getCount();
		if(count==0){
			cl.setCount(1);
		}else{
			cl.setCount(0);
			}
		wzq.paint(g);		
	}
	
	//重新开局
	public void restart(){
		ch=cl.getChess();
		for(int i=0;i<ch.length;i++){
			for(int j=0;j<ch[i].length;j++){
				ch[i][j]=0;	
			}	
		}
		for(int i=0;i<200;i++){
			for(int j=0;j<2;j++){
				//重新开局后将数组清空
				chi[i][j]=0;
				chj[i][j]=0;
			}
		}
		//所下棋子数设为0
		cl.setN(0);
		cl.setCount(0);
		wzq.paint(g); 
		choose = cl.isChoose();
		if(choose == true){
			//只有输赢结果出来后才加上监听器
			wzq.addMouseListener(cl);
			cl.setChoose(false);
		}

	}

   
 
 由于之前一直对参数传递不太熟,只要不在一个类里面就手足无措,通过这个小项目,我更好的理解了如何传递参数,
 还有利用source中的Generate Getters and Setters 现成的方法 可以省好多力气的
 总是在不断地发现问题和解决问题中进步,不要害怕遇到问题,写程序中总会遇到问题的
 下一步,该好好想想如何实现人机对战了。

5
2
分享到:
评论

相关推荐

    QT五子棋人机对战人人对战

    人人对战模式则主要依赖于网络编程技术,让两个玩家可以在同一网络环境下进行实时对战。这可能涉及到TCP/IP协议的使用,以及数据的序列化和反序列化,确保棋步在网络传输过程中的准确无误。如果游戏支持跨平台对战,...

    五子棋1.1_人人对战

    《五子棋1.1_人人对战》是一款经典的在线双人对弈游戏,它集策略与娱乐于一体,深受广大玩家喜爱。在这个版本中,五子棋不仅包含了基本的对战模式,还特意加入了悔棋功能,使得游戏过程更加灵活多变,增加了玩家的...

    五子棋代码,人人对战,绿色背景

    五子棋代码,人人对战,绿色背景

    五子棋 人人对战 人机对战

    《五子棋游戏详解:人人对战与人机对战技术》 五子棋,作为一项深受人们喜爱的传统智力游戏,其简洁的规则和深奥的策略性使其在电子游戏领域也有着广泛的适应性。本篇文章将围绕"五子棋 人人对战 人机对战"这一主题...

    五子棋人人对战小游戏java代码

    【五子棋人人对战小游戏】是基于Java编程语言实现的一款经典桌面游戏,它通过简单的图形界面让两位玩家可以在线上或本地进行实时对战。这款游戏的代码结构清晰,易于理解,非常适合初学者学习和研究Java图形用户界面...

    五子棋【人人对战】

    本项目"五子棋【人人对战】"就是一个基于移动端的简易五子棋游戏,开发者利用Android平台上的`View`组件进行界面布局和游戏逻辑的实现。在这里,我们将深入探讨`View`组件在游戏开发中的应用以及五子棋游戏的基本...

    MFC 五子棋 人人对战

    标题 "MFC 五子棋 人人对战" 指的是一个使用Microsoft Foundation Classes (MFC) 开发的五子棋游戏,允许两个人面对面进行对战。MFC 是微软提供的一套C++类库,它基于Windows API,简化了Windows应用程序的开发。这...

    五子棋C语言(支持人人对战、人机对战,含禁手)

    在本项目中,我们主要探讨的是一个用C语言编写的五子棋游戏,它支持人与人之间的对战以及人与计算机之间的对战,并且包含了禁手规则。下面将详细介绍这个项目的各个知识点。 1. **C语言编程**:C语言是一种基础且...

    五子棋小游戏 人人对战 跟人机对战

    一个很好的 很不错的五子棋小游戏C++代码 帮你们过课程设计没问题

    基于QT的五子棋 人人对战 人机对战 程序与程序对战

    本项目基于QT框架,实现了五子棋的多人对战模式,包括人人对战、人机对战以及程序与程序对战。 【QT框架详解】 QT是一个跨平台的C++库,它提供了丰富的GUI工具包,支持Windows、Linux、macOS等多种操作系统。QT库...

    java实现的人人对战五子棋

    标题 "java实现的人人对战五子棋" 暗示了这是一个使用Java编程语言开发的五子棋游戏,允许两个玩家通过网络或同一设备进行对战。在五子棋游戏中,目标是先将五个棋子连成一线(水平、垂直或对角线)的玩家获胜。下面...

    五子棋——人人对战

    NULL 博文链接:https://1075345532.iteye.com/blog/1882153

    VC++五子棋程序集合(内含有控制台下、窗体界面、人机对战、人人对战和五子棋算法精析等多个经典之作源代码)全部亲自测试后,都能在VC6.0环境下直接编译成功!

    这个压缩包文件包含了一系列关于VC++五子棋程序的源代码,涵盖了从基本的控制台应用到具有图形用户界面(GUI)的人机对战和人人对战模式。这些项目不仅展示了VC++编程的基础,还深入探讨了五子棋游戏的核心算法。 ...

    VC++人人对战五子棋代码

    【标题】:“VC++人人对战五子棋代码”是一个基于C++编程语言开发的五子棋游戏项目,特别设计为人与人之间的实时对弈。这个项目的核心目标是实现一个简单而直观的用户界面,让两个玩家可以在同一台计算机上进行...

    Java 五子棋 人人对战

    【Java五子棋人人对战】是一个基于Java编程语言实现的简单桌面游戏,它允许两位玩家在同一设备上进行对弈。这个项目可能是为一个IT课程的实验报告而创建的,但与作者之前的作品相比,其功能可能有所简化,因为描述中...

    五子棋(AI人机对战,人人对战,国际化,读设残局)

    在这个数字化的时代,一款名为“五子棋(AI人机对战,人人对战,国际化,读设残局)”的软件应运而生,为玩家提供了更为丰富的对弈体验。该软件不仅支持人机对战,让玩家可以与智能AI一较高下,还实现了人人对战模式...

    简易五子棋(人人对战型)开发

    【简易五子棋(人人对战型)开发】是一个基于C#编程语言的项目,主要目的是实现一个简单直观的五子棋游戏,让两位玩家能够通过计算机进行对弈。在这个项目中,开发者利用了Windows Forms应用程序框架,以及GDI+图形...

    五子棋gobangmfc带有网络对战的五子棋mfc带有网络对战的五子棋

    带网络功能的,用mfc编写的,很强大的比较全面的五子棋。带网络功能的,用mfc编写的,很强大的比较全面的五子棋。带网络功能的,用mfc编写的,很强大的比较全面的五子棋。带网络功能的,用mfc编写的,很强大的比较...

    VC++做的人人对战五子棋

    【标题】"VC++做的人人对战五子棋"是一个使用Microsoft Visual C++开发的双人对战五子棋游戏。在这个项目中,开发者利用C++编程语言和可能的MFC(Microsoft Foundation Classes)库来创建用户界面,实现棋盘逻辑以及...

    java五子棋人人对战可悔棋

    【Java五子棋人人对战可悔棋】是一款基于Java编程语言实现的两人对弈的五子棋游戏,允许玩家在走错棋步时进行悔棋操作,为玩家提供了更加自由的游戏体验。该项目由个人独立完成,并获得了老师的高度评价,成绩A+。...

Global site tag (gtag.js) - Google Analytics