Форум программистов, компьютерный форум, киберфорум
Python: GUI, графика
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
Рейтинг 4.70/30: Рейтинг темы: голосов - 30, средняя оценка - 4.70
1 / 1 / 0
Регистрация: 09.12.2016
Сообщений: 99

Переписать код C# под Python

08.05.2017, 15:50. Показов 8267. Ответов 137
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Я сделал игру в VisialStudio. Мне велели переписать код под Python я не спец по нему. Пожалуйста помогите!
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
using System;
using System.Collections.Generic;
using System.Drawing;
 
namespace maze
{
    //класс клетки
    class Cell
    {
        //статусы границ: - true - граница есть, false - границы нет
        public bool IsUpBorder { get; set; }
        public bool IsDownBorder { get; set; }
        public bool IsLeftBorder { get; set; }
        public bool IsRightBorder { get; set; }
        //используется при генерации лабиринта
        public bool IsVisit;
        //true - когда клетка часть пути
        public bool IsWay;
        //индекс клетки в лабиринте
        public Point Pos;
        //используется при анимации пути
        public bool IsWayAnim;
    }
    //класс клетки игрока
    class PlayerCell
    {
        //скорость перемещения
        public const float Speed = 0.15f;
        //true - если клетка движется
        public bool IsAnim;
        //индек клеткок для перемещений
        public Point StartPos;
        public Point EndPos;
        //координаты отрисовки на форме
        public PointF DrawPos;
    }
    //класс лабиринта
    class Board
    {
        //список всех клеток
        private List<Cell> _cells;
        //кол-во клеток в лабиринте
        private int _countCells;
        //кол-во клеток по горизонтали
        public int CountColumns { get; private set; }
        //кол-во клеток по вертикали
        public int CountRows { get; private set; }
        //ширина лабиринта в пикелях
        public int Width { get; private set; }
        //высота лабиринта в пикселях
        public int Height { get; private set; }
        //ширина клетки в пикселях
        public int CellWidth { get; private set; }
        //высота клетки в пикселях
        public int CellHeight { get; private set; }
 
        //время до перекличения на следующую клетку при анимации пути
        private const long ShowWayTime = 70;
        //счетчик времени анимации пути
        private long _showWayTimer;
        //счетчик последовательности клеток пути при анимации
        private int _wayCellsSequenceCounter;
        //последовательность клеток пути
        private List<Cell> _wayCellsSequence;
        //true - если показывать путь
        private bool _isShowWay;
        public bool IsShowWay
        {
            get { return _isShowWay; }
            set
            {
                _isShowWay = value;
                if (!_isShowWay)
                {
                    //сброс анимации пути всех клеток
                    foreach (var cell in _cells)
                    {
                        cell.IsWayAnim = false;
                    }
                }
                else
                {
                    //сброс счетсика клеток пути при анимации
                    _wayCellsSequenceCounter = 0;
                }
            }
        }
        //клетка входа лабиринта
        private Cell _startCell;
        //клетка выхода лабиринта
        private Cell _endCell;
        //клетка игрока
        private PlayerCell _playerCell;
 
