Змінюй хід війни! Допомагай ЗСУ!

[С#] Нужна помощь по сапёру (игра)

🟡 10:00 Відбій тривоги в Харківський район.Зверніть увагу, тривога ще триває у:- Харківський район#Харківський_район
Статус: Offline
Реєстрація: 16.04.2009
Повідом.: 76
  • 🟡 10:00 Відбій тривоги в Харківський район.Зверніть увагу, тривога ще триває у:- Харківський район#Харківський_район
  • #1
[С#] Нужна помощь по сапёру (игра)

У меня 9 ошибок, почти все связанны с Invalidate(). Не знаю как исправить... Заранее спасибо. Вот код:
using System;
using System.Collections.Generic;
using System.Windows.Forms;
using System.Drawing;
using System.Net.Mail;
using System.Drawing.Imaging;


namespace Saper
{
class Saperr
{
private const int
MR = 10, // кол-во клеток по вертикали
MC = 10, // кол-во клеток по горизонтали
NM = 10, // кол-во мин
W = 40, // ширина клетки поля
H = 40; // высота клетки поля

private int[,] Pole = new int[MR + 2, MC + 2]; // минное поле

private int nMin, // кол-во найденных мин
nFlag; // кол-во поставленных флагов

private int status; // статус игры 0 - начало
// 1 - игра
// 2 - конец



private void NewGame()
{
int row, col; // индексы клетки
int n = 0; // кол-во посталенных мин
int k; // кол-во соседних мин
for (row = 1; row <= MR; row++)
for (col = 1; col <= MC; col++)
Pole[row, col] = 0;

Random rnd = new Random(); // расставляем мины
do
{
row = rnd.Next(MR) + 1;
col = rnd.Next(MC) + 1;
if (Pole[row, col] != 9)
{
Pole[row, col] = 9;
n++;
}
}

while (n != NM);
for (row = 1; row <= MR; row++)
for (col = 1; col <= MC; col++)
if (Pole[row, col] != 9)
{
k = 0;

if (Pole[row, col - 1] == 9) k++;
if (Pole[row - 1, col] == 9) k++;
if (Pole[row, col + 1] == 9) k++;
if (Pole[row + 1, col] == 9) k++;
if (Pole[row - 1, col - 1] == 9) k++;
if (Pole[row - 1, col + 1] == 9) k++;
if (Pole[row + 1, col - 1] == 9) k++;
if (Pole[row + 1, col + 1] == 9) k++;

Pole[row, col] = k;
}
status = 0; // итак игра начинаеться!
nMin = 0; // кол-во обнаруженных мин
nFlag = 0; // и флагов пока нет
}






private void showPole(System.Drawing.Graphics g, int status) // рисование поля
{
for (int row = 1; row <= MR; row++)
for (int col = 1; col <= MC; col++)
this.kletka(g, row, col, status);
}

private void kletka(System.Drawing.Graphics g, int row, int col, int status) // всё о клетке
{
int x = (col - 1) * W + 1;
int y = (row - 1) * H + 1;

if (Pole[row, col] < 100)
g.FillRectangle(SystemBrushes.ControlLight, x - 1, y - 1, x + W, y + H); // отисовывает нетронутую клетку

if (Pole[row, col] >= 100)
{
if (Pole[row, col] != 109)
g.FillRectangle(Brushes.White, x - 1, y - 1, x + W, y + W); // открываем клетку, мины нет
else
g.FillRectangle(Brushes.Red, x - 1, y - 1, x + W, y + H); // ба-бах! - мина

if ((Pole[row, col] >= 101) && (Pole[row, col] <= 108)) // подписываем сколько мин вокруг
g.DrawString((Pole[row, col] - 100).ToString(), new Font("Times New Roman", 10, System.Drawing.FontStyle.Bold), Brushes.Black, x + 3, y + 2);
}

if (Pole[row, col] >= 200) // в клетке поставлен флаг
this.flag(g, x, y);
g.DrawRectangle(Pens.Black, x - 1, y - 1, x + W, y + H);
if ((status == 2) && (Pole[row, col] % 10 == 9))
this.mina(g, x, y);
}

private void open(int row, int col) // открывет текущую и все соседние клетки
{
int x = (col - 1) * W + 1;
int y = (row - 1) * H + 1;

if (Pole[row, col] == 0)
{
Pole[row, col] = 100;

this.Invalidate(new Rectangle(x, y, W, H));

this.open(row, col - 1);
this.open(row - 1, col);
this.open(row, col + 1);
this.open(row + 1, col);
this.open(row - 1, col - 1);
this.open(row - 1, col + 1);
this.open(row + 1, col - 1);
this.open(row + 1, col + 1);
}

else
if ((Pole[row, col] < 100) && (Pole[row, col] != -3))
{
Pole[row, col] += 100;

this.Invalidate();
//this.Invalidate(new Rectangle(x, y, W, H));
}
}

private void mina(Graphics g, int x, int y)
{ // корпус6,
g.FillRectangle(Brushes.Green, x + 16, y + 26, 8, 4);
g.FillRectangle(Brushes.Green, x + 8, y + 30, 24, 4);
g.DrawPie(Pens.Black, x + 6, y + 28, 28, 16, 0, -180);
}

private void flag(System.Drawing.Graphics g, int x, int y)
{ // рисование флага
g.Rectangle(x + 5, y + 5, x, y);
}





public void WinForm() // конструктор
{
InitializeComponent(); // в элеметны невидимой рамки запишем (-3) для open()
for (int row = 0; row <= MR + 1; row++)
{
Pole[row, 0] = -3;
Pole[row, MC + 1] = -3;
}
for (int col = 0; col <= MC + 1; col++)
{
Pole[0, col] = -3;
Pole[MR + 1, col] = -3;
}

this.NewGame();


this.ClientSize = new Size(W * MC + 1, H * MR + 1); // размер формы
}

private void InitializeComponent()
{
throw new Exception("The method or operation is not implemented.");
}


private void WinForm_MouseDown(object sender, System.Windows.Forms.MouseEventArgs e)
{
if (status == 2) return;
if (status == 0) status = 1;


int row = (int)(e.Y / H) + 1; // преоброзование координат
int col = (int)(e.X / W) + 1;

int x = (col - 1) * W + 1;
int y = (row - 1) * H + 1;

if (e.Button == MouseButtons.Left)
{
if (Pole[row, col] == 9)
{
Pole[row, col] += 100;
status = 2;
this.Invalidate();
}
else
if (Pole[row, col] < 9)
this.open(row, col);
}

if (e.Button == MouseButtons.Right)
{
if (Pole[row, col] <= 9)
{
nFlag += 1;

if (Pole[row, col] == 9)
nMin += 1;
Pole[row, col] += 200;

if ((nMin == NM) && (nFlag == NM))
{
status = 2;

this.Invalidate();
}
else
this.Invalidate(new Rectangle(x, y, W, H));
}
else // убирает флаг
if (Pole[row, col] >= 200)
{
nFlag -= 1;
Pole[row, col] -= 200;

this.Invalidate(new Rectangle(x, y, W, H));
}
}
}
private void menuItem1_Click(object sender, System.EventArgs e) // клик на "Новая игра"
{
this.NewGame();
this.Invalidate();
}

private void WinForm_Paint(object sender, System.Windows.Forms.PaintEventArgs e)
{
this.showPole(e.Graphics, status);
}
}


static class Program
{


static void Main()
{
Application.EnableVisualStyles();
Application.SetCompatibleTextRenderingDefault(false);
Application.Run(new Form1());
}
}
}


Писался на visual studio 2003
 
  • 🟡 10:00 Відбій тривоги в Харківський район.Зверніть увагу, тривога ще триває у:- Харківський район#Харківський_район
  • #2
Тебе нужно чтобы ошибок при компиляции не было, я правильно понял? Вот:
Код:
using System;
using System.Collections.Generic;
using System.Windows.Forms;
using System.Drawing;
using System.Net.Mail;
using System.Drawing.Imaging;


namespace Saper
{
    public class Saperr : Form
    {
        private const int
        MR = 10, // кол-во клеток по вертикали
        MC = 10, // кол-во клеток по горизонтали
        NM = 10, // кол-во мин
        W = 40, // ширина клетки поля
        H = 40; // высота клетки поля

        private int[,] Pole = new int[MR + 2, MC + 2]; // минное поле

        private int nMin, // кол-во найденных мин
        nFlag; // кол-во поставленных флагов

        private int status; // статус игры 0 - начало
        // 1 - игра
        // 2 - конец



        private void NewGame()
        {
            int row, col; // индексы клетки
            int n = 0; // кол-во посталенных мин
            int k; // кол-во соседних мин
            for (row = 1; row <= MR; row++)
                for (col = 1; col <= MC; col++)
                    Pole[row, col] = 0;

            Random rnd = new Random(); // расставляем мины
            do
            {
                row = rnd.Next(MR) + 1;
                col = rnd.Next(MC) + 1;
                if (Pole[row, col] != 9)
                {
                    Pole[row, col] = 9;
                    n++;
                }
            }

            while (n != NM);
            for (row = 1; row <= MR; row++)
                for (col = 1; col <= MC; col++)
                    if (Pole[row, col] != 9)
                    {
                        k = 0;

                        if (Pole[row, col - 1] == 9) k++;
                        if (Pole[row - 1, col] == 9) k++;
                        if (Pole[row, col + 1] == 9) k++;
                        if (Pole[row + 1, col] == 9) k++;
                        if (Pole[row - 1, col - 1] == 9) k++;
                        if (Pole[row - 1, col + 1] == 9) k++;
                        if (Pole[row + 1, col - 1] == 9) k++;
                        if (Pole[row + 1, col + 1] == 9) k++;

                        Pole[row, col] = k;
                    }
            status = 0; // итак игра начинаеться!
            nMin = 0; // кол-во обнаруженных мин
            nFlag = 0; // и флагов пока нет
        }






        private void showPole(System.Drawing.Graphics g, int status) // рисование поля
        {
            for (int row = 1; row <= MR; row++)
                for (int col = 1; col <= MC; col++)
                    this.kletka(g, row, col, status);
        }

        private void kletka(System.Drawing.Graphics g, int row, int col, int status) // всё о клетке
        {
            int x = (col - 1) * W + 1;
            int y = (row - 1) * H + 1;

            if (Pole[row, col] < 100)
                g.FillRectangle(SystemBrushes.ControlLight, x - 1, y - 1, x + W, y + H); // отисовывает нетронутую клетку

            if (Pole[row, col] >= 100)
            {
                if (Pole[row, col] != 109)
                    g.FillRectangle(Brushes.White, x - 1, y - 1, x + W, y + W); // открываем клетку, мины нет
                else
                    g.FillRectangle(Brushes.Red, x - 1, y - 1, x + W, y + H); // ба-бах! - мина

                if ((Pole[row, col] >= 101) && (Pole[row, col] <= 108)) // подписываем сколько мин вокруг
                    g.DrawString((Pole[row, col] - 100).ToString(), new Font("Times New Roman", 10, System.Drawing.FontStyle.Bold), Brushes.Black, x + 3, y + 2);
            }

            if (Pole[row, col] >= 200) // в клетке поставлен флаг
                this.flag(g, x, y);
            g.DrawRectangle(Pens.Black, x - 1, y - 1, x + W, y + H);
            if ((status == 2) && (Pole[row, col] % 10 == 9))
                this.mina(g, x, y);
        }

        private void open(int row, int col) // открывет текущую и все соседние клетки
        {
            int x = (col - 1) * W + 1;
            int y = (row - 1) * H + 1;

            if (Pole[row, col] == 0)
            {
                Pole[row, col] = 100;

                this.Invalidate(new Rectangle(x, y, W, H));

                this.open(row, col - 1);
                this.open(row - 1, col);
                this.open(row, col + 1);
                this.open(row + 1, col);
                this.open(row - 1, col - 1);
                this.open(row - 1, col + 1);
                this.open(row + 1, col - 1);
                this.open(row + 1, col + 1);
            }

            else
                if ((Pole[row, col] < 100) && (Pole[row, col] != -3))
                {
                    Pole[row, col] += 100;

                    this.Invalidate();
                    //this.Invalidate(new Rectangle(x, y, W, H));
                }
        }

        private void mina(Graphics g, int x, int y)
        { 
            // корпус6,
            g.FillRectangle(Brushes.Green, x + 16, y + 26, 8, 4);
            g.FillRectangle(Brushes.Green, x + 8, y + 30, 24, 4);
            g.DrawPie(Pens.Black, x + 6, y + 28, 28, 16, 0, -180);
        }

        private void flag(System.Drawing.Graphics g, int x, int y)
        { 
            // рисование флага
            g.FillRectangle(Brushes.Red, x + 5, y + 5, x, y);
        }





        public Saperr() // конструктор
        {
            InitializeComponent(); 
            
            // в элеметны невидимой рамки запишем (-3) для open()
            for (int row = 0; row <= MR + 1; row++)
            {
                Pole[row, 0] = -3;
                Pole[row, MC + 1] = -3;
            }
            for (int col = 0; col <= MC + 1; col++)
            {
                Pole[0, col] = -3;
                Pole[MR + 1, col] = -3;
            }

            this.NewGame();


            this.ClientSize = new Size(W * MC + 1, H * MR + 1); // размер формы
        }

        private void InitializeComponent()
        {
            throw new Exception("The method or operation is not implemented.");
        }


        private void WinForm_MouseDown(object sender, System.Windows.Forms.MouseEventArgs e)
        {
            if (status == 2) return;
            if (status == 0) status = 1;


            int row = (int)(e.Y / H) + 1; // преоброзование координат
            int col = (int)(e.X / W) + 1;

            int x = (col - 1) * W + 1;
            int y = (row - 1) * H + 1;

            if (e.Button == MouseButtons.Left)
            {
                if (Pole[row, col] == 9)
                {
                    Pole[row, col] += 100;
                    status = 2;
                    this.Invalidate();
                }
                else
                    if (Pole[row, col] < 9)
                        this.open(row, col);
            }

            if (e.Button == MouseButtons.Right)
            {
                if (Pole[row, col] <= 9)
                {
                    nFlag += 1;

                    if (Pole[row, col] == 9)
                        nMin += 1;
                    Pole[row, col] += 200;

                    if ((nMin == NM) && (nFlag == NM))
                    {
                        status = 2;

                        this.Invalidate();
                    }
                    else
                        this.Invalidate(new Rectangle(x, y, W, H));
                }
                else // убирает флаг
                    if (Pole[row, col] >= 200)
                    {
                        nFlag -= 1;
                        Pole[row, col] -= 200;

                        this.Invalidate(new Rectangle(x, y, W, H));
                    }
            }
        }
        private void menuItem1_Click(object sender, System.EventArgs e) // клик на "Новая игра"
        {
            this.NewGame();
            this.Invalidate();
        }

        private void WinForm_Paint(object sender, System.Windows.Forms.PaintEventArgs e)
        {
            this.showPole(e.Graphics, status);
        }
    }


    static class Program
    {


        static void Main()
        {
            Application.EnableVisualStyles();
            Application.SetCompatibleTextRenderingDefault(false);
            Application.Run(new Saperr());
        }
    }
}

кстати, судя по этому:
Код:
using System.Collections.Generic;

это не в 2003 студии писалось, и писалось весьма странным образом, непонятно как это предполагается сделать работоспособным... :)
 
  • 🟡 10:00 Відбій тривоги в Харківський район.Зверніть увагу, тривога ще триває у:- Харківський район#Харківський_район
  • #3
что вообще никак?

это с книги по c#... я не знаю что ч ней делать...:(
 
  • 🟡 10:00 Відбій тривоги в Харківський район.Зверніть увагу, тривога ще триває у:- Харківський район#Харківський_район
  • #4
бредовая у тебя книга, вот я тебе набросал сапера, изучай, ковыряйся :)
Код:
using System;
using System.Text;
using System.Drawing;
using System.Windows.Forms;

