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

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

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

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

並列処理

複数の計算が同時に実行される手法

同期

複数のディレクトリに存在するファイルを更新した場合に、すべてのファイルにも更新が行われる事、又は、同じ記憶領域に同時にアクセスして内容の整合性が失われてしまう事をを防ぐ制御などを同期と呼びます。

非同期処理

非同期処理とは一部のコードを別々のスレッドで実行させる手法です。アプリケーションのパフォーマンスを向上させる目的でこの手法を用います。

コードレビュー

コードレビューは、ソフトウェア開発の一工程で、 ソースコードの検査を行い、開発工程で見過ごされた誤りを検出する事で、 ソフトウェア品質を高めるためのものです。

解決済

スレッドの仕組みを使い、キャラクター同士で戦わせるプログラムでHPが0になっても処理が続いてしまう。

remontaruto8325
remontaruto8325

総合スコア3

Java

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

並列処理

複数の計算が同時に実行される手法

同期

複数のディレクトリに存在するファイルを更新した場合に、すべてのファイルにも更新が行われる事、又は、同じ記憶領域に同時にアクセスして内容の整合性が失われてしまう事をを防ぐ制御などを同期と呼びます。

非同期処理

非同期処理とは一部のコードを別々のスレッドで実行させる手法です。アプリケーションのパフォーマンスを向上させる目的でこの手法を用います。

コードレビュー

コードレビューは、ソフトウェア開発の一工程で、 ソースコードの検査を行い、開発工程で見過ごされた誤りを検出する事で、 ソフトウェア品質を高めるためのものです。

1回答

0評価

0クリップ

556閲覧

投稿2021/12/09 17:59

編集2021/12/09 18:02

前提・実現したいこと

スレッドを使って、キャラクター同士で戦闘を行い、攻撃を仕掛ける度に攻撃を受けた側のHPをー1する。
どちらかのキャラクターのHPが0になったらその時点で処理をやめる。
HPが0になったキャラクターは攻撃してはならず、攻撃側もHP0のキャラを攻撃できない。

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

どちらかのHPが0になっても、1回だけ死んだはずのキャラが攻撃してしまう。

実際の実行結果

Rock attacked Jay , Rock:10 , Jay:9
Rock attacked Jay , Rock:10 , Jay:8
Jay attacked Rock , Jay:8 , Rock:9
Rock attacked Jay , Rock:9 , Jay:7
Jay attacked Rock , Jay:7 , Rock:8
Rock attacked Jay , Rock:7 , Jay:6
Jay attacked Rock , Jay:6 , Rock:7
Jay attacked Rock , Jay:6 , Rock:6
Rock attacked Jay , Rock:6 , Jay:5
Rock attacked Jay , Rock:6 , Jay:4
Rock attacked Jay , Rock:6 , Jay:3
Jay attacked Rock , Jay:3 , Rock:5
Rock attacked Jay , Rock:5 , Jay:2
Jay attacked Rock , Jay:2 , Rock:4
Rock attacked Jay , Rock:4 , Jay:1
Jay attacked Rock , Jay:1 , Rock:3
Jay attacked Rock , Jay:1 , Rock:2
Rock attacked Jay , Rock:2 , Jay:0
Jay attacked Rock , Jay:0 , Rock:1
↑でJayは死んでいるはずなのに攻撃している。
Jaylost.

該当のソースコード

Java

class Fight{ public static void main(String args[]) { RPGCharacter c1 = null,c2 = null; c1 = new RPGCharacter("Jay",10); c2 = new RPGCharacter("Rock",10); c1.setTarget(c2); c2.setTarget(c1); c1.start(); c2.start(); } } class RPGCharacter extends Thread{ String name; int hp; RPGCharacter target; Object lock = new Object(); RPGCharacter(String name,int hp){ this.name = name; this.hp = hp; } void setTarget(RPGCharacter target) {this.target = target;} RPGCharacter getTarget(){synchronized(lock) {return target;}} void attack() { synchronized(lock) { while(hp>0&&target.hp>0) { try {Thread.sleep((int)(10*Math.random()));} catch(InterruptedException ie) {} if(target.hp>0)target.hp--; System.out.println(name + " attacked " + target.name + " , " + name + ":" + hp + " , " + target.name + ":" + target.hp); } if(hp<=0) { System.out.println(name + "lost."); } } } public void run() { attack(); } }

試したこと

synchronizedの書き方をいろいろ試したのですがどうもうまくいきません!c1とc2、同時に処理が行われているから、HPが0になった判定while(hp>0&&target.hp>0)を受ける前に攻撃の処理をしてしまうっていうことは何となくわかるのですが、、
同期処理についての理解が足りないのでしょうか?

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

Java初心者なので、質問内容等で不快にさせてしまったら申し訳ありません!

良い質問の評価を上げる

以下のような質問は評価を上げましょう

  • 質問内容が明確
  • 自分も答えを知りたい
  • 質問者以外のユーザにも役立つ

評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

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

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

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

teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

  • プログラミングに関係のない質問
  • やってほしいことだけを記載した丸投げの質問
  • 問題・課題が含まれていない質問
  • 意図的に内容が抹消された質問
  • 過去に投稿した質問と同じ内容の質問
  • 広告と受け取られるような投稿

評価を下げると、トップページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

まだ回答がついていません

会員登録して回答してみよう

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

ただいまの回答率
87.20%

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

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

質問する

関連した質問

同じタグがついた質問を見る

Java

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

並列処理

複数の計算が同時に実行される手法

同期

複数のディレクトリに存在するファイルを更新した場合に、すべてのファイルにも更新が行われる事、又は、同じ記憶領域に同時にアクセスして内容の整合性が失われてしまう事をを防ぐ制御などを同期と呼びます。

非同期処理

非同期処理とは一部のコードを別々のスレッドで実行させる手法です。アプリケーションのパフォーマンスを向上させる目的でこの手法を用います。

コードレビュー

コードレビューは、ソフトウェア開発の一工程で、 ソースコードの検査を行い、開発工程で見過ごされた誤りを検出する事で、 ソフトウェア品質を高めるためのものです。