棋类游戏-五子棋小游戏

article/2025/9/20 15:57:59


活动地址:CSDN21天学习挑战赛

界面效果:

 实现:

第一步:定义好设计该游戏要用到的组件以及相关数据;

第二步:组装组件,给组件设置相对应的功能;

第三步:调用init()方法;

具体

第一步

用到的组件:f游戏窗口,存放四张图的bufferedImage对象分别代表棋盘,黑棋,白棋,选中框;以及3个按钮button,还有结束界面result。

相关数据:例如:棋盘的宽(TABLE_WIDTH)高(TABLE_HEIGHT),棋盘横向纵向分别能下多少棋子BOARD_SIZE,每个棋子占用棋RATE,还有最棋子们对棋盘最左边框的偏移量X_OFFSET,对上边框的偏移量Y_OFFSET,棋子:board_type 值为0 -没有棋子 1-白棋 2-黑棋。

声明一个二维数组board[][]来记录棋子,如果board[ i ][ j ]值为0 -没有棋子 1-白棋 2-黑棋

定义一个选择框的坐标,用selected_X记录横坐标,用selected_Y记录纵坐标,默认值都为-1;

还自定义一个类:ChessBoard,重写paint方法用来绘画棋盘,棋子,选择框;

第二步

给按钮添加事件监听器,添加颜色变换效果,并通过改变board_type来选择下黑棋还是白棋或者是没有棋子,调用repaint方法;

给棋盘添加一个鼠标移动监听器,用来记录选选择框的位置;

定义一个判断是否获胜方法isOwn;

然后再给棋盘添加一个鼠标监听器,用来记录鼠标左击之后新棋子的坐标pos_X,pos_Y;

在左击之后,判断在玩家的棋子是否成五子,若成五子,则结束游戏,弹出(白/黑)玩家获胜;若不成五子,则继续比赛,并将选择框的坐标值select_X和select_Y重新赋值为-1;

最后设置checkboard的大小,checkboard添加到f窗口中,将f设置合适的大小,并使它可见

另外我额外给窗口添加了一个窗口关闭的事件监听器,方便大家关闭窗口;

第三步

调用init()方法

代码最核心的地方可能就是判断输赢(哪个玩家)

boolean isOwn(int pos_X,int pos_Y,int board_type)

pos_X :下的棋子横坐标,pos_Y:下的棋子纵坐标,board_type表示(执(白/黑)棋)玩家

主要思路:在玩家接下来一个棋子下落时,我们要立刻对下棋位置周围八个方向进行检验,其分大体来说是4条边,从上到下,从左到右,从左上到右下,从右上到左下;用count来记录每条边棋子的情况,当一种棋子在每条边上连续出现5个时,直接return true;结束该方法;记住在每一条边上遍历完之后要重新更新count,将其赋值为1.

isOwn()方法代码实现:

//    某玩家是否赢了private boolean isOwn(int x,int y,int board_type) {int temp=board[x][y]==board_type?1:0;int count = temp;int posX = 0;int posY = 0;
//        水平方向
//        向左遍历for (posX = x - 1; posX > 0; posX--) {if (board[posX][y] == board_type) {count++;if (count >= 5) {return true;}} else {break;}}
//        向右遍历for (posX = x + 1; posX <= BOARD_SIZE; posX++) {if (board[posX][y] == board_type) {count++;if (count >= 5) {return true;}} else {break;}}
//        垂直方向
//        重新更count值count = temp;
//        向上遍历for (posY = y - 1; posY > 0; posY--) {if (board[x][posY] == board_type) {count++;if (count >= 5) {return true;}} else {break;}}
//        向下遍历for (posY = y + 1; posY <= BOARD_SIZE; posY++) {if (board[x][posY] == board_type) {count++;if (count >= 5) {return true;}} else {break;}}
//        左下-右上方向
//        重新更新count值count=temp;
//        向左下角遍历for (posX = x - 1, posY = y - 1; posX > 0 && posY > 0; posX--, posY--) {if (board[posX][posY] == board_type) {count++;if (count >= 5) {count = 1;return true;}} else {break;}}
//        向右上角遍历for (posX = x + 1, posY = y + 1; posX <= BOARD_SIZE && posY <= BOARD_SIZE; posX++, posY++) {if (board[posX][posY] == board_type) {count++;if (count >= 5) {count = 1;return true;}} else {break;}}
//        左上-右下
//        更新count值count=temp;
//      向右下角遍历for (posX = x + 1, posY = y - 1; posX <= BOARD_SIZE && posY > 0; posX++, posY--) {if (board[posX][posY] == board_type) {count++;if (count >= 5) {return true;}} else {break;}}
//        向左上角遍历for (posX = x - 1, posY = y + 1; posX > 0 && posY <= 15; posX--, posY++) {if (board[posX][posY] == board_type) {count++;if (count >= 5) {return true;}} else {break;}}return false;}