namespace SAPER2
{
    public class FormMain : Form
    {
        private const int CellWidth = 40;
        private const int CellHeight = 40;
        
        private Random _rand = new Random();
        private CellState[,] _grid = null;
        
        
        
        
        public FormMain()
        {
            //InitializeComponent();

            Paint += Form_Paint;
            MouseClick += Form_MouseClick;

            SetStyle(ControlStyles.Opaque, true);
            DoubleBuffered = true;
            FormBorderStyle = FormBorderStyle.FixedSingle;
            init(8, 8, 4);
        }

        private void init(int width, int height, int count)
        {
            _grid = new CellState[width, height];
            for(int i=0; i < width; i++)
                for(int j=0; j < height; j++)
                    _grid[i,j] = CellState.NotTestedFree;
            
            if (width * height < count) 
                count = width * height;

            for (int i = 0; i < count; i++)
            {
                int x,y;
                do
                {
                    x = _rand.Next(width);
                    y = _rand.Next(height);
                } while (_grid[x, y] != CellState.NotTestedFree);
                _grid[x, y] = CellState.NotTestedMine;
            }
            ClientSize = new Size(CellWidth * _grid.GetLength(0), CellHeight * _grid.GetLength(1));
            Invalidate();
        }

        private void drawGrid(Graphics g)
        {
            for (int x = 0; x < _grid.GetLength(0); x++)
                for (int y = 0; y < _grid.GetLength(1); y++)
                    drawCell(g, new Rectangle(x * CellWidth, y * CellHeight, CellWidth, CellHeight), _grid[x, y]);
        }

