Jung Marco Ответов: 2

Как я могу исправить эту игру Камень-ножницы-бумага в C++, используя "класс" ?


Теперь это выглядит так :

Press 1 for Rock, 2 for Paper, 3 for Scissors

Player's choice:
AI:

AI wins!

=============
wins:
ties:
losses:
=============
would you like to play again?

/////////

Тем не менее, я бы с удовольствием сделал так, используя" класс", чтобы игрок - победитель каждого раунда брал 10 л. с. У врага и когда
Кто-то забирает все hp у врага, а затем печатает "AI или игрок получает победу!":


Press 1 for Rock, 2 for Paper, 3 for Scissors

Player's Current hp:50
AI's Current hp:50

Player's choice:1
AI:3

AI wins! (then showing Player's hp 40 and AI's hp 60 at next round)

=============
wins:
ties:
losses:
=============
would you like to play again?


Что я уже пробовал:

#include "stdafx.h"
#include <iostream>
#include <string>
#include <time.h>
#include <cmath>
#include <cstdlib>

using namespace std;


class play {
private:
	int hp ;
public:
	void ShowHp();
	void SetHp(int *_hp);

};

void play::ShowHp(){
	cout << "CurrentHp: " << hp << endl;
}
void play::SetHp(int *_hp) {
	hp = *_hp;
}



int main() {

	play player;
	
	char ch;
	
	int win = 0; // hp +10
	int tie = 0; // keep hp
	int lose = 0; // hp -10

	//cout << PlayerHP: << ;
	//cout << AiHP: << ;
	
	do {
		int choice;

		
		cout << "Press 1 for Rock, 2 for Paper, 3 for Scissors" << endl;
		cout << endl;

		cout << "Player's Choice: ";
		cin >> choice;
		
	
		int ai = rand() % 3 + 1;
		cout << "AI: " << ai << endl;
		cout << endl;
		
		//
		if (choice == 1 && ai == 1) {
			cout << "tie!" << endl;
			cout << endl;
			tie++;
		}
		else if (choice == 1 && ai == 2) {
			cout << "Ai wins!." << endl;
			cout << endl;
			lose++; // how can I reduce player's hp??
		}
		else if (choice == 1 && ai == 3) {
			cout << "Player wins!" << endl;
			cout << endl;
			win++;
		}
		else if (choice == 2 && ai == 1) {
			cout << "Player wins!" << endl;
			cout << endl;
			win++;
		}
		else if (choice == 2 && ai == 2) {
			cout << "tie!" << endl;
			cout << endl;
			tie++;
		}
		else if (choice == 2 && ai == 3) {
			cout << "Ai wins!" << endl;
			cout << endl;
			lose++;
		}
		else if (choice == 3 && ai == 1) {
			cout << "Ai wins!" << endl;
			cout << endl;
			lose++;
		}
		else if (choice == 3 && ai == 2) {
			cout << "Player wins!" << endl;
			cout << endl;
			win++;
		}
		else if (choice == 3 && ai == 3) {
			cout << "tie!" << endl;
			cout << endl;
			tie++;
		}
		
		else {
			cout << "WRONG SELECT" << endl;
			cout << endl;
		}
		// 
		cout << "============================================="<<endl;
		cout << "Wins: " << win << endl;
		cout << "Ties:" << tie << endl;
		cout << "Losses:" << lose << endl;
		cout << "=============================================" << endl;
		cout << "Would you like to play again? Y/N" << endl;
		cin >> ch;
		
		system("CLS");
	} while (ch == 'Y' || ch == 'y');
	//system("pause"); took this out so that the loop ends it with out you needing to hit another button
	return 0;
	
}

Rick York

На этом этапе я рекомендую использовать отладчик, чтобы вы могли видеть, что на самом деле делает код.

Patrice T

В чем же проблема ?

2 Ответов

Рейтинг:
8

KarstenK

вам нужно только несколько функций и добавить их в правильные места в вашем коде

void play::GameLost(){
  hp -= 10;
  cout << "GameLost CurrentHp: " << hp << endl;
}
void play::GameWon(){
  hp += 10;
  cout << "GameWon CurrentHp: " << hp << endl;
}
bool play::IsAlive(){
  cout << (hp > 0) ? "alive" : "dead" << endl;
  return hp > 0;
}


Рейтинг:
13

OriginalGriff

Начните избавляться от "магических чисел":

if (choice == 1 && ai == 1) {
"1", "2" и так далее не делают ваш код слишком читабельным: enum быть намного лучше:
if (choice == PlayType.Rock && ai == PlayType.Rock) {
это целая нагрузка более очевидна.
Но... Я бы все сделал по-другому.

C++ - это объектно-ориентированный язык, поэтому я бы организовал свои данные как объекты: каждый игрок-это объект, так почему бы игроку не иметь функции воспроизведения, которая генерирует его go? И функция результата, которая решает, кто выиграл раунд?
player1.Play();
player2.Play();
result = player1.Result(player2);
if (result == Result.Lose)
   {
   ...
   }
else if (result == Result.Draw)
   {
   ...
   }
else if (result == Result.Win)
   {
   ...
   }
else
   {
   // Panic!
   ...
   }
Таким образом, вы сохраняете "механику" реальной игры внутри игрока, а не "размазываете ее" по всему коду.
Конструктору игрока можно сказать "человек" или "компьютер", а затем функция воспроизведения использует это, чтобы решить, запрашивать ли входные данные, или случайным образом (или разумно!) выбрать для раунда бумагу / камень / ножницы.

Это не только делает его "чище", но и означает, что один и тот же код может играть в различные игры без каких - либо изменений-класс игрока заменяется на "палач", или "крестики-нолики", или ... и главный код не должен знать об этом.

Да, и кстати: вместо того, чтобы делать серию if тесты, чтобы решить, кто выиграл раунд, рассматривали ли вы 2D-массив: если входные данные-игрок 1 поперек, а игрок два вниз, а камень-0, бумага-1, а ножницы-2, то:
    0  1  2
   --------
0 | 0  1 -1
1 |-1  0  1
2 | 1 -1  0
Результатом является элемент в индексной паре, а -1-проигрыш игрока 1, ноль-ничья, а 1-выигрыш игрока 1. Тогда это одна строка кода для проверки результатов!