SeaBattle/Form1.cs
2021-06-28 02:13:29 +03:00

373 lines
15 KiB
C#
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

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Нажмите кнопку 'Старт' для повторной игры";
}
}
}