mirror of
https://github.com/RetroShare/RetroShare.git
synced 2025-08-07 22:02:32 -04:00
added for plugins own dir
git-svn-id: http://svn.code.sf.net/p/retroshare/code/trunk@1850 b45a01b8-16f6-495d-af2f-9b41ad6348cc
This commit is contained in:
parent
97d8640f3a
commit
87344de7d4
809 changed files with 790 additions and 722 deletions
423
plugins/qcheckers_plugin/echeckers.cc
Normal file
423
plugins/qcheckers_plugin/echeckers.cc
Normal file
|
@ -0,0 +1,423 @@
|
|||
/***************************************************************************
|
||||
* Copyright (C) 2002-2003 Andi Peredri *
|
||||
* andi@ukr.net *
|
||||
* *
|
||||
* This program is free software; you can redistribute it and/or modify *
|
||||
* it under the terms of the GNU General Public License as published by *
|
||||
* the Free Software Foundation; either version 2 of the License, or *
|
||||
* (at your option) any later version. *
|
||||
* *
|
||||
* This program is distributed in the hope that it will be useful, *
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of *
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
|
||||
* GNU General Public License for more details. *
|
||||
* *
|
||||
* You should have received a copy of the GNU General Public License *
|
||||
* along with this program; if not, write to the *
|
||||
* Free Software Foundation, Inc., *
|
||||
* 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. *
|
||||
***************************************************************************/
|
||||
|
||||
|
||||
// aw?1 - due to english rules a man reaching the king-row becomes a king
|
||||
// and the is complete.
|
||||
//
|
||||
// English Checkers
|
||||
|
||||
|
||||
#include "echeckers.h"
|
||||
|
||||
|
||||
///////////////////////////////////////////////////
|
||||
//
|
||||
// Player Functions
|
||||
//
|
||||
///////////////////////////////////////////////////
|
||||
|
||||
|
||||
bool ECheckers::go1(int from, int field)
|
||||
{
|
||||
from=internal(from);
|
||||
field=internal(field);
|
||||
|
||||
to=field;
|
||||
|
||||
if(checkCapture1()) {
|
||||
bool capture=false;
|
||||
|
||||
switch(board[from]) {
|
||||
case MAN1:
|
||||
if(manCapture1(from, UL, capture)) return true;
|
||||
if(manCapture1(from, UR, capture)) return true;
|
||||
return false;
|
||||
case KING1:
|
||||
if(kingCapture1(from, UL, capture)) return true;
|
||||
if(kingCapture1(from, UR, capture)) return true;
|
||||
if(kingCapture1(from, DL, capture)) return true;
|
||||
if(kingCapture1(from, DR, capture)) return true;
|
||||
return false;
|
||||
}
|
||||
|
||||
} else {
|
||||
switch(board[from]) {
|
||||
case MAN1:
|
||||
if((to==(from-6))||(to==(from-5))) {
|
||||
board[from]=FREE;
|
||||
if(to<10)
|
||||
board[to]=KING1;
|
||||
else
|
||||
board[to]=MAN1;
|
||||
return true;
|
||||
}
|
||||
return false;
|
||||
case KING1:
|
||||
if((to==(from-6))||(to==(from-5)) ||
|
||||
(to==(from+5))||(to==(from+6)) ) {
|
||||
board[from]=FREE;
|
||||
board[to]=KING1;
|
||||
return true;
|
||||
}
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
|
||||
bool ECheckers::checkCapture1() const
|
||||
{
|
||||
for(int i=6;i<48;i++)
|
||||
if(checkCapture1(i))
|
||||
return true;
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
|
||||
bool ECheckers::checkCapture1(int i) const
|
||||
{
|
||||
switch(board[i]) {
|
||||
case MAN1:
|
||||
// forward-left
|
||||
if(board[i-6]==MAN2 || board[i-6]==KING2)
|
||||
if(board[i-12]==FREE) return true;
|
||||
// forward-right
|
||||
if(board[i-5]==MAN2 || board[i-5]==KING2)
|
||||
if(board[i-10]==FREE) return true;
|
||||
break;
|
||||
|
||||
case KING1:
|
||||
// forward-left
|
||||
if(board[i-6]==MAN2 || board[i-6]==KING2)
|
||||
if(board[i-12]==FREE) return true;
|
||||
// forward-right
|
||||
if(board[i-5]==MAN2 || board[i-5]==KING2)
|
||||
if(board[i-10]==FREE) return true;
|
||||
// backward-left
|
||||
if(board[i+5]==MAN2 || board[i+5]==KING2)
|
||||
if(board[i+10]==FREE) return true;
|
||||
// backward-right
|
||||
if(board[i+6]==MAN2 || board[i+6]==KING2)
|
||||
if(board[i+12]==FREE) return true;
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
|
||||
/* ORIG FUNC aw???
|
||||
bool ECheckers::checkCapture1()
|
||||
{
|
||||
for(int i=6;i<48;i++) {
|
||||
switch(board[i]) {
|
||||
case MAN1:
|
||||
// forward-left
|
||||
if(board[i-6]==MAN2 || board[i-6]==KING2)
|
||||
if(board[i-12]==FREE) return true;
|
||||
// forward-right
|
||||
if(board[i-5]==MAN2 || board[i-5]==KING2)
|
||||
if(board[i-10]==FREE) return true;
|
||||
break;
|
||||
|
||||
case KING1:
|
||||
// forward-left
|
||||
if(board[i-6]==MAN2 || board[i-6]==KING2)
|
||||
if(board[i-12]==FREE) return true;
|
||||
// forward-right
|
||||
if(board[i-5]==MAN2 || board[i-5]==KING2)
|
||||
if(board[i-10]==FREE) return true;
|
||||
// backward-left
|
||||
if(board[i+5]==MAN2 || board[i+5]==KING2)
|
||||
if(board[i+10]==FREE) return true;
|
||||
// backward-right
|
||||
if(board[i+6]==MAN2 || board[i+6]==KING2)
|
||||
if(board[i+12]==FREE) return true;
|
||||
}
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
*/
|
||||
|
||||
|
||||
// Return TRUE if a course of the player true
|
||||
// Return FALSE if a course of the player incorrect
|
||||
|
||||
bool ECheckers::manCapture1(int from, int direction, bool& capture)
|
||||
{
|
||||
int i=from+direction;
|
||||
|
||||
if(board[i]==MAN2 || board[i]==KING2) {
|
||||
int k=i+direction;
|
||||
if(board[k]==FREE) {
|
||||
bool next=false;
|
||||
int save=board[i];
|
||||
board[from]=FREE;
|
||||
board[i]=NONE;
|
||||
|
||||
// become a king!
|
||||
if(k<10) {
|
||||
board[k]=KING1;
|
||||
/*aw?1
|
||||
if(kingCapture1(k, direction+11, next)) {
|
||||
board[i]=FREE;
|
||||
return true;
|
||||
}
|
||||
*/
|
||||
} else {
|
||||
board[k]=MAN1;
|
||||
if(manCapture1(k,UL,next)) {board[i]=FREE; return true;}
|
||||
if(manCapture1(k,UR,next)) {board[i]=FREE; return true;}
|
||||
}
|
||||
|
||||
//?? make move here, too???
|
||||
if((!next) && k==to) {board[i]=FREE; return true;}// move success
|
||||
|
||||
// move failed, restore
|
||||
board[k]=FREE;
|
||||
board[i]=save;
|
||||
board[from]=MAN1;
|
||||
capture=true;
|
||||
}
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
|
||||
bool ECheckers::kingCapture1(int from, int direction, bool& capture)
|
||||
{
|
||||
int i=from+direction;
|
||||
if(board[i]==MAN2 || board[i]==KING2)
|
||||
{
|
||||
int k=i+direction;
|
||||
if(board[k]==FREE)
|
||||
{
|
||||
bool next=false;
|
||||
int save=board[i];
|
||||
board[from]=FREE;
|
||||
board[i]=NONE;
|
||||
board[k]=KING1;
|
||||
|
||||
if(direction==UL || direction==DR) {
|
||||
if(kingCapture1(k,UR,next)) {board[i]=FREE;return true;}
|
||||
if(kingCapture1(k,DL,next)) {board[i]=FREE;return true;}
|
||||
} else {
|
||||
if(kingCapture1(k,UL,next)) {board[i]=FREE;return true;}
|
||||
if(kingCapture1(k,DR,next)) {board[i]=FREE;return true;}
|
||||
}
|
||||
if(kingCapture1(k,direction,next)) {board[i]=FREE;return true;}
|
||||
|
||||
if((!next) && k==to) {board[i]=FREE;return true;}// move ok
|
||||
|
||||
// move failed, restore
|
||||
board[k]=FREE;
|
||||
board[i]=save;
|
||||
board[from]=KING1;
|
||||
capture=true;
|
||||
}
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
|
||||
////////////////////////////////////////////////////
|
||||
//
|
||||
// Computer Functions
|
||||
//
|
||||
////////////////////////////////////////////////////
|
||||
|
||||
|
||||
void ECheckers::kingMove2(int from, int& resMax)
|
||||
{
|
||||
board[from]=FREE;
|
||||
|
||||
int i=from-6;
|
||||
if(board[i]==FREE) {
|
||||
board[i]=KING2;
|
||||
turn(resMax);
|
||||
board[i]=FREE;
|
||||
}
|
||||
|
||||
i=from-5;
|
||||
if(board[i]==FREE) {
|
||||
board[i]=KING2;
|
||||
turn(resMax);
|
||||
board[i]=FREE;
|
||||
}
|
||||
|
||||
i=from+5;
|
||||
if(board[i]==FREE) {
|
||||
board[i]=KING2;
|
||||
turn(resMax);
|
||||
board[i]=FREE;
|
||||
}
|
||||
|
||||
i=from+6;
|
||||
if(board[i]==FREE) {
|
||||
board[i]=KING2;
|
||||
turn(resMax);
|
||||
board[i]=FREE;
|
||||
}
|
||||
|
||||
board[from]=KING2;
|
||||
}
|
||||
|
||||
|
||||
bool ECheckers::checkCapture2() const
|
||||
{
|
||||
for(int i=6;i<48;i++)
|
||||
{
|
||||
switch(board[i])
|
||||
{
|
||||
case MAN2:
|
||||
if(board[i+5]==MAN1 || board[i+5]==KING1)
|
||||
if(board[i+10]==FREE) return true;
|
||||
if(board[i+6]==MAN1 || board[i+6]==KING1)
|
||||
if(board[i+12]==FREE) return true;
|
||||
break;
|
||||
case KING2:
|
||||
if(board[i-6]==MAN1 || board[i-6]==KING1)
|
||||
if(board[i-12]==FREE) return true;
|
||||
if(board[i-5]==MAN1 || board[i-5]==KING1)
|
||||
if(board[i-10]==FREE) return true;
|
||||
if(board[i+5]==MAN1 || board[i+5]==KING1)
|
||||
if(board[i+10]==FREE) return true;
|
||||
if(board[i+6]==MAN1 || board[i+6]==KING1)
|
||||
if(board[i+12]==FREE) return true;
|
||||
}
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
|
||||
// Return TRUE if it is possible to capture
|
||||
// Return FALSE if it is impossible to capture
|
||||
bool ECheckers::manCapture2(int from, int& resMax)
|
||||
{
|
||||
bool capture=false;
|
||||
|
||||
// try left-down
|
||||
int i=from+5;
|
||||
if(board[i]==MAN1 || board[i]==KING1) {
|
||||
int k=from+10;
|
||||
if(board[k]==FREE) {
|
||||
int save=board[i];
|
||||
board[from]=FREE;
|
||||
board[i]=NONE;
|
||||
resMax--;
|
||||
|
||||
// become a king!
|
||||
if(from>32) {
|
||||
board[k]=KING2;
|
||||
// aw?1
|
||||
turn(resMax, true); //aw???
|
||||
//aw??if(!kingCapture2(k, UL, resMax)) turn(resMax, true);
|
||||
} else {
|
||||
board[k]=MAN2;
|
||||
if(!manCapture2(k, resMax)) turn(resMax, true);
|
||||
}
|
||||
|
||||
// restore
|
||||
resMax++;
|
||||
board[k]=FREE;
|
||||
board[i]=save;
|
||||
board[from]=MAN2;
|
||||
capture=true;
|
||||
}
|
||||
}
|
||||
|
||||
// now right-down
|
||||
i=from+6;
|
||||
if(board[i]==MAN1 || board[i]==KING1) {
|
||||
int k=from+12;
|
||||
if(board[k]==FREE) {
|
||||
int save=board[i];
|
||||
board[from]=FREE;
|
||||
board[i]=NONE;
|
||||
resMax--;
|
||||
|
||||
// become a king!
|
||||
if(from>32) {
|
||||
board[k]=KING2;
|
||||
// aw?1
|
||||
turn(resMax, true); // aw???
|
||||
//aw???if(!kingCapture2(k,UR,resMax)) turn(resMax,true);
|
||||
} else {
|
||||
board[k]=MAN2;
|
||||
if(!manCapture2(k,resMax)) turn(resMax,true);
|
||||
}
|
||||
|
||||
// restore
|
||||
resMax++;
|
||||
board[k]=FREE;
|
||||
board[i]=save;
|
||||
board[from]=MAN2;
|
||||
capture=true;
|
||||
}
|
||||
}
|
||||
|
||||
if(capture) return true;
|
||||
return false;
|
||||
}
|
||||
|
||||
|
||||
bool ECheckers::kingCapture2(int from, int direction, int &resMax)
|
||||
{
|
||||
int i=from+direction;
|
||||
if(board[i]==MAN1 || board[i]==KING1)
|
||||
{
|
||||
int k=i+direction;
|
||||
if(board[k]==FREE)
|
||||
{
|
||||
bool capture=false;
|
||||
int save=board[i];
|
||||
board[from]=FREE;
|
||||
board[i]=NONE;
|
||||
resMax--;
|
||||
|
||||
board[k]=KING2;
|
||||
if(direction==UL || direction==DR) {
|
||||
if(kingCapture2(k,UR,resMax)) capture=true;
|
||||
if(kingCapture2(k,DL,resMax)) capture=true;
|
||||
} else {
|
||||
if(kingCapture2(k,UL,resMax)) capture=true;
|
||||
if(kingCapture2(k,DR,resMax)) capture=true;
|
||||
}
|
||||
if(kingCapture2(k,direction,resMax)) capture=true;
|
||||
|
||||
if(!capture) turn(resMax,true);
|
||||
board[k]=FREE;
|
||||
|
||||
//restore
|
||||
resMax++;
|
||||
board[i]=save;
|
||||
board[from]=KING2;
|
||||
return true;
|
||||
}
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
|
Loading…
Add table
Add a link
Reference in a new issue