當前位置:首頁 » 電腦資訊 » 為什麼電腦下棋

為什麼電腦下棋

發布時間: 2022-05-09 08:42:39

⑴ 為什麼電腦不能使用象棋軟體

一直以來都是可以使用啊,不知道你用的是什麼樣的相機軟體,是不是這個軟體本身有問題呢?又或者是這個象棋軟體需要電腦本身擁有一些其他方面的東西,比如說有的三維軟體需要direct x,或者是一些顯卡方面的驅動,主要是從這方面著手吧!

⑵ 電腦為什麼會下象棋

我是學計算機的,呵呵,其實這個問題很有趣的呢^_^
中國的象棋我還不是很清楚,我目前所知道的最牛的機子名叫【深藍】,戰勝了國際象棋大師【卡斯帕羅夫】,詳細資料如下
http://www.wst.net.cn/history/5.11/10.htm
其實,計算機本身是沒有隻能的,之所以他能夠擁有下棋的能力,是因為我們預先教會了他,通過程序語言,實現了我們跟計算機之前的對話,就好像我們告訴他:
如果別人走馬,你就走馬,如果別人走象,你就走象一樣……
在計算機中,是通過程序語言來實現的,格式是
if......then......
else if......then.......
就跟上面的如果怎麼樣就怎麼樣是一樣的了,這樣計算機就懂得在不同情況下如何處理了哦^_^
希望姐姐的解釋還比較清晰^_^

【補充來了】^_^
思路1,平均每方每步可有35種走法。50回合。
思路2,棋盤上90個點,各點可走的點。如車可以走到任意一點。
按照思路一的演算法 往多了算
一盤棋有50回合,也就是100步,每步有50種變化
一共的變化數就是50的100次方
就算少算一點
一盤棋有20回合,也就是40步,每步10種變化
一共的變化數是10的40次方
這個數也足夠大了,就是1後面跟著40個0
【也就是說,別人走了一步以後,你有多少種可能的走法,計算機會去計算,然後擇優錄取】
給你個演算法吧,我們實驗課上經常做這些^_^
#include "StdAfx.h"
#include "Calculate.h"
#include "MantisChessThink.h"
#include "string.h"
#include "stdio.h"

/*************************************************************************
把Think重新包裝一下,進行坐標變換,希望以後其他人的演算法的介面都採用這個函數
這樣的編譯出來的DLL可以直接替換原來的CChessThinker.dll
timespan是思考的限定時間,以毫秒為單位,時間不同可能導致不同的思考策略。
本程序中的演算法沒有使用這一變數。
**************************************************************************/
BOOL Calculate(char* map,int timespan,int& x1,int& y1,int& x2,int& y2)
{
//BOOL Thinking(int tmap[11][12],POINT tmanposition[32],int &tside,int &resultman, POINT &resultpoint);
int tmap[11][12];
POINT manpoint[32];
int side=(int)map[0]-48;
int resultman=32;
POINT resultpoint={0,0};

for (int i = 0; i < 11; i++)
{
for (int j = 0; j < 12; j++)
{
tmap[i][j] = 32;
}
}
for (int i = 0; i < 32; i++)
{
manpoint[i].x=0;
manpoint[i].y=0;
}
int length=(int)strlen(map);
int index = 1;
while (index < length)
{
int x =1 + ((int)map[index + 0]-48);//thinking的x從1到9
int y = 10 - ((int)map[index + 1]-48);//thinking的y從10到1
int color = (int)map[index + 2]-48;//0-RED,1-BLAVK
int type = (int)map[index + 3]-48;//0-6

int manIndex=0;
if (color==0)
{
switch (type)
{
case 0:
manIndex=0;
break;
case 1:
if (manpoint[1].x==0) manIndex=1;
else manIndex=2;
break;
case 2:
if (manpoint[3].x==0) manIndex=3;
else manIndex=4;
break;
case 3:
if (manpoint[5].x==0) manIndex=5;
else manIndex=6;
break;
case 4:
if (manpoint[7].x==0) manIndex=7;
else manIndex=8;
break;
case 5:
if (manpoint[9].x==0) manIndex=9;
else manIndex=10;
break;
case 6:
if (manpoint[11].x==0) manIndex=11;
else if (manpoint[12].x==0) manIndex=12;
else if (manpoint[13].x==0) manIndex=13;
else if (manpoint[14].x==0) manIndex=14;
else manIndex=15;
break;
}

}
else
{
switch (type)
{
case 0:
manIndex=16;
break;
case 1:
if (manpoint[17].x==0) manIndex=17;
else manIndex=18;
break;
case 2:
if (manpoint[19].x==0) manIndex=19;
else manIndex=20;
break;
case 3:
if (manpoint[21].x==0) manIndex=21;
else manIndex=22;
break;
case 4:
if (manpoint[23].x==0) manIndex=23;
else manIndex=24;
break;
case 5:
if (manpoint[25].x==0) manIndex=25;
else manIndex=26;
break;
case 6:
if (manpoint[27].x==0) manIndex=27;
else if (manpoint[28].x==0) manIndex=28;
else if (manpoint[29].x==0) manIndex=29;
else if (manpoint[30].x==0) manIndex=30;
else manIndex=31;
break;
}
}

manpoint[manIndex].x=x;
manpoint[manIndex].y=y;
tmap[x][y]=manIndex;

index += 4;
}
//ShowInt(side);
//ShowInt(resultman);
//ShowInt(resultpoint.x);
//ShowInt(resultpoint.y);

BOOL b=Think( tmap,manpoint,side,resultman,resultpoint);

if (b)
{
x1=manpoint[resultman].x-1;
y1=10-manpoint[resultman].y;
x2=resultpoint.x-1;
y2=10-resultpoint.y;
}

return b;

//return FALSE;
}
BOOL test(char* x1)
{
return FALSE;
}
void ShowInt(int i)
{
char buf[256];
sprintf(buf,"%d",i);
MessageBox(NULL,buf,"test",0);
}
void ShowString(char * t)
{
MessageBox(NULL,t,"test",0);
}