        private void drawCell(Graphics g, Rectangle rect, CellState value)
        {
            Rectangle subRect = new Rectangle(rect.X + 1, rect.Y + 1, rect.Width - 2, rect.Height - 2);
            g.FillRectangle(Brushes.Silver, rect);
            switch(value)
            {
                case CellState.NotTestedFree:
                case CellState.NotTestedMine:
                    g.FillRectangle(Brushes.Gray, subRect);
                    break;
                case CellState.TestedFree:
                    g.FillRectangle(Brushes.Green, subRect);
                    break;
                case CellState.TestedMine:
                    g.FillEllipse(Brushes.Black, subRect);
                    break;
                case CellState.TestedMineExplode:
                    g.FillRectangle(Brushes.Red, subRect);
                    g.FillEllipse(Brushes.Black, subRect);
                    break;
            }
        }

        private StepResult check(int x, int y)
        {
            StepResult result = StepResult.Win;
            switch (_grid[x, y])
            {
                case CellState.NotTestedFree:
                    _grid[x, y] = CellState.TestedFree;
                    break;
                case CellState.NotTestedMine:
                    for (int i = 0; i < _grid.GetLength(0); i++)
                        for (int j = 0; j < _grid.GetLength(1); j++)
                        {
                            if (_grid[i, j] == CellState.NotTestedMine)
                                _grid[i, j] = CellState.TestedMine;
                        }
                    _grid[x, y] = CellState.TestedMineExplode;
                    result = StepResult.Lose;
                    break;
            }
            if (result != StepResult.Lose)
                for (int i = 0; i < _grid.GetLength(0); i++)
                    for (int j = 0; j < _grid.GetLength(1); j++)
                        if (_grid[i, j] == CellState.NotTestedFree)
                        {
                            result = StepResult.None;
                            break;
                        }
            Invalidate();
            return result;
        }

