質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

Q&A

解決済

2回答

252閲覧

どのようにしたら上手く重複しないようにできる?

Alpa

総合スコア80

Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

0グッド

0クリップ

投稿2018/02/24 01:45

前提・実現したいこと

既にブロックが置かれている場所だけに
ブロックを置けなくしたい

発生している問題・エラーメッセージ

ブロックが置かれていない場所でも置かれているという メッセージが出てブロックを置けない

該当のソースコード

java

1import MyLib.Swing.*; 2import javax.swing.*; 3import java.awt.*; 4import java.awt.event.*; 5import java.util.*; 6 7public class GTest extends JFrame implements KeyListener 8{ 9 10 static GTest Frame; 11 static JPanel Panel; 12 13 boolean Back = false; 14 15 int BlockWidth = 10; 16 int BlockHeight = 10; 17 int BlockX = 9; 18 int BlockY = 32; 19 20 boolean Copy = false; 21 22 ArrayList<Integer> CopyX = new ArrayList<Integer>(); 23 ArrayList<Integer> CopyY = new ArrayList<Integer>(); 24 25 public static void main(String[] args) 26 { 27 Frame = new GTest(); 28 MFrame.SetFrame(Frame, "グラフィックテスト", 500, 500, true, false, true); 29 } 30 31 GTest() 32 { 33 Panel = new JPanel(); 34 MPanel.nullLayout(Panel); 35 36 addKeyListener(this); 37 38 getContentPane().add(Panel, BorderLayout.CENTER); 39 } 40 41 public void paint(Graphics g) 42 { 43 Dimension size = getSize(); 44 45 g.setColor(Color.black); 46 47 if(!Back){ 48 g.fillRect(0, 0, size.width - 1, size.height - 1); 49 } 50 51 if(Copy){ 52 for(int i = 0; i < CopyX.size(); i++){ 53 g.setColor(Color.white); 54 g.fillRect(CopyX.get(i), CopyY.get(i), BlockWidth, BlockHeight); 55 } 56 } 57 58 g.setColor(Color.red); 59 g.fillRect(BlockX, BlockY, 10, 10); 60 } 61 62 public void keyPressed(KeyEvent e) 63 { 64 //System.out.println(e.getKeyText(e.getKeyCode())); 65 switch(e.getKeyText(e.getKeyCode())){ 66 case "上":{ 67 BlockY -= BlockHeight; 68 repaint(); 69 }break; 70 71 case "下":{ 72 BlockY += BlockHeight; 73 repaint(); 74 }break; 75 76 case "右":{ 77 BlockX += BlockWidth; 78 repaint(); 79 }break; 80 81 case "左":{ 82 BlockX -= BlockWidth; 83 repaint(); 84 }break; 85 86 case "Enter":{ 87 System.out.println("現在X:" + BlockX); 88 System.out.println("現在Y:" + BlockY); 89 System.out.println("検索値X:" + CopyX.contains(BlockX)); 90 System.out.println("検索値Y:" + CopyY.contains(BlockY)); 91 if(!CopyX.contains(BlockX) || !CopyY.contains(BlockY)){ 92 CopyX.add(BlockX); 93 CopyY.add(BlockY); 94 Copy = true; 95 repaint(); 96 }else{ 97 System.out.println("その場所には既にブロックがあります"); 98 } 99 }break; 100 101 case "スペース":{ 102 try{ 103 CopyX.remove(CopyX.indexOf(BlockX)); 104 CopyY.remove(CopyY.indexOf(BlockY)); 105 repaint(); 106 }catch (IndexOutOfBoundsException ioobe){ 107 System.out.println("その場所にブロックはありません"); 108 } 109 }break; 110 111 case "Esc":{ 112 CopyX.clear(); 113 CopyY.clear(); 114 CopyX.trimToSize(); 115 CopyY.trimToSize(); 116 repaint(); 117 }break; 118 } 119 120 if(BlockY <= 31){ 121 BlockY = 32; 122 repaint(); 123 } 124 125 if(BlockY >= 483){ 126 BlockY = 482; 127 repaint(); 128 } 129 130 if(BlockX <= 8){ 131 BlockX = 9; 132 repaint(); 133 } 134 135 if(BlockX >= 483){ 136 BlockX = 482; 137 repaint(); 138 } 139 } 140 141 public void keyReleased(KeyEvent e) 142 { 143 144 } 145 146 public void keyTyped(KeyEvent e) 147 { 148 149 } 150 151}

試したこと

今の座標がブロックを設置した座標かどうか判定して
設置されていたらブロックを設置しないようにしました

補足情報(FW/ツールのバージョンなど)

javaのバージョン9.0.4

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

ベストアンサー

単純な座標系で考えると、現状のコードでは
ブロックが(1,1)と(2,2)だけにある状態でも、
(1,2)や(2,1)にも「ある」という判定になってしまいます。
例えばx座標に対してブロックがあるy座標はどこかと対応付けて管理する必要があります。

java

1Map<Integer, Set<Integer>> blocks = new HashMap<>(); 2 3// 記録 4blocks.computeIfAbsent(x, k -> new HashSet<Integer>()).add(y); 5 6// 判定 7boolean isExist = blocks.getOrDefault(x, Collections.emptySet()).contains(y);

投稿2018/02/24 03:50

編集2018/02/24 13:21
swordone

総合スコア20649

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Alpa

2018/02/24 06:12

対応付けとは具体的にどのようにしたらいいでしょうか?
Alpa

2018/02/25 00:08

ありがとうございます! 上手くできました!
guest

0

if(!CopyX.contains(BlockX) || !CopyY.contains(BlockY)){
orじゃなくてand(|| → &&)では?

投稿2018/02/24 02:32

unz.hori

総合スコア1057

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問