SeaBattle/Form1.cs

374 lines
15 KiB
C#
Raw Normal View History

2021-06-27 23:13:29 +00:00
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.Media;
namespace Project
{
public partial class form : Form
{
public form()
{
InitializeComponent();
}
int s, score, scorev, shot, kln, q;
int sd = 1;
Random myRnd = new Random();
SoundPlayer popal = new SoundPlayer(Properties.Resources.explosion);
SoundPlayer promah = new SoundPlayer(Properties.Resources.mimo);
//объявляю все переменные
private void Form1_Load(object sender, EventArgs e)
{
pole2.Enabled = false;
}
private void klv_Click(object sender, EventArgs e)
{
PictureBox klv = (PictureBox)sender;
//проверка на то куда мы стреляем
if (klv.BackgroundImage == null)
{
status.Text = "Идёт игра";
shot++;
lshot.Text = "Выстрелов: " + Convert.ToInt32(shot);
//если в ячейке был корабль то засчитывается очко и он становится подбитым
if (Convert.ToInt32(klv.Tag) == 2)
{
klv.BackgroundImage = Properties.Resources.popadanie;
score++;
klv.Tag = 3;
//воспроизведение звука если он включен
if (sd == 1)
{
popal.Play();
}
}
//если корабля не было то появляется крестик
else
{
klv.BackgroundImage = Properties.Resources.krest;
//воспроизведение звука
if (sd==1)
{
promah.Play();
}
}
//если мы достигаем 10 очков то игра завершается
if (score == 10)
{
pole2.Enabled = false;
start.Enabled = true;
status.Text = "Игра окончена! Вы победили!\nНажмите кнопку 'Старт' для повторной игры";
}
else
{
//компьютер выбирает новую ячейку отличную от предыдущих
do
{
kln = myRnd.Next(0, 99);
}
while (Convert.ToInt32(pole1.Controls[kln].Tag) == 3 || Convert.ToInt32(pole1.Controls[kln].Tag) == 1);
//если там был корабль то он становится подбитым и дается очко компьютеру
if (Convert.ToInt32(pole1.Controls[kln].Tag) == 2)
{
pole1.Controls[kln].BackgroundImage = Properties.Resources.popadanie;
pole1.Controls[kln].Tag = 3;
scorev++;
}
//если там ничего не было то ставится крестик
if (Convert.ToInt32(pole1.Controls[kln].Tag) == 0)
{
pole1.Controls[kln].BackgroundImage = Properties.Resources.krest;
pole1.Controls[kln].Tag = 1;
}
//если компьютер достигает 10 очков то игра завершается
if (scorev == 10)
{
L();
res.Visible = false;
res.Enabled = false;
start.Enabled = true;
start.Visible = true;
}
}
}
//объявление счета
lscore.Text = "Счет: " + Convert.ToInt32(scorev) + ":" + Convert.ToInt32(score);
}
private void kl_Click(object sender, EventArgs e)
{
PictureBox kl = (PictureBox)sender;
s++;
//если количество поставленных конраблей 10 то игра начинается
if (s == 10)
{
status.Text = "Игра началась! Уничтожьте все корабли противника";
pole1.Enabled = false;
pole2.Enabled = true;
res.Visible = true;
res.Enabled = true;
lshot.Text = "Выстрелов: " + Convert.ToInt32(shot);
lscore.Text = "Счет: " + Convert.ToInt32(scorev) + ":" + Convert.ToInt32(score);
}
kl.BackgroundImage = Properties.Resources.ship;
kl.Tag = 2;
kl.Enabled = false;
}
private void start_Click(object sender, EventArgs e)
{
//обнуление всех переменных и подготовка к началу новой игры
start.Enabled = false;
start.Visible = false;
status.Text = "Расставьте 10 кораблей по вашему полю";
lscore.Text = null;
lshot.Text = null;
pole1.Enabled = true;
int p, k, i, x, y, t;
t = 0;
x = 0;
y = 0;
p = 1;
Random myRnd1 = new Random();
List<int> shipv = new List<int>();
shipv.Clear();
pole1.Controls.Clear();
pole2.Controls.Clear();
s = 0;
score = 0;
scorev = 0;
shot = 0;
kln = 0;
//компьютер выбирает 10 не повторяющихся ячеек для кораблей
for (i = 1; i < 11; i++)
{
do
{
t = myRnd1.Next(1, 100);
}
while (shipv.Contains(t) == true);
shipv.Add(t);
}
for (k = 0; k < 10; k++)
{
//создание ячеек нашего поля
for (i = 1; i < 11; i++)
{
PictureBox kl = new PictureBox();
kl.Click += new System.EventHandler(this.kl_Click);
kl.MouseEnter += new System.EventHandler(this.kl_MouseEnter);
kl.MouseLeave += new System.EventHandler(this.kl_MouseLeave);
kl.SizeMode = PictureBoxSizeMode.StretchImage;
kl.BackColor = Color.FromArgb(127, 199, 255);
kl.Width = 30;
kl.Height = 30;
kl.Location = new Point(x, y);
kl.BorderStyle = BorderStyle.FixedSingle;
pole1.Controls.Add(kl);
kl.Name = "kl" + p;
x += 30;
p++;
}
y += 30;
x = 0;
}
y = 0;
p = 1;
for (k = 0; k < 10; k++)
{
//создание ячеек поля врага
for (i = 1; i < 11; i++)
{
PictureBox klv = new PictureBox();
klv.Click += new System.EventHandler(this.klv_Click);
klv.MouseEnter += new System.EventHandler(this.klv_MouseEnter);
klv.MouseLeave += new System.EventHandler(this.klv_MouseLeave);
//если номер который выбрал компьютер совпадает с номером ячейки то в этой ячейке появится корабль
if (shipv.ElementAt(0) == p || shipv.ElementAt(1) == p || shipv.ElementAt(2) == p || shipv.ElementAt(3) == p || shipv.ElementAt(4) == p || shipv.ElementAt(5) == p || shipv.ElementAt(6) == p || shipv.ElementAt(7) == p || shipv.ElementAt(8) == p || shipv.ElementAt(9) == p)
{
klv.Tag = 2;
}
klv.SizeMode = PictureBoxSizeMode.StretchImage;
klv.BackColor = Color.FromArgb(127, 199, 255);
klv.Width = 30;
klv.Height = 30;
klv.Location = new Point(x, y);
klv.BorderStyle = BorderStyle.FixedSingle;
pole2.Controls.Add(klv);
klv.Name = "klv" + p;
x += 30;
p++;
}
y += 30;
x = 0;
}
y = 0;
p = 1;
start.Enabled = false;
}
private void kl_MouseEnter(object sender, EventArgs e)
{
PictureBox kl = (PictureBox)sender;
//при ведении мышки над вашим полем появляется корабль с уменьшенной прозрачностью
if (s != 10)
{
kl.BackgroundImage = Properties.Resources.ship2;
}
}
private void res_Click(object sender, EventArgs e)
{
if (MessageBox.Show("Вы уверены, что хотите сдаться?", "Сдаться", MessageBoxButtons.YesNo) == DialogResult.Yes)
{
//завершение игры и показ всех кораблей противника
L();
for (q = 0; q < 100; q++)
{
if (Convert.ToInt32(pole1.Controls[q].Tag) == 2)
{
pole1.Controls[q].BackgroundImage = Properties.Resources.popadanie;
}
}
//воспроизведение звук
if (sd == 1)
{
popal.Play();
}
res.Visible = false;
res.Enabled = false;
start.Enabled = true;
start.Visible = true;
}
}
private void kl_MouseLeave(object sender, EventArgs e)
{
PictureBox kl = (PictureBox)sender;
//когда мышь покидает ячейку то полупрозрачный корабль исчезает
if (Convert.ToInt32(kl.Tag) != 2)
{
kl.BackgroundImage = null;
}
}
private void rules_Click(object sender, EventArgs e)
{
//перенос на форму с правилами
fhelp myFrm = new fhelp();
myFrm.Show();
this.Hide();
}
private void aboutme_Click(object sender, EventArgs e)
{
//перенос на форму с информацией об авторе
fme myFrm3 = new fme();
this.Hide();
myFrm3.Show();
}
private void klv_MouseEnter(object sender, EventArgs e)
{
//появление прицела при наведении на поле противника
PictureBox klv = (PictureBox)sender;
klv.Image = Properties.Resources.aim;
}
private void klv_MouseLeave(object sender, EventArgs e)
{
//удаление прицела из ячейки
PictureBox klv = (PictureBox)sender;
klv.Image = null;
}
private void sound_CheckedChange(object sender, EventArgs e)
{
//включение и выключение звука
if (sound.Checked==true)
{
sd = 1;
}
else
{
sd = 0;
}
}
private void bcolor_DropDownItemClicked(object sender, ToolStripItemClickedEventArgs e)
{
//смена цвета фона и цвета шрифта
if (skyblue.Selected)
{
black.Checked = false;
white.Checked = false;
barv.Checked = false;
darkblue.Checked = false;
this.BackColor = Color.FromArgb(0, 191, 255);
lshot.ForeColor = Color.FromArgb(0, 0, 128);
status.ForeColor = Color.FromArgb(0, 0, 128);
lscore.ForeColor = Color.FromArgb(0, 0, 128);
}
if (black.Selected)
{
skyblue.Checked = false;
white.Checked = false;
barv.Checked = false;
darkblue.Checked = false;
this.BackColor = Color.FromArgb(0, 0, 0);
lshot.ForeColor = Color.FromArgb(255, 255, 255);
status.ForeColor = Color.FromArgb(255, 255, 255);
lscore.ForeColor = Color.FromArgb(255, 255, 255);
}
if (white.Selected)
{
black.Checked = false;
skyblue.Checked = false;
barv.Checked = false;
darkblue.Checked = false;
this.BackColor = Color.FromArgb(255, 255, 255);
lshot.ForeColor = Color.FromArgb(0, 0, 0);
status.ForeColor = Color.FromArgb(0, 0, 0);
lscore.ForeColor = Color.FromArgb(0, 0, 0);
}
if (barv.Selected)
{
black.Checked = false;
white.Checked = false;
skyblue.Checked = false;
darkblue.Checked = false;
this.BackColor = Color.FromArgb(204, 204, 255);
lshot.ForeColor = Color.FromArgb(93, 118, 203);
status.ForeColor = Color.FromArgb(93, 118, 203);
lscore.ForeColor = Color.FromArgb(93, 118, 203);
}
if (darkblue.Selected)
{
black.Checked = false;
white.Checked = false;
barv.Checked = false;
skyblue.Checked = false;
this.BackColor = Color.FromArgb(0, 0, 128);
lshot.ForeColor = Color.FromArgb(0, 191, 255);
status.ForeColor = Color.FromArgb(0, 191, 255);
lscore.ForeColor = Color.FromArgb(0, 191, 255);
}
}
private void L()
{
//кусочек повторяющегося кода записанный в виде метода
for (q = 0; q < 100; q++)
{
if (Convert.ToInt32(pole2.Controls[q].Tag) == 2)
{
pole2.Controls[q].BackgroundImage = Properties.Resources.ship;
}
}
pole2.Enabled = false;
start.Enabled = true;
status.Text = "Игра окончена! Победил компьютер...\nНажмите кнопку 'Старт' для повторной игры";
}
}
}