        protected void Form_Paint(object sender, PaintEventArgs e)
        {
            drawGrid(e.Graphics);
        }

        protected void Form_MouseClick(object sender, MouseEventArgs e)
        {
            int x = e.X / CellWidth;
            int y = e.Y / CellHeight;
            if (x >= 0 && y >= 0 && x < _grid.GetLength(0) && y < _grid.GetLength(1))
            {    
                StepResult result = check(x, y);
                if (result == StepResult.Lose || result == StepResult.Win)
                {
                    MessageBox.Show("You are " + result.ToString());
                    init(8, 8, 4);
                }
            }
        }
    }

    public enum CellState
    {
        NotTestedFree,
        TestedFree,
        NotTestedMine,
        TestedMine,
        TestedMineExplode,
    }
    public enum StepResult
    {
        None,
        Lose,
        Win,
    }

    static class Program
    {
        [STAThread]
        static void Main()
        {
            Application.EnableVisualStyles();
            Application.SetCompatibleTextRenderingDefault(false);
            Application.Run(new FormMain());
        }
    }
}
 
  • 🟡 10:00 Відбій тривоги в Харківський район.Зверніть увагу, тривога ще триває у:- Харківський район#Харківський_район
  • #5
Спасибо! Буду ковыряться! :)
 
  • 🟡 10:00 Відбій тривоги в Харківський район.Зверніть увагу, тривога ще триває у:- Харківський район#Харківський_район
  • #6