/ CChessThink.cpp : 定義 DLL 應用程序的入口點。
//

#include "stdafx.h"

#ifdef _MANAGED
#pragma managed(push, off)
#endif

BOOL APIENTRY DllMain( HMODULE hMole,
DWORD ul_reason_for_call,
LPVOID lpReserved
)
{
return TRUE;
}

#ifdef _MANAGED
#pragma managed(pop)
#endif

Calculate.h
void ShowInt(int i);
void ShowString(char * t);
BOOL Calculate(char* map,int timespan,int& x1,int& y1,int& x2,int& y2);

MantisChessDef.h
const int MW=32,SW=1; //MW-棋子寬度;SW-棋子間隔的一半
const int BWA=MW+SW*2; //BWA-棋格寬度

const int XBW=BWA*9,YBW=BWA*10; //棋盤的長寬

const int MAN=0; //人
const int COM=1; //計算機

const int RED=0; //紅方
const int BLACK=1; //黑方

const int RED_K=0; //紅帥
const int RED_S=1; //仕
const int RED_X=2; //相
const int RED_M=3; //馬
const int RED_J=4; //車
const int RED_P=5; //炮
const int RED_B=6; //兵

const int BLACK_K=7; //黑將
const int BLACK_S=8; //士
const int BLACK_X=9; //象
const int BLACK_M=10; //馬
const int BLACK_J=11; //車
const int BLACK_P=12; //炮
const int BLACK_B=13; //卒

//以下是全局函數定義:

//把棋子序號轉換為對應圖標的序號
const int ManToIcon[33]= {0,1,1,2,2,3,3,4,4,5,5,6,6,6,6,6
,7,8,8,9,9,10,10,11,11,12,12,13,13,13,13,13,-1};

//棋子類型與圖標的序號相同
#define ManToType ManToIcon

const int ManToType7[33]= {0,1,1,2,2,3,3,4,4,5,5,6,6,6,6,6
,0,1,1,2,2,3,3,4,4,5,5,6,6,6,6,6,-1};

//隨即函數,返回小於n的隨機整數
int rnd(const int& n);

//給出棋子序號!!,判斷是紅是黑
const int SideOfMan[33]= {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,-1};

