#include <iostream>
#include <bitset>
using namespace std;
bool isPoisen = false;
bool isStone = false;
bool isParalysis = false;
bool isDead = false;
unsigned char status = 0;
//00000000 8bitのフラグを用意、右4ビットで死麻石毒
const unsigned char poison = 1 << 0;//毒
//1を左に0ビットシフト 0001 => 0001
const unsigned char stone = 1 << 1;//石化
//1を左に1ビットシフト 0001 => 0010
const unsigned char paralysis = 1 << 2;//麻痺
//1を左に2ビットシフト 0001 => 0100
const unsigned char dead = 1 << 3;//死
//1を左に3ビットシフト 0001 => 1000
void bitkusaiIki() { //ff的な臭い息 ビットフラグ版
int stat = rand() % 6;
switch (stat) {
//フラグをセットするときは、ORを使う
case 0:status = status | poison; break;
case 1:status = status | stone; break;
case 2:status = status | paralysis; break;
case 3:status = status | dead; break;
case 4:status = status | poison | paralysis; break; //毒と、麻痺が同時に起こる
case 5:status = status | poison | paralysis | stone; break; //毒と麻痺と石化が同時に起こる
default:break;
}
}
void setState(const unsigned char sstate)
{
status = status | sstate; //フラグを立てるときは OR
}
bool getState(const unsigned char sstate)
{
return(status & sstate); //フラグを確認するときは AND
}
void unsetState(const unsigned char sstate)
{
status = status & ~sstate; //フラグを下げるときは AND NOT
}
void kusaiIki() { //ff的な臭い息 フラグ変数版
int stat = rand() % 4;
switch (stat) {
case 0:isPoisen = true; break;
case 1:isStone = true; break;
case 2:isParalysis = true; break;
case 3:isDead = true; break;
default:break;
}
}
void lastChance()
{
int stat = rand() % 100;
if (stat == 7)
{
unsetState(dead);
}
}
void printState()
{
cout << "あなたの状態" << endl;
cout << " 毒:" << getState(poison) << endl;
cout << "石化:" << getState(stone) << endl;
cout << "麻痺:" << getState(paralysis) << endl;
cout << " 死:" << getState(dead) << endl;
}
int main() {
//cout << "status=" << bitset<8>(status) << endl;
//cout << "poison=" << bitset<8>(poison) << endl;
//cout << "stone=" << bitset<8>(stone) << endl;
//cout << "paralysis=" << bitset<8>(paralysis) << endl;
//cout << "dead=" << bitset<8>(dead) << endl;
//status = status | poison | stone;
// 00000000
// 00000001
// 00000010 のOR
//cout << "status=" << bitset<8>(status) << endl;
//status = status & ~(stone) & ~(poison);
////フラグを下げるときは & ~(下げるフラグ)
//cout << "status=" << bitset<8>(status) << endl;
srand((unsigned int)time(nullptr));
while (!getState(dead)) {
bitkusaiIki();
printState();
getchar();
}
cout << "ラストチャンス" << endl;
lastChance();
if (!getState(dead)) {
cout << "生き返った!" << endl;
printState();
}
else {
cout << "ゲームオーバー" << endl;
}
}