у меня тоже был курсовой написать сапера (по теории вероятности) и тоже писал на си-шарпе )))
 
  • 🟡 10:00 Відбій тривоги в Харківський район.Зверніть увагу, тривога ще триває у:- Харківський район#Харківський_район
  • #7
чи скомпилить поиграться :)
 
  • 🟡 10:00 Відбій тривоги в Харківський район.Зверніть увагу, тривога ще триває у:- Харківський район#Харківський_район
  • #8
Fraer скинь код пожалуйста :)
 
  • 🟡 10:00 Відбій тривоги в Харківський район.Зверніть увагу, тривога ще триває у:- Харківський район#Харківський_район
  • #9
я седня дома гляну остался он у мня или нет а завтра если что отпишусь (не забыть бы)
 
  • 🟡 10:00 Відбій тривоги в Харківський район.Зверніть увагу, тривога ще триває у:- Харківський район#Харківський_район
  • #10
  • 🟡 10:00 Відбій тривоги в Харківський район.Зверніть увагу, тривога ще триває у:- Харківський район#Харківський_район
  • #11
поиграл
не впечатлило. оно без циферок :D
Это как??!? В смысле слепоглухонемой сапер с поломанным миноискателем в толстых зимних рукавицах со скрюченными ревматизмом пальцами ?!?! :D:D:D
 
  • 🟡 10:00 Відбій тривоги в Харківський район.Зверніть увагу, тривога ще триває у:- Харківський район#Харківський_район
  • #12
  • 🟡 10:00 Відбій тривоги в Харківський район.Зверніть увагу, тривога ще триває у:- Харківський район#Харківський_район
  • #13