const int _defaultmap[11][12]=
{
// [0][1][2][3][4][5][6][7][8][9][10][11]
{32,32,32,32,32,32,32,32,32,32,32,32},//[0]
{32,32,32,32,32,32,32,32,32,32,32,32},//[1]
{32,32,32,32,32,32,32,32,32,32,32,32},//[2]
{32,32,32,32,32,32,32,32,32,32,32,32},//[3]
{32,32,32,32,32,32,32,32,32,32,32,32},//[4]
{32,32,32,32,32,32,32,32,32,32,32,32},//[5]
{32,32,32,32,32,32,32,32,32,32,32,32},//[6]
{32,32,32,32,32,32,32,32,32,32,32,32},//[7]
{32,32,32,32,32,32,32,32,32,32,32,32},//[8]
{32,32,32,32,32,32,32,32,32,32,32,32},//[9]
{32,32,32,32,32,32,32,32,32,32,32,32}//[10]
};

const int FistOfSide[2]={0,16};
const int LastOfSide[2]={15,31};
const int MAXMOVE = 1000;

struct MOVEHISTORY
{
int count;
int man[MAXMOVE];
POINT from[MAXMOVE];
POINT to[MAXMOVE];
int betaken[MAXMOVE];
};

#include "StdAfx.h"
#include "MantisChessDef.h"
#include "MantisChessThink.h"
//-------------下面幾項可以調試智能模塊---------------------------
#define S_WIDTH 8
#define S_DEPTH 6

// 將 士 象 馬 車 炮 兵
const int base[7]= {300,400,300,600, 1000,600,300}; //平均價值
const int range[7]= {0 , 0, 0, 20, 10, 0, 50}; //價值的變動范圍

const int contactpercent1=20; //防守的重視程度
const int contactpercent2=25; //進攻的重視程度

/******************************************************************
例:把馬設為平均價值200,變動范圍±13%應設base[3]=200,range[3]=13
*******************************************************************/
//-----------------------------------------------------------------

const int BV1[7]=//基本價值
{
base[0]-base[0]*range[0]/100,
base[1]-base[1]*range[1]/100,
base[3]-base[2]*range[2]/100,
base[3]-base[3]*range[3]/100,
base[4]-base[4]*range[4]/100,
base[5]-base[5]*range[5]/100,
base[6]-base[6]*range[6]/100
};
const int BV2[7]=//活躍度
{
2*base[0]*range[0]/100/4,
2*base[1]*range[1]/100/4,
2*base[2]*range[2]/100/4,
2*base[3]*range[3]/100/8,
2*base[4]*range[4]/100/17,
2*base[5]*range[5]/100/17,
0,
};

const int BV3[5]=//兵在不同位置的價值附加
{
0*2*base[6]*range[6]/100/4,
1*2*base[6]*range[6]/100/4,
2*2*base[6]*range[6]/100/4,
3*2*base[6]*range[6]/100/4,
4*2*base[6]*range[6]/100/4,
};

#define NORED(i,j) (SideOfMan[tmap[i][j]]!=0)
#define NOBLACK(i,j) (SideOfMan[tmap[i][j]]!=1)
#define NOMAN(i,j) (tmap[i][j]==32)

