私は初心者のJavaプログラマーであり、私の道は何千人も旅をしました。

最初に最も正しい本の長く苦痛な選択が来て、それからそれから転載されたプログラムリストの仕事に対する最初の熱意が来ます。 その後、成長するクールさとプロ意識の意識。 自分で何かを書き込もうとしているときに、自分の取るに足りないものの落とし穴に落ちる。 そして長い道のり。
私の場合、最も正しい本は2巻の「Java。 「ケイホルストマンとゲイリーコーネルによって執筆され、Javaの世界への扉を開いた最初の本は、ジェイコブファイン、「子供、親、祖父、祖母のためのJavaプログラミング」です。」
私の頭ではなく、スマートブックのページに頑なに留まろうとしていた、ばらまこうとする知識を統合するために、私は簡単なゲームを書くことにしました。 主なタスクは、サードパーティのライブラリを使用せずに記述することでした。
一般的なアイデア(私のものではなく、Chain Rxnフラッシュゲームから取ったもの)
長方形の競技場では、レベルに応じて、壁に反射するさまざまな速度で、それに沿って着用されるいくつかのボールが表示されます。 プレーヤーは競技場でマウスカーソルを押します。押した時点でボールが成長し、所定の半径まで増加します。 一定時間後、残りのボールは、衝突した場合、停止し、サイズが大きくなり、さらに小さくなり、消えます。
各レベルの特定の目標は、「ノックアウト」するボールの数です。

実装。
まず、GameConstantsインターフェースが作成され、そこにすべての主要な定数が配置されました。 すべてのクラスについて、GameConstantsの実装が指定されました:
GameConstantsインターフェースpublic interface GameConstants { public final int DEFAULT_WIDTH = 600;
次に、Ballクラスが作成されました。 このクラスの各オブジェクトには、x軸とy軸に沿った独自の座標セット、dx変数とdy変数があり、単位時間あたりの座標の増分(実際には速度)、半径と半径の増分の値、および色と一意の識別子が記録されます。 識別子は、後で衝突を追跡するときに役立ちます。
各ボールには、現在の状態を特徴付けるinAction変数もあります。つまり、0-衝突前、1-衝突と成長、2-寿命とサイズの縮小です。
別のタイマーがクラスに追加されました。その目的は、ボールの「寿命」の時間を、最大サイズに達した瞬間から追跡することです。 上記のインターフェース(LIFETIME)で指定された時間が経過すると、サイズの増分は負になり、サイズがゼロになるとオブジェクトが削除されます。
ボールクラス public class Ball implements GameConstants { private int inAction;
moveBall関数では、ボールの位置とそのサイズが追跡されます。 これを行うには、速度値を座標に追加します。これは、以下の
BallGameクラスでランダムな値として設定され、その増分はベース半径の値(ゼロに設定)に追加されます。
x+=dx; y+=dy; radius+=dRadius;
BallComponentクラスはJPanelを継承し、競技場を直接描画する役割を果たし、Ballタイプのオブジェクトが配置され、スコアが維持されるリストを作成します。 オブジェクトの存続期間が過ぎると、リストから削除されます。
BallComponentクラス public class BallComponent extends JPanel implements GameConstants { List<Ball> listBall = new CopyOnWriteArrayList<>(); boolean startClick; public int score=0; public int totalScore=0;
さらに、HorstmannとCornellの教育的な例の最良の伝統では、メインのBallGameクラスが作成され、そこからBallGameFrame()クラスが呼び出されました。
BallGameクラス public class BallGame implements GameConstants { public static void main(String[] args) { EventQueue.invokeLater(new Runnable() { public void run() { JFrame ballFrame = new BallGameFrame(); ballFrame.setVisible(true); }}); }}
JFrameを継承するBallGameFrameクラスは、競技場の外部シェルを作成します。つまり、要素を配置し、マウスイベントリスナーを処理し、情報メッセージを出力します。 また、マウスをクリックすると呼び出されるstartGame()関数も含まれます。 この関数は、無限のゲームループが回転するストリームを起動します。
BallGameFrameクラス class BallGameFrame extends JFrame implements GameConstants{ private int level=1;
メインアクションが実行されるBallRunnableクラス。
BallRunnableクラス class BallRunnable implements Runnable, GameConstants{ private BallComponent ballComponent; private JLabel scoreLabel; private int level, ballQnt; private MousePlayer mousePlayerListener; private int goal; public BallRunnable(final BallComponent ballComponent, JLabel scoreLabel, int level, int ballQnt) { this.ballComponent = ballComponent; this.scoreLabel = scoreLabel; this.level=level; this.ballQnt=ballQnt; this.goal=2; } class MousePlayer extends MouseAdapter{ public void mousePressed(MouseEvent e) { Random random = new Random(); Ball ball = new Ball(e.getX(), e.getY(), 0, 0, BASERADIUS, new Color(random.nextInt(255),random.nextInt(255),random.nextInt(255)), 1, 1); ballComponent.addBall(ball); ballComponent.startClick=true; ballComponent.removeMouseListener(mousePlayerListener); ballComponent.removeMouseMotionListener(mousePlayerListener); ballComponent.setCursor(Cursor.getDefaultCursor()); }} public void run(){ while(true){ try{ mousePlayerListener = new MousePlayer(); ballComponent.addMouseListener(mousePlayerListener); ballComponent.addMouseMotionListener(mousePlayerListener);
メッセージは別のストリームで画面に表示されることに注意してください。 これについては、ホルストマンの第14章「マルチスレッド処理」および「ストリームとSwingライブラリ」セクションを参照してください。
各レベルで、ボールの総数と目標(ノックアウトする必要がある数)が増加します。 最初は、プレーヤーが最初に多くのボール(たとえば、10個中8個)を打たなければならないようにしましたが、これはテスターにとって退屈に見え、ゲームは中止されました。 そのため、難易
度の不適格度を徐々に上げることにしました。
公式記録はレベル86です。 著者自身が最大レベル15まで行きました。
その後、休暇を取らせてください。 アドバイス、批判、サポートを楽しみにしています。