Created attachment 49717 [details] screenshot while kbattleship freezes Version: 2.0 OS: Linux On a single player game while both sides have only the ship of size one left, the computer player stops shooting after some tries, the game freezes so it will not end. Freezes like: - the human player cannot shoot any more - without an endgame lost or won message. So you just have to click new to start a new game. Reproducible: Couldn't Reproduce OS: Linux (i686) release 2.6.34-gentoo-r2 Compiler: i686-pc-linux-gnu-gcc
Created attachment 82083 [details] screenshot of game I had this several times, too. Maybe the screenshot can give a hint why the AI fails to continue. It looks like the AI is following a pattern, but fails to complete it. Also, I sent SIGSEGV to the process right after making the screenshot. Here is the backtrace: Application: Naval Battle (kbattleship), signal: Segmentation fault Using host libthread_db library "/lib64/libthread_db.so.1". [Current thread is 1 (Thread 0x7f8b1304d780 (LWP 29989))] Thread 2 (Thread 0x7f8afddac700 (LWP 30010)): #0 0x00007f8b0fbecd43 in select () at ../sysdeps/unix/syscall-template.S:82 #1 0x00007f8b10539bb4 in QProcessManager::run (this=<optimized out>) at io/qprocess_unix.cpp:245 #2 0x00007f8b10455b18 in QThreadPrivate::start (arg=0x7f8b108c7440 <processManager()::processManager>) at thread/qthread_unix.cpp:338 #3 0x00007f8b101bcc92 in start_thread (arg=<optimized out>) at pthread_create.c:305 #4 0x00007f8b0fbf373d in clone () at ../sysdeps/unix/sysv/linux/x86_64/clone.S:115 Thread 1 (Thread 0x7f8b1304d780 (LWP 29989)): [KCrash Handler] #6 0x00007f8b0fbea7bf in *__GI___poll (fds=<optimized out>, nfds=<optimized out>, timeout=10117) at ../sysdeps/unix/sysv/linux/poll.c:87 #7 0x00007f8b0bd74494 in g_main_context_poll (n_fds=<optimized out>, fds=<optimized out>, priority=<optimized out>, timeout=<optimized out>, context=<optimized out>) at gmain.c:3440 #8 g_main_context_iterate (context=0x1269e40, block=<optimized out>, dispatch=<optimized out>, self=<optimized out>) at gmain.c:3141 #9 0x00007f8b0bd7456b in g_main_context_iteration (context=0x1269e40, may_block=1) at gmain.c:3207 #10 0x00007f8b105945e5 in QEventDispatcherGlib::processEvents (this=0x1246470, flags=...) at kernel/qeventdispatcher_glib.cpp:424 #11 0x00007f8b1106e3e2 in QGuiEventDispatcherGlib::processEvents (this=0x14793e0, flags=...) at kernel/qguieventdispatcher_glib.cpp:204 #12 0x00007f8b105614e8 in QEventLoop::processEvents (this=<optimized out>, flags=<error reading variable: DWARF-2 expression error: DW_OP_reg operations must be used either alone or in conjunction with DW_OP_piece or DW_OP_bit_piece.>) at kernel/qeventloop.cpp:149 #13 0x00007f8b10561975 in QEventLoop::exec (this=0x7fffcd72e1c0, flags=<error reading variable: DWARF-2 expression error: DW_OP_reg operations must be used either alone or in conjunction with DW_OP_piece or DW_OP_bit_piece.>) at kernel/qeventloop.cpp:204 #14 0x00007f8b10567843 in QCoreApplication::exec () at kernel/qcoreapplication.cpp:1218 #15 0x000000000041ea33 in main (argc=<optimized out>, argv=<optimized out>) at /var/tmp/portage/kde-base/knavalbattle-4.11.0/work/knavalbattle-4.11.0/src/main.cpp:78
The problem comes when illegal move ( -1 , -1 ) for player x is reached in Controller::finalizeShot. I see two solutions: * Improve the AI to not shoot an illegal move * make the AI surrender in that case.
Git commit b41f5254b3365aefac3637bd23fb3a176fcb6516 by Jaime Torres. Committed on 28/11/2013 at 19:12. Pushed by jtamate into branch 'KDE/4.12'. always return a valid move to avoid the game freeze When Controller::finalizeShot receives an Illegal move, it just does not know what to do next, and the game freeze. This patch implements the last option to return a valid move, searching for a free cell one by one, therefore it becomes impossible to return an Illegal move because or the computer wins or the opponen wins before the board is empty of free cells. Another solution for dummyAI could be to implement a list of free cells and choose on them randomly. FIXED-IN: KDE/4.12 REVIEW: 113854 M +12 -0 src/ai/ai.cpp M +1 -0 src/ai/ai.h M +2 -3 src/ai/dummyai.cpp M +8 -2 src/ai/smartai.cpp http://commits.kde.org/knavalbattle/b41f5254b3365aefac3637bd23fb3a176fcb6516
Git commit e7e05ad435d72a0ac32d9e573e6d04b0a97a02f2 by Jaime Torres. Committed on 28/11/2013 at 19:12. Pushed by jtamate into branch 'master'. always return a valid move to avoid the game freeze When Controller::finalizeShot receives an Illegal move, it just does not know what to do next, and the game freeze. This patch implements the last option to return a valid move, searching for a free cell one by one, therefore it becomes impossible to return an Illegal move because or the computer wins or the opponen wins before the board is empty of free cells. Another solution for dummyAI could be to implement a list of free cells and choose on them randomly. FIXED-IN: KDE/4.12 REVIEW: 113854 M +12 -0 src/ai/ai.cpp M +1 -0 src/ai/ai.h M +2 -3 src/ai/dummyai.cpp M +8 -2 src/ai/smartai.cpp http://commits.kde.org/knavalbattle/e7e05ad435d72a0ac32d9e573e6d04b0a97a02f2