masa

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
教えて下さい

masa

#1

投稿記事 by 教えて下さい » 9年前

先ほどの続きです
バトルの中をswitch分にしました
switch{
case1 ミス;
break
case2 回復;
break



}
先攻も後攻めもおなじ攻撃パターンになります
わからないので教えて下さい

アバター
みけCAT
記事: 6734
登録日時: 14年前
住所: 千葉県
連絡を取る:

Re: masa

#2

投稿記事 by みけCAT » 9年前

先ほどってなんですか?
なんで続きなのに新しいトピックにしたのですか?
どうしてタイトルを名前っぽい文字列にしているのですか?
わからないので教えて下さい
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)

アバター
Dixq (管理人)
管理人
記事: 1662
登録日時: 15年前
住所: 北海道札幌市
連絡を取る:

Re: masa

#3

投稿記事 by Dixq (管理人) » 9年前

・解決していないトピックを解決にする
・関連した質問なのに別トピックを立てる
・新しく立てたトピックになんの前提知識の説明もない
・名前とトピックが反対
・トピック名が禁止されたトピック名になっている

もう少し落ち着いて行動しましょう。
何故解決していないトピックを解決にしたんでしょう?
同じ質問は同じトピックにしてください。
新しく立てたいなら全てここで説明しましょう。
また、せっかく回答してくれた人を無視するのはやめましょう。
結局自分の行動が正しくないので回答を減らしています。
masaさんにとって不利にしかなりません。

アバター
asd
記事: 319
登録日時: 15年前

Re: masa

#4

投稿記事 by asd » 9年前

元のトピックにリンクしておきます。
http://dixq.net/forum/viewtopic.php?f=3&t=17588
masa さんが書きました:先ほどの続きです
バトルの中をswitch分にしました
switch{
case1 ミス;
break
case2 回復;
break



}
先攻も後攻めもおなじ攻撃パターンになります
わからないので教えて下さい
あなたがどうしたいのかわからないので教えて下さい
オフトピック
先攻(せんこう)と後攻め(あとぜめ?)
前のトピックで同じ攻撃パターンになること、同じ行動しかしないことは指摘済みですが
あなたがどうしたいのか答えていただけなかったので助言しようがありません。
仕様案も併せて提示していましたがスルーされたということは、他にmasaさんの確固たる仕様があるのでしょうから
見守ることにします。

がんばってください。
Advanced Supporting Developer
無理やりこじつけ(ぉ

masa

教えて下さい

#5

投稿記事 by masa » 9年前

コード:

#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 みたいな感じにしたいです

アバター
usao
記事: 1889
登録日時: 12年前
連絡を取る:

Re: masa

#6

投稿記事 by usao » 9年前

オフトピック
前トピックを見返したけど「指摘」がどこなのか外野からはさっぱりわからんです.

swtichを使ったコード断片は この新しい側のトピックで初出であるように見えますが,
そのコードだと両プレイヤ(先攻と後攻)が選択する行動が同じになってしまうという問題がある
(…んですよね?多分. 説明不足すぎて本当のところは違うのかもですが)
ということに関して
前のトピックで指摘済みというのは時間の前後関係が謎です.
[追記]
…って書いてる間に問題の内容が詳しく書かれましたね.

教えて下さい

Re: masa

#7

投稿記事 by 教えて下さい » 9年前

(先攻と後攻)が選択する行動が同じになってしまうという問題がある

そうです。

masa

教えて下さい

#8

投稿記事 by masa » 9年前

先攻と後攻)が選択する行動が同じになってしまうという問題がある

そうです

アバター
usao
記事: 1889
登録日時: 12年前
連絡を取る:

Re: masa

#9

投稿記事 by usao » 9年前

srand((unsigned)time(NULL));

ここが問題なのではないでしょうか.

time()は時間を秒単位で返すのだったと思います.

あるときにこの行が実行されてから,次にこの行が実行されるまでの間に time()が返す値が変わっていなければ
srandの引数が変わらないことになり,
結果としてrand()の返す値が同じになります.

ひじょーにざっくり言うと, 先攻側のためのbattle()の処理には1秒を要しないだろうから,
ほとんどの場合において,後攻側のためのbattle()での行動選択のためのrand()が先行側と同じ値を返すことになる
ということです.

このsrandの行はbattle()内に書くのではなく,main関数の最初らへんに移してもよいのではないでしょうか.

アバター
asd
記事: 319
登録日時: 15年前

Re: masa

#10

投稿記事 by asd » 9年前

usao さんが書きました:
オフトピック
そのコードだと両プレイヤ(先攻と後攻)が選択する行動が同じになってしまうという問題がある
(…んですよね?多分. 説明不足すぎて本当のところは違うのかもですが)
ということに関して
前のトピックで指摘済みというのは時間の前後関係が謎です.
オフトピック
言われてみると「先攻も後攻めも同じ攻撃パターンになる」の理解を私が誤っていただけみたいですね。
ご指摘ありがとうございました。

前トピックの私の回答では、
1.行動のパターンを増やす(攻撃、昼寝、回復)
2.攻撃のパターンを増やす(通常攻撃、急所に命中、攻撃が外れる)
の2点を提示しており、それぞれでパターンの切り替え条件を質問していました。

「同じ攻撃パターンになること」というのは2の内の「通常攻撃しかしないこと(急所に命中、攻撃が外れるが発生しない)」を指していたつもりでした。
Advanced Supporting Developer
無理やりこじつけ(ぉ

masa

教えて下さい

#11

投稿記事 by masa » 9年前

あと一つ質問したいのですが
先攻が攻撃する場合のアニメーションと後攻が攻撃する場合のアニメーションを作ったのですが
分岐が分からないので教えて下さい。
if文でお願いします。

アバター
asd
記事: 319
登録日時: 15年前

Re: 教えて下さい

#12

投稿記事 by asd » 9年前

masa さんが書きました:あと一つ質問したいのですが
先攻が攻撃する場合のアニメーションと後攻が攻撃する場合のアニメーションを作ったのですが
分岐が分からないので教えて下さい。
if文でお願いします。
新しく質問する前に、
masa さんが書きました:(先攻と後攻)が選択する行動が同じになってしまうという問題がある

そうです。
上記の問題に対してどのように修正をして現状どうなったのかを提示してください。
またDixqさんの指摘もよく読まれてはいかがでしょうか。
Advanced Supporting Developer
無理やりこじつけ(ぉ

masa

教えて下さい

#13

投稿記事 by masa » 9年前

(先攻と後攻)が選択する行動が同じになってしまうという問題があるは解決しました

アバター
asd
記事: 319
登録日時: 15年前

Re: 教えて下さい

#14

投稿記事 by asd » 9年前

masa さんが書きました:(先攻と後攻)が選択する行動が同じになってしまうという問題があるは解決しました
では現状の最新のソースを提示してください。
Advanced Supporting Developer
無理やりこじつけ(ぉ

閉鎖

“C言語何でも質問掲示板” へ戻る