//兵卒在不同位置的價值,數字越大價值越高
const int ManBPlus[2][12][11]=
{
{
{ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
{ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
{ 0, 1, 2, 3, 4, 4, 4, 3, 2, 1, 0},
{ 0, 1, 2, 3, 4, 4, 4, 3, 2, 1, 0},
{ 0, 1, 2, 3, 3, 3, 3, 3, 2, 1, 0},
{ 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0},
{ 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0},
{ 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0},
{ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
{ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
{ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
{ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}
},
{
{ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
{ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
{ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
{ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
{ 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0},
{ 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0},
{ 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0},
{ 0, 1, 2, 3, 3, 3, 3, 3, 2, 1, 0},
{ 0, 1, 2, 3, 4, 4, 4, 3, 2, 1, 0},
{ 0, 1, 2, 3, 4, 4, 4, 3, 2, 1, 0},
{ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
{ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}
}
};

//-------------------------------------------
static void ContactV(int tmap[11][12],POINT tmanposition[32],int &tside,int activity[32],int contact[32][32]);

/******************************************************************
Mantis_QuickSort:對走法列表進行快速排序

參數:
A: 關鍵值
chessman: 待排序的棋子列表
targetpoint: 待排序的目標點列表
low,high: QuickSort上下限

返回值: 無
******************************************************************/
void Mantis_QuickSort(int A[],int chessman[],POINT targetpoint[],int low,int high)
{
int pivot;
int pivot_man;
POINT pivot_point;
int scanUp,scanDown;
int mid,k;
POINT point;
if(high-low<=0)
{
return;
}
else
{
if(high-low==1)
{
if(A[high]>A[low])
{
k=A[high];
A[high]=A[low];
A[low]=k;
k=chessman[high];
chessman[high]=chessman[low];
chessman[low]=k;
point=targetpoint[high];
targetpoint[high]=targetpoint[low];
targetpoint[low]=point;
return;
}
}
}
mid=(low +high)/2;
pivot=A[mid];
pivot_man=chessman[mid];
pivot_point=targetpoint[mid];
k=A[mid];
A[mid]=A[low];
A[low]=k;
k=chessman[mid];
chessman[mid]=chessman[low];
chessman[low]=k;
point=targetpoint[mid];
targetpoint[mid]=targetpoint[low];
targetpoint[low]=point;
scanUp =low+1;
scanDown = high;
do{
while(scanUp<=scanDown && A[scanUp]>=pivot)
scanUp++;
while(pivot>A[scanDown])
scanDown--;
if(scanUp<scanDown)
{
k=A[scanUp];
A[scanUp]=A[scanDown];
A[scanDown]=k;
k=chessman[scanUp];
chessman[scanUp]=chessman[scanDown];
chessman[scanDown]=k;
point=targetpoint[scanUp];
targetpoint[scanUp]=targetpoint[scanDown];
targetpoint[scanDown]=point;
}
}while(scanUp<scanDown);
A[low]=A[scanDown];
A[scanDown]=pivot;
chessman[low]=chessman[scanDown];
chessman[scanDown]=pivot_man;
targetpoint[low]=targetpoint[scanDown];
targetpoint[scanDown]=pivot_point;

if(low<scanDown-1)
Mantis_QuickSort(A,chessman,targetpoint,low,scanDown-1);
if(scanDown+1<high)
Mantis_QuickSort(A,chessman,targetpoint,scanDown+1,high);
}

/******************************************************************
Value: 估值函數

參數:
tmap: 各棋位狀態
tmanposition: 32棋子的坐標
tside: 輪到哪一放走

返回值: 局面的價值
******************************************************************/
int Value(int tmap[11][12],POINT tmanposition[32],int &tside)
{
static int k;
static int ManExtValue[32];
static int ManBaseValue[32];
static int ManContact[32][32];
static int BeAteCount[32];
static BOOL OwnSee[32];
ZeroMemory(ManContact,sizeof(int)*32*32);
ZeroMemory(ManBaseValue,sizeof(int)*32);
ZeroMemory(ManExtValue,sizeof(int)*32);
ZeroMemory(BeAteCount,sizeof(int)*32);
ZeroMemory(OwnSee,sizeof(int)*32);
int maxvalue=0;
int i,j;
ContactV(tmap,tmanposition,tside,ManBaseValue,ManContact);
//己方將軍
for(i=FistOfSide[tside];i<=LastOfSide[tside];i++)
{
if(ManContact[i][FistOfSide[!tside]])
{
maxvalue=9700;
return maxvalue;
}
}
for(i=0;i<32;i++)
{
k=ManToType7[i];
ManBaseValue[i]=BV1[k]+ManBaseValue[i]*BV2[k];
switch(k)
{
case 6: ManBaseValue[i]+=BV3[ ManBPlus[SideOfMan[i]][tmanposition[i].y][tmanposition[i].x] ];
break;
}
}
for(i=0;i<32;i++)
{
for(j=0;j<32;j++)
{
if(ManContact[i][j])
{
if(SideOfMan[i]==SideOfMan[j])
{
BeAteCount[j]++;
if(!OwnSee[j])
{
ManExtValue[i]+=ManBaseValue[j]*contactpercent1/100;//己方
OwnSee[j]=TRUE;
}
}
else
{
ManExtValue[i]+=ManBaseValue[j]*contactpercent2/100;//對方
BeAteCount[j]--;
}
}
}
}
for(i=FistOfSide[tside];i<=LastOfSide[tside];i++)
{
if(tmanposition[i].x)maxvalue+=ManBaseValue[i]+ManExtValue[i];
}
static BOOL flag;
flag=FALSE;k=32;
for(i=FistOfSide[!tside];i<=LastOfSide[!tside];i++)
{
if(tmanposition[i].x)maxvalue-=ManBaseValue[i]+ManExtValue[i];
//對方將軍
if(ManContact[i][FistOfSide[tside]])
{
flag=TRUE;
k=i;
break;
}
}
if(flag&&BeAteCount[k]>=0)//被將,所將軍的棋子不能被吃掉
{
j=0;
for(i=FistOfSide[tside];i<=LastOfSide[tside];i++)
{
if(BeAteCount[i]<0 && ManBaseValue[i]>j)
j=ManBaseValue[i];
}
maxvalue -=j;
}
else
{
j=0;
for(i=FistOfSide[!tside];i<=LastOfSide[!tside];i++)
{
if(BeAteCount[i]<0 && ManBaseValue[i]>j)
j=ManBaseValue[i];
}
maxvalue +=j;
}
return maxvalue;
}

/******************************************************************
EnumList: 列出所有走法

參數:
tmap: 各棋位狀態
tmanposition: 32棋子的坐標
tside: 輪到哪一放走
chessman: 指向棋子列表的指針(存放結果)
move: 指向棋子所走到位置的指針,與chessman一起組成走法列表
(存放結果)
count: 走法的總數(存放結果)

返回值: 「照相」返回TRUE,否則返回FALSE
******************************************************************/
BOOL EnumList(int tmap[11][12],POINT tmanposition[32],int &tside,int *chessman,POINT *move,int &count)
{
#define ADD(man,tx,ty) {chessman[count]=man;move[count].x=tx;move[count].y=ty;count++;if(tmap[tx][ty]==FistOfSide[!tside])goto _NOKING;}
static int i,j,n,x,y;
static BOOL flag;
count=0;
for(n=FistOfSide[tside];n<=LastOfSide[tside];n++)
{
x=tmanposition[n].x;
if(!x)continue;
y=tmanposition[n].y;
switch(n)
{
case 0:
if(tmanposition[0].x==tmanposition[16].x) //將帥在同一列
{
flag=FALSE;
for(j=tmanposition[16].y+1;j<tmanposition[0].y;j++)
{
if(tmap[x][j]!=32)
{
flag=TRUE;
break;
}
}
if (!flag)
{
ADD(0,x,tmanposition[16].y);
}
}
j=y+1;if(j<=10 && NORED(x,j)) ADD(0,x,j)
j=y-1;if(j>=8 && NORED(x,j)) ADD(0,x,j)
i=x+1;if(i<=6 && NORED(i,y)) ADD(0,i,y)
i=x-1;if(i>=4 && NORED(i,y)) ADD(0,i,y)
break;
case 16:
if(tmanposition[0].x==tmanposition[16].x) //將帥在同一列
{
flag=FALSE;
for(j=tmanposition[16].y+1;j<tmanposition[0].y;j++)
{
if(tmap[x][j]!=32)
{
flag=TRUE;
break;
}
}
if (!flag)
{
ADD(16,x,tmanposition[0].y);
}
}
j=y+1;if(j<=3 && NOBLACK(x,j)) ADD(16,x,j)
j=y-1;if(j>=1 && NOBLACK(x,j)) ADD(16,x,j)
i=x+1;if(i<=6 && NOBLACK(i,y)) ADD(16,i,y)
i=x-1;if(i>=4 && NOBLACK(i,y)) ADD(16,i,y)
break;
case 1:
case 2:
i=x+1;j=y+1;if(i<=6 && j<=10 && NORED(i,j)) ADD(n,i,j)
i=x+1;j=y-1;if(i<=6 && j>=8 && NORED(i,j)) ADD(n,i,j)
i=x-1;j=y+1;if(i>=4 && j<=10 && NORED(i,j)) ADD(n,i,j)
i=x-1;j=y-1;if(i>=4 && j>=8 && NORED(i,j)) ADD(n,i,j)
break;
case 17:
case 18:
i=x+1;j=y+1;if(i<=6 && j<=3 && NOBLACK(i,j)) ADD(n,i,j)
i=x+1;j=y-1;if(i<=6 && j>=1 && NOBLACK(i,j)) ADD(n,i,j)
i=x-1;j=y+1;if(i>=4 && j<=3 && NOBLACK(i,j)) ADD(n,i,j)
i=x-1;j=y-1;if(i>=4 && j>=1 && NOBLACK(i,j)) ADD(n,i,j)
break;
case 3:
case 4:
i=x+2;j=y+2;if(i<=9 && j<=10 && NORED(i,j)) if(NOMAN(x+1,y+1)) ADD(n,i,j)
i=x+2;j=y-2;if(i<=9 && j>=6 && NORED(i,j)) if(NOMAN(x+1,y-1)) ADD(n,i,j)
i=x-2;j=y+2;if(i>=1 && j<=10 && NORED(i,j)) if(NOMAN(x-1,y+1)) ADD(n,i,j)
i=x-2;j=y-2;if(i>=1 && j>=6 && NORED(i,j)) if(NOMAN(x-1,y-1)) ADD(n,i,j)
break;
case 19:
case 20:
i=x+2;j=y+2;if(i<=9 && j<=5 && NOBLACK(i,j)) if(NOMAN(x+1,y+1)) ADD(n,i,j)
i=x+2;j=y-2;if(i<=9 && j>=1 && NOBLACK(i,j)) if(NOMAN(x+1,y-1)) ADD(n,i,j)
i=x-2;j=y+2;if(i>=1 && j<=5 && NOBLACK(i,j)) if(NOMAN(x-1,y+1)) ADD(n,i,j)
i=x-2;j=y-2;if(i>=1 && j>=1 && NOBLACK(i,j)) if(NOMAN(x-1,y-1)) ADD(n,i,j)
break;
case 5:
case 6:
i=x+1;
if(NOMAN(i,y))
{
i=x+2;j=y+1;if(i<=9 && j<=10 && NORED(i,j)) ADD(n,i,j)
i=x+2;j=y-1;if(i<=9 && j>=1 && NORED(i,j)) ADD(n,i,j)
}
i=x-1;
if(NOMAN(i,y))
{
i=x-2;j=y+1;if(i>=1 && j<=10 && NORED(i,j)) ADD(n,i,j)
i=x-2;j=y-1;if(i>=1 && j>=1 && NORED(i,j)) ADD(n,i,j)
}
j=y+1;
if(NOMAN(x,j))
{
i=x+1;j=y+2;if(i<=9 && j<=10 && NORED(i,j)) ADD(n,i,j)
i=x-1;j=y+2;if(i>=1 && j<=10 && NORED(i,j)) ADD(n,i,j)
}
j=y-1;
if(NOMAN(x,j))
{
i=x+1;j=y-2;if(i<=9 && j>=1 && NORED(i,j)) ADD(n,i,j)
i=x-1;j=y-2;if(i>=1 && j>=1 && NORED(i,j)) ADD(n,i,j)
}
break;
case 21:
case 22:
i=x+1;
if(NOMAN(i,y))
{
i=x+2;j=y+1;if(i<=9 && j<=10 && NOBLACK(i,j)) ADD(n,i,j)
i=x+2;j=y-1;if(i<=9 && j>=1 && NOBLACK(i,j)) ADD(n,i,j)
}
i=x-1;
if(NOMAN(i,y))
{
i=x-2;j=y+1;if(i>=1 && j<=10 && NOBLACK(i,j)) ADD(n,i,j)
i=x-2;j=y-1;if(i>=1 && j>=1 && NOBLACK(i,j)) ADD(n,i,j)
}
j=y+1;
if(NOMAN(x,j))
{
i=x+1;j=y+2;if(i<=9 && j<=10 && NOBLACK(i,j)) ADD(n,i,j)
i=x-1;j=y+2;if(i>=1 && j<=10 && NOBLACK(i,j)) ADD(n,i,j)
}
j=y-1;
if(NOMAN(x,j))
{
i=x+1;j=y-2;if(i<=9 && j>=1 && NOBLACK(i,j)) ADD(n,i,j)
i=x-1;j=y-2;if(i>=1 && j>=1 && NOBLACK(i,j)) ADD(n,i,j)
}
break;

case 7:
case 8:
i=x+1;
while(i<=9)
{
if (NOMAN(i,y)) ADD(n,i,y)
else
{
if(NORED(i,y)) ADD(n,i,y)
break;
}
i++;
}
i=x-1;
while(i>=1)
{
if (NOMAN(i,y)) ADD(n,i,y)
else
{
if(NORED(i,y)) ADD(n,i,y)
break;
}
i--;
}
j=y+1;
while(j<=10)
{
if (NOMAN(x,j)) ADD(n,x,j)
else
{
if(NORED(x,j)) ADD(n,x,j)
break;
}
j++;
}
j=y-1;
while(j>=1)
{
if (NOMAN(x,j)) ADD(n,x,j)
else
{
if(NORED(x,j)) ADD(n,x,j)
break;
}
j--;
}
break;
case 23:
case 24:
i=x+1;
while(i<=9)
{
if (NOMAN(i,y)) ADD(n,i,y)
else
{
if(NOBLACK(i,y)) ADD(n,i,y)
break;
}
i++;
}
i=x-1;
while(i>=1)
{
if (NOMAN(i,y)) ADD(n,i,y)
else
{
if(NOBLACK(i,y)) ADD(n,i,y)
break;
}
i--;
}
j=y+1;
while(j<=10)
{
if (NOMAN(x,j)) ADD(n,x,j)
else
{
if(NOBLACK(x,j)) ADD(n,x,j)
break;
}
j++;
}
j=y-1;
while(j>=1)
{
if (NOMAN(x,j)) ADD(n,x,j)
else
{
if(NOBLACK(x,j)) ADD(n,x,j)
break;
}
j--;
}
break;
case 9:
case 10:
i=x+1;flag=FALSE;
while(i<=9)
{
if(NOMAN(i,y))
{
if(!flag) ADD(n,i,y)
}
else
{
if(!flag)flag=TRUE;
else
{
if(NORED(i,y)) ADD(n,i,y)
break;
}
}
i++;
}

i=x-1;flag=FALSE;
while(i>=1)
{
if(NOMAN(i,y))
{
if(!flag) ADD(n,i,y)
}
else
{
if(!flag)flag=TRUE;
else
{
if(NORED(i,y)) ADD(n,i,y)
break;
}
}
i--;
}

j=y+1;flag=FALSE;
while(j<=10)
{
if(NOMAN(x,j))
{
if(!flag) ADD(n,x,j)
【我是學c++的】呵呵,加了注釋,你應該能明白一點^_^

⑶ 電腦下象棋的原理

一種主要是通過棋譜少量由電腦計算來下棋的。還有一種則主要通過電腦的計算,當然不能完全脫離棋譜第二種的比較少見而且下起來比較卡(因為運算大,手機什麼的特別明顯,電腦幾乎無差別)

⑷ 電腦為什麼會下棋

呵呵
電腦程序,不是電腦會下棋,是人設定好了電腦程序,電腦按照人給的命令來做。
麻煩採納,謝謝!

⑸ 電腦是怎麼下棋的

電腦不用棋譜,電腦下棋靠的是計算,它列出後幾步的所有走法,然後給每種走法的結果打分,選擇最高分的方法。打分的方法就靠編程者編的AI了,比如前進一步多少分,後退一步多少分,吃一個子多少分,被吃了多少分。由於這種計算量隨著計算的步數的增加會變得非常變態,只有靠計算機來實現。人下棋主要靠的是經驗,許多人下棋都有自己的套路,對手的意圖可以通過他的走法判斷出來,人之間的對戰很容易變成各種套路的對戰,久而久之就形成了棋譜。

由於電腦的判斷方法計算量大而且有許多不必要的步驟,所以有的編程者會給電腦加入各種走法,減少不必要的計算。但總的來說還是要憑借這些走法的打分來選擇。

⑹ 為什麼電腦上下棋和野外實戰下棋差別好大

電腦能順著你的思維下,人就不同了,下棋老手都有不同的多種思路,不一定會按照你預想的那樣路子去下,用現在的網路語來說 叫套路吧。哈哈哈

⑺ 為什麼電腦下象棋這么厲害,甚至能下贏世界級大師

朋友,你好:
因為它用的是超級計算機,而不是普通的電腦,一秒有數萬次的運算的能力,比人腦不知快多少倍,所以能超過人也是很正常的。
希望對你有所幫助,祝你快樂~~

⑻ 用<象棋巫師>跟電腦下棋為什麼老下不過電腦

象棋巫師的棋力確實比較強大,甚至都有點快趕上收費軟體了,這類棋軟的特點是善於發現你走棋的漏洞,其反映速度比人快得多,你的漏洞跟真人下可能發現不了,而跟巫師下一下就發現了。你可以多與巫師下,下的多了你走棋的漏洞就少了,當巫師抓不住你的漏洞了,你就把巫師戰勝了。
開始跟巫師下,我也不行,後來下的多了,抓住了巫師的規律了,也就常勝了。 通過跟巫師下棋,我的棋力提高了很多,以前在QQ上下棋,總是在1700到2000分之間,輸一陣贏一陣,水平不再提升,通過跟巫師下棋,我在QQ上贏的就多了,現在分數是2560分。
我在象棋巫師網站發了幾個帖子,《舍馬棄車戰巫師》你可以看一下,都是勝巫師的比較典型的殺局。網址:http://bbs.elephantbase.net/forumdisplay.php?fid=7&page=1

⑼ 為什麼在電腦上下棋,我走的很爛

怎麼說呢,您的對手是電腦,畢竟不大好贏,不過我玩過,10局也能贏上兩局,恐怕是玩的關過高。
盡管電腦的運算速度非常快,這種速度雖然人無法冀及;但電腦無論如何無法在沒有預定程序的前提下工作,換言之電腦是沒有思維功能的;先進的電腦或許有簡單的(相對於人腦)邏輯思維功能,但那也是人腦通過無數的賦值程序賦於的。電腦或許能按照人賦於的程序造出人腦,但它絕對不可能不受人腦編制的程序控制(或間接或直接)。電腦只能代替人腦的一小部分簡單的邏輯運算,它無法代替人進行創造性思維。
人大腦有100多億腦細胞.每個細胞有幾百個神經.並行運算.比現在最快的計算機運行速度快大約20個數量級.也就是大約快100000000000000000000倍.按摩爾定律的發展.100多年後的計算機才可以達到人腦的運算水平.不要去和電腦比純計算的快慢.你想想像一下識別一個人的運算速度.也就是你見到張三無論他穿什麼衣服.什麼發型.甚至受了傷,毀了容,你都可以一下子分別出他就是張三.你用電腦去識別這個的話.要處理和運算多少個信息才可以得出這個結果,並且還不夠准確.當電腦有一天可以准備完全無誤像人這樣分別出一個人就是張三的時候.你再看一下這台電腦的運算能力.你就知道人腦的運算能力有多強了.計算機只能運算所有可預見並且簡單的鍵盤輸入或者聲音和圖像輸入.你想一下人的輸入方式有多少種.並且精確度和電腦相比.比如你站在人流擁擠的大街上.你看一眼也馬上可以分別出各種物體和人還有發生是什麼事情.目前的計算機還沒有這樣的運算能力.你想下你目前的一些攝像頭是至少都是幾百W像素的.人眼同樣的道理.但精確度要比攝像頭好上不知多少倍哦.能一眼識別出3D信息。人的大腦要做很多運算.各種感覺都要大腦處理.數學上的運算只是人腦的一部分而己.不能因為算數沒有計算機好,就說大腦沒有計算機運算快。

⑽ 為什麼弈城圍棋里下棋電腦會自動走棋

和電腦下棋,當然電腦會按照儲存的程序進行下棋,你下的子經過電腦計算後也會選中一個交叉點進行落子。

熱點內容
蘋果手機關機了為什麼收不到信息 發布:2025-01-15 21:56:48 瀏覽:287
捷德為什麼是藍眼睛 發布:2025-01-15 21:52:02 瀏覽:952
為什麼我買的東西被人嫌棄 發布:2025-01-15 21:50:16 瀏覽:937
女生為什麼不想找比自己小的男人 發布:2025-01-15 21:47:31 瀏覽:157
送給別人東西為什麼會感覺是施捨 發布:2025-01-15 21:07:40 瀏覽:561
電腦為什麼只有一個軟體有聲音 發布:2025-01-15 20:59:09 瀏覽:136
為什麼一發脾氣想丟東西發泄 發布:2025-01-15 20:57:23 瀏覽:545
為什麼信號很好而網不好呢 發布:2025-01-15 20:39:20 瀏覽:745
為什麼不挖愛因斯坦時間膠囊 發布:2025-01-15 20:39:17 瀏覽:200
文件夾的橫杠為什麼搜索不出來 發布:2025-01-15 20:23:10 瀏覽:542