五子棋代码实现: 

public class Gobang {TextArea result=new TextArea();//定义五子棋游戏窗口private JFrame f = new JFrame("五子棋游戏");//声明四个BufferedImage对象,分别记录四张图片BufferedImage table;BufferedImage black;BufferedImage white;BufferedImage selected;//声明棋盘的宽和高final int TABLE_WIDTH = 535;final int TABLE_HEIGHT = 536;//声明棋盘横向和纵向分别可以下多少子,他们的值都为15final int BOARD_SIZE = 15;//声明每个棋子占用棋盘的比率final int RATE = TABLE_WIDTH / BOARD_SIZE;//声明变量,记录棋子对于x方向和y方向的偏移量final int X_OFFSET = 5;final int Y_OFFSET = 6;//声明一个二维数组,记录棋子, 如果索引[i][j]处的值为  0-没有棋子  1-白棋  2-黑棋int[][] board = new int[BOARD_SIZE][BOARD_SIZE];//声明红色选择框的坐标  该坐标其实就是二维数组board中的索引int selected_X = -1;int selected_Y = -1;//自定义类,继承Canvasprivate class ChessBoard extends JPanel {@Overridepublic void paint(Graphics g) {//绘图//绘制棋盘g.drawImage(table,0,0,null);//绘制选择框if (selected_X>0 && selected_Y>0){g.drawImage(selected,selected_X*RATE+X_OFFSET,selected_Y*RATE+Y_OFFSET,null);}//绘制棋子for (int i = 0; i < BOARD_SIZE; i++) {for (int j = 0; j < BOARD_SIZE; j++) {//绘制黑棋if (board[i][j] == 2){g.drawImage(black,i*RATE+X_OFFSET,j*RATE+Y_OFFSET,null);}//绘制白棋if (board[i][j] == 1){g.drawImage(white,i*RATE+X_OFFSET,j*RATE+Y_OFFSET,null);}}}}}ChessBoard chessBoard = new ChessBoard();//声明变量,记录当前下棋的颜色int board_type = 2;//声明底部需要用到的组件Panel p = new Panel();Button whiteBtn = new Button("白棋");Button blackBtn = new Button("黑棋");Button deleteBtn = new Button("删除");public void refreshBtnColor(Color whiteBtnColor,Color blackBtnColor,Color deleteBtnColor){whiteBtn.setBackground(whiteBtnColor);blackBtn.setBackground(blackBtnColor);deleteBtn.setBackground(deleteBtnColor);}public void init() throws Exception {//组装视图,编写逻辑whiteBtn.addActionListener(e->{// 修改当前要下的棋子的标志为1board_type = 1;// 刷新按钮的颜色refreshBtnColor(Color.GREEN,Color.GRAY,Color.GRAY);});blackBtn.addActionListener(e->{// 修改当前要下的棋子的标志为2board_type = 2;// 刷新按钮的颜色refreshBtnColor(Color.GRAY,Color.GREEN,Color.GRAY);});deleteBtn.addActionListener(e->{// 修改当前要下的棋子的标志为0board_type = 0;// 刷新按钮的颜色refreshBtnColor(Color.GRAY,Color.GRAY,Color.GREEN);});p.add(whiteBtn);p.add(blackBtn);p.add(deleteBtn);f.add(p,BorderLayout.SOUTH);//组装棋盘//初始化图片table = ImageIO.read(new File("src\\awt\\img\\board.jpg"));white = ImageIO.read(new File("src\\awt\\img\\white.gif"));black = ImageIO.read(new File("src\\awt\\img\\black.gif"));selected = ImageIO.read(new File("src\\awt\\img\\selected.gif"));//处理鼠标移动chessBoard.addMouseMotionListener(new MouseAdapter() {@Overridepublic void mouseMoved(MouseEvent e) {selected_X = (e.getX()-X_OFFSET)/RATE;selected_Y = (e.getY()-Y_OFFSET)/RATE;chessBoard.repaint();}});//处理鼠标点击chessBoard.addMouseListener(new MouseAdapter() {//当鼠标被点击后 会调用这个方法@Overridepublic void mouseClicked(MouseEvent e) {int xPos = (e.getX()-X_OFFSET)/RATE;int yPos = (e.getY()-Y_OFFSET)/RATE;board[xPos][yPos] = board_type;if(isOwn(xPos,yPos,1)){result.append("白棋获胜");chessBoard.setVisible(false);p.setVisible(false);f.add(result);}if(isOwn(xPos,yPos,2)){result.append("黑棋获胜");chessBoard.setVisible(false);p.setVisible(false);f.add(result);}chessBoard.repaint();}@Overridepublic void mouseExited(MouseEvent e) {selected_X=-1;selected_Y=-1;chessBoard.repaint();}});chessBoard.setPreferredSize(new Dimension(TABLE_WIDTH,TABLE_HEIGHT));f.add(chessBoard);//        关闭窗口f.addWindowFocusListener(new WindowAdapter() {@Overridepublic void windowClosing(WindowEvent e) {System.exit(0);}});//设置frame最佳大小并可见f.pack();f.setVisible(true);}
//    某玩家是否赢了private boolean isOwn(int x,int y,int board_type) {int temp=board[x][y]==board_type?1:0;int count = temp;int posX = 0;int posY = 0;
//        水平方向
//        向左遍历for (posX = x - 1; posX > 0; posX--) {if (board[posX][y] == board_type) {count++;if (count >= 5) {return true;}} else {break;}}
//        向右遍历for (posX = x + 1; posX <= BOARD_SIZE; posX++) {if (board[posX][y] == board_type) {count++;if (count >= 5) {return true;}} else {break;}}
//        垂直方向
//        重新更count值count = temp;
//        向上遍历for (posY = y - 1; posY > 0; posY--) {if (board[x][posY] == board_type) {count++;if (count >= 5) {return true;}} else {break;}}
//        向下遍历for (posY = y + 1; posY <= BOARD_SIZE; posY++) {if (board[x][posY] == board_type) {count++;if (count >= 5) {return true;}} else {break;}}
//        左下-右上方向
//        重新更新count值count=temp;
//        向左下角遍历for (posX = x - 1, posY = y - 1; posX > 0 && posY > 0; posX--, posY--) {if (board[posX][posY] == board_type) {count++;if (count >= 5) {count = 1;return true;}} else {break;}}
//        向右上角遍历for (posX = x + 1, posY = y + 1; posX <= BOARD_SIZE && posY <= BOARD_SIZE; posX++, posY++) {if (board[posX][posY] == board_type) {count++;if (count >= 5) {count = 1;return true;}} else {break;}}
//        左上-右下
//        更新count值count=temp;
//      向右下角遍历for (posX = x + 1, posY = y - 1; posX <= BOARD_SIZE && posY > 0; posX++, posY--) {if (board[posX][posY] == board_type) {count++;if (count >= 5) {return true;}} else {break;}}
//        向左上角遍历for (posX = x - 1, posY = y + 1; posX > 0 && posY <= 15; posX--, posY++) {if (board[posX][posY] == board_type) {count++;if (count >= 5) {return true;}} else {break;}}return false;}public static void main(String[] args) throws Exception {new Gobang().init();}}

如果有些小伙在运行时,出现下面这个问题。可以把new File()中的相对路径改成关于盘符的绝对路径。

代码中使用的图片在下面的百度网盘中

链接:https://pan.baidu.com/s/1CQSk_rU0S0C7Y1XXiHs56Q?pwd=xzhf 
提取码:xzhf


http://chatgpt.dhexx.cn/article/gQgQuNgH.shtml

相关文章

基于c语言的象棋游戏

一、主要目标&#xff1a; 1.1&#xff1a;鼠标控制。 1.2&#xff1a;各棋子按照象棋规则移动 1.3&#xff1a;判断双方胜负 注&#xff1a;本设计使用vs-2017运行。需要下载graphics.h库。 二、基本流程 2.1 棋牌展示 直接输出棋盘背景图片&#xff0c;包含方格线、“楚…

【Unity连载】斗兽棋—棋类游戏开发演示(1)

序言 “黄梅时节家家雨&#xff0c;青草池塘处处蛙。有约不来过夜半&#xff0c;闲敲棋子落灯花。” “象棋终日乐悠悠&#xff0c;苦被严亲一旦丢。兵卒坠河皆不救&#xff0c;将军溺水一齐休。马行千里随波去&#xff0c;象入三川逐浪游。炮响一声天地震&#xff0c;忽然惊…

简单的象棋开发

我们需要准备的知识是c语言基础和easyx图形: easyx官网&#xff1a; https://easyx.cn/ 首先头文件少不了: #include<stdio.h>(c语言的头文件) #include<graphics.h>&#xff08;easyx的&#xff09; #include<mmsystem.h>&#xff08;音乐播放的&#x…

Java游戏开发 —— 五子棋

引言&#xff1a; 五子棋的代码实现很简单&#xff0c;难的是计算机的AI算法&#xff0c;在网上找了很多资料&#xff0c;费了好半天劲才弄明白其实现的原理&#xff0c;真的挺开阔思路的&#xff0c;很有意思&#xff01; 思路&#xff1a; 1、创建主窗口&#xff0c;加载菜单…

编程小游戏之三子棋

三子棋是一个民间的益智小游戏&#xff0c;游戏分为双方对战&#xff0c;双方依次在9宫格棋盘上摆放棋子&#xff0c;率先将自己的三个棋子连成一条线的一方则视为胜利者。下面将说明如何利用C语言在我们的计算机上简单的实现三子棋。 1.逻辑框架设计 在vs上创建两个.c文件test…

【C语言】三子棋游戏的实现(玩家VS玩家 or 玩家VS电脑)

目 录 一、三子棋游戏介绍 二、游戏功能函数分析 1 菜单显示函数 2 菜单选择函数 3 选择确认函数 4 显示当前棋盘状态函数 5 棋盘初始化函数 6 玩家下棋函数 7 电脑下棋函数 8 棋局状态判断函数 三、游戏功能函数的整合 四、三子棋游戏的实现 五、游戏…

安卓做的棋类游戏

大方大斜 前言一、直接上图二、游戏主要代码1.界面绘制代码2.游戏触摸事件代码 最后 前言 安卓制作棋类游戏&#xff0c;小时候和发小在地上画棋盘&#xff0c;有树叶或者树枝做棋子。 一、直接上图 二、游戏主要代码 1.界面绘制代码 双人界面绘制&#xff0c;主要代码代码如…

基于java的五子棋游戏设计

技术&#xff1a;Java、JSP等摘要&#xff1a;随着互联网迅速的发展&#xff0c;网络游戏已经成为人们普遍生活中不可或缺的一部分&#xff0c;它不仅能使人娱乐&#xff0c;也能够开发人的智力&#xff0c;就像本文所主要讲的五子棋游戏一样能挖掘人们聪明的才干与脑袋的机灵程…

自己设计的棋类游戏

1、构思&#xff1a; 象棋、国际象棋、井字棋等 我一开始的设计是这个样的&#xff1a;一个5x5的棋盘&#xff08;之后变成7x7&#xff09;&#xff0c;所有棋子摆成一个井字 棋子有两种&#xff0c;一种兵一种王&#xff0c;中间用中立的棋子&#xff0c;就叫box来隔开他们 …

Java围棋游戏的设计与实现

技术&#xff1a;Java等 摘要&#xff1a; 围棋作为一个棋类竞技运动&#xff0c;在民间十分流行&#xff0c;为了熟悉五子棋规则及技巧&#xff0c;以及研究简单的人工智能&#xff0c;决定用Java开发五子棋游戏。主要完成了人机对战和玩家之间联网对战2个功能。网络连接部分为…

【国际象棋】棋盘游戏-微信小程序开发流程详解

与中国象棋类似的&#xff0c;还有国际象棋&#xff0c;知道有人爱玩&#xff0c;于是凭着好奇心&#xff0c;网上研究了一下&#xff0c;跟中国象棋有相似之处&#xff0c;玩法是有些许不一样&#xff0c;不知道象棋最早出于谁之手呢&#xff0c;抽空做一做&#xff0c;最终完…

利用C语言巧妙实现棋类游戏——三子棋

小游戏&#xff1a;三子棋用C语言实现 你是否学完了C语言的函数、数组、选择结构、循环结构苦于没有实战小项目巩固自己所学的知识呢&#xff0c;今天小程序猿就给大家带来了一个游戏的小游戏——三子棋&#xff0c;利用C语言实现的&#xff0c;希望对大家能有所帮助。 我们大家…

基于C#的五子棋游戏设计

目 录 一、 毕业设计内容 3 二、 毕业设计目的 3 三、 工具/准备工作 3 四、 设计步骤和方法 3 &#xff08;一&#xff09; 总体设计 3 1&#xff0e; 总体设计思路及设计图 3 2&#xff0e; 界面设计 4 3&#xff0e; 全局变量设计 4 &#xff08;二&#xff09; 详细设计 5 …

【Unity连载】斗兽棋-棋类游戏开发演示(2)

第四章 游戏操作与指令 如同养育一个婴儿&#xff0c;父母总会一步步引领孩子成长&#xff0c;从蹒跚学步到来去如风&#xff1b;我们对游戏功能的开发&#xff0c;也无疑应当从走出第一步棋开始。现在&#xff0c;我们已经构建出了棋盘、棋子等基本的游戏逻辑对象&#xff1b…

Java游戏开发——中国象棋联机版

游戏介绍&#xff1a; 中国象棋是起源于中国的一种棋戏&#xff0c;属于二人对抗性游戏的一种&#xff0c;在中国有着悠久的历史。由于规则简单&#xff0c;趣味性强&#xff0c;成为流行极为广泛的棋类游戏。 中国象棋使用方形格状棋盘及红黑二色圆形棋子进行对弈&#xff0c…

【论文】word中三线表的快速简单制作

【论文】word中三线表的快速简单制作 首先&#xff0c;打开word点击插入→表格&#xff0c;选择需要插入表格的行列数&#xff0c;行列数没有关系&#xff0c;因为你插入后可以随意添加行列。 则插入了一下表格&#xff1a; 把你所需要的数据放进去&#xff1a; 之后&#…

如何在word中制作线宽不同的三线表

在word中难免会插入特定的三线表&#xff0c;那就现场给给大家演示一遍 1、打开word&#xff0c;点击插入&#xff0c;点击表格&#xff0c;至于插入几行几列看自己的需求哈。 2、右键点击表格&#xff0c;然后点击表格属性 3、点击边框和底纹&#xff0c;对表格去除相关边线 …

论文中的三线表绘制(word)

步骤 1、选中表格&#xff08;点击下图中的红框部分选中&#xff09; 2、右击表格选择“表格属性” 3、点击边框和底纹&#xff0c;再选择无边框&#xff08;先不要点确定&#xff09; 4、设置三线表的上下边框&#xff08;1.5磅&#xff09;&#xff0c;完成下图之后点击确定-…

word三线表标题两条线之间如何出现空白间隔(论文必备)

为了写论文&#xff0c;我需要把以上的标题转换成下图所示的样子 所实现的步骤如下&#xff1a; 1、把标题内容回车 放在下一行 2、加一条绘制表格的线 3、选中第一行对应位置的两格&#xff0c;合并单元格 并填入内容 可以看到单纯的加上边框&#xff0c;两条线之间是没有空…

Word 2016表格三线表制作

1、打开word&#xff0c;点击插入&#xff0c;插入一个表格。 2、选中表格&#xff0c;点击设计&#xff0c;在边框中的笔画粗细选择1.5磅&#xff0c;然后在边框下拉框先选择无框线&#xff0c;再选择上框线和下框线。然后笔画粗细选择0.5磅&#xff0c;选中第一行后&#x…