masa
Re: masa
先ほどってなんですか?
なんで続きなのに新しいトピックにしたのですか?
どうしてタイトルを名前っぽい文字列にしているのですか?
わからないので教えて下さい
なんで続きなのに新しいトピックにしたのですか?
どうしてタイトルを名前っぽい文字列にしているのですか?
わからないので教えて下さい
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)
- Dixq (管理人)
- 管理人
- 記事: 1662
- 登録日時: 15年前
- 住所: 北海道札幌市
- 連絡を取る:
Re: masa
・解決していないトピックを解決にする
・関連した質問なのに別トピックを立てる
・新しく立てたトピックになんの前提知識の説明もない
・名前とトピックが反対
・トピック名が禁止されたトピック名になっている
もう少し落ち着いて行動しましょう。
何故解決していないトピックを解決にしたんでしょう?
同じ質問は同じトピックにしてください。
新しく立てたいなら全てここで説明しましょう。
また、せっかく回答してくれた人を無視するのはやめましょう。
結局自分の行動が正しくないので回答を減らしています。
masaさんにとって不利にしかなりません。
・関連した質問なのに別トピックを立てる
・新しく立てたトピックになんの前提知識の説明もない
・名前とトピックが反対
・トピック名が禁止されたトピック名になっている
もう少し落ち着いて行動しましょう。
何故解決していないトピックを解決にしたんでしょう?
同じ質問は同じトピックにしてください。
新しく立てたいなら全てここで説明しましょう。
また、せっかく回答してくれた人を無視するのはやめましょう。
結局自分の行動が正しくないので回答を減らしています。
masaさんにとって不利にしかなりません。
Re: masa
元のトピックにリンクしておきます。
http://dixq.net/forum/viewtopic.php?f=3&t=17588
前のトピックで同じ攻撃パターンになること、同じ行動しかしないことは指摘済みですが
あなたがどうしたいのか答えていただけなかったので助言しようがありません。
仕様案も併せて提示していましたがスルーされたということは、他にmasaさんの確固たる仕様があるのでしょうから
見守ることにします。
がんばってください。
http://dixq.net/forum/viewtopic.php?f=3&t=17588
あなたがどうしたいのかわからないので教えて下さいmasa さんが書きました:先ほどの続きです
バトルの中をswitch分にしました
switch{
case1 ミス;
break
case2 回復;
break
・
・
・
}
先攻も後攻めもおなじ攻撃パターンになります
わからないので教えて下さい
オフトピック
先攻(せんこう)と後攻め(あとぜめ?)
あなたがどうしたいのか答えていただけなかったので助言しようがありません。
仕様案も併せて提示していましたがスルーされたということは、他にmasaさんの確固たる仕様があるのでしょうから
見守ることにします。
がんばってください。
Advanced Supporting Developer
無理やりこじつけ(ぉ
無理やりこじつけ(ぉ
教えて下さい
#include<stdio.h>
#define HP_MAX (1000)
#define ATTACK_MAX (20)
#define PLAYER_MAX (2)
#define LIFE_MAX (30)
#define UPATTACK_MAX (2)
#define DOWNATTACK_MAX (2)
#include <windows.h>
#include <tchar.h>
#include <stdio.h>
#include <stdlib.h>
#include <conio.h>
#include <time.h>
#include <io.h>
#include <mmsystem.h>
typedef struct {
char name[21];
int hp;
int attack;
} PLAYER;
void input_player(PLAYER *);
void output_player(PLAYER *);
bool battle(PLAYER*, PLAYER*);
int main(void){
int i;
PLAYER player_data[PLAYER_MAX];
PLAYER *pt_player_data;
pt_player_data = &player_data[0];
for (i = 0; i < PLAYER_MAX; i++)
{
printf("%d人目のステータス入力してください \n\n", (i + 1));
input_player(pt_player_data);
pt_player_data++;
}
pt_player_data = &player_data[0];
for (i = 0; i < PLAYER_MAX; i++)
{
printf("\n");
output_player(pt_player_data);
pt_player_data++;
}
rewind(stdin);
getchar();
int turn, b_end;
turn = 0;
do{
b_end = battle(&player_data[turn], &player_data[(turn ^ 1)]);
turn = (turn ^ 1);
} while (!b_end);
rewind(stdin);
getchar();
return 0;
}
void input_player(PLAYER*pt_data)
{
srand((unsigned)time(NULL));
scanf("%s", pt_data->name);
pt_data->hp = rand() % (HP_MAX + 1000);
pt_data->attack = rand() % (ATTACK_MAX + 2);
}
void output_player(PLAYER *pt_data)
{
printf("名前:%s\n体力:%d\n攻撃力:%d\n", pt_data->name, pt_data->hp, pt_data->attack);
}
bool battle(PLAYER *pt_atc, PLAYER *pt_def)
{
int retry;
srand((unsigned)time(NULL));
retry = rand() % 7;
switch (retry){
case 0:
Sleep(2000);
system("cls");
printf("---------------------\n");
printf("%s %s\n", pt_atc->name, pt_def->name);
printf("HP%d HP%d\n", pt_atc->hp, pt_def->hp);
printf("---------------------\n");
pt_def->hp -= pt_atc->attack;
printf(" %sの攻撃\n", pt_atc->name);
printf(" %sは%dの攻撃を受けた\n", pt_def->name, pt_atc->attack);
break;
case 1:
Sleep(2000);
system("cls");
printf("---------------------\n");
printf("%s %s\n", pt_atc->name, pt_def->name);
printf("HP%d HP%d\n", pt_atc->hp, pt_def->hp);
printf("---------------------\n");
printf(" %sの攻撃\n", pt_atc->name);
printf(" 攻撃は外れた\n");
break;
case 2:
Sleep(2000);
system("cls");
printf("---------------------\n");
printf("%s %s\n", pt_atc->name, pt_def->name);
printf("HP%d HP%d\n", pt_atc->hp, pt_def->hp);
printf("---------------------\n");
pt_def->hp -= pt_atc->attack * 2;
printf(" %sの攻撃\n", pt_atc->name);
printf(" クリティカルHIT\n");
printf(" %sは%dの攻撃を受けた\n", pt_def->name, pt_atc->attack * 2);
break;
case 3:
int life;
Sleep(2000);
system("cls");
printf("---------------------\n");
printf("%s %s\n", pt_atc->name, pt_def->name);
printf("HP%d HP%d\n", pt_atc->hp, pt_def->hp);
printf("---------------------\n");
srand((unsigned)time(NULL));
life = rand() % (LIFE_MAX + 2);
pt_atc->hp = pt_atc->hp + life;
printf(" %sは%d回復した\n", pt_atc->name, life);
break;
case 4:
Sleep(2000);
system("cls");
printf("---------------------\n");
printf("%s %s\n", pt_atc->name, pt_def->name);
printf("HP%d HP%d\n", pt_atc->hp, pt_def->hp);
printf("---------------------\n");
pt_def->hp -= pt_atc->attack * 1 / 2;
printf(" %sの攻撃\n", pt_atc->name);
printf(" ダメージ半減\n");
printf(" %sは%dの攻撃を受けた\n", pt_def->name, pt_atc->attack * 1 / 2);
break;
case 5:
int attack;
Sleep(2000);
system("cls");
printf("---------------------\n");
printf("%s %s\n", pt_atc->name, pt_def->name);
printf("HP%d HP%d\n", pt_atc->hp, pt_def->hp);
printf("---------------------\n");
srand((unsigned)time(NULL));
attack = rand() % (UPATTACK_MAX + 2);
pt_atc->attack = pt_atc->attack + attack;
printf(" %sは%d攻撃力が上がった\n", pt_atc->name, attack);
srand((unsigned)time(NULL));
break;
case 6:
int attackdown; //攻撃力ダウン
attackdown = 0;
Sleep(2000);
system("cls");
printf("---------------------\n");
printf("%s %s\n", pt_atc->name, pt_def->name);
printf("HP%d HP%d\n", pt_atc->hp, pt_def->hp);
printf("---------------------\n");
srand((unsigned)time(NULL));
attackdown = rand() % (DOWNATTACK_MAX + 2);
pt_atc->attack = pt_atc->attack - attackdown;
printf(" %sは%d攻撃力が下がった\n", pt_atc->name, attackdown);
srand((unsigned)time(NULL));
break;
}
if (pt_def->hp < 0)
pt_def = 0;
if (pt_def <= 0){
system("cls");
printf(" %sは勝利した \n", pt_atc->name);
rewind(stdin);
getchar();
return true;
}
return false;
}
先攻が通常攻撃をすると後攻も通常攻撃。
先攻が回復すると後攻も回復します。
なので先攻が通常攻撃 後攻は回復 先攻はミス 後攻は攻撃力UP みたいな感じにしたいです
Re: masa
オフトピック
前トピックを見返したけど「指摘」がどこなのか外野からはさっぱりわからんです.
swtichを使ったコード断片は この新しい側のトピックで初出であるように見えますが,
そのコードだと両プレイヤ(先攻と後攻)が選択する行動が同じになってしまうという問題がある
(…んですよね?多分. 説明不足すぎて本当のところは違うのかもですが)
ということに関して
前のトピックで指摘済みというのは時間の前後関係が謎です.
swtichを使ったコード断片は この新しい側のトピックで初出であるように見えますが,
そのコードだと両プレイヤ(先攻と後攻)が選択する行動が同じになってしまうという問題がある
(…んですよね?多分. 説明不足すぎて本当のところは違うのかもですが)
ということに関して
前のトピックで指摘済みというのは時間の前後関係が謎です.
…って書いてる間に問題の内容が詳しく書かれましたね.
Re: masa
srand((unsigned)time(NULL));
ここが問題なのではないでしょうか.
time()は時間を秒単位で返すのだったと思います.
あるときにこの行が実行されてから,次にこの行が実行されるまでの間に time()が返す値が変わっていなければ
srandの引数が変わらないことになり,
結果としてrand()の返す値が同じになります.
ひじょーにざっくり言うと, 先攻側のためのbattle()の処理には1秒を要しないだろうから,
ほとんどの場合において,後攻側のためのbattle()での行動選択のためのrand()が先行側と同じ値を返すことになる
ということです.
このsrandの行はbattle()内に書くのではなく,main関数の最初らへんに移してもよいのではないでしょうか.
ここが問題なのではないでしょうか.
time()は時間を秒単位で返すのだったと思います.
あるときにこの行が実行されてから,次にこの行が実行されるまでの間に time()が返す値が変わっていなければ
srandの引数が変わらないことになり,
結果としてrand()の返す値が同じになります.
ひじょーにざっくり言うと, 先攻側のためのbattle()の処理には1秒を要しないだろうから,
ほとんどの場合において,後攻側のためのbattle()での行動選択のためのrand()が先行側と同じ値を返すことになる
ということです.
このsrandの行はbattle()内に書くのではなく,main関数の最初らへんに移してもよいのではないでしょうか.
Re: masa
usao さんが書きました:オフトピックそのコードだと両プレイヤ(先攻と後攻)が選択する行動が同じになってしまうという問題がある
(…んですよね?多分. 説明不足すぎて本当のところは違うのかもですが)
ということに関して
前のトピックで指摘済みというのは時間の前後関係が謎です.
オフトピック
言われてみると「先攻も後攻めも同じ攻撃パターンになる」の理解を私が誤っていただけみたいですね。
ご指摘ありがとうございました。
前トピックの私の回答では、
1.行動のパターンを増やす(攻撃、昼寝、回復)
2.攻撃のパターンを増やす(通常攻撃、急所に命中、攻撃が外れる)
の2点を提示しており、それぞれでパターンの切り替え条件を質問していました。
「同じ攻撃パターンになること」というのは2の内の「通常攻撃しかしないこと(急所に命中、攻撃が外れるが発生しない)」を指していたつもりでした。
ご指摘ありがとうございました。
前トピックの私の回答では、
1.行動のパターンを増やす(攻撃、昼寝、回復)
2.攻撃のパターンを増やす(通常攻撃、急所に命中、攻撃が外れる)
の2点を提示しており、それぞれでパターンの切り替え条件を質問していました。
「同じ攻撃パターンになること」というのは2の内の「通常攻撃しかしないこと(急所に命中、攻撃が外れるが発生しない)」を指していたつもりでした。
Advanced Supporting Developer
無理やりこじつけ(ぉ
無理やりこじつけ(ぉ
Re: 教えて下さい
新しく質問する前に、masa さんが書きました:あと一つ質問したいのですが
先攻が攻撃する場合のアニメーションと後攻が攻撃する場合のアニメーションを作ったのですが
分岐が分からないので教えて下さい。
if文でお願いします。
上記の問題に対してどのように修正をして現状どうなったのかを提示してください。masa さんが書きました:(先攻と後攻)が選択する行動が同じになってしまうという問題がある
そうです。
またDixqさんの指摘もよく読まれてはいかがでしょうか。
Advanced Supporting Developer
無理やりこじつけ(ぉ
無理やりこじつけ(ぉ
Re: 教えて下さい
では現状の最新のソースを提示してください。masa さんが書きました:(先攻と後攻)が選択する行動が同じになってしまうという問題があるは解決しました
Advanced Supporting Developer
無理やりこじつけ(ぉ
無理やりこじつけ(ぉ