Thanks for comment. I'll fix all problems and change everything you mentioned, hope to succeed in it.
Mark 2014-02-09 22:51 GMT+02:00 Pharo4Stef <pharo4s...@free.fr>: > Hi mark > > I read a bit your code > > It is nice for a first project!!!! > > Here are some feedback. I suggest that you take into account the easy one > and produce a new version and if you want to > train your skills you try to see how to address the difficult ones. > > Stef > > > > - Add it in the class comment > XsAndOsGame new openInWorld. > > - you have some unclassified protocols on the class side. > > - you may want to run smallLint (criticBorwser on your code and see the > hints that it can give you). > > - When you create a new game do not move the window to the top corner :) > > easyBtn -> easyButton (you do not pay per character :)) > > findEmptyCellPos -> findEmptyCellPosition > not in accessing > > impBtn -> impossibleButton > > .... :) > - Why do you need a separate class just for three colors? > I would merge > XsAndOsGameColors and XsAndOsGame > > XsAndOsGame>>initialize is long > May be you should extract some methods from it (methods that you can then > reuse for other tasks) > > > renderOContents > | delta offset x1 y1 x2 y2 rect | > delta := CellRenderer cellExtent - 1. > offset := self offsetWithinGridForm. > x1 := offset x + self oCorner x. > x2 := offset x + delta x - self oCorner x. > y1 := offset y + self oCorner y. > y2 := offset y + delta y - self oCorner y. > rect := Rectangle new setOrigin: x1 @ y1 corner: x2 @ y2. > self targetForm getCanvas > fillOval: rect > color: XsAndOsGameColors gameBoardBackgroundColor > borderWidth: 3 > borderColor: XsAndOsGameColors OColor > > What do you refer to CellRenderer direcly? self class ? > > > rendererFor: aCell > "VERY BAD IMPLEMENTATION OF THIS METHOD!!!" > > aCell class = EmptyCell > ifTrue: [ ^ CellRenderer ]. > aCell class = XCell > ifTrue: [ ^ XCellRenderer ]. > aCell class = OCell > ifTrue: [ ^ OCellRenderer ] > > indeed :) > why not implementing some methods call renderClass and sending a message > to the object :) > > mptyCell>>initialize > super initialize. > > > > CellRenderer>>offsetWithinGridForm > "Returns a point - left top corner of current cell" > > ^ CellRenderer cellExtent * ((self cellLocation x - 1) @ (self > cellLocation y - 1)) > => self clas cellExtent > > CellRenderer >> renderBorderBottom > | delta offset x1 y1 x2 y2 | > delta := CellRenderer cellExtent - 1. > offset := self offsetWithinGridForm. > x1 := offset x. > x2 := x1 + delta x. > y1 := offset y + delta y. > y2 := y1. > self targetForm getCanvas > line: x1 @ y1 > to: x2 @ y2 > width: 1 > color: XsAndOsGameColors cellBorderColor > > => > CellRenderer >> renderBorderBottom > | delta offset x1 y1 x2 y2 | > delta := self class cellExtent - 1. > offset := self offsetWithinGridForm. > x1 := offset x. > x2 := x1 + delta x. > y1 := offset y + delta y. > y2 := y1. > self targetForm getCanvas > line: x1 @ y1 > to: x2 @ y2 > width: 1 > color: XsAndOsGameColors cellBorderColor > > > I was wondering why you need Grid (I would rename it CellGrid) and do not > use a Matrix. > > grid sizeOfGrid > -> I would rename sizeOfGrid into size like that your grid can be a bit > more polymorphic from its API point of view > > > makeGameBoarMorph > -> typo :) > Now I want wondering why you do not have an instance variable to hold it > > > Future fun ideas for new versions: > -------------------------------------------- > playerVsComputer > self vsComputer > ifTrue: [ > self vsComputer: false. > self stateMorph contents: 'Player 1 VS Player 2' ] > ifFalse: [ > self vsComputer: true. > self stateMorph contents: 'Player VS Computer ---> Difficulty: ' , self > difficulty asString ]. > self vsComputer > ifTrue: [ > self easyBtn enable. > self normalBtn enable. > self impBtn enable ] > ifFalse: [ > self easyBtn disable. > self normalBtn disable. > self impBtn disable ] > This kind of code may be think that may be you need another object that > represent the > TwoUsers > vsComputer > strategy > I'm not sure but clicked look quite long. > May be you should create another class that can represent the logic of the > game. > > A really interesting exercise would be to see how you can create a > boardGame for 15*15 and see how it breaks some hidden rules. > On 08 Feb 2014, at 15:07, Маркіян Різун <mri...@gmail.com> wrote: > > Updated XsAndOsGame: added AI, also fixed some problems, that Damien > mentioned in his comments. > Btw, thanks to Damien, because I learned for myself a lot of new useful > things. > Note: The new version is XsAndOsGame (NOT Xs&OsGame) ! > To play it type in workspace: XsAndOsGame new openInWorld. > If you want to play vs computer press button "ToggleMode" and choose > difficulty. Initially it is easy. > > Mark > > > 2014-02-05 15:57 GMT+02:00 Маркіян Різун <mri...@gmail.com>: > >> Thanks, I'll certainly take a look at it >> >> >> 2014-02-05 Damien Cassou <damien.cas...@gmail.com>: >> >> On Tue, Feb 4, 2014 at 8:58 PM, Маркіян Різун <mri...@gmail.com> wrote: >>> > I should think how to write this tutorial. >>> >>> >>> on the technical point of view, I advise you to use Pillar: >>> http://www.smalltalkhub.com/#!/~Pier/Pillar >>> >>> -- >>> Damien Cassou >>> http://damiencassou.seasidehosting.st >>> >>> "Success is the ability to go from one failure to another without >>> losing enthusiasm." >>> Winston Churchill >>> >>> >> > >