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