Paper-Scissors-Rock is a game for two players. Each player simultaneously opens his/her hand to display a symbol:
* Fist equals rock,
* Open hand equals paper,
* Showing the index and middle finger equals scissors.
The winner is determined by the following schema:
* paper beats (wraps) rock,
* rock beats (blunts) scissors,
* scissors beats (cuts) paper.
Algorithm1
#include <stdio.h>
#include <tchar.h>
#include <string>
#include <ctime>
#include <map>
#include <iostream>
using namespace std;
const int Rock = -2;
const int Paper = 0;
const int scissors = 1;
std::string str_symbols[3] = {"Rock", "Paper", "scissors"};
std::string results[3] = {"Win", "Lose", "Deuce"};
int symbols[3] = {Rock, Paper, scissors};
int CreateSymbol()
{
srand((unsigned)time(0));
return rand()%3;
}
int WhoWins(int x , int y)
{
int a = symbols[x];
int b = symbols[y];
if (a==b)
{
return 2;//deuce
}
if (a*b==0)
{
return a > b ? 0:1;
}
return abs(a) > abs(b)? 0:1;
}
const int N = 4;
int _tmain(int argc, _TCHAR* argv[])
{
int input;
for (int i=0; i<N; i++)
{
while(1)
{
cout<<"please input a number 0, 1 or 2 ";
cout<<"0-->Rock, 1-->Paper, 2-->scissors"<<endl;
cin>>input;
if (input>=0 && input <=2)
{
break;
}
cout<<"input is out of the range"<<endl;
}
int a = CreateSymbol();
int result = WhoWins(a, input);
std::cout<<"computer gives a "<<str_symbols[a]<<std::endl;
std::cout<<"you give a "<<str_symbols[input]<<std::endl;
std::cout<<"computer "<<results[result]<<std::endl;
}
return 0;
}
Algorithm2
#include <stdio.h>
#include <tchar.h>
#include <string>
#include <ctime>
#include <map>
#include <iostream>
#include <algorithm>
using namespace std;
std::string str_symbols[3] = {"Rock", "Paper", "scissors"};
std::string results[3] = {"Win", "Lose", "Deuce"};
int rules[5] = {2, 0, 1, 2, 0};
int CreateSymbol()
{
srand((unsigned)time(0));
return rand()%3;
}
int WhoWins2(int x , int y)
{
if (x == y)
{
return 2;
}
int *p_x= find(rules+1, rules+4, x);// find the element x from [rule[1]~rule[3]]
int *p_y = find(p_x-1, p_x+2, y);// find the element y from near by element x;
return p_x>p_y?0:1;
}
const int N = 4;
int _tmain(int argc, _TCHAR* argv[])
{
int input;
for (int i=0; i<N; i++)
{
while(1)
{
cout<<"please input a number 0, 1 or 2 ";
cout<<"0-->Rock, 1-->Paper, 2-->scissors"<<endl;
cin>>input;
if (input>=0 && input <=2)
{
break;
}
cout<<"input is out of the range"<<endl;
}
int a = CreateSymbol();
int result = WhoWins2(a, input);
std::cout<<"computer gives a "<<str_symbols[a]<<std::endl;
std::cout<<"you give a "<<str_symbols[input]<<std::endl;
std::cout<<"computer "<<results[result]<<std::endl;
}
return 0;
}
Summary
Algorithm2 is quicker if there are more variables. For example we have Tiger(0), Stick(1), Insect(2), Chicken(3), then we could establish a rule
int rule[] = {3, 0, 1, 2, 3, 0}
int WhoWins(int x , int y)
{
if (x == y)
{
return 2;
}
int *p_x= find(rules+1, rules+sizeof(rules)/sizeof(int)-2, x);
if (y == *(p_x+1))
{
return 1;//lose
}
else if (y == *(p_x-1))
{
return 0;//win
}
else
{
return 2;//deuce
}
}
j