        //возвращает клетку по индекам в лабиринте
        private Cell GetCell(Point pos)
        {
            if (pos.X >= 0 && pos.X < CountColumns && pos.Y >= 0 && pos.Y < CountRows)
                return _cells[pos.X + pos.Y * CountColumns];
            return null;
        }
        //возвращает клетку по индекам в лабиринте
        private Cell GetCell(int x, int y)
        {
            return GetCell(new Point(x, y));
        }
        //конструктор лабиринта
        //countColumns - кол-во клеток по горизонтали
        //countRows - кол-во клеток по вертикали
        //width - ширина области отрисовки в пикселях
        //height - высота области отрисовки в пикселях
        public Board(int countColumns, int countRows, int width, int height)
        {
            //заполнение св-в класса лабиринта
            CountColumns = countColumns;
            CountRows = countRows;
            Width = width;
            Height = height;
            CellWidth = Width / CountColumns;
            CellHeight = Height / CountRows;
 
            _countCells = CountColumns * CountRows;
            _cells = new List<Cell>(_countCells);
 
            //заполнение клеток лабиринта начальными св-вами
            for (var y = 0; y < CountRows; y++)
            {
                for (var x = 0; x < CountColumns; x++)
                {
                    var cell = new Cell();
                    //считаем, что в начале у клетки есть все границы
                    cell.IsDownBorder = cell.IsUpBorder = cell.IsLeftBorder = cell.IsRightBorder = true;
                    cell.IsVisit = false;
                    cell.Pos = new Point(x, y);
                    _cells.Add(cell);
                }
            }
 
            //вбираем вход в лабиринт
            var rnd = new Random();
            var rndPos = rnd.Next((int)CountColumns);
            _startCell = _cells[(rndPos + (CountRows - 1) * CountColumns)];
            _startCell.IsDownBorder = false;
            //выбираем выход их лабиринта
            rndPos = rnd.Next((int)CountColumns);
            _endCell = _cells[rndPos];
            _endCell.IsUpBorder = false;
 
            //создаем клетку игрока
            _playerCell = new PlayerCell();
            _playerCell.StartPos = _startCell.Pos;
            _playerCell.DrawPos = new PointF(_playerCell.StartPos.X * CellWidth, _playerCell.StartPos.Y * CellHeight);
 
            //далее генерация лабиринта по алгоритму из [url]https://habrahabr.ru/post/262345/[/url]
            var currentCell = _startCell;
            currentCell.IsVisit = true;
            var stackCells = new Stack<Cell>();
            var process = false;
            do
            {
                process = false;
                var nonVisitCells = new List<Cell>();
                var left = GetCell(currentCell.Pos.X - 1, currentCell.Pos.Y);
                var right = GetCell(currentCell.Pos.X + 1, currentCell.Pos.Y);
                var up = GetCell(currentCell.Pos.X, currentCell.Pos.Y - 1);
                var down = GetCell(currentCell.Pos.X, currentCell.Pos.Y + 1);
                if (left != null && !left.IsVisit)
                    nonVisitCells.Add(left);
                if (right != null && !right.IsVisit)
                    nonVisitCells.Add(right);
                if (up != null && !up.IsVisit)
                    nonVisitCells.Add(up);
                if (down != null && !down.IsVisit)
                    nonVisitCells.Add(down);
 
                if (nonVisitCells.Count > 0)
                {
                    stackCells.Push(currentCell);
                    var nextCell = nonVisitCells[rnd.Next(nonVisitCells.Count)];
                    if (nextCell.Pos.X < currentCell.Pos.X)
                    {
                        currentCell.IsLeftBorder = false;
                        nextCell.IsRightBorder = false;
                    }
                    else if (nextCell.Pos.X > currentCell.Pos.X)
                    {
                        currentCell.IsRightBorder = false;
                        nextCell.IsLeftBorder = false;
                    }
                    else if (nextCell.Pos.Y < currentCell.Pos.Y)
                    {
                        currentCell.IsUpBorder = false;
                        nextCell.IsDownBorder = false;
                    }
                    else if (nextCell.Pos.Y > currentCell.Pos.Y)
                    {
                        currentCell.IsDownBorder = false;
                        nextCell.IsUpBorder = false;
                    }
                    currentCell = nextCell;
                    currentCell.IsVisit = true;
                }
                else if (stackCells.Count > 0)
                {
                    currentCell = stackCells.Pop();
                }
                else
                {
                    foreach (var cell in _cells)
                    {
                        if (!cell.IsVisit)
                        {
                            currentCell = cell;
                            currentCell.IsVisit = true;
                            break;
                        }
 
                    }
                }
 
                foreach (var cell in _cells)
                {
                    if (!cell.IsVisit)
                        process = true;
                }
 
            } while (process);
 
            FindWay();
        }
        //поиск пути по алгоритму из [url]https://habrahabr.ru/post/262345/[/url]
        private void FindWay()
        {
            _wayCellsSequence=new List<Cell>();
            foreach (var cell in _cells)
            {
                cell.IsVisit = false;
            }
            var currentCell = _startCell;
            _wayCellsSequence.Add(currentCell);
            currentCell.IsVisit = true;
            currentCell.IsWay = true;
            var stackCells = new Stack<Cell>();
            var rnd = new Random();
            var process = true;
            while (process)
            {
                var nonVisitCells = new List<Cell>();
                if (!currentCell.IsLeftBorder)
                {
                    var left = GetCell(currentCell.Pos.X - 1, currentCell.Pos.Y);
                    if (left != null && !left.IsVisit)
                        nonVisitCells.Add(left);
                }
                if (!currentCell.IsRightBorder)
                {
                    var right = GetCell(currentCell.Pos.X + 1, currentCell.Pos.Y);
                    if (right != null && !right.IsVisit)
                        nonVisitCells.Add(right);
                }
                if (!currentCell.IsUpBorder)
                {
                    var up = GetCell(currentCell.Pos.X, currentCell.Pos.Y - 1);
                    if (up != null && !up.IsVisit)
                        nonVisitCells.Add(up);
                }
                if (!currentCell.IsDownBorder)
                {
                    var down = GetCell(currentCell.Pos.X, currentCell.Pos.Y + 1);
                    if (down != null && !down.IsVisit)
                        nonVisitCells.Add(down);
                }
                if (nonVisitCells.Count > 0)
                {
                    stackCells.Push(currentCell);
                    var nextCell = nonVisitCells[rnd.Next(nonVisitCells.Count)];
                    currentCell = nextCell;
                    currentCell.IsVisit = true;
                    currentCell.IsWay = true;
                    _wayCellsSequence.Add(currentCell);
                    if (currentCell.Pos == _endCell.Pos)
                        process = false;
                }
                else if (stackCells.Count > 0)
                {
                    _wayCellsSequence.Remove(currentCell);
                    currentCell.IsWay = false;
                    currentCell = stackCells.Pop();
                }
                else
                {
                    process = false;
                }
            }
        }
        //возвращает true - если игра окончена
        public bool IsGameOver()
        {
            if (_playerCell != null && _endCell != null)
            {
                return _playerCell.EndPos == _endCell.Pos;
            }
            return false;
        }
        //перемещает клетку игрока влево
        public void MovePlayerLeft()
        {
            if (!_playerCell.IsAnim)
            {
                var cell = GetCell(_playerCell.StartPos);
                if (!cell.IsLeftBorder)
                {
                    var left = GetCell(cell.Pos.X - 1, cell.Pos.Y);
                    if (left != null)
                    {
                        _playerCell.EndPos = left.Pos;
                        _playerCell.IsAnim = true;
                    }
                }
            }
        }
        //перемещает клетку игрока вправо
        public void MovePlayerRight()
        {
            if (!_playerCell.IsAnim)
            {
                var cell = GetCell(_playerCell.StartPos);
                if (!cell.IsRightBorder)
                {
                    var right = GetCell(cell.Pos.X + 1, cell.Pos.Y);
                    if (right != null)
                    {
                        _playerCell.EndPos = right.Pos;
                        _playerCell.IsAnim = true;
                    }
                }
            }
        }
        //перемещает клетку игрока вверх
        public void MovePlayerUp()
        {
            if (!_playerCell.IsAnim)
            {
                var cell = GetCell(_playerCell.StartPos);
                if (!cell.IsUpBorder)
                {
                    var up = GetCell(cell.Pos.X, cell.Pos.Y - 1);
                    if (up != null)
                    {
                        _playerCell.EndPos = up.Pos;
                        _playerCell.IsAnim = true;
                    }
                }
            }
        }
        //перемещает клетку игрока вниз
        public void MovePlayerDown()
        {
            if (!_playerCell.IsAnim)
            {
                var cell = GetCell(_playerCell.StartPos);
                if (!cell.IsDownBorder)
                {
                    var down = GetCell(cell.Pos.X, cell.Pos.Y + 1);
                    if (down != null)
                    {
                        _playerCell.EndPos = down.Pos;
                        _playerCell.IsAnim = true;
                    }
                }
            }
        }
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
08.05.2017, 15:50
Ответы с готовыми решениями:

Переписать код на Python
Помогите переписать этот код с С++ на Python #include&lt;windows.h&gt; #include&lt;GL/glu.h&gt; #include&lt;GL/glut.h&gt; int LE,RE; ...

Переписать код C# под Python
я сделала консольное приложение на с#, но мне так же надо сделать его на python. Помогите пожалуйста using System; using...

Переписать код C# на Python
namespace Project1 { class Лампа { private static string Тип_лампы1 = &quot;Лампа накаливания:&quot;; private static string...

137
1 / 1 / 0
Регистрация: 09.12.2016
Сообщений: 99
05.06.2017, 22:04  [ТС]
Студворк — интернет-сервис помощи студентам
Перевод этого кусочка

C#
1
2
3
4
5
6
7
8
9
10
//время до переключения на следующую клетку при анимации пути
        private const long ShowWayTime = 70;
        //счетчик времени анимации пути
        private long _showWayTimer;
        //счетчик последовательности клеток пути при анимации
        private int _wayCellsSequenceCounter;
        //последовательность клеток пути
        private List<Cell> _wayCellsSequence;
        //true - если показывать путь
        private bool _isShowWay;
Если у вас есть время посмотрите, я не понял всегда ли нам нужно делать возврат значения?

Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
class Board:
    def __init__(self):
        self.__ShowWayTime = 70
        self.___showWayTimer = True
        self.___wayCellsSequenceCounter = True
        self.___wayCellsSequence = [Cell]
        self.___isShowWay = True
    @property
    def ShowWayTime (self):
          return self.__ShowWayTime
    @property
    def _showWayTimer (self):
         return self.___showWayTimer
    @property
    def _wayCellsSequenceCounter (self):
         return self.___wayCellsSequenceCounter
    @property
    def _wayCellsSequence (self):
         return self.___wayCellsSequence
    @property
    def _isShowWay (self):
         return self.___isShowWay
Добавлено через 2 минуты



Я попробовал писать так (ниже), это правильно?

Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
class Board:
    @property
    def ShowWayTime (self):
        self.ShowWayTime = 70
    @property
    def _showWayTimer (self):
        self._showWayTimer = True
    @property
    def _wayCellsSequenceCounter (self):
        self._wayCellsSequenceCounter = True
    @property
    def _wayCellsSequence (self):
        self._wayCellsSequence = [Cell]
    @property
    def _isShowWay (self):
        self._isShowWay = True
Добавлено через 9 минут
В шарпе есть значение void там идет возврат значения, а у нас тут ни одного void и мы постоянно возвращаем значение. Я правильно понимаю что из-за того что мы пишем в __init__ значения нам приходиться писать return?
0
9990 / 2962 / 497
Регистрация: 05.10.2013
Сообщений: 8,134
Записей в блоге: 243
06.06.2017, 09:15
Вы не путайте поля и свойства. В данном случае в этом кусочке только приватные поля, поэтому будет так:
Python
1
2
3
4
5
6
7
class Board:
    def __init__(self):
        self.__SHOW_WAY_TIME = 70
        self.__showWayTimer;
        self.__wayCellsSequenceCounter;
        self.__wayCellsSequence = [];
        self.__isShowWay;
Я написал SHOW_WAY_TIME с заглавных букв потому что в Python нет const, но есть договорённость писать название констрант с большой буквы.

Добавлено через 1 минуту
Цитата Сообщение от alik_710 Посмотреть сообщение
Я правильно понимаю что из-за того что мы пишем в __init__ значения нам приходиться писать return?
return пишется для геттера свойсва.
0
1 / 1 / 0
Регистрация: 09.12.2016
Сообщений: 99
06.06.2017, 09:25  [ТС]
Почему мы ни как не обозначаем что это список "Целл" List<Cell> ???

Добавлено через 1 минуту
Логично [Cell] ???
0
9990 / 2962 / 497
Регистрация: 05.10.2013
Сообщений: 8,134
Записей в блоге: 243
06.06.2017, 11:23
Цитата Сообщение от alik_710 Посмотреть сообщение
Почему мы ни как не обозначаем что это список "Целл" List<Cell> ???
Потому что в Python нет дженериков, как в C#. В Python нельзя заранее определить типы элементов, которые будут храниться в списке. Python даже позволяет хранить в списке элементы разных типов, например:
Python
1
list = ['physics', 'chemistry', 1997, 2000]
Цитата Сообщение от alik_710 Посмотреть сообщение
Логично [Cell] ???
Скопируйте этот пример, он выдаст ошибку при запуске:
Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
class Cell:
    def __init__(self, id):
        self.id = id
 
class Board:
    def __init__(self):
        self.wayCellsSequence = [Cell]
 
def main():
    board = Board()
    cell1 = Cell(1)
    cell2 = Cell(2)
    board.wayCellsSequence.append(cell1)
    board.wayCellsSequence.append(cell2)
    print("id:", board.wayCellsSequence[0].id)
    print("id:", board.wayCellsSequence[1].id)
 
main()
А если исправить, то не выдаст:
Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
class Cell:
    def __init__(self, id):
        self.id = id
 
class Board:
    def __init__(self):
        self.wayCellsSequence = []
 
def main():
    board = Board()
    cell1 = Cell(1)
    cell2 = Cell(2)
    board.wayCellsSequence.append(cell1)
    board.wayCellsSequence.append(cell2)
    print("id:", board.wayCellsSequence[0].id)
    print("id:", board.wayCellsSequence[1].id)
 
main()
0
1 / 1 / 0
Регистрация: 09.12.2016
Сообщений: 99
07.06.2017, 17:33  [ТС]
Добавлено через 3 минуты
Что взять первое или второе??

Python
1
2
3
4
5
6
7
8
9
class Board:
    def __init__(self):
        self.__SHOW_WAY_TIME = 70
        self.__showWayTimer;
        # счетчик последовательности клеток пути при анимации
        self.__wayCellsSequenceCounter = 0
        self.__wayCellsSequence = [];
        # true - если показывать путь
        self.__isShowWay = False
Python
1
2
3
4
5
6
    def __init__(self):
        self.__SHOW_WAY_TIME = 70
        self.__showWayTimer;
        self.__wayCellsSequenceCounter;
        self.__wayCellsSequence = [];
        self.__isShowWay;
Добавлено через 1 час 21 минуту
Пока не знаю что делать с этой строчкой
C#
1
private Cell GetCell(Point pos)
0
9990 / 2962 / 497
Регистрация: 05.10.2013
Сообщений: 8,134
Записей в блоге: 243
07.06.2017, 22:52
Цитата Сообщение от alik_710 Посмотреть сообщение
Что взять первое или второе??
Я думаю, в Python (да и в C#) лучше инициализировать все переменные явно. Потому что если написать как вы
Python
1
2
3
4
class Board:
    def __init__(self):
        self.__SHOW_WAY_TIME = 70
        self.__showWayTimer
то есть "self.__showWayTimer" без инициализации, то выдаёт ошибку, а если инициализировать, то не выдаёт:
Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
class Board:
    def __init__(self):
        self.__SHOW_WAY_TIME = 70
        self.__showWayTimer = 5
        # счетчик последовательности клеток пути при анимации
        self.__wayCellsSequenceCounter = 0
        self.__wayCellsSequence = []
        # true - если показывать путь
        self.__isShowWay = False
        self.myMethod()
 
    def myMethod(self):
        self.__showWayTimer += 10
        print(self.__showWayTimer)
 
def main():
    board = Board()
 
main()
Цитата Сообщение от alik_710 Посмотреть сообщение
Пока не знаю что делать с этой строчкой
Я придумал вам демо-пример:
Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
class Cell:
    def __init__(self):
        self.name = "this is cell"
 
class Point:
    def __init__(self, x, y):
        self.x = x
        self.y = y
 
class Board:
    def GetCell(self, pos):
        print("pos.x = ", pos.x, ", pos.y = ", pos.y)
        return Cell()
 
def main():
    board = Board()
    cell = board.GetCell(Point(10, 20))
    print("cell.name: ", cell.name)
 
main()
Добавлено через 9 минут
Помните, чтобы сделать поле (или свойство) приватным (то есть недоступным извне) мы писали перед именами полей и свойств два подчёркивания? С методами точно так же: два подчёркивания и метод будет доступен только внутри класса:
Python
1
2
3
4
class Board:
    def __GetCell(self, pos):
        print("pos.x = ", pos.x, ", pos.y = ", pos.y)
        return Cell()
P.S. Но на самом деле в Python нельзя сделать по-настоящему приватные методы, поля, свойства, как это есть во многих языках. Всё ещё можно получить доступ к приватному методу (полю, свойству) через имя класса вот так:
Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
class Cell:
    def __init__(self):
        self.name = "this is cell"
 
class Point:
    def __init__(self, x, y):
        self.x = x
        self.y = y
 
class Board:
    def __GetCell(self, pos):
        print("pos.x = ", pos.x, ", pos.y = ", pos.y)
        return Cell()
 
def main():
    board = Board()
    cell = board._Board__GetCell(Point(10, 20))
    print("cell.name: ", cell.name)
 
main()
Это было в первом уроке "Урок 1. Введение в ООП Python" на 01:16:45
0
1 / 1 / 0
Регистрация: 09.12.2016
Сообщений: 99
08.06.2017, 23:02  [ТС]
C++
1
2
3
4
5
        private Cell _startCell;
        //клетка выхода лабиринта
        private Cell _endCell;
        //клетка игрока
        private PlayerCell _playerCell;
Перевод

Python
1
2
3
4
5
class Cell:
    def __init__(self):
        self.___startCell;
        self.___endCell;
        self.___playerCell;
Спасибо за пример, но я его не совсем понял простите((

C#
1
2
3
4
5
6
        private Cell GetCell(Point pos)
        {
            if (pos.X >= 0 && pos.X < CountColumns && pos.Y >= 0 && pos.Y < CountRows)
                return _cells[pos.X + pos.Y * CountColumns];
            return null;
        }
Посмотрите когда сможете
Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
class Cell:
    def __init__(self):
       self.__GetCell = Point(pos)
 
class Point:
 
    def __init__(self, x, y):
        self.x = x
        self.x = y
 
class Board:
    def __GetCell(self, pos):
        if pos.x >= 0 and pos.x < CountColums and pos.y >=0 and pos.y < CountRows:
            return ___cells [pos.x + pos.y * CountColums];
        return None;
Добавлено через 7 минут
Цитата Сообщение от 8Observer8 Посмотреть сообщение
Я думаю, в Python (да и в C#) лучше инициализировать все переменные явно. Потому что если написать как вы
Вы уверенны? Просто Python поддерживает не объявленные переменные и вообще это не строго типизированный язык. Какое значение можно присвоить полю отвечающему за положение клетки, которая движется?

Добавлено через 3 минуты
C#
1
private _endCell
Давайте там где private и имя начинается ставить тройное подчеркивание? все таки это такое имя у поля! В то в примерах везде двойное





Добавлено через 33333333333333333333 минуты
И еще объясните пож-ста когда и при каких обстоятельствах мы пишем в метод main(). Именно этот момент мне не понятен был в примере
0
9990 / 2962 / 497
Регистрация: 05.10.2013
Сообщений: 8,134
Записей в блоге: 243
08.06.2017, 23:26
Цитата Сообщение от alik_710 Посмотреть сообщение
Спасибо за пример, но я его не совсем понял простите((
Чтобы его понять, нужно его скопировать, запустить и посмотреть, что он выводит

Цитата Сообщение от alik_710 Посмотреть сообщение
Вы уверенны? Просто Python поддерживает не объявленные переменные и вообще это не строго типизированный язык.
Вы ошибаетесь, Python - это язык со строгой динамической типизацией:


Ну и что, что поддерживает необъявленные переменные. Если переводить один в один, то лучше объявить и иницилизировать, чтобы понимать какие класс имеет поля и свойства.

Я просто хотел сказать, что вот такая строчка кода, которую вы написали выше невозможно использовать в коде:
Python
1
2
3
class Board:
    def __init__(self):
        self.__showWayTimer
Потому что обращние к ней внутри какого-нибудь метода класса вызывает ошибку.
0
9990 / 2962 / 497
Регистрация: 05.10.2013
Сообщений: 8,134
Записей в блоге: 243
09.06.2017, 00:08
Почему в этом коде вы используете тройные подчёркивания?
Python
1
2
3
4
5
class Cell:
    def __init__(self):
        self.___startCell;
        self.___endCell;
        self.___playerCell;
Точки с запятой не ставят в Python. Но с ними тоже работает.

Цитата Сообщение от alik_710 Посмотреть сообщение
Перевод
Ваш код не работает:
Python
1
2
3
4
5
6
7
8
9
10
class Cell:
    def __init__(self):
        self.___startCell;
        self.___endCell;
        self.___playerCell;
 
def main():
    cell = Cell()
 
main()
Выдаёт ошибку:
AttributeError: 'Cell' object has no attribute '_Cell___startCell'
Press any key to continue . . .
Добавлено через 3 минуты
Цитата Сообщение от alik_710 Посмотреть сообщение
Посмотрите когда сможете
Вы перед тем как сюда запостить код, проверяете работает ли он или нет? Надо проверить, хотя бы создать объект этого класса и запустить. Можно вывести какие-то тестовые значения. Просто нужно убедиться, что запускается без ошибок.

Добавлено через 13 минут
Как вы смотрите на то чтобы переводить параллельно этот код с C# на JavaScript в этой теме: Исправить код к не большой игре

Рисовать можно на <canvas>. Нужно будет рисовать всего лишь линии и прямоугольники вот так: https://codepen.io/8Observer8/pen/zzrYQY

codepen удобный сервис. Можно там зарегистрироваться, писать код, сразу видеть результат его работы, автоматически сохраняется, можно делиться ссылками. Как вам предложение?

Добавлено через 11 минут
Цитата Сообщение от alik_710 Посмотреть сообщение
И еще объясните пож-ста когда и при каких обстоятельствах мы пишем в метод main(). Именно этот момент мне не понятен был в примере
А как же вы запустите код на выполнение? def - это всего лишь создание функции, а чтобы запустить main() нужно явно её вызвать. Надеюсь, этот пример вам будет понятен:
Python
1
2
3
4
5
6
7
8
9
class Hello:
    def sayHello(self):
        print("hello")
 
def main():
    obj = Hello()
    obj.sayHello()
 
main()
Добавлено через 1 минуту
Цитата Сообщение от alik_710 Посмотреть сообщение
Давайте там где private и имя начинается ставить тройное подчеркивание? все таки это такое имя у поля! В то в примерах везде двойное
Двойные - это стандарт для закрытых членов класса. Не вижу смысла ставить тройные.
0
1 / 1 / 0
Регистрация: 09.12.2016
Сообщений: 99
09.06.2017, 01:13  [ТС]
Цитата Сообщение от 8Observer8 Посмотреть сообщение
Чтобы его понять, нужно его скопировать, запустить и посмотреть, что он выводит
Запускал и смотрел я и по print вижу что вы хотели вывести. cell.name контатанация с значением self.name. И вывод на печать значений Point(x,y). Значения 10 и 20.
Цитата Сообщение от 8Observer8 Посмотреть сообщение
Вы ошибаетесь, Python - это язык со строгой динамической типизацией:
Ладно, видимо я перепутал
Цитата Сообщение от 8Observer8 Посмотреть сообщение
Ну и что, что поддерживает необъявленные переменные. Если переводить один в один, то лучше объявить и иницилизировать, чтобы понимать какие класс имеет поля и свойства.
Можно на ставить везде равно нулю, перевести переведем, а работать будет после этого?
Цитата Сообщение от 8Observer8 Посмотреть сообщение
Почему в этом коде вы используете тройные подчёркивания?
Уже писал если имя начинается с подчеркивания и поле, свойство защищено,то я ставлю тройное подчеркивание. Обратите внимание есть такое поле а есть и такое.
C#
1
2
private bool _isShowWay;
              private bool IsShowWay
Если при переводе поставить и там и там двойное поле, то это будет одно и тоже, моя цель работоспособность кода после перевода
Цитата Сообщение от 8Observer8 Посмотреть сообщение
Ваш код не работает:
Потому-что я не объявил переменные?
Цитата Сообщение от 8Observer8 Посмотреть сообщение
Вы перед тем как сюда запостить код, проверяете работает ли он или нет? Надо проверить, хотя бы создать объект этого класса и запустить. Можно вывести какие-то тестовые значения. Просто нужно убедиться, что запускается без ошибок.
Я подставлю значения и запущу
Цитата Сообщение от 8Observer8 Посмотреть сообщение
Как вы смотрите на то чтобы переводить параллельно этот код с C# на JavaScript в этой теме
Не большая игра, перевести можно, но один я не смогу
Цитата Сообщение от 8Observer8 Посмотреть сообщение
Надеюсь, этот пример вам будет понятен:
main() вызывыет в свою очередь значения объектjq и выводит hello, так?
Цитата Сообщение от 8Observer8 Посмотреть сообщение
Двойные - это стандарт для закрытых членов класса. Не вижу смысла ставить тройные
C#
1
2
        private bool _isShowWay;
                      private bool IsShowWay
Будут два поля с одинаковым именем, зачем? Мы же проверяли что тройное подчеркивание оставляет поле защищенным

Добавлено через 3 минуты
Я ни настаиваю ни на чем, если считаете что так нужно я сделаю так
0
9990 / 2962 / 497
Регистрация: 05.10.2013
Сообщений: 8,134
Записей в блоге: 243
09.06.2017, 11:20
Цитата Сообщение от alik_710 Посмотреть сообщение
Можно на ставить везде равно нулю, перевести переведем, а работать будет после этого?
Будет.

Цитата Сообщение от alik_710 Посмотреть сообщение
Потому-что я не объявил переменные?
В Python нет понятия "объявить" или "определить". Даже в C# такого нет. Есть только понятие "создать". А понятия "объявить" или "определить" из компилируемых языков типа C++. Ошибка происходит из-за того, что это ошибочный синтаксис, так в Python нельзя писать:
Python
1
2
3
4
5
6
7
8
9
10
class Cell:
    def __init__(self):
        self.___startCell;
        self.___endCell;
        self.___playerCell;
 
def main():
    cell = Cell()
 
main()
Цитата Сообщение от alik_710 Посмотреть сообщение
Не большая игра, перевести можно, но один я не смогу
Я вам буду помогать. Вы же хотите изучать JavaScript? Параллельно переписывать легче. За одно можно смотреть как аналогичные конструкции выглядят в C#, Python и JavaScript. Мне всё равно нужно вместе с TypeScript изучать JavaScript тоже, потому что TS - это надстройка над JS. Переписывая мы получим большой опыт во всех этих языка. Вообще языки очень сильно похожи. Что можно написать на одном, тоже самое можно написать на другом.

Цитата Сообщение от alik_710 Посмотреть сообщение
main() вызывыет в свою очередь значения объектjq и выводит hello, так?
Да, если вы удалите вызов main() то ничего не выведется, потому что тело main() не будет выполнено, а следовательно не будет создан объект obj и не будет вызван его метод sayHello()

Добавлено через 3 минуты
Цитата Сообщение от alik_710 Посмотреть сообщение
Будут два поля с одинаковым именем, зачем? Мы же проверяли что тройное подчеркивание оставляет поле защищенным
Напишите этот код на Python. Я не понял, где будет два поля с одинаковым именем. Не могут существовать два поня с одинаковым именем. Интерпретатор должен выдать ошибку.

Добавлено через 1 минуту
Цитата Сообщение от alik_710 Посмотреть сообщение
Я ни настаиваю ни на чем, если считаете что так нужно я сделаю так
Если считаете нужным то нужно настаивать. Я тоже только начал изучать Python и могу в некоторых вещах ошибаться. Но я перед тем как что-то озвучить проверяю как это работает на практике, и запускается ли код вообще.
0
1 / 1 / 0
Регистрация: 09.12.2016
Сообщений: 99
11.06.2017, 15:13  [ТС]
Python
1
2
3
4
5
6
7
class Board:
    def __init__(self):
        self.__SHOW_WAY_TIME = 70
        self.__showWayTimer;
        self.__wayCellsSequenceCounter;
        self.__wayCellsSequence = [];
        self.__isShowWay;
В чем собственно заключается синтаксическая ошибка? Я перевел 3 этих поля так же как и вы поля выше! Которые перевели вы
Python
1
2
3
4
    def __init__(self):
          self.__startCell;
          self.__endCell;
          self.__playerCell;
Добавлено через 5 минут
Цитата Сообщение от 8Observer8 Посмотреть сообщение
Сообщение от alik_710
Можно на ставить везде равно нулю, перевести переведем, а работать будет после этого?
Будет.
В игре работают алгоритмы они и должны управлять значения, хорошо я буду писать main() для проверки но делать это с большими участками кода.

Добавлено через 1 минуту
Цитата Сообщение от 8Observer8 Посмотреть сообщение
Я вам буду помогать. Вы же хотите изучать JavaScript? Параллельно переписывать легче. За одно можно смотреть как аналогичные конструкции выглядят в C#, Python и JavaScript. Мне всё равно нужно вместе с TypeScript изучать JavaScript тоже, потому что TS - это надстройка над JS. Переписывая мы получим большой опыт во всех этих языка. Вообще языки очень сильно похожи. Что можно написать на одном, тоже самое можно написать на другом.
Определитесь пожалуйста что это будет tipe script или java script

Добавлено через 8 минут
Цитата Сообщение от 8Observer8 Посмотреть сообщение
Напишите этот код на Python. Я не понял, где будет два поля с одинаковым именем. Не могут существовать два поня с одинаковым именем. Интерпретатор должен выдать ошибку.
Я вам дал пример двух имен полей которые реально есть в коде. Я иду сверху вниз. Вы следите за ходом перевода? Да я вам не сказал, что одно из них pablic. Но нижнее подчеркивание является частью названия поля то его стоит сохранить. И если поле privat так и получается тройное подчеркивание. Если оставить двойное это будет уже переименование. И дальше по коду надо будет держать в голове, что мы изменили имя и так же переименовывать.

Добавлено через 13 минут
Вы говорили что будете переписывать код сами на Python. Пож-ста скиньте, то что вы уже перевели я бы хотел это увидеть. Мне бы это было бы наглядным примером
0
9990 / 2962 / 497
Регистрация: 05.10.2013
Сообщений: 8,134
Записей в блоге: 243
11.06.2017, 15:54
Цитата Сообщение от alik_710 Посмотреть сообщение
В чем собственно заключается синтаксическая ошибка? Я перевел 3 этих поля так же как и вы поля выше! Которые перевели вы
У вас не возникает ошибки? У меня при запуске возникает ошибка вот в этой строке:
Python
1
self.__showWayTimer;
Цитата Сообщение от alik_710 Посмотреть сообщение
Определитесь пожалуйста что это будет tipe script или java script
Хотелось бы TypeScript, но мне всё равно и JavaScript нужен, поэтому можно JavaScript.

Цитата Сообщение от alik_710 Посмотреть сообщение
Но нижнее подчеркивание является частью названия поля то его стоит сохранить. И если поле privat так и получается тройное подчеркивание.
В Python три подчёркивания являются часть имени. Получается, что в C# одно подчёркивание для приватных полей, а в Python три. Одно порчёркивание не равно трём, поэтому это тоже отступление от нормы. Сделайте тогда одно подчёркивание в Python. Это будет условно приватное поле. Так же как константы с большой буквы. Да, давайте там и там чтобы было одинаково. Пусть будут одинарные. Пойдёт?

Цитата Сообщение от alik_710 Посмотреть сообщение
Пож-ста скиньте, то что вы уже перевели я бы хотел это увидеть.
Я ещё пока не начинал. На днях начну, скину.
0
1 / 1 / 0
Регистрация: 09.12.2016
Сообщений: 99
11.06.2017, 20:34  [ТС]
Цитата Сообщение от 8Observer8 Посмотреть сообщение
У вас не возникает ошибки? У меня при запуске возникает ошибка вот в этой строке:
Поставьте пож-ста равно нулю есть ошибка? Поле таймера должно управляться алгоритмом из игры
Цитата Сообщение от 8Observer8 Посмотреть сообщение
В Python три подчёркивания являются часть имени. Получается, что в C# одно подчёркивание для приватных полей, а в Python три. Одно порчёркивание не равно трём, поэтому это тоже отступление от нормы. Сделайте тогда одно подчёркивание в Python. Это будет условно приватное поле. Так же как константы с большой буквы. Да, давайте там и там чтобы было одинаково, но пусть будут одинарные. Пойдёт?
Так давайте так public - без подчеркиваний, privat - двойное подчеркивание, privat _поле (с нижним подчеркиванием) - одно подчеркивание. ОК? Если забуду напомните мне плиз
Цитата Сообщение от 8Observer8 Посмотреть сообщение
Я ещё пока не начинал. На днях начну, скину.
Мой дорогой чего же вы ждете? А tipescript или javascript начали?

Добавлено через 1 минуту
Да я сейчас проверяю __GetCell (последнее что я скидывал) пока одни ошибки

Добавлено через 2 минуты
Это интересно объем информации который может хранить мозг около 2-3 Петабайт, но почему у меня тогда плохая память?

Добавлено через 1 час 13 минут
Можете помочь с проверкой, я собрал все воедино для проверки куска логики
Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
class Cell:
 
    def __init__(self):
       self.__getCell = Point(x,y)
 
class Point:
 
    def __init__(self, x, y):
        self.x = 10
        self.x = 20
 
class Board:
    @property
    def CountColums(self):
        return self.__countColums
    @property
    def CountRows(self):
        return self.__countRows
    def __init__(self):
        #кол-во клеток по горизонтали
        self.__countColums = 0
        #кол-во клеток по горизонтали
        self.__countRows = 1
        #ширина лабиринта в пикелях
    def __GetCell(self, pos):
        if pos.x >= 0 and pos.x < CountColums and pos.y >=0 and pos.y < CountRows:
            return ___cells [pos.x + pos.y * CountColums];
        return None;
 
def main():
        
main()
Добавлено через 10 минут
Надо вызвать __getCell который присвоено значение Point(x,y), а на место значения (x,y) должны подтягиваться значения из self.x и self.y. Дальше идет логика в которой оперируются значения из self.x и self.y и CountColums и CountRows. Надо напечатать результат

Добавлено через 1 час 23 минуты
Не хвататет
Python
1
2
3
4
5
6
7
8
class Board:
    @property
    def _cells(self):
        self._cells = []
 
        def __init__(self):
        # список всех клеток
        self.___cells = []
Добавлено через 1 час 31 минуту
Вопрос ниже
C#
1
2
3
4
        private Cell GetCell(Point pos)
 
        //возвращает клетку по индекам в лабиринте
        private Cell GetCell(int x, int y)
Надо в бедное поле GettCell запихать и Point Pos и X и Y. Я правильно понял?
0
9990 / 2962 / 497
Регистрация: 05.10.2013
Сообщений: 8,134
Записей в блоге: 243
12.06.2017, 14:02
Цитата Сообщение от alik_710 Посмотреть сообщение
Поставьте пож-ста равно нулю есть ошибка?
Я приводил как-то выше примерно такой пример. Пытался акцентировать ваше внимание на этом. Ещё раз приведу.

Если инициализировать нулём, то ошибки нет:
Python
1
2
Peter Age: 0
Press any key to continue . . .
Python
1
2
3
4
5
6
7
8
9
10
class Person:
    def __init__(self):
        self.name = ""
        self.age = 0
 
def main():
    peter = Person()
    print("Peter Age:", peter.age)
 
main()
Если вообще не инициализировать, а написать, как вы выше писали, то возникает ошибка, что "поле не найдено":
AttributeError: 'Person' object has no attribute 'age'
Python
1
2
3
4
5
6
7
8
9
10
class Person:
    def __init__(self):
        self.name = ""
        self.age
 
def main():
    peter = Person()
    print("Peter Age:", peter.age)
 
main()
Цитата Сообщение от alik_710 Посмотреть сообщение
А tipescript или javascript начали?
TS начал. На него проще переписывать с C#, чем на JS. Сравните визуально эквивалентный код, как создать класс Point:
Python
1
2
3
4
class Point:
    def __init__(self, x, y):
        self.x = x
        self.y = y
TypeScript:
JavaScript
1
2
3
4
5
6
7
8
9
10
11
class Point
{
    public x: number;
    public y: number;
 
    constructor(x, y)
    {
        this.x = x;
        this.y = y;
    }
}
JavaScript
JavaScript
1
2
3
4
5
6
7
8
9
var Point = (function ()
{
    function Point(x, y)
    {
        this.x = x;
        this.y = y;
    }
    return Point;
}());
Добавлено через 3 минуты
Давайте вот этот ваш код обсудим. Вас ничего в нём не смущает?
Python
1
2
3
4
5
class Point:
 
    def __init__(self, x, y):
        self.x = 10
        self.x = 20
0
1 / 1 / 0
Регистрация: 09.12.2016
Сообщений: 99
13.06.2017, 20:39  [ТС]
Вам не нравиться значения в полях? Давайте вынесем X и Y в класс Point как pos X и pos Y?

И скажите что с этим делать
C#
1
2
3
4
        private Cell GetCell(Point pos)
 
        //возвращает клетку по индекам в лабиринте
        private Cell GetCell(int x, int y)
Надо в бедное поле GettCell запихать и Point Pos и X и Y. Я правильно понял?
0
9990 / 2962 / 497
Регистрация: 05.10.2013
Сообщений: 8,134
Записей в блоге: 243
14.06.2017, 08:27
Мне не нравятся два момента в конструкторе класса Point:
  1. Поле this.x инициализируется два раза, а this.y - не инициализируется
  2. Чтобы я не передавал в конструкторе всё равно инициализируется числами (10, 20)

Неправильно:
Python
1
2
3
4
5
class Point:
 
    def __init__(self, x, y):
        self.x = 10
        self.x = 20
Правильно:
Python
1
2
3
4
5
class Point:
 
    def __init__(self, x, y):
        self.x = x
        self.y = y
0
1 / 1 / 0
Регистрация: 09.12.2016
Сообщений: 99
14.06.2017, 14:08  [ТС]
Да вы правы X и Y это опечатка, я не заметил, числа думаю можно было оставить.

C#
1
2
        private Cell GetCell(Point pos)
        private Cell GetCell(int x, int y)
Смотрите верхняя строка предлагает инициализировать только POS в классе Point вам не кажется? Если посмотрите выше мы уже инициализировали и сам класс и X Y а нем ранее. А вот вторая строка уже должна обращаться и получать значения X Y. Хотя не указано что из Point. Но помоиму именно туда. Мне это не понятно. А что вы думаете?

Добавлено через 10 минут
Хочется увидеть ваш перевод. Он мне нужен как образец. Я подожду пока у вас что-то появиться, пока что у меня плохо получается без наглядного примера

И я просил вас написать вызов куска логики main() вы это сделаете? Там да / нет
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
14.06.2017, 14:08

Переписать код С++ в Python
#ifndef __PWLH_CPP #define __PWLH_CPP #include &quot;../../../stdafx.h&quot; #include &quot;PWLH.h&quot; #include &quot;LinearBucket.h&quot; // Add ----&gt;...

Переписать код c Python
Уважаемые программисты Python. Мне требуется переписать код программы с python на другой язык программирования. С этим языком (Python) я...

Переписать код с VB на Python
Доброго времени суток уважаемые форумчане, помогите пожалуйста переписать код с VB на Python, код ниже прикрепляю. Function root(x As...

Как переписать код с++ на python
№1 #include &lt;bits/stdc++.h&gt; using namespace std; int main() {

Переписать код с Delphi на Python
Доброго времени суток! Подскажите пожалуйста, как интерпретировать код с Delphi на Python. var Form1: TForm1; const ...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
138
Ответ Создать тему
Новые блоги и статьи
Программный домашний кинотеатр
russiannick 27.09.2026
Сподобился на программный домашний кинотеатр. В качестве ЯВУ по традиции выбрал js. В помощники взял Яндекс-Алису. Было создано три зала на разные интересы. исторические и ретро сериал Хичкок. . .
Беседа с ИИ о программистах, недопускающих к созданию и правке кода генеративные ИИ и причины этого
zorxor 21.09.2026
Раньше я радовался или получал некоторые эмоции, пусть небольшие, но всё же, от самого процесса написания кода, рекомпиляции и запуска, видя постепенное развитие программы и прочее. А теперь лень. . .
Мобильное приложение ColorStep
pavlinmavlin 17.09.2026
Реализовал приложение Красный, Зеленый, Синий в Unity3d + c#. Название изменил на ColorStep. Приложение прошло модерацию и теперь доступно для скачивания. Делал его сам, шаг за шагом — и вот,. . .
Запрет дублирования строк в табличной части
Maks 13.09.2026
Реализация из решения ниже выполнена на нетиповом справочнике "Нормы ТО" с табличной часть "Виды ТО", разработанного в КА2, со следующими реквизитами: - ВидТО (СправочникСсылка. ВидыТО); - ВидГСМ. . .
Скрипты Tampermonkey для CyberForum, ChatGPT, Claude и пр.
Jin X 06.09.2026
Скрипты Tampermonkey для CyberForum, ChatGPT, Claude и пр. Работая с форумом и нейросетями в браузере часто хочется что-то подкорректировать или добавить какого-то функционала. Ниже прикреплён. . .
Программа опроса у.з. расходомера SLS-720F
Argus19 02.09.2026
Программа опроса у. з. расходомера SLS-720F Программа опрашивает один раз в минуту три ультразвуковых расходомера SLS-720F через интерфейс RS-485 по протоколу Modbus RTU. Опрашиваются регистры. . .
Hyper-V: Компьютер должен поддерживать доверенный платформенный модуль 2.0.
Maks 31.08.2026
При установке Windows 11 на виртуальную машину Hyper-V 2-го поколения вылезла такая ошибка: Решение: в параметрах виртуальной машины, в разделе "Безопасность" (Security) активировать флаг. . .
Архитектура биовида Стива в Майнкрафте: Зачем бонобо кубический каннибализм
anaschu 30.08.2026
Кубический Вагинокапитализм в Minecraft: Математический инвариант ОДУ и рок Стивов-бонобо Главная задача разработанной «Модели Всего» — наглядно продемонстрировать наличие системной «судьбы». . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru