热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

java连连看代码_java实现连连看游戏

本文实例为大家分享了java实现连连看游戏的具体代码,供大家参考,具体内容如下代码会实现共享的,这个是截图代码:packag

本文实例为大家分享了java实现连连看游戏的具体代码,供大家参考,具体内容如下

代码会实现共享的,这个是截图

2f614037b98648baf4b2aae08ecbc9d1.png

代码:

package com.lr.bean;

import java.util.Scanner;

import java.util.Random;

import com.lr.bean.Point;

public class Link{

public static void main(String[] args){

Scanner sc=new Scanner(System.in);

System.out.println("==========================");

System.out.println("\t\t连连看小游戏");

System.out.println("\t\t版权:lr");

System.out.println("==========================");

System.out.println("请先输入图片数量(难度系数 1~9):");

int picnum=sc.nextInt();

System.out.println("请输入棋盘的行数:");

int rows=sc.nextInt();

int cols=0; //列数

int count=0; //计数器

do{

if (count>0){

System.out.println("输入有误,列数必须大于0!");

}

System.out.println("请输入棋盘列数:");

cols=sc.nextInt();

count++;

}while( cols<1 || cols%2!&#61;0);

//创建二维数组&#xff0c;生成棋盘&#xff0c;列数&#43;2的原因&#xff1a;做出边框的效果 数组刚刚生成时&#xff0c;每个元素都是0

int[][] chessboard&#61;new int[ rows&#43;2 ][ cols&#43;2];

//随机生成的图片数值存入这个二维数组中&#xff0c;注意&#xff1a;边框不存值&#xff0c;任为0

initBoard( chessboard ,picnum);

System.out.println("初始化后的棋盘为&#xff1a;");

showBoard2( chessboard);

//打乱棋盘

shuffle( chessboard );

//输出

System.out.println("打乱后的棋盘为&#xff1a;");

showBoard2( chessboard);

//实现消除业务

// 1.定义两个Point对象

Point p1&#61;new Point();

Point p2&#61;new Point();

// 2.游戏状态 isGameOver

boolean isGameOver&#61;false;

do{

// 3.循环输入两个点 do...while

System.out.println("请输入两个点的坐标");

p1.x&#61;sc.nextInt();

p1.y&#61;sc.nextInt();

p2.x&#61;sc.nextInt();

p2.y&#61;sc.nextInt();

// 4.判断这两个数是否可以消除

if( isErazeOk( chessboard,p1,p2)){

//如果可以消除&#xff0c;将这两个点在chessboard 中的值都设为0

chessboard[p1.x][p1.y]&#61;0;

chessboard[p2.x][p2.y]&#61;0;

if( checkGameOver( chessboard )){

isGameOver&#61;true;

}

}

//显示消除后的棋盘

showBoard2( chessboard );

}while( !isGameOver );

System.out.println("游戏结束&#xff01;");

}

//判断是否能消除的业务

public static boolean isErazeOk(int[][] chessboard ,Point p1,Point p2){

// 1.两个点不是同一个

if( p1.equals( p2) ){

System.out.println("输入的两个点位置不能相同&#xff01;");

}

// 2。两个点的值是否相等

if(chessboard[p1.x][p1.y] !&#61;chessboard[p2.x][p2.y]){

System.out.println("输入的两个点值不相同&#xff01;请重新输入");

return false;

}

// 3.判断两个点的连线情况

if( doOneLine(chessboard,p1,p2) || doTwoLine(chessboard,p1,p2) || doThreeLine(chessboard,p1,p2)){

return true;

}

return false;

}

// 1连线

public static boolean doOneLine(int[][] chessboard,Point p1,Point p2){

//定义最大值和最小值

int max&#61;0;

int min&#61;0;

//判断是循环行还是循环列

if( p1.x&#61;&#61;p2.x){

//找y的最大值、找y的最小值、循环从 min&#43;1 至 max-1、判断是否为0、如果中间有一个不为0&#xff0c;则返回 false

max&#61;p1.y>p2.y?p1.y:p2.y;

min&#61;p1.y

for(int i&#61;min&#43;1;i

if(chessboard[p1.x][i]!&#61;0){

return false;

}

}

return true;

}else if( p1.y&#61;&#61;p2.y){

//找x的最大值、找x的最小值、循环从 min&#43;1 至 max-1、判断是否为0、如果中间有一个不为0&#xff0c;则返回 false

max&#61;p1.x>p2.x?p1.x:p2.x;

min&#61;p1.x

for(int i&#61;min&#43;1;i

if(chessboard[i][p1.y]!&#61;0){

return false;

}

}

return true;

}

return false;

}

// 2连线

public static boolean doTwoLine(int[][] chessboard,Point p1,Point p2){

//定义两个临时点

Point t1&#61;new Point();

t1.x&#61;p1.x;

t1.y&#61;p2.y;

Point t2&#61;new Point();

t2.x&#61;p2.x;

t2.y&#61;p1.y;

if( chessboard[t1.x][t1.y]&#61;&#61;0 && doOneLine(chessboard, p1,t1 ) && doOneLine(chessboard, t1,p2) ){

return true;

}

if( chessboard[t2.x][t2.y]&#61;&#61;0 && doOneLine(chessboard, p1,t2 ) && doOneLine(chessboard, t2,p2) ){

return true;

}

return false;

}

// 3连线

public static boolean doThreeLine(int[][] chessboard,Point p1,Point p2){

//先循环行 &#xff1a;x

for( int i&#61;0;i

Point t&#61;new Point();

t.x&#61;i;

t.y&#61;p1.y;

if( chessboard[t.x][t.y]&#61;&#61;0 && doOneLine(chessboard,t, p1) && doTwoLine(chessboard, t,p2) ){

return true;

}

}

//再循环列 &#xff1a;y

for( int i&#61;0;i

Point t&#61;new Point();

t.x&#61;p1.x;

t.y&#61;i;

if( chessboard[t.x][t.y]&#61;&#61;0 && doOneLine(chessboard,t, p1) && doTwoLine(chessboard, t,p2) ){

return true;

}

}

return false;

}

//判断游戏是否结束&#xff1a;循环这个数组&#xff0c;判断所有的位置都为0

public static boolean checkGameOver(int[][] chessboard){

for(int i&#61;1;i

for(int j&#61;1;i

if( chessboard[i][j]!&#61;0 ){

return false;

}

}

}

return true;

}

public static void initBoard(int[][] chessboard,int picnum){

Random r&#61;new Random();

for( int i&#61;1;i

for(int j&#61;1;j

int pic&#61;r.nextInt( picnum )&#43;1;

chessboard[i][j]&#61;pic;

chessboard[i][j&#43;1]&#61;pic;

}

}

}

//打乱棋盘&#xff0c;只能对中间的值打乱&#xff0c;而不能打扰边框

//交换数组的两个值 &#xff0c;随机生成的四个下标&#xff0c;每个下标表示一个数 x1&#xff0c;y1 x2&#xff0c;y2 &#61;》 chessboard【x2】【y1】 将上面两个数交换

//概率&#xff1a;棋盘越大&#xff0c;交换越多

public static void shuffle(int[][] chessboard ){

Random r&#61;new Random();

int x1&#61;0;

int y1&#61;0;

int x2&#61;0;

int y2&#61;0;

int temp&#61;0;

for(int i&#61;0;i

//生成的四个下标&#xff0c;不能为0&#xff0c;也不能为 length-1

x1&#61;r.nextInt( chessboard.length-2 )&#43;1;

y1&#61;r.nextInt( chessboard[0].length-2 )&#43;1;

x2&#61;r.nextInt( chessboard.length-2 )&#43;1;

y2&#61;r.nextInt( chessboard[0].length-2 )&#43;1;

//完成交换

temp&#61;chessboard[x1][y1];

chessboard[x1][y1]&#61;chessboard[x2][y2];

chessboard[x2][y2]&#61;temp;

}

}

//简单的输出

public static void showBoard(int[][] chessboard){

for(int i&#61;0;i

for(int j&#61;0;j

System.out.print(chessboard[i][j]&#43;"\t");

}

System.out.println();

}

}

//私有方法&#xff1a;专门用来输出棋盘最上面和最下面要出现的列号

private static void showColsNum( int[][] chessboard ){

for(int i&#61;0;i

if( i&#61;&#61;0 || i&#61;&#61;chessboard[i].length-1){

System.out.print("\t");

}else{

System.out.print("*"&#43;i&#43;"\t");

}

}

System.out.println();

}

//带行列提示的输出

public static void showBoard2( int[][] chessboard){

showColsNum( chessboard );//输出error:列号

//中间完成棋盘

for(int i&#61;0;i

//加入前面行号的输出

if( i&#61;&#61;0 || i&#61;&#61;chessboard[i].length-1){

System.out.print(" ");

}else{

System.out.print(""&#43;i);

}

for(int j&#61;0;j

//边框要用 * 来修饰

if( i&#61;&#61;0 || j&#61;&#61;0 || i&#61;&#61;chessboard.length-1 || j&#61;&#61;chessboard[i].length-1){

if( j&#61;&#61;chessboard[i].length-1){

System.out.print(" # ");

}else{

System.out.print(" #\t");

}

}else{//不是边框&#xff0c;就输出数组中对应的数字

if( chessboard[i][j]&#61;&#61;0){

System.out.print(" \t");

}else{

System.out.print(" "&#43;chessboard[i][j]&#43;"\t");

}

}

}

//加入后面的行号

if( i&#61;&#61;0 || i&#61;&#61;chessboard.length-1){

System.out.print(" ");

}else{

System.out.print(""&#43;i);

}

System.out.println();

}

showColsNum( chessboard );//输出列号

}

}

Point类没有写出来了&#xff0c;比较简单&#xff0c;里面就存了两个数据&#xff0c;表示数字的行和列&#xff0c;就不上图了。

以上就是本文的全部内容&#xff0c;希望对大家的学习有所帮助&#xff0c;也希望大家多多支持脚本之家。



推荐阅读
  • 本题库精选了Java核心知识点的练习题,旨在帮助学习者巩固和检验对Java理论基础的掌握。其中,选择题部分涵盖了访问控制权限等关键概念,例如,Java语言中仅允许子类或同一包内的类访问的访问权限为protected。此外,题库还包括其他重要知识点,如异常处理、多线程、集合框架等,全面覆盖Java编程的核心内容。 ... [详细]
  • 深入解析 UIImageView 与 UIImage 的关键细节与应用技巧
    本文深入探讨了 UIImageView 和 UIImage 的核心特性及应用技巧。首先,详细介绍了如何在 UIImageView 中实现动画效果,包括创建和配置 UIImageView 实例的具体步骤。此外,还探讨了 UIImage 的加载方式及其对性能的影响,提供了优化图像显示和内存管理的有效方法。通过实例代码和实际应用场景,帮助开发者更好地理解和掌握这两个重要类的使用技巧。 ... [详细]
  • Prim算法在处理稠密图时表现出色,尤其适用于边数远多于顶点数的情形。传统实现的时间复杂度为 \(O(n^2)\),但通过引入优先队列进行优化,可以在点数为 \(m\)、边数为 \(n\) 的情况下显著降低时间复杂度,提高算法效率。这种优化方法不仅能够加速最小生成树的构建过程,还能在大规模数据集上保持良好的性能表现。 ... [详细]
  • PHP中元素的计量单位是什么? ... [详细]
  • 计算 n 叉树中各节点子树的叶节点数量分析 ... [详细]
  • 从零起步:使用IntelliJ IDEA搭建Spring Boot应用的详细指南
    从零起步:使用IntelliJ IDEA搭建Spring Boot应用的详细指南 ... [详细]
  • BZOJ4240 Gym 102082G:贪心算法与树状数组的综合应用
    BZOJ4240 Gym 102082G 题目 "有趣的家庭菜园" 结合了贪心算法和树状数组的应用,旨在解决在有限时间和内存限制下高效处理复杂数据结构的问题。通过巧妙地运用贪心策略和树状数组,该题目能够在 10 秒的时间限制和 256MB 的内存限制内,有效处理大量输入数据,实现高性能的解决方案。提交次数为 756 次,成功解决次数为 349 次,体现了该题目的挑战性和实际应用价值。 ... [详细]
  • 在使用群报数小程序进行高效接龙与统计时,可以通过创建 `LinkedList` 对象并利用 `for` 循环生成指定数量的 `Person` 对象,为每个人员分配唯一的编号,并将其添加到 `LinkedList` 集合中。这一过程确保了数据的有序性和高效管理,便于后续的接龙和统计操作。此外,该小程序还支持实时更新和查看参与人员的状态,进一步提升了活动组织的便利性和准确性。 ... [详细]
  • RK算法通过比较两个字符串的哈希值来实现快速匹配,但即使哈希值相同,也不能确保两字符串完全一致,仍需进行逐字符对比以确认。此过程的时间复杂度为O(n)。此外,RK算法在文本搜索、模式识别等领域有广泛应用,并可通过多种优化策略提高其效率和准确性。 ... [详细]
  • 本项目在Java Maven框架下,利用POI库实现了Excel数据的高效导入与导出功能。通过优化数据处理流程,提升了数据操作的性能和稳定性。项目已发布至GitHub,当前最新版本为0.0.5。该项目不仅适用于小型应用,也可扩展用于大型企业级系统,提供了灵活的数据管理解决方案。GitHub地址:https://github.com/83945105/holygrail,Maven坐标:`com.github.83945105:holygrail:0.0.5`。 ... [详细]
  • 本周课程涵盖了高精度计算、前缀和及差分技术。在高精度计算部分,我们将探讨如何处理任意进制的数值运算,包括但不限于正数的加法、减法和乘法。通过调整基数,可以灵活应对不同进制的需求。前缀和与差分技术则主要用于高效解决数组和区间查询问题,提升算法性能。 ... [详细]
  • 在 JavaScript 中,对象可以被转换为字符串、数字或布尔值。具体而言,对象转换为字符串时,若对象定义了 `toString` 方法,则会调用该方法并返回相应结果。大多数情况下,这一过程会自动执行,因为所有对象都继承了 `toString` 方法。此外,对象转换为数字时,会先尝试将其转换为字符串,再进行数值解析。对于布尔值的转换,非空对象通常会被视为 `true`,而空对象则被视为 `false`。这些转换规则在实际开发中非常有用,能够帮助开发者更好地处理不同类型的数据。 ... [详细]
  • 在进行网络编程时,准确获取本地主机的IP地址是一项基本但重要的任务。Winsock作为20世纪90年代初由Microsoft与多家公司共同制定的Windows平台网络编程接口,为开发者提供了一套高效且易用的工具。通过Winsock,开发者可以轻松实现网络通信功能,并准确获取本地主机的IP地址,从而确保应用程序在网络环境中的稳定运行。此外,了解Winsock的工作原理及其API函数的使用方法,有助于提高开发效率和代码质量。 ... [详细]
  • 状态模式在软件设计中的应用与实现
    本文以酒店管理系统为例,探讨了状态模式在软件设计中的应用与实现。酒店房间的状态包括空闲、已预订和已入住,这些状态之间可以相互转换。通过引入状态模式,系统能够更加灵活地管理和响应不同状态下的操作,提高了代码的可维护性和扩展性。此外,状态模式还简化了状态转换的逻辑处理,使得系统的整体架构更为清晰和高效。 ... [详细]
  • 本文作为“实现简易版Spring系列”的第五篇,继前文深入探讨了Spring框架的核心技术之一——控制反转(IoC)之后,将重点转向另一个关键技术——面向切面编程(AOP)。对于使用Spring框架进行开发的开发者来说,AOP是一个不可或缺的概念。了解AOP的背景及其基本原理,对于掌握这一技术至关重要。本文将通过具体示例,详细解析AOP的实现机制,帮助读者更好地理解和应用这一技术。 ... [详细]
author-avatar
迎风奔跑的狼
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有