у мня только экзешник (вчера поигрался, даже подсказки есть - сам себя умеет решать :) ), и пояснительная записка побитая вирусом, вообщем я не уверен, но для джавы есть толковые декомпиляторы, как тут я не знаю...
а вот восстановить пояснительную записку (там наверняка искходный код) я не знаю как... когда то уже пытался...
 
  • 🟡 10:00 Відбій тривоги в Харківський район.Зверніть увагу, тривога ще триває у:- Харківський район#Харківський_район
  • #14
Жаль что восстановить не получается, а этот у меня переделать не получается, - пытался сделать циферки и чтоб поле открывал как с соседними пустыми клетками - не выходит, - написано как-то сложно, я ещё в ней не до конца разобрался... HELP!

Нужна самая простая версия сапёра (только чтоб с циферками и с открытием поля :) )
 
  • 🟡 10:00 Відбій тривоги в Харківський район.Зверніть увагу, тривога ще триває у:- Харківський район#Харківський_район
  • #15
если екзешник на сиширпе, то из него можно достать код. :) не помню имя проги.
 
  • 🟡 10:00 Відбій тривоги в Харківський район.Зверніть увагу, тривога ще триває у:- Харківський район#Харківський_район
  • #16
экзешник на шарпе и вроде даже требует инсталированного дотнета...(что на мой взгляд увеличивает шансы того, что даже переменные будут названы так как их назвал я, не опфускэйтченые)
 
  • 🟡 10:00 Відбій тривоги в Харківський район.Зверніть увагу, тривога ще триває у:- Харківський район#Харківський_район
  • #17
достань код пожалуйста, пожалуйста :)
 
  • 🟡 10:00 Відбій тривоги в Харківський район.Зверніть увагу, тривога ще триває у:- Харківський район#Харківський_район
  • #18
сбрось мне файлик, я верну тебе код, возможно даже готовый проект в студии :)
 
  • 🟡 10:00 Відбій тривоги в Харківський район.Зверніть увагу, тривога ще триває у:- Харківський район#Харківський_район
  • #19
если екзешник на сиширпе, то из него можно достать код. :) не помню имя проги.

не факт, во первых его обфускатором могли обработать, чтобы никто свой нос не совал. А во вторых рефлектор довольно криво код восстанавливает, например вместо switch ставит заковыристые условные goto :)

Хотя зачем сапера обфусцировать понятия не имею :D

В любом случае, уверен, мой пример будет более полезным, т.к. прост и не перегружен лишним кодом ;)
 
  • 🟡 10:00 Відбій тривоги в Харківський район.Зверніть увагу, тривога ще триває у:- Харківський район#Харківський_район
  • #20
Не получаеться переделать прогу Klezа, - не могу с циферками разобраться... постоянно 0 выводит...
 
Назад
Зверху Знизу