java实现连连看游戏

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

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

代码:

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!=0);
 //创建二维数组,生成棋盘,列数+2的原因:做出边框的效果 数组刚刚生成时,每个元素都是0
 int[][] chessboard=new int[ rows+2 ][ cols+2];

 //随机生成的图片数值存入这个二维数组中,注意:边框不存值,任为0
 initBoard( chessboard ,picnum);
 System.out.println("初始化后的棋盘为:");
 showBoard2( chessboard);
 //打乱棋盘
 shuffle( chessboard );
 //输出
 System.out.println("打乱后的棋盘为:");
 showBoard2( chessboard);

 //实现消除业务
 // 1.定义两个Point对象
 Point p1=new Point();
 Point p2=new Point();
 // 2.游戏状态 isGameOver
 boolean isGameOver=false;
 do{
 // 3.循环输入两个点 do...while
 System.out.println("请输入两个点的坐标");
 p1.x=sc.nextInt();
 p1.y=sc.nextInt();
 p2.x=sc.nextInt();
 p2.y=sc.nextInt();
 // 4.判断这两个数是否可以消除
 if( isErazeOk( chessboard,p1,p2)){
 //如果可以消除,将这两个点在chessboard 中的值都设为0
 chessboard[p1.x][p1.y]=0;
 chessboard[p2.x][p2.y]=0;
 if( checkGameOver( chessboard )){
  isGameOver=true;
 }
 }
 //显示消除后的棋盘
 showBoard2( chessboard );
 }while( !isGameOver );
 System.out.println("游戏结束!");
 }

 //判断是否能消除的业务
 public static boolean isErazeOk(int[][] chessboard ,Point p1,Point p2){
 // 1.两个点不是同一个
 if( p1.equals( p2) ){
 System.out.println("输入的两个点位置不能相同!");
 }
 // 2。两个点的值是否相等
 if(chessboard[p1.x][p1.y] !=chessboard[p2.x][p2.y]){
 System.out.println("输入的两个点值不相同!请重新输入");
 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=0;
 int min=0;
 //判断是循环行还是循环列
 if( p1.x==p2.x){
 //找y的最大值、找y的最小值、循环从 min+1 至 max-1、判断是否为0、如果中间有一个不为0,则返回 false
 max=p1.y>p2.y?p1.y:p2.y;
 min=p1.y<p2.y?p1.y:p2.y;
 for(int i=min+1;i<max;i++){
  if(chessboard[p1.x][i]!=0){
  return false;
  }
 }
 return true;
 }else if( p1.y==p2.y){
 //找x的最大值、找x的最小值、循环从 min+1 至 max-1、判断是否为0、如果中间有一个不为0,则返回 false
 max=p1.x>p2.x?p1.x:p2.x;
 min=p1.x<p2.x?p1.x:p2.x;
 for(int i=min+1;i<max;i++){
 if(chessboard[i][p1.y]!=0){
  return false;
 }
 }
 return true;
 }
 return false;
 }

 // 2连线
 public static boolean doTwoLine(int[][] chessboard,Point p1,Point p2){
 //定义两个临时点
 Point t1=new Point();
 t1.x=p1.x;
 t1.y=p2.y;

 Point t2=new Point();
 t2.x=p2.x;
 t2.y=p1.y;

 if( chessboard[t1.x][t1.y]==0 && doOneLine(chessboard, p1,t1 ) && doOneLine(chessboard, t1,p2) ){
 return true;
 }
 if( chessboard[t2.x][t2.y]==0 && doOneLine(chessboard, p1,t2 ) && doOneLine(chessboard, t2,p2) ){
 return true;
 }
 return false;
 }

 // 3连线
 public static boolean doThreeLine(int[][] chessboard,Point p1,Point p2){
 //先循环行 :x
 for( int i=0;i<chessboard.length;i++){
 Point t=new Point();
 t.x=i;
 t.y=p1.y;
 if( chessboard[t.x][t.y]==0 && doOneLine(chessboard,t, p1) && doTwoLine(chessboard, t,p2) ){
 return true;
 }
 }
 //再循环列 :y
 for( int i=0;i<chessboard.length;i++){
 Point t=new Point();
 t.x=p1.x;
 t.y=i;
 if( chessboard[t.x][t.y]==0 && doOneLine(chessboard,t, p1) && doTwoLine(chessboard, t,p2) ){
 return true;
 }
 }
 return false;
 }

 //判断游戏是否结束:循环这个数组,判断所有的位置都为0
 public static boolean checkGameOver(int[][] chessboard){
 for(int i=1;i<chessboard.length-1;i++){
 for(int j=1;i<chessboard[i].length-1;j++){
 if( chessboard[i][j]!=0 ){
  return false;
 }
 }
 }
 return true;
 }

 public static void initBoard(int[][] chessboard,int picnum){
 Random r=new Random();
 for( int i=1;i<chessboard.length-1;i++){
 for(int j=1;j<chessboard[i].length-1;j=j+2){
 int pic=r.nextInt( picnum )+1;
 chessboard[i][j]=pic;
 chessboard[i][j+1]=pic;
 }
 }
 }

 //打乱棋盘,只能对中间的值打乱,而不能打扰边框
 //交换数组的两个值 ,随机生成的四个下标,每个下标表示一个数 x1,y1 x2,y2 =》 chessboard【x2】【y1】 将上面两个数交换
 //概率:棋盘越大,交换越多
 public static void shuffle(int[][] chessboard ){
 Random r=new Random();
 int x1=0;
 int y1=0;
 int x2=0;
 int y2=0;
 int temp=0;
 for(int i=0;i<chessboard.length*chessboard[0].length*10;i++){
 //生成的四个下标,不能为0,也不能为 length-1
 x1=r.nextInt( chessboard.length-2 )+1;
 y1=r.nextInt( chessboard[0].length-2 )+1;
 x2=r.nextInt( chessboard.length-2 )+1;
 y2=r.nextInt( chessboard[0].length-2 )+1;
 //完成交换
 temp=chessboard[x1][y1];
 chessboard[x1][y1]=chessboard[x2][y2];
 chessboard[x2][y2]=temp;
 }
 }
 //简单的输出
 public static void showBoard(int[][] chessboard){
 for(int i=0;i<chessboard.length;i++){
 for(int j=0;j<chessboard[i].length;j++){
  System.out.print(chessboard[i][j]+"\t");
 }
 System.out.println();
 }
 }

 //私有方法:专门用来输出棋盘最上面和最下面要出现的列号
 private static void showColsNum( int[][] chessboard ){
 for(int i=0;i<chessboard[0].length;i++){
 if( i==0 || i==chessboard[i].length-1){
  System.out.print("\t");
 }else{
  System.out.print("*"+i+"\t");
 }
 }
 System.out.println();

 }

 //带行列提示的输出
 public static void showBoard2( int[][] chessboard){
 showColsNum( chessboard );//输出error:列号
 //中间完成棋盘
 for(int i=0;i<chessboard.length;i++ ){
 //加入前面行号的输出
 if( i==0 || i==chessboard[i].length-1){
  System.out.print(" ");
 }else{
 System.out.print(""+i);
 }
 for(int j=0;j<chessboard[i].length;j++){
 //边框要用 * 来修饰
 if( i==0 || j==0 || i==chessboard.length-1 || j==chessboard[i].length-1){
  if( j==chessboard[i].length-1){
  System.out.print(" # ");
  }else{
  System.out.print(" #\t");
  }
 }else{//不是边框,就输出数组中对应的数字
  if( chessboard[i][j]==0){
  System.out.print(" \t");
  }else{
  System.out.print(" "+chessboard[i][j]+"\t");
  }
 }
 }
 //加入后面的行号
 if( i==0 || i==chessboard.length-1){
 System.out.print(" ");
 }else{
 System.out.print(""+i);
 }
 System.out.println();
 }
 showColsNum( chessboard );//输出列号

 }

}

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

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持我们。

