编写一个五子棋代码量不会很大,但这好歹也算是个项目,所以还是需要花点时间的。看别人的代码需要耐心,要看懂别人的代码就更需要耐心了,作为一个程序员也就是需要这样的耐心。当然,在代码里我会尽量的多加一些注释来提高代码的可读性,唯一的要求就是要读者们一步一步的跟着我来,顺着我的思路一步一步的深入,这样才能最终达到我写这篇博客和你看这篇博客的目的。
那下面呢,我就具体介绍一下人人五子棋是如何实现的。
1)首先我们要有一个五子棋界面,就是画出许多行横线和许多行竖线
private void DrawCheesTable(Graphics g) { // TODO Auto-generated method stub //画出指定的行数 for( int i = 0; i < Config.ROWS; i++) g.drawLine(Config.X0, Config.Y0 + Config.SIZE * i, Config.X0 + Config.SIZE *( Config.COLUMNS - 1), Config.Y0 +Config.SIZE * i); //画出指定的列数 for( int i = 0; i < Config.COLUMNS; i++) g.drawLine(Config.X0 + Config.SIZE * i,Config.Y0, Config.X0 + Config.SIZE * i,Config.Y0 +( Config.ROWS - 1) * Config.SIZE); }
看到上面的代码里面有一些奇怪的符号吧,不急,那是我事先定义好的保存常量数据的类。另外,for语句中画线所用到的数据是如何给定的,留给读者自己分析了。
2)创建一个保存常量的类,为了方便我们改变棋子大小,棋盘大小
棋盘画好了,现在就来实现释放鼠标时画填充圆。鼠标释放,就用到 public void mouseReleased(MouseEvent e) {}函数,于是就要监听器类extends java.awt.event.MouseAdapter了。
public interface Config { //棋盘的初始点坐标 public static final int X0 = 50; public static final int Y0 = 50; //多少列多少行 public static final int ROWS = 11; public static final int COLUMNS = 14; //棋子的大小 //格子的大小 public static final int CHESS_SIZE = 40; public static final int SIZE = 40; }
3)鼠标释放方法
public void mouseReleased(MouseEvent e) { //得到鼠标释放时的点的坐标 int x1 = e.getX(); int y1 = e.getY(); //按下点后我们就去找 它在拿个交点附近 for(int i = 0; i < Config.ROWS; i++){ for(int j = 0; j < Config.COLUMNS; j++){ //得到每一个交点的值 xx = Config.X0 + Config.SIZE * j; yy = Config.Y0 + Config.SIZE * i; //如果这个交点可以放棋子 if(FiveChress_array[i][j] == 0) //判断离谁更近 if(x1 > xx - Config.SIZE/3 && x1 < xx + Config.SIZE/ 3 && y1 > yy - Config.SIZE /3 && y1 < yy + Config.SIZE /3 ) //花黑棋 if(count){ System.out.println("再黑棋中xx的值是 " +xx +"\t" + "在黑棋中yy的值是 " + yy); //画出来的是黑棋 g.setColor(java.awt.Color.BLACK); g.fillOval(xx - Config.CHESS_SIZE/2, yy - Config.CHESS_SIZE/2, Config.CHESS_SIZE, Config.CHESS_SIZE); //下一次是画白棋 count = false; //用数组记录每个交点的属性 1黑棋 0空白 -1白棋 FiveChress_array[i][j] = 1; x = j; y = i; //画出了点酒结束 不再循环 break; }else{ //画白棋 System.out.println("再白棋中xx的值是 " +xx +"\t" + "在白棋中yy的值是 " + yy); g.setColor(java.awt.Color.WHITE); g.fillOval(xx - Config.CHESS_SIZE/2, yy - Config.CHESS_SIZE/2, Config.CHESS_SIZE, Config.CHESS_SIZE); count = true; FiveChress_array[i][j] = -1 ; x = j; y = i; //画出了点酒结束 不再循环 break; } } } //调用判断是否赢棋函数 win_or_not(x,y); }
这其中包含了一个判断鼠标按下点离哪个棋盘交点最近的算法,留给读者自己分析了。里面同时有使用很多的变量它们的声明如下
//定义画板对象 private java.awt.Graphics g; //每个棋子的基本属性 true表示要放黑棋 false表示要放白棋 private boolean count = true; //再创建两个数来表示交点坐标 使得画出来的圈圆心会在交点 private int xx,yy; //创建(x,y)来表示按下的那个点所放在的焦点坐标 比如(1,3) 表示第一行第三个交点 private int x,y; //创建一个数组记录每个可以放棋子的点的状态 0表示空 1表示黑棋 -1表示白棋 private int [][] FiveChress_array = new int[Config.ROWS][Config.COLUMNS];
4)鼠标监听器类的构造函数
//构造函数 public ChessListener(java.awt.Graphics g1 , int [][] FiveChress_array){ //地址传递 this.g = g1; this.FiveChress_array = FiveChress_array; }
现在我们的棋子可以下了,而且可以下在正确的位置上,下面要做的是实现win_or_not()函数了,该函数里我们要实现行列左倾斜,右倾斜的判断。
5)实现win_or_not()函数
private void win_or_not(int x, int y) { //如果在行列左斜右斜的方向上有了五个连续的同色棋子 就可以判断出输赢了 System.out.println("进入win_or_not函数"); if(check_row(x,y) || check_columns(x,y) || check_left(x,y) || check_right(x,y) ){ if(!count){ //黑棋赢了 JOptionPane.showMessageDialog(null,"我靠 黑棋赢了"); System.out.println("我靠 黑棋赢了"); }else{ //白棋赢了 JOptionPane.showMessageDialog(null,"我靠 白棋赢了"); System.out.println("我靠 白棋赢了"); } } }
在if判断里调用了判断行、列、左斜、右斜的函数。其中JOptionPane.showMessageDialog(null,"");是用来弹出一个对话框突出显示输赢。
6)check_row函数的实现
private boolean check_row(int x, int y) { int num = 0; //表示相同颜色的棋子个数 //开始向右找相邻的相同颜色的 for(int i = x ; i < Config.COLUMNS ; i++){ if(FiveChress_array[y][x] == FiveChress_array[y][i]){ //找到了 就加一 num ++; }else{ //找到了有一个不是 就跳出 break; } } //开始向左找相邻的相同颜色的 for(int i = x ; i > 0 ; i--){ if(FiveChress_array[y][x] == FiveChress_array[y][i-1]){ //找到了 就加一 num ++; }else{ //找到了有一个不是 就跳出 break; } } System.out.println("在check_row函数里num = " + num); //如果有了五个或五个以上的连续相同颜色就给出判断 true if(num >= 5) return true; else return false; }
7)check_columns函数的实现
private boolean check_columns(int x, int y) { int num = 0; //表示相同颜色的棋子个数 //开始向右找相邻的相同颜色的 for(int i = y ; i < Config.ROWS ; i++){ if(FiveChress_array[y][x] == FiveChress_array[i][x]){ //找到了 就加一 num ++; }else{ //找到了有一个不是 就跳出 break; } } //开始向左找相邻的相同颜色的 for(int i = y ; i > 0 ; i--){ if(FiveChress_array[y][x] == FiveChress_array[i-1][x]){ //找到了 就加一 num ++; }else{ //找到了有一个不是 就跳出 break; } } System.out.println("在check_columns函数中num = " + num); //如果有了五个或五个以上的连续相同颜色就给出判断 true if(num >= 5) return true; else return false; }
8)check_left函数的实现
private boolean check_left(int x, int y) { int num = 0; //表示相同颜色的棋子个数 //定义ix,jy记录下(y,x); int ix = x; int jy = y; //开始向右上找相邻的相同颜色的 for(int i = x, j = y;(Config.COLUMNS - i) < j ? (i < Config.COLUMNS) : j >= 0 ; i++,j--){ if(FiveChress_array[y][x] == FiveChress_array[j][i]){ //找到了 就加一 num ++; }else{ //找到了有一个不是 就跳出 break; } } //开始向左下角找相邻的相同颜色的 for(int i = ix, j = jy ; i <(Config.ROWS - j) ? i>=0 : (j < Config.ROWS) ; i--,j++){ if(FiveChress_array[jy][ix] == FiveChress_array[j][i]){ //找到了 就加一 num ++; }else{ //找到了有一个不是 就跳出 break; } } //在两个for循环里有两次和自己比较颜色 num--; System.out.println("在check_left函数里num = " + num); //如果有了五个或五个以上的连续相同颜色就给出判断 true if(num >= 5) return true; else return false; }
9)check_right函数的实现
private boolean check_right(int x, int y) { int num = 0; //表示相同颜色的棋子个数 //定义i,j记录下(y,x); int ix = x; int jy = y; //开始向右下角找相邻的相同颜色的 for(int i = x, j = y;(Config.COLUMNS - i) < (Config.ROWS - j) ? (i < Config.COLUMNS) : (j < Config.ROWS) ; i++,j++){ if(FiveChress_array[jy][ix] == FiveChress_array[j][i]){ //找到了 就加一 num ++; }else{ //找到了有一个不是 就跳出 break; } } //开始向左上角找相邻的相同颜色的 for(int i = ix, j = jy ; i < j ? i >= 0 : j >= 0 ; i--,j--){ if(FiveChress_array[y][x] == FiveChress_array[j][i]){ //找到了 就加一 num ++; }else{ //找到了有一个不是 就跳出 break; } } //在两个for循环里有两次和自己比较颜色 num--; System.out.println("在check_right函数里num = " + num); //如果有了五个或五个以上的连续相同颜色就给出判断 true if(num >= 5) return true; else return false; }
这些个方法都大同小异,主要注意它们的坐标,和递增递减关系,行和列一定不能表示错。x的改变就是列数的改变,y的改变就是行数的改变。
写到这里基本上人人五子棋就完成了,下面要做的就是重绘,因为之前我们已经有用一个二维数组及路线每一个交点的属性,现在这个也就比较好实现了。
10)paint函数的重写
public void paint(Graphics g1){ //先绘出各个组件 super.paint(g1); //绘出棋盘 DrawCheesTable(g1); //重绘棋子 DrawChees(g1); }
11)重绘棋子函数的实现
private void DrawChees(Graphics g1) { // TODO Auto-generated method stub for(int i = 0; i < Config.ROWS; i++){ for(int j = 0; j < Config.COLUMNS; j++){ //得到每一个交点的值 xx = Config.X0 + Config.SIZE * j; yy = Config.Y0 + Config.SIZE * i; if(FiveChress_array[i][j] == 1){ g.setColor(Color.BLACK); g.fillOval(xx - Config.CHESS_SIZE/2, yy - Config.CHESS_SIZE/2, Config.CHESS_SIZE, Config.CHESS_SIZE); }else if(FiveChress_array[i][j] == -1){ g.setColor(Color.WHITE); g.fillOval(xx - Config.CHESS_SIZE/2, yy - Config.CHESS_SIZE/2, Config.CHESS_SIZE, Config.CHESS_SIZE); } } } }
现在人人五子棋就完成了。
但,这还是无比不够的。首先非常重要的界面不够美观,悔棋,重新开始,判断输赢后就不可以再下棋等等都还没有实现,留给读者们自己扩展了。
相关推荐
文件名“五子棋程序之Fir最最终版”可能意味着项目经历了多次迭代,版本控制工具如Git的使用,有助于团队协作和代码管理。 总的来说,这个项目涵盖了C#编程、图形界面设计、游戏逻辑实现、人工智能、网络编程、多...
Java五子棋人机人人项目是一个利用Java编程语言实现的五子棋游戏,它支持人与人对战、人与计算机对战以及计算机与计算机之间的对战模式。在这个项目中,我们将探讨Java编程基础、图形用户界面(GUI)设计、算法实现...
本项目"五子棋【人人对战】"就是一个基于移动端的简易五子棋游戏,开发者利用Android平台上的`View`组件进行界面布局和游戏逻辑的实现。在这里,我们将深入探讨`View`组件在游戏开发中的应用以及五子棋游戏的基本...
人人对战模式则主要依赖于网络编程技术,让两个玩家可以在同一网络环境下进行实时对战。这可能涉及到TCP/IP协议的使用,以及数据的序列化和反序列化,确保棋步在网络传输过程中的准确无误。如果游戏支持跨平台对战,...
《五子棋:人人对弈与人机对弈模式解析》 五子棋,作为一种深受人们喜爱的传统棋类游戏,其简洁的规则和深邃的策略性吸引了无数玩家。在这个数字化时代,基于MFC(Microsoft Foundation Classes)开发的五子棋程序...
标题 "MFC 五子棋 人人对战" 指的是一个使用Microsoft Foundation Classes (MFC) 开发的五子棋游戏,允许两个人面对面进行对战。MFC 是微软提供的一套C++类库,它基于Windows API,简化了Windows应用程序的开发。这...
《五子棋1.1_人人对战》是一款经典的在线双人对弈游戏,它集策略与娱乐于一体,深受广大玩家喜爱。在这个版本中,五子棋不仅包含了基本的对战模式,还特意加入了悔棋功能,使得游戏过程更加灵活多变,增加了玩家的...
【简易五子棋(人人对战型)开发】是一个基于C#编程语言的项目,主要目的是实现一个简单直观的五子棋游戏,让两位玩家能够通过计算机进行对弈。在这个项目中,开发者利用了Windows Forms应用程序框架,以及GDI+图形...
【安卓五子棋人人对战】是一个专门为Android平台设计的双人对弈应用,它允许两位玩家在同一设备上进行实时的五子棋游戏。这款应用的核心特性是利用自定义View来构建游戏界面,以实现更加灵活和高效的游戏交互。下面...
五子棋是世界智力运动会竞技项目之一,是一种两人对弈的纯策略型棋类游戏,是世界智力运动会竞技项目之一,通常双方分别使用黑白两色的棋子,下在棋盘直线与横线的交叉点上,先形成5子连线者获胜。 棋具与围棋通用,...
- **AI对战**:虽然这个项目是人人对战,但可以作为基础,进一步开发AI对手,例如采用简单的Minimax算法或更高级的Alpha-Beta剪枝。 - **用户交互**:增加悔棋、重新开始、保存和加载游戏等功能,提升用户体验。 ...
这款名为"五子棋人人对战"的程序充分利用了Java的AWT(Abstract Window Toolkit)和Swing库来创建图形用户界面(GUI),使得用户可以进行直观的人机对战。 **Java AWT和Swing** AWT是Java最早提供的GUI库,它提供...
这个压缩包文件包含了一系列关于VC++五子棋程序的源代码,涵盖了从基本的控制台应用到具有图形用户界面(GUI)的人机对战和人人对战模式。这些项目不仅展示了VC++编程的基础,还深入探讨了五子棋游戏的核心算法。 ...
《五子棋图形界面人机或人人对战:VC++ MFC实现详解》 五子棋,古称“连珠”,是一种策略性两人棋类游戏,简单易学却蕴含深厚的战略思维。对于初涉游戏编程的学者而言,开发一款五子棋游戏是一个绝佳的实践项目。...
NULL 博文链接:https://1075345532.iteye.com/blog/1882153
在本项目中,我们主要探讨的是一个用C语言编写的五子棋游戏,它支持人与人之间的对战以及人与计算机之间的对战,并且包含了禁手规则。下面将详细介绍这个项目的各个知识点。 1. **C语言编程**:C语言是一种基础且...
【人人版五子棋】是一款基于鼠标操作的简易五子棋游戏,主要功能包括玩家下棋、悔棋以及计算胜负情况。在这个项目中,我们将会深入探讨其背后的编程原理和实现技术。 首先,五子棋游戏的核心算法是棋盘状态的判断与...
【标题】:“VC++人人对战五子棋代码”是一个基于C++编程语言开发的五子棋游戏项目,特别设计为人与人之间的实时对弈。这个项目的核心目标是实现一个简单而直观的用户界面,让两个玩家可以在同一台计算机上进行...
可以轻松调试,就是程序有些简陋 不够美观
【标题】"VC++做的人人对战五子棋"是一个使用Microsoft Visual C++开发的双人对战五子棋游戏。在这个项目中,开发者利用C++编程语言和可能的MFC(Microsoft Foundation Classes)库来创建用户界面,实现棋盘逻辑以及...