Hi all,
Thank you for all your help lately. As a beginner programmer (and even more beginner chess programmer) it has been a fun and frustrating journey but now I have finally got some working code. If you are interested you can find the code on https://github.com/eligolf/affinity_chess.
Any feedback or improvement suggestions is highly appreciated. There are still lots of things to develop and this will probably be an ongoing project for a while. Which is very fun!
And again, thank you so much for the helpful comments to my newbie questions the past weeks
Python chess engine
Moderators: hgm, Rebel, chrisw
-
- Posts: 114
- Joined: Sat Nov 14, 2020 12:49 pm
- Full name: Elias Nilsson
-
- Posts: 140
- Joined: Wed Jun 03, 2020 6:46 am
- Full name: Kurt Lanc
Re: Python chess engine
I like python chess engines. But is there any chance to connect this via UCI to an own GUI? You did 99.9% of the work already so I hope you can add this.
-
- Posts: 114
- Joined: Sat Nov 14, 2020 12:49 pm
- Full name: Elias Nilsson
Re: Python chess engine
Hi KLc, it is not currently possible but I can surely give it a try. This is my first chess engine so I am still a bit unsure of the standard way of doing things. Thanks for checking it out.
-
- Posts: 266
- Joined: Fri Jul 10, 2015 9:23 pm
- Location: Russia
-
- Posts: 140
- Joined: Wed Jun 03, 2020 6:46 am
- Full name: Kurt Lanc
-
- Posts: 27
- Joined: Fri Nov 22, 2019 4:12 pm
- Full name: Hafni Rojo
Re: Python chess engine
+ 1
Best regards
Best regards
-
- Posts: 771
- Joined: Sat Sep 08, 2018 5:37 pm
- Location: Ukraine
- Full name: Maksim Korzh
Re: Python chess engine
Awesome work!eligolf wrote: ↑Fri Nov 27, 2020 1:31 pm Hi all,
Thank you for all your help lately. As a beginner programmer (and even more beginner chess programmer) it has been a fun and frustrating journey but now I have finally got some working code. If you are interested you can find the code on https://github.com/eligolf/affinity_chess.
Any feedback or improvement suggestions is highly appreciated. There are still lots of things to develop and this will probably be an ongoing project for a while. Which is very fun!
And again, thank you so much for the helpful comments to my newbie questions the past weeks
GUI is fantastic.
A few downsides though:
To run it on linux I need to comment out these lines in main driver:
Code: Select all
# Set the correct icon in Windows taskbar
#myappid = u'_'
#ctypes.windll.shell32.SetCurrentProcessExplicitAppUserModelID(myappid)
In C it's done as simple as:
Code: Select all
#ifdef WIN64
//your code
#endif
Also after submitting initial window I had this error:
Code: Select all
Traceback (most recent call last):
File "gui.py", line 581, in <module>
Gui().main()
File "gui.py", line 149, in main
self.draw(self.gamestate.get_valid_moves())
File "gui.py", line 172, in draw
self.draw_board(valid_moves)
File "gui.py", line 206, in draw_board
self.highlight_squares(valid_moves)
File "gui.py", line 253, in highlight_squares
self.draw_highlighting(s.grey[1], s.grey_t[1], start_col, start_row, 2)
File "gui.py", line 277, in draw_highlighting
pygame.draw.rect(self.screen, color, (col * s.sq_size + s.board_offset, row * s.sq_size + s.board_offset, s.sq_size, s.sq_size), thickness, border_radius=1)
TypeError: rect() takes no keyword arguments
Code: Select all
def draw_highlighting(self, color, color_t, col, row, thickness):
surface = pygame.Surface((s.sq_size, s.sq_size), pygame.SRCALPHA)
surface.fill(color_t)
self.screen.blit(surface, (col * s.sq_size + s.board_offset, row * s.sq_size + s.board_offset))
#pygame.draw.rect(self.screen, color, (col * s.sq_size + s.board_offset, row * s.sq_size + s.board_offset, s.sq_size, s.sq_size), thickness, border_radius=1)
Do you have UCI/winboard version of your engine to play in custom GUI?
Playing vs other engines allows to reveal lots of bug.
I'm just curious what is the project goal?
Didactic chess engines:
https://www.chessprogramming.org/Maksim_Korzh
Chess programming YouTube channel:
https://www.youtube.com/channel/UCB9-pr ... KKqDgXhsMQ
https://www.chessprogramming.org/Maksim_Korzh
Chess programming YouTube channel:
https://www.youtube.com/channel/UCB9-pr ... KKqDgXhsMQ
-
- Posts: 50
- Joined: Thu Oct 15, 2020 10:19 am
- Full name: ghostway
Re: Python chess engine
I made a python chess engine. with AB, mcts (the native one), and uct.
I made also the uci and I don't think you need more than that. a gui for that will just be a nightmare if you use something like pygame.
I made also the uci and I don't think you need more than that. a gui for that will just be a nightmare if you use something like pygame.
-
- Posts: 114
- Joined: Sat Nov 14, 2020 12:49 pm
- Full name: Elias Nilsson
Re: Python chess engine
@maksimKorzh, thank you for your nice words! It is always nice to have someone else test out the code to find bugs I haven't thought about. About your findings:
1. You are right about setting the icon in task bar, I need to add an if statement to make it only for Windows machines.
2. The error you get with the pygame.rect is due to the 'border_radius' key word. Make sure you have the latest version of pygame installed and it should work. I tried with pygame 1.9.something and got the same error but with 2.0.0 it worked as it should. I might need to write down a list of what modules are needed for this program.
3. Unfortunately I have no UCI version but that is on the todo list.
The project is just a hobby project to learn more about programming in Python, and it also evolved to learn more about chess programming too which is fun and sort of addictive
I have a few main goals which are probably going to change along the way:
1. Reach a depth of 8 plies in a reasonble time (max around 5-10 seconds per move) in a midgame position, preferably with quiescence search installed.
- Now it reaches around depth 5-6 in that time depending on position, without extensions in negamax.
2. Be able to beat me constantly.
- Now I beat it 98% of the time if I concentrate enough.
3. Maybe maybe change to bitboard representation to be able to reasonably do more cool evaluation tricks, and to hopefully speed things up.
- I understand the concept but have no idea how to do move generation logic with them.
Any ideas on how to improve efficiency is also very appreciated. Next I will try to add history heuristics and some check extension.
I tried to implement nullmove logic according to the Mediocre engine (https://mediocrechess.blogspot.com/2007 ... moves.html) which seems super easy to do. But somehow it fails. Maybe I am missing to update some logic in the make_null_move function since there are lots of things to consider: Zobrist hasing update, enpassant possible square, latest move made (which is what in this case?) etc.
1. You are right about setting the icon in task bar, I need to add an if statement to make it only for Windows machines.
2. The error you get with the pygame.rect is due to the 'border_radius' key word. Make sure you have the latest version of pygame installed and it should work. I tried with pygame 1.9.something and got the same error but with 2.0.0 it worked as it should. I might need to write down a list of what modules are needed for this program.
3. Unfortunately I have no UCI version but that is on the todo list.
The project is just a hobby project to learn more about programming in Python, and it also evolved to learn more about chess programming too which is fun and sort of addictive
I have a few main goals which are probably going to change along the way:
1. Reach a depth of 8 plies in a reasonble time (max around 5-10 seconds per move) in a midgame position, preferably with quiescence search installed.
- Now it reaches around depth 5-6 in that time depending on position, without extensions in negamax.
2. Be able to beat me constantly.
- Now I beat it 98% of the time if I concentrate enough.
3. Maybe maybe change to bitboard representation to be able to reasonably do more cool evaluation tricks, and to hopefully speed things up.
- I understand the concept but have no idea how to do move generation logic with them.
Any ideas on how to improve efficiency is also very appreciated. Next I will try to add history heuristics and some check extension.
I tried to implement nullmove logic according to the Mediocre engine (https://mediocrechess.blogspot.com/2007 ... moves.html) which seems super easy to do. But somehow it fails. Maybe I am missing to update some logic in the make_null_move function since there are lots of things to consider: Zobrist hasing update, enpassant possible square, latest move made (which is what in this case?) etc.
-
- Posts: 512
- Joined: Tue Sep 29, 2020 4:29 pm
- Location: Dublin, Ireland
- Full name: Madeleine Birchfield
Re: Python chess engine
Magic bitboards are very fast for board representation, and are the most widely used for board representation in modern engines, so I would highly recommend replacing your current representation with magic bitboards to improve your engine's efficiency. If you are able to use more than one CPU on your computer, then implementing a parallel search for multiple processes such as lazy SMP would also improve your engine's efficiency.eligolf wrote: ↑Wed Dec 02, 2020 7:35 am I have a few main goals which are probably going to change along the way:
1. Reach a depth of 8 plies in a reasonble time (max around 5-10 seconds per move) in a midgame position, preferably with quiescence search installed.
- Now it reaches around depth 5-6 in that time depending on position, without extensions in negamax.
2. Be able to beat me constantly.
- Now I beat it 98% of the time if I concentrate enough.
3. Maybe maybe change to bitboard representation to be able to reasonably do more cool evaluation tricks, and to hopefully speed things up.
- I understand the concept but have no idea how to do move generation logic with them.
Any ideas on how to improve efficiency is also very appreciated. Next I will try to add history heuristics and some check extension.
I would also suggest that at some point learn about automated tuning and machine learning techniques, using those to make the parameters in the search and the evaluation more optimal. Specifically for your evaluation, you could also learn about neural networks and use those for your evaluation in place of your current evaluation function, as neural networks tend to be better evaluation functions than the current handcrafted heuristics you are using for evaluation. The trade off with neural networks is that they also tend to be slower to calculate, so may slow down your search speed.