(0)

相关推荐

  • java连连看游戏菜单设计

    本文实例为大家分享了java连连看游戏菜单的具体实现代码,供大家参考,具体内容如下 先写GUI. 首先初始化框架,菜单,按钮,需要把菜单和按钮都添加在框架中.注意添加的顺序,首先要设置菜单,再设置框架,再设置按钮,如果交换了设置菜单和框架的顺序,会导致菜单显示不出,被框架挡住.对菜单设置了三个选项,第一个选项有五个下拉按键,用循环添加,第二个和第三个选项的下拉按键直接添加. GUI代码如下: package gui; import java.awt.Font; import javax.swin

  • java基于swing实现的连连看代码

    本文实例讲述了java基于swing实现连连看代码.分享给大家供大家参考. 主要功能代码如下: 复制代码 代码如下: package llkan; import javax.swing.*; import java.awt.*; import java.awt.event.*; /**  * 连连看游戏  * @author Administrator  *2014年10月17日  */ public class MainGame implements ActionListener {     

  • java仿QQ连连看游戏

    关于这个项目,真的是花了很多心思在上面,从开始构思,到最后完成,真的是花了整整一个月.大概是11月初开始学java swing的时候有的想法,然后开始构思整个思路,相关算法讨论以及调试. 最开始先对连连看基础算法进行测试,就用一般的二维数组,然后就用控制台输入两个点的坐标进行删除,这一步就调试了我整整一个星期,基础算法搞完了 终于开始设计界面了,反正也不知道那时候花了多长时间才把界面给设计好,反正还设计的特别丑(至今也如此). 功能如下: 运行程序后有背景音乐 菜单栏有:重新开始,提示,炸弹,排

  • java实现连连看游戏

    本文实例为大家分享了java实现连连看游戏的具体代码,供大家参考,具体内容如下 代码会实现共享的,这个是截图 代码: 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);

  • java实现连连看游戏课程设计

    本文为大家分享了JAVA语言课程设计:连连看小游戏,供大家参考,具体内容如下 1.设计内容 界面中有5*10的界面,图中共有6种不同的图片,每两个相同的图片连接在一起,如果连线中转折的次数<=3次,两张图片可同时削掉,否则不能削去. 2.设计要求 色彩鲜艳,鼠标点击键好用,以固定时间将所有图片消掉为胜利,若时间到了,图片还有,则闯关失败. 3.设计思想 1)    搭建界面,首先搭建简单界面,可以先用按钮代替图片,并且行列可以先少做一些,如下图所示:2)    每次用户选择两个图形,如果图形满足

  • Java实现简单连连看游戏

    本文实例为大家分享了Java实现连连看游戏的具体代码,供大家参考,具体内容如下 大二时做的Java课程设计,拿了个优秀,用了icon来模拟做了个简单的连连看,代码量不多,仅供参考. 课设要求是实现连连看最基本的功能,所以这里写了个简单的初始界面和经典模式的一个界面. 初始界面 代码如下: public class PictureMatching {     JButton classical = new JButton("经典模式");     JButton about = new

  • 跟我学Java Swing之游戏设计(1)

    文章来源:电脑爱好者 作者:张剑 谁知道通天的巴比伦塔耗费了多少沙石?又有谁知道罗马的建成经历了多少个日夜?我们惟一知道的是,没有一块块砖石的垒砌,就没有蜿蜒万里的长城;没有巨石和黏土的堆集,就没有亘古不变的金字塔.由此可见,基础知识的准备对于我们学习任何事物都至关重要,那么,就让我们从认识Swing的一些基础功能开始,启动我们建造罗马的伟大工程吧! 前言 Java咖啡馆已经开张不少时日了,如果你已经喜欢上了Java这杯咖啡的味道,那么记得常来哦.这一次,我们为大家准备了一大杯香浓的咖啡--将以

  • Android实现疯狂连连看游戏之加载界面图片和实现游戏Activity(四)

    正如在<我的Android进阶之旅------>Android疯狂连连看游戏的实现之状态数据模型(三)>一文中看到的,在AbstractBoard的代码中,当程序需要创建N个Piece对象时,程序会直接调用ImageUtil的getPlayImages()方法去获取图片,该方法会随机从res/drawable目录中取得N张图片. 下面是res/drawable目录视图: 为了让getPlayImages()方法能随机从res/drawable目录中取得N张图片,具体实现分为以下几步: 通

  • Android实现疯狂连连看游戏之开发游戏界面(二)

    连连看的游戏界面十分简单,大致可以分为两个区域: --游戏主界面区 --控制按钮和数据显示区 1.开发界面布局 本程序使用一个RelativeLayout作为整体的界面布局元素,界面布局上面是一个自定义组件,下面是一个水平排列的LinearLayout. 下面是本程序的布局文件:/res/layout/main.xml <?xml version="1.0" encoding="utf-8"?> <RelativeLayout xmlns:andr

  • Android实现疯狂连连看游戏之状态数据模型(三)

    对于游戏玩家而言,游戏界面上看到的"元素"千变万化:但是对于游戏开发者而言,游戏界面上的元素在底层都是一些数据,不同数据所绘制的图片有所差异而已.因此建立游戏的状态数据模型是实现游戏逻辑的重要步骤. 1.定义数据模型 连连看的界面是一个NxM的"网格",每个网格上显示一张图片.而这个网格只需要一个二维数组来定义即可,而每个网格上所显示的图片,对于底层数据模型来说,不同的图片对于着不同的数值即可. 对于上图所示的数据模型,只要让数值为0的网格上不绘制图片,其他数值的网

  • Android实现疯狂连连看游戏之实现游戏逻辑(五)

    在上一篇<我的Android进阶之旅------>Android疯狂连连看游戏的实现之加载界面图片和实现游戏Activity(四)>中提到的两个类: GameConf:负责管理游戏的初始化设置信息. GameService:负责游戏的逻辑实现. 其中GameConf的代码如下:cn\oyp\link\utils\GameConf.java package cn.oyp.link.utils; import android.content.Context; /** * 保存游戏配置的对象

随机推荐