/* package whatever; // don't place package name! */

import java.util.*;
import java.lang.*;
import java.io.*;

/* Name of the class has to be "Main" only if the class is public. */
class Ideone
{
    private static final Random RANDOM = new Random();
    public static void main(String[] args) {
        Player p = new Player();
        NPC other = new NPC();

        for (int turn = 0; turn < 10; turn++) {
            System.out.printf("turn %d%n", turn);
            for (LevelCrawler current : new LevelCrawler[]{p, other}) {
                move(current);
            }
        }
    }

    private static void move(LevelCrawler crawler) {
        GameObject go = RANDOM.nextBoolean() ? new Chest() : new NPC();
        go.accept(crawler);
    }
}

interface LevelCrawler {
    void handle(Chest c);

    void handle(NPC npc);
}

class Player implements LevelCrawler {
    public void handle(Chest c) {
        System.out.println("opening a chest");
    }

    public void handle(NPC npc) {
        System.out.println("meeting NPC");
    }
}

abstract class GameObject {
    abstract void accept(LevelCrawler p);
}

class Chest extends GameObject {
    @Override
    void accept(LevelCrawler p) {
        p.handle(this);
    }
}

class NPC extends GameObject implements LevelCrawler {
    @Override
    void accept(LevelCrawler p) {
        p.handle(this);
    }

    @Override
    public void handle(Chest c) {
        System.out.println("chests are for the players, leaving it alone");
    }

    @Override
    public void handle(NPC npc) {
        System.out.println("forming group with other npc");
    }
}