Files
Greed/WinGreed/frmPersonRound.cs

406 lines
12 KiB
C#

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using System.Diagnostics;
namespace WinGreed
{
public partial class frmPersonRound : Form
{
int y = 79;
int x = 0;
int row = 0;
bool maxHeatPoints = false;
private List<Button> _dice = new List<Button>();
private HandleThrow _ht;
public string Player { get; set; }
public int TotPoints { get; set; }
List<int> Points = new List<int>();
public frmPersonRound(string player)
{
InitializeComponent();
Player = player;
this.Text = $"Din tur - {Player}";
_ht = new HandleThrow();
_ht.Who = Player;
///ht.Throw();
btnThrow.Enabled = true;
btnCollect.Enabled = true;
}
private void btnThrow_Click(object sender, EventArgs e)
{
x = 0;
y = y + btnDiceTmpl1.Height + 5;
var no = 0;
var result = _ht.Throw();
Button btn = null;
if (MarkGrayAndDisable(row))
{
result = _ht.Throw();
}
row++;
foreach (var item in result)
{
no++;
switch (item.Number)
{
case 1:
{
btn = btnDiceTmpl1.Clone<Button>();
btn.Name = $"btnDice{row}1";
break;
}
case 2:
{
btn = btnDiceTmpl2.Clone<Button>();
btn.Name = $"btnDice{row}2";
break;
}
case 3:
{
btn = btnDiceTmpl3.Clone<Button>();
btn.Name = $"btnDice{row}3";
break;
}
case 4:
{
btn = btnDiceTmpl4.Clone<Button>();
btn.Name = $"btnDice{row}4";
break;
}
case 5:
{
btn = btnDiceTmpl5.Clone<Button>();
btn.Name = $"btnDice{row}5";
break;
}
case 6:
{
btn = btnDiceTmpl6.Clone<Button>();
btn.Name = $"btnDice{row}6";
break;
}
default:
break;
}
_dice.Add(btn);
btn.Location = new Point(x + (btn.Width + 5) * no, y);
btn.Visible = true;
btn.Tag = item;
btn.Click += new System.EventHandler(btnDiceTmpl_Click);
this.Controls.Add(_dice.Last());
this.Refresh();
}
CalculateResult(result);
}
private void CalculateResult(List<Dice> result)
{
List<int> Numbers = new List<int>();
foreach (var item in result)
{
Numbers.Add(item.Number);
}
AnalyseNumbers(Numbers);
}
private bool MarkGrayAndDisable(int row)
{
var ok = false;
List<int> Numbers = new List<int>();
if (row > 0)
{
foreach (var item in _dice)
{
if (item.Name.Contains($"btnDice{row}"))
{
item.Enabled = false;
if (item.BackColor == Color.Red)
{
item.BackColor = Color.Gray;
Numbers.Add(((Dice)item.Tag).Number);
}
}
}
ok =AnalyseNumbers(Numbers, false);
}
return ok;
}
private bool AnalyseNumbers(List<int> numbers, bool before = true)
{
var result = false;
if (before)
{
TextBox txt = null;
TextBox txtRes = null;
txt = txtMaxValue.Clone<TextBox>();
txt.Name = $"txtMaxValue{row}";
txt.Location = new Point(x + 400, y);
txt.Visible = true;
this.Controls.Add(txt);
this.Refresh();
txtRes = txtChosenValue.Clone<TextBox>();
txtRes.Name = $"txtChosenValue{row}";
txtRes.Location = new Point(x + 400 + (txtRes.Width + 5), y);
txtRes.Visible = true;
this.Controls.Add(txtRes);
this.Refresh();
string outPut = CheckForDifferentOutCome(numbers);
var actTxtBox = ((TextBox)this.Controls.Find($"txtMaxValue{row}", true).FirstOrDefault());
actTxtBox.Text = outPut;
actTxtBox.Refresh();
if (numbers.Count > 0 && int.Parse(outPut.Trim()) == 0)
{
btnThrow.Enabled = false;
btnCollect.Enabled = false;
MarkGrayAndDisable(row);
}
}
else
{
string outPut = CheckForDifferentOutCome(numbers);
var actTxtBox = ((TextBox)this.Controls.Find($"txtChosenValue{row}", true).FirstOrDefault());
actTxtBox.Text = outPut;
actTxtBox.Refresh();
if(((TextBox)this.Controls.Find($"txtMaxValue{row}", true).FirstOrDefault()).Text == actTxtBox.Text
&& int.Parse(actTxtBox.Text.Trim()) > 0
&& _ht.Dices.Count(x => x.Chosen == true) == _ht.Dices.Count)
{
_ht.Dices.ForEach(x => x.Chosen = false);
result = true;
}
}
numbers.ForEach(x => Debug.Write($"{x}, "));
Debug.WriteLine(" -");
return result;
}
private string CheckForDifferentOutCome(List<int> numbers)
{
var outPut = "";
var sum = 0;
maxHeatPoints = false;
numbers.Sort();
sum = CheckForDoubleTriple(numbers);
sum += CheckForTripleDouble(numbers);
sum += CheckForSerial(numbers);
sum += CheckForThreeOrMore(numbers);
outPut = sum.ToString();
return outPut;
}
private int CheckForSerial(List<int> numbers)
{
if (numbers.Count > 5)
{
for (int i = 0; i < numbers.Count; i++)
{
if (numbers[i] != i + 1)
{
return 0;
}
}
maxHeatPoints = true;
return 1500;
}
return 0;
}
private int CheckForThreeOrMore(List<int> numbers)
{
var result = 0;
var ones = 0;
var twos = 0;
var threes = 0;
var fours = 0;
var fives = 0;
var sixs = 0;
//if(numbers.Count > 2)
//{
foreach (var number in numbers)
{
switch (number)
{
case 1:
{
ones++;
break;
}
case 2:
{
twos++;
break;
}
case 3:
{
threes++;
break;
}
case 4:
{
fours++;
break;
}
case 5:
{
fives++;
break;
}
case 6:
{
sixs++;
break;
}
default:
break;
}
}
result += NumberCounts(ones, 1);
result += NumberCounts(twos, 2);
result += NumberCounts(threes, 3);
result += NumberCounts(fours, 4);
result += NumberCounts(fives, 5);
result += NumberCounts(sixs, 6);
//}
return result;
}
public int NumberCounts(int value, int nmbr)
{
if (value > 2)
{
var back = nmbr == 1 ? 1000 : nmbr * 100;
if (value > 3)
{
back *= 2;
}
if (value > 4)
{
back *= 2;
}
if (value > 5)
{
back *= 2;
}
return back;
}
else
{
if ((value < 3 && (nmbr == 1 || nmbr == 5)) && !maxHeatPoints)
{
var back = value * (nmbr == 1 ? 100 : 50);
return back;
}
}
return 0;
}
private int CheckForTripleDouble(List<int> numbers)
{
if (numbers.Count == 6
&& numbers[0] == numbers[1]
&& numbers[2] == numbers[3]
&& numbers[4] == numbers[5]
&& numbers[1] != numbers[2]
&& numbers[3] != numbers[4]
&& numbers[0] != numbers[5])
{
maxHeatPoints = true;
return 1500;
}
return 0;
}
private int CheckForDoubleTriple(List<int> numbers)
{
if (numbers.Count == 6
&& numbers[0] == numbers[2]
&& numbers[3] == numbers[5]
&& numbers[2] != numbers[3])
{
maxHeatPoints = true;
return 1500;
}
return 0;
}
private void btnDiceTmpl_Click(object sender, EventArgs e)
{
if (((Dice)((Button)sender).Tag).Chosen)
{
((Button)sender).BackColor = Color.Green;
((Dice)((Button)sender).Tag).Chosen = false;
}
else
{
((Dice)((Button)sender).Tag).Chosen = true;
((Button)sender).BackColor = Color.Red;
}
}
private void btnClose_Click(object sender, EventArgs e)
{
this.Close();
}
private void btnCollect_Click(object sender, EventArgs e)
{
btnThrow.Enabled = false;
MarkGrayAndDisable(row);
var totalSum = 0;
for (int i = row; i > 0; i--)
{
var acttxt = (TextBox)this.Controls.Find($"txtChosenValue{i}", true).FirstOrDefault();
totalSum += int.Parse(acttxt.Text);
}
if (_ht.Score == 0 && totalSum < 1000)
{
//Startspärr
}
else
{
_ht.Score += totalSum;
}
TotPoints = _ht.Score;
txtTotalPoints.Text = _ht.Score.ToString();
}
private void frmPersonRound_Shown(object sender, EventArgs e)
{
txtTotalPoints.Text = TotPoints.ToString();
_ht.Score = TotPoints;
}
}
}