7-8 卡片邻居游戏 (50 分)

进行了一下修改,比原来更整洁了

有个游戏叫卡片邻居游戏,它使用多张正方形的卡片,每张卡片在上下左右四边上有数字,可以顺时针旋转,如下图所示。

在这里插入图片描述

卡片在游戏板上被放成一排,相邻两张卡片的邻边应当具有相同的数字,不断有新的卡片需要放置到游戏板上,放置的位置应当满足相临边数字相同的要求(亦可放在头部和尾部)。下图展示了游戏板上的一组卡片排列和新增一张卡片后的游戏板

在这里插入图片描述

在这里插入图片描述

完成类NumberCard,包含构造函数和方法 rotate 和 getLeft,getRight,分别表示顺时针旋转卡片,返回左侧数字,返回右侧数字

完成类CardGame表示游戏版,包含方法int getIndexForFit(NameCard),boolean insertCard(NameCard),print() 其中getIndexForFit返回用最少的旋转数能将卡片插入到游戏板中的最靠前的位置,头部位置为0. insertCard将卡片通过最少的旋转插入到游戏板,按旋转完成的方向插入getIndexForFit返回的位置,返回插入成功与否。print函数按顺序输出每个卡片,每个卡片按照上右下左的顺序输出各个边上的数字。(注:应当选择适当的结构存储游戏板中的卡片)

输入格式:
插入新的卡片的个数 每个新插入的新卡片,按上右下左顺序

输出格式:
依次输出游戏板上各个卡片,按上右下左的顺序

输入样例:
在这里给出一组输入。例如:

3
1 2 3 4
6 4 3 3
4 3 7 4
输出样例:
在这里给出相应的输出。例如:

4 3 7 4 6 4 3 3 1 2 3 4

package zuoye;

import java.util.Scanner;
public class Main{
    public static void main(String[] args) {
         Scanner sc = new Scanner(System.in);
         int n,k,p;
         boolean flag = false;
         CardGame c = new CardGame();
         n = sc.nextInt();
         NumberCard num = new NumberCard(sc.nextInt(), sc.nextInt(), sc.nextInt(), sc.nextInt());
         c.add(num,0);
         for(int i=1;i<n;i++) {
             num = new NumberCard(sc.nextInt(),sc.nextInt(),sc.nextInt(),sc.nextInt());
        	 flag = c.insertCard(num);
        	 k = 0;
        	 while(!flag&&k<4) {
        		 num.rotate();
        		 flag = c.insertCard(num);
        		 k++;
        	 }
        	 if(flag) {
        		 p = c.getIndexForFit(num);
        		 c.add(num, p);
        	 }
             flag = false;
         }
         c.print();
         sc.close(); 
    }
}



class NumberCard{
	int up,down,left,right;
	public NumberCard(int u,int r,int d,int l) {
		left = l;
		right = r;
		up = u;
		down = d;
	}
	public void rotate() {
		int temp;
		temp = up;
		up = left;
		left = down;
		down = right;
		right = temp;
	}
	public int getLeft() {
		return left;
	}
	public int getRight() {
		return right;
	}
	public int getUp() {
		return up;
	}
	public int getDown() {
		return down;
	}
}


class CardGame {
	NumberCard num[] = new NumberCard[100];
	int m=0;
	public CardGame() {
		
	}
	public void add(NumberCard n,int p) {
		for(int i=m;i>p;i--)
			num[i] = num[i-1];
		num[p] = n;
		m++;
	}
	public int getIndexForFit(NumberCard n) {
		if(n.right == num[0].left)
			return 0;
		else if(n.left == num[m-1].right)
			return m;
		for(int i=1;i<m;i++) {
			if(n.left == num[i-1].right && n.right == num[i].left)
				return i;
		}
		return -1;
	}
	public boolean insertCard(NumberCard n) {
		if(n.right == num[0].left)
			return true;
		else if(n.left == num[m-1].right)
			return true;
		for(int i=1;i<m;i++) {
			if(n.left == num[i-1].right && n.right == num[i].left)
				return true;
		}
		return false;
	}
	public void print() {
		System.out.print(num[0].up+" "+num[0].right+" "+num[0].down+" "+num[0].left);
		for(int i=1;i<m;i++) {
			System.out.print(" "+num[i].getUp()+" "+num[i].getRight()+" "+num[i].getDown()+" "+num[i].getLeft());
		}
	}
}
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值