Untitled

 avatar
unknown
plain_text
2 years ago
4.5 kB
1
Indexable
using System;
using System.Collections.Generic;

public enum WybranyZnak {
	Papier,
	Nozyce,
	Kamien,
	BrakWyboru
}

static class Extension {
	public static WybranyZnak ZnakWygrywajacy(this WybranyZnak z) {
		switch(z) {
			case WybranyZnak.Papier: return WybranyZnak.Nozyce;
			case WybranyZnak.Nozyce: return WybranyZnak.Kamien;
			case WybranyZnak.Kamien: return WybranyZnak.Papier;
			default: return WybranyZnak.BrakWyboru;
		}
	}
}

public interface IGracz {
	WybranyZnak WybierzRuch();

	void ZarejestrujRuchPrzeciwnika(WybranyZnak z);
}

public class GraczCzlowiek : IGracz {
	public GraczCzlowiek() {}

	public WybranyZnak WybierzRuch() {
		while(true) {
			Console.WriteLine("1) Papier. 2) Nożyce. 3) Kamień.");
			Console.Write("Co wybierasz? ");
			string s = Console.ReadLine();
			if (s == "1") return WybranyZnak.Papier;
			else if (s == "2") return WybranyZnak.Nozyce;
			else if (s == "3") return WybranyZnak.Kamien;
			else Console.WriteLine("Nieprawidłowy wybór!");
		}
	}

	public void ZarejestrujRuchPrzeciwnika(WybranyZnak z) {}
}

public class GraczAutomatyczny : IGracz {
	Random r = new Random();

	public GraczAutomatyczny() {}

	public WybranyZnak WybierzRuch() {
		return (WybranyZnak)r.Next(0, 3);
	}

	public void ZarejestrujRuchPrzeciwnika(WybranyZnak z) {}
}

public class GraczUczacySie : IGracz {
	Dictionary<WybranyZnak, int> licz_ruchow_przeciw = new Dictionary<WybranyZnak, int>();

	public GraczUczacySie() {
		licz_ruchow_przeciw[WybranyZnak.Papier] = 0;
		licz_ruchow_przeciw[WybranyZnak.Nozyce] = 0;
		licz_ruchow_przeciw[WybranyZnak.Kamien] = 0;
		licz_ruchow_przeciw[WybranyZnak.BrakWyboru] = 0;
	}

	public WybranyZnak WybierzRuch() {
		int max_wyst = 0;
		WybranyZnak z = WybranyZnak.BrakWyboru;
		foreach (var para in licz_ruchow_przeciw) {
			if (para.Value >= max_wyst) {
				z = para.Key;
				max_wyst = para.Value;
			}
		}
		return z.ZnakWygrywajacy();
		//return kto_wygrywa_z[z];
	}

	public void ZarejestrujRuchPrzeciwnika(WybranyZnak z) {
		++licz_ruchow_przeciw[z];
	}

	public PamiatkaGraczaUczacegoSie UtworzPamiatke() {
		return new PamiatkaGraczaUczacegoSie(licz_ruchow_przeciw);
	}

	public void OdtworzStan(PamiatkaGraczaUczacegoSie memento) {
		this.licz_ruchow_przeciw = new Dictionary<WybranyZnak, int>(memento.licz_ruchow_przeciw);
	}
}


public class PamiatkaGraczaUczacegoSie {
	public Dictionary<WybranyZnak, int> licz_ruchow_przeciw {get;}

	public PamiatkaGraczaUczacegoSie(Dictionary<WybranyZnak, int> licz_ruchow_przeciw) {
		this.licz_ruchow_przeciw = new Dictionary<WybranyZnak, int>(licz_ruchow_przeciw);
	}
}


public class HistoriaGraczaUczacegoSie {
	Stack<PamiatkaGraczaUczacegoSie> stos = new Stack<PamiatkaGraczaUczacegoSie>();

	public void DodajStan(PamiatkaGraczaUczacegoSie pam) {
		stos.Push(pam);
	}

	public PamiatkaGraczaUczacegoSie OdtworzOStatniStan() {
		var wynik = stos.Peek();
		stos.Pop();
		return wynik;
	}
}



public class PapierNozyceKamien {
	static IGracz KimMaByc(int num) {
		Console.WriteLine($"Kim ma być gracz {num}?");
		Console.Write("1) Człowiekiem. 2) Maszyną losową. 3) Maszyną uczącą się.");
		var odp = Console.ReadLine();
		if (odp == "1") return new GraczCzlowiek();
		else if (odp == "2") return new GraczAutomatyczny();
		else return new GraczUczacySie();
	}

	public static void Main(string[] args) {
		var kto_wygrywa_z = new Dictionary<WybranyZnak, WybranyZnak>();
		kto_wygrywa_z[WybranyZnak.Papier] = WybranyZnak.Nozyce;
		kto_wygrywa_z[WybranyZnak.Nozyce] = WybranyZnak.Kamien;
		kto_wygrywa_z[WybranyZnak.Kamien] = WybranyZnak.Papier;

		IGracz gracz1, gracz2;
		gracz1 = KimMaByc(1);
		gracz2 = KimMaByc(2);
		int punkty = 0;
		while (punkty < 2 && punkty > -2) {
			var wybor1 = gracz1.WybierzRuch();
			var wybor2 = gracz2.WybierzRuch();
			gracz1.ZarejestrujRuchPrzeciwnika(wybor2);
			gracz2.ZarejestrujRuchPrzeciwnika(wybor1);
			Console.WriteLine($"Gracz pierwszy wybrał: {wybor1}.");
			Console.WriteLine($"Gracz drugi wybrał: {wybor2}.");
			if (wybor1 == wybor2) {
				Console.WriteLine("Remis");
			}
			else if (wybor2 == kto_wygrywa_z[wybor1]) punkty -= 1;
			else punkty += 1;
			Console.WriteLine($"Punkty: {punkty}\n");
		}
		if (punkty >= 2) Console.WriteLine("Wygrał gracz pierwszy!");
		else Console.WriteLine("Wygrał gracz drugi!");
	}
}
Editor is loading...