Wątek przeniesiony 2018-06-10 12:08 z C/C++ przez kq.

Cout nie wyświetla globalnego string;

0

Tutaj chodzi mi o 3 linie które zaznaczyłem w komentarzach dużymi literami. **Cout ** nie wyświetla napisu który zainicjalizowałem globalnie poprzez string, jednak kiedy używam char nie ma problemu z wyświetleniem. Tak z ciekawości zastanawiam się jaka może być tego przyczyna.

// ConsoleApplication45.cpp : Defines the entry point for the console application.
//

#include "stdafx.h"
#include <iostream>
#include <ctime>
#include <locale>
#include <conio.h>
#include <cstdlib>
#include <time.h>
#include <windows.h>

using namespace std;

struct warior {string name; float attack; float hp;};            // DEKLARACJA
warior enemy[10]{ enemy[0] = { "Pucybut", 5.5, 113 } };  
warior champion[10]{ champion[0] = { "aaa", 4, 125 } }; // INICJALIZACJA
int i, R_number;
float C_hp = 100, E_hp = 100, gold;
												
void battle();				
int N_random(int& x);
void Crit_chance(int x, float& z );


int main()
{
	setlocale(LC_ALL, "");
	cout << champion[0].name << endl;                            // COUT NIE wyświetla "aaa"
	cout << "Witaj w świecie łamanych kości i czaszek!\n";
	cout << "Witaj na aranie!\n";
	cout << "----------------------------------------------------\n";
	wcout << L"Wpisz imię swojego wojownika(bez pl znaków): ";
	
	cout << "\nTwój pierwszy przeciwnik to: " << enemy[0].name << endl;
	battle();
	Sleep(3000);
	system("cls");
	cout << C_hp << " i: " << E_hp;

	cin.get();
	cin.get();
	return 0; // zrobić, a następnie zapętlić menu główne
}

void battle()
{
	int choice;

	while (C_hp >= 0 && E_hp >= 0)
	{

		cout << "\n1. Atakuj!\n";
		cout << "2. Opuśc arenę\n\n";
		cin >> choice;
		switch (choice)
		{
		case 1:
			N_random(R_number);
			Crit_chance(R_number, E_hp);
			C_hp = C_hp - enemy[0].attack;
			
			break;
		case 2:
			cout << "Wyszedłeś z pola bitwy\n";
			exit(0);
			break;
		}
		cout << "Pozostałe życie " << champion[0].name << " to: " << C_hp << endl;
		cout << "Pozostałe życie " << enemy[0].name << " to: " << E_hp << endl;
		Sleep(1000);

		if (E_hp <= 0)
			{
			cout << "Pokonałeś " << enemy[0].name << "!"<< endl;
			}
		if (C_hp <= 0)
			{
			cout << "Przegrałeś z: " << enemy[0].name;
			cout << ". Wróć ponownie silniejszy." << endl;
			}
		// system("cls");
	}
}

int N_random(int& x)							// funkcja odpowiadająca za liczbę losową
{
	srand(time(NULL));
	x = rand() % 100 + 1; x = rand() % 100 + 1;
	x = rand() % 100 + 1; x = rand() % 100 + 1;
	x = rand() % 100 + 1; x = rand() % 100 + 1;
	x = rand() % 100 + 1; x = rand() % 100 + 1;
	x = rand() % 100 + 1; x = rand() % 100 + 1;
	x = rand() % 100 + 1; x = rand() % 100 + 1;
	x = rand() % 100 + 1; x = rand() % 100 + 1;
	x = rand() % 100 + 1; x = rand() % 100 + 1;
	x = rand() % 100 + 1; x = rand() % 100 + 1;
	return x = rand() % 100 + 1;
}

void Crit_chance(int x, float& z )
{
	if (x <= 20)

	{
		E_hp = E_hp - 5 * champion[0].attack;
		cout << "Zadajesz obrażenia krytyczne!" << endl;
	}
	else
	{
		E_hp = E_hp - champion[0].attack;
	}

	cout << endl << x << endl;
}
2
warior enemy[10]{ enemy[0] = { "Pucybut", 5.5, 113 } };  
warior champion[10]{ champion[0] = { "aaa", 4, 125 } }; // INICJALIZACJA

Tak się nie inicjalizuje tablic w C++. Inicjalizuj normalnie to będzie działało.

warior enemy[10]{ { "Pucybut", 5.5, 113 } };  
warior champion[10]{ { "aaa", 4, 125 } }; // INICJALIZACJA

Dodatkowo: nie używaj zmiennych globalnych, tutaj masz idealny use case dla opakowania zachowań w klasy.

0

Już rozumiem. Dzięki;).

0
int N_random(int& x)                            // funkcja odpowiadająca za liczbę losową
{
    srand(time(NULL));
    x = rand() % 100 + 1; x = rand() % 100 + 1;
    x = rand() % 100 + 1; x = rand() % 100 + 1;
    x = rand() % 100 + 1; x = rand() % 100 + 1;
    x = rand() % 100 + 1; x = rand() % 100 + 1;
    x = rand() % 100 + 1; x = rand() % 100 + 1;
    x = rand() % 100 + 1; x = rand() % 100 + 1;
    x = rand() % 100 + 1; x = rand() % 100 + 1;
    x = rand() % 100 + 1; x = rand() % 100 + 1;
    x = rand() % 100 + 1; x = rand() % 100 + 1;
    return x = rand() % 100 + 1;
}

Co to za pieroństwo? Liczbę wystarczy raz wysolować – nie musisz tego robić dziesiątki razy. A nawet jeśli byś musiał, to taką drabinkę należy wymienić na pętlę, zamiast kopiować ten kod wielokrotnie.

0
int N_random(int& x)							// funkcja odpowiadająca za liczbę losową
{
	int i;
	for (i = 0; i < 20; i++)
	{
		srand(time(NULL));
		x = rand() % 100 + 1;
	}
	return x = rand() % 100 + 1;
}

Mądrze powiedziane. Tak ładniej wygląda.
Dlatego zapętlam że losuje na podstawie upływu sekund, więc jak daje tylko jeden raz po prostu idzie stopniowo w górę. Więc co to za losowość.

1

Po co w pętli resetujesz seeda? To z założenia masz zrobić raz, na początku działania programu... Po kiego grzyba losujesz 20 razy i ignorujesz 19 wyników?

W ogóle, zapraszam do lektury: https://dsp.krzaq.cc/post/180/nie-uzywaj-rand-cxx-ma-random/

0

Dzięki za ten kod, od razu poprawiła się jakość programu. Dobry blog.

1 użytkowników online, w tym zalogowanych: 0, gości: 1