當前位置:首頁 » 編程語言 » c語言博弈

c語言博弈

發布時間: 2023-02-15 22:27:26

c語言的五子棋代碼(博弈演算法

#include<stdio.h>
#include<bios.h>
#include<ctype.h>
#include<conio.h>
#include<dos.h>
#defineCROSSRU0xbf/*右上角點*/
#defineCROSSLU0xda/*左上角點*/
#defineCROSSLD0xc0/*左下角點*/
#defineCROSSRD0xd9/*右下角點*/
#defineCROSSL0xc3/*左邊*/
#defineCROSSR0xb4/*右邊*/
#defineCROSSU0xc2/*上邊*/
#defineCROSSD0xc1/*下邊*/
#defineCROSS0xc5/*十字交叉點*/

/*定義棋盤左上角點在屏幕上的位置*/
#defineMAPXOFT5
#defineMAPYOFT2

/*定義1號玩家的操作鍵鍵碼*/
#definePLAY1UP0x1157/*上移--'W'*/
#definePLAY1DOWN0x1f53/*下移--'S'*/
#definePLAY1LEFT0x1e41/*左移--'A'*/
#definePLAY1RIGHT0x2044/*右移--'D'*/
#definePLAY1DO0x3920/*落子--空格鍵*/

/*定義2號玩家的操作鍵鍵碼*/
#definePLAY2UP0x4800/*上移--方向鍵up*/
#definePLAY2DOWN0x5000/*下移--方向鍵down*/
#definePLAY2LEFT0x4b00/*左移--方向鍵left*/
#definePLAY2RIGHT0x4d00/*右移--方向鍵right*/
#definePLAY2DO0x1c0d/*落子--回車鍵Enter*/

/*若想在游戲中途退出,可按Esc鍵*/
#defineESCAPE0x011b

/*定義棋盤上交叉點的狀態,即該點有無棋子*/
/*若有棋子,還應能指出是哪個玩家的棋子*/
#defineCHESSNULL0/*沒有棋子*/
#defineCHESS1'O'/*一號玩家的棋子*/
#defineCHESS2'X'/*二號玩家的棋子*/

/*定義按鍵類別*/
#defineKEYEX99v0/*退出鍵*/
#defineKEYFALLCHESS1/*落子鍵*/
#defineKEYMOVECURSOR2/*游標移動鍵*/
#defineKEYINVALID3/*無效鍵*/

/*定義符號常量:真,假---真為1,假為0*/
#defineTRUE1
#defineFALSE0

/**********************************************************/
/*定義數據結構*/

/*棋盤交叉點坐標的數據結構*/
structpoint
{
intx,y;
};


或者下面這個:
#include<graphics.h>
#include<stdlib.h>
#include<stdio.h>
#include<conio.h>
#defineN15
#defineB7
#defineSTOP-10000
#defineOK1
#defineNO0
#defineUP328
#defineDOWN336
#defineLEFT331
#defineRIGHT333

inta[N+1][N+1];
intzx,zy;
intwrite=1,biaoji=0;
structzn{
longsum;

inty;

intx;

}w[N+1][N+1],max,max1;


voidcbar(inti,intx,inty,intr);
voidmap(inta[][]);
intgetkey();
intkey();
voidzuobiao(intx,inty,inti);
inttu(inta[][],intwrite);
intwtu(inta[][],intwrite);
intneng(inta[][]);
intzh5(inty,intx,inta[][]);
longzzh5(intb[][],inti);
main()
{
inti,j;
intgdriver=DETECT;
intgmode;
initgraph(&gdriver,&gmode,"");
zx=(N+1)/2;
zy=(N+1)/2;
for(i=1;i<=N;i++)
for(j=1;j<=N;j++)
a[i][j]=0;
map(a);
i=1;
while(i)
{
intk,n;
k=wtu(a,write);
if(k==STOP)gotoend;
map(a);
n=neng(a);
if(n==STOP)gotoend;
map(a);
}
end:
;
}


intneng(inta[N+1][N+1])

{
inti,j;
intk;
max.sum=-1;

for(i=0;i<=N;i++)
for(j=0;j<+N;j++)

{
w[i][j].sum=0;
w[i][j].x=i;
w[i][j].y=j;
}
for(i=1;i<=N-4;i++)
for(j=1;j<=N-4;j++)
{
k=zh5(i,j,a);
if(k==STOP)return(STOP);
}

for(i=1;i<=N;i++)
for(j=1;j<=N;j++)
{

if(max.sum<w[i][j].sum)
{

max.sum=w[i][j].sum;
max.y=i;
max.x=j;
}

elseif(max.sum==w[i][j].sum)
{

if(((max.y-zy)*(max.y-zy)+(max.x-zx)*(max.x-zx))>((i-zy)*(i-zy)+(j-zx)*(j-zx)))
max.sum=w[i][j].sum;
max.y=i;
max.x=j;
}
}
if(a[max.y][max.x]==0)

{
a[max.y][max.x]=-1;
zy=max.y;
zx=max.x;
}

}


intzh5(inty,intx,inta[N+1][N+1])
{

inti,j;
intb[6][6];
longc[13];

longd[6][6];
longtemp;
for(i=y;i<=y+4;i++)
for(j=x;j<=x+4;j++)
b[i+1-y][j+1-x]=a[i][j];
c[1]=b[1][1]+b[1][2]+b[1][3]+b[1][4]+b[1][5];
c[2]=b[2][1]+b[2][2]+b[2][3]+b[2][4]+b[2][5];
c[3]=b[3][1]+b[3][2]+b[3][3]+b[3][4]+b[3][5];
c[4]=b[4][1]+b[4][2]+b[4][3]+b[4][4]+b[4][5];
c[5]=b[5][1]+b[5][2]+b[5][3]+b[5][4]+b[5][5];
c[6]=b[1][1]+b[2][1]+b[3][1]+b[4][1]+b[5][1];
c[7]=b[1][2]+b[2][2]+b[3][2]+b[4][2]+b[5][2];
c[8]=b[1][3]+b[2][3]+b[3][3]+b[4][3]+b[5][3];
c[9]=b[1][4]+b[2][4]+b[3][4]+b[4][4]+b[5][4];
c[10]=b[1][5]+b[2][5]+b[3][5]+b[4][5]+b[5][5];
c[11]=b[1][1]+b[2][2]+b[3][3]+b[4][4]+b[5][5];
c[12]=b[1][5]+b[2][4]+b[3][3]+b[4][2]+b[5][1];


for(i=1;i<=12;i++)
{
switch(c[i])

{

case5:biaoji=1;return(STOP);

case-5:biaoji=-1;return(STOP);

case-4:c[i]=100000;break;

case4:c[i]=100000;break;

case-3:c[i]=150;break;

case3:c[i]=150;break;

case-2:c[i]=120;break;

case2:c[i]=100;break;

case-1:c[i]=1;break;

case1:c[i]=1;break;

default:c[i]=0;

}

}

for(i=1;i<=12;i++)

{

if(c[i]==150)

c[i]+=zzh5(b,i);

}

for(i=1;i<=5;i++)

for(j=1;j<=5;j++)

d[i][j]=0;

for(i=1;i<=5;i++)

for(j=1;j<=5;j++)

{

if(i==j)d[i][j]+=c[11];

if((i+j)==6)d[i][j]+=c[12];

d[i][j]+=c[i]+c[j+5];

}

for(i=1;i<=5;i++)

for(j=1;j<=5;j++)

{

if(b[i][j]!=0)

d[i][j]=-2;

}

max1.sum=-1;

max1.y=0;

max1.x=0;

for(i=1;i<=5;i++)

for(j=1;j<=5;j++)

{

if(max1.sum<d[i][j])

{

max1.sum=d[i][j];

max1.y=i;

max1.x=j;

w[i+y-1][j+x-1].sum+=max1.sum;

}

elseif(max1.sum==d[i][j])

{

if(((i+y-1-zy)*(i+y-1-zy)+(j+x-1-zx)*(j+x-1-zx))>((max1.y+y-1-zy)*(max1.y+y-1-zy)+(max1.x+x-1-zx)*(max1.x+x-1-zx)))

{

max1.sum=d[i][j];

max1.y=i;

max1.x=j;

}

}

}

}

longzzh5(intb[6][6],intn)

{

inti,j,k,l,m;

switch(n)

{

case1:i=b[1][1];j=b[1][2];k=b[1][3];l=b[1][4];m=b[1][5];break;

case2:i=b[2][1];j=b[2][2];k=b[2][3];l=b[2][4];m=b[2][5];break;

case3:i=b[3][1];j=b[3][2];k=b[3][3];l=b[3][4];m=b[3][5];break;

case4:i=b[4][1];j=b[4][2];k=b[4][3];l=b[4][4];m=b[4][5];break;

case5:i=b[5][1];j=b[5][2];k=b[5][3];l=b[5][4];m=b[5][5];break;

case6:i=b[1][1];j=b[2][1];k=b[3][1];l=b[4][1];m=b[5][1];break;

case7:i=b[1][2];j=b[2][2];k=b[3][2];l=b[4][2];m=b[5][2];break;

case8:i=b[1][3];j=b[2][3];k=b[3][3];l=b[4][3];m=b[5][3];break;

case9:i=b[1][4];j=b[2][4];k=b[3][4];l=b[4][4];m=b[5][4];break;

case10:i=b[1][5];j=b[2][5];k=b[3][5];l=b[4][5];m=b[5][5];break;

case11:i=b[1][1];j=b[2][2];k=b[3][3];l=b[4][4];m=b[5][5];break;

case12:i=b[1][5];j=b[2][4];k=b[3][3];l=b[4][2];m=b[5][1];break;

}

if((i==0&&j==1&&k==1&&l==1&&m==0))

return(900);

if((i==0&&j==-1&&k==-1&&l==-1&&m==0))

return(1000);

if((i==0&&j==0&&k==1&&l==1&&m==1)||(i==1&&j==1&&k==1&&l==0&&m==0))

return(20);

if((i==0&&j==0&&k==-1&&l==-1&&m==-1)||(i==-1&&j==-1&&k==-1&&l==0&&m==0))

return(20);

if((i==-1&&j==1&&k==1&&l==1&&m==1)||(i==1&&j==-1&&k==1&&l==1&&m==1)||(i==1&&j==1&&k==-1&&l==1&&m==1)||(i==1&&j==1&&k==1&&l==-1&&m==1)||(i==1&&j==1&&k==1&&l==1&&m==-1))

return(-60);

if((i==1&&j==-1&&k==-1&&l==-1&&m==-1)||(i==-1&&j==1&&k==-1&&l==-1&&m==-1)||(i==-1&&j==1&&k==-1&&l==-1&&m==-1)||(i==-1&&j==-1&&k==-1&&l==1&&m==-1)||(i==-1&&j==-1&&k==-1&&l==-1&&m==1))

return(-60);

}


intwtu(inta[N+1][N+1],intwrite)

{

inti=1;

map(a);

zuobiao(zx,zy,1);

while(i)

{

intk;

k=tu(a,write);

if(k==OK)i=0;

if(k==STOP)return(STOP);

}

}


intgetkey()

{

intkey,lo,hi;

key=bioskey(0);

lo=key&0x00ff;

hi=(key&0xff00)>>8;

return((lo==0)?hi+256:lo);

}


intkey()

{

intk;

k=getkey();

switch(k)

{

case27:return(STOP);

case13:

case'':return(OK);

case328:return(UP);

case336:return(DOWN);

case331:return(LEFT);

case333:return(RIGHT);

default:return(NO);

}

}


voidzuobiao(intx,inty,inti)

{

intr;

if(i!=0)

{

setcolor(GREEN);

for(r=1;r<=5;r++)

circle(75+25*x,25+25*y,r);


}

else

{

if(a[zy][zx]==1)

{

setcolor(8);

for(r=1;r<=5;r++)

circle(75+25*x,25+25*y,r);

}

elseif(a[zy][zx]==-1)

{

setcolor(WHITE);

for(r=1;r<=5;r++)

circle(75+25*x,25+25*y,r);

}

else

{

setcolor(B);

for(r=1;r<=5;r++)

circle(75+25*x,25+25*y,r);

setcolor(RED);line(75+25*zx-5,25+25*zy,75+25*x+5,25+25*zy);

line(75+25*zx,25+25*zy-5,75+25*zx,25+25*zy+5);

}

}

}


inttu(inta[N+1][N+1],intwrite)

{

intk;

re:

k=key();

if(k==OK)

{

if(a[zy][zx]==0)

{

a[zy][zx]=write;

}

else

gotore;

}

if(k==STOP)return(STOP);

if(k==NO)gotore;

if(k==UP)

{

inti,j;

if(zy==1)j=zy;

elsej=zy-1;

zuobiao(zx,zy,0);

zuobiao(zx,j,1);

zy=j;

gotore;

}

if(k==DOWN)

{

inti,j;

if(zy==N)j=zy;

elsej=zy+1;

zuobiao(zx,zy,0);

zuobiao(zx,j,1);

zy=j;

gotore;

}

if(k==LEFT)

{

inti,j;

if(zx==1)i=zx;

elsei=zx-1;

zuobiao(zx,zy,0);

zuobiao(i,zy,1);

zx=i;

gotore;

}

if(k==RIGHT)

{

inti,j;

if(zx==N)i=zx;

elsei=zx+1;

zuobiao(zx,zy,0);

zuobiao(i,zy,1);

zx=i;

gotore;

}

}


voidcbar(inti,intx,inty,intr)

{

if(i!=0)

{

if(i==1)

setcolor(8);

elseif(i==-1)

setcolor(WHITE);

for(i=1;i<=r;i++)

{

circle(x,y,i);

}

}

}


voidmap(inta[N+1][N+1])

{

inti,j;

cleardevice();

setbkcolor(B);

setcolor(RED);

for(i=0;i<N;i++)

{

line(100,50+25*i,75+N*25,50+25*i);

line(100+25*i,50,100+25*i,25+N*25);

}

for(i=1;i<=N;i++)

for(j=1;j<=N;j++)

cbar(a[i][j],75+25*j,25+25*i,10);

}

② 求助!C語言博弈問題

如果輪到自己時:
含有1則必勝

2或3則必敗
4必勝
5=2+3 必勝
6=3+3 必勝
7=1+6|2+5|3+4 必敗
8=1+7|2+6|3+5|4+4 必敗
9=2+7 必勝
------------------------------------------
總結一下現在的規律
如果一個數字能由必敗數字組合而成,則該數字必勝
4 = 2+2
5 = 2+3
6 = 3+3
這個容易判斷

其它數字應該都是必敗數字(根據規律猜的)

所以只要找出必勝數字,然後判斷初始條件中有沒有必勝數字
如果有,就輸了
如果沒有就贏了(前提是證明數字只分必敗和必勝兩種)
---------------------------------------------------
#include <stdio.h>
#include <conio.h>
#include <windows.h>
int main()
{
int max=0, winnum[10001], input[10][2], i, j;

memset(winnum, -1, 10001);

for(i = 0; i < 10; i++)
{
scanf("%d %d", &input[i][0], &input[i][1]);
if(input[i][0] > max)
max = input[i][0];
if(input[i][1] > max)
max = input[i][1];
}
//輸入10組數字,找出裡面最大的數
winnum[1] = 0;
winnum[2] = 1;
winnum[3] = 1;
winnum[4] = 0;
for(i = 1; i < max; i++)
{//找出所有比max小的必勝數
if(winnum[i] != 0)
{
winnum[i] = 1;
//printf("i = %d\n", i);
for(j = 2; j < max; j++)
{
if(winnum[j] == 1)
{
winnum[i + j] = 0;//由兩個必敗數字組成的是必勝數字
//printf("%d\n", i + j);
}
}
}
}//判斷必勝數

for(i = 1; i < 10; i++)
{
if(!winnum[input[i][0]] || !winnum[input[i][1]])
//如果小譚擁必勝數字,則我方沒有必勝策略
printf("NO\n");
else
//否則,小譚擁有的是兩個必敗數字,我方有必勝策略
printf("YES\n");
}
return 0;
}
//以上程序的前提是證明數字只分必敗和必勝兩種
//請LZ自己證明,我大致證明了一下,但無法用數學語言表達出來
-----------------------------------------------------------
你要我注釋哪部分啊?

③ C語言 五子棋 博弈樹演算法 葉子節點的分值是如何計算的

其實這個不是難點的,那個分數是當前落子後所形成的以這個棋子為中心的9x9矩陣中所形成的棋型,計算其他地方的棋型顯然沒有什麼意義,再有就是不是C語言才可以寫演算法的,對於極大極小原理,博弈樹和alpha-beta剪枝演算法都是基於這個原理的,如果你是剛學編程不久,而且沒有數據結構的基礎是寫不出來運用博弈樹演算法的五子棋的,先把基礎打好再說。。

④ 求五子棋C語言AI演算法(原創思路)

你網路,極大極小數alpha-beta剪枝樹演算法這是最基礎的演算法,如果你想做得好,這個東西絕對夠你研究個三年五年的。我寫過五子棋人工智慧,如果你需要,我有源碼發給你。

⑤ c 語言知識清單

1.1 基本數據結構
1. 數組
2. 鏈表,雙向鏈表
3. 隊列,單調隊列,雙端隊列
4. 棧,單調棧
1.2 中級數據結構
1. 堆
2. 並查集與帶權並查集
3. hash 表
自然溢出
雙hash
1.3 高級數據結構
1. 樹狀數組
2. 線段樹,線段樹合並
3. 平衡樹
Treap 隨機平衡二叉樹
Splay 伸展樹
* Scapegoat Tree 替罪羊樹
4. 塊狀數組,塊狀鏈表
5.* 樹套樹
線段樹套線段樹
線段樹套平衡樹
* 平衡樹套線段樹
6.可並堆
左偏樹
*配對堆
7. *KDtree,*四分樹
1.4 可持久化數據結構
1. 可持久化線段樹
主席樹
2. * 可持久化平衡樹
3. * 可持久化塊狀數組
1.5 字元串相關演算法及數據結構
1. KMP
2. AC 自動機
3. 後綴數組
4. *後綴樹
5. *後綴自動機
6. 字典樹 Trie
7. manacher
1.6 圖論相關
1. 最小生成樹
prim
kruskal
2. 最短路,次短路,K短路
spfa
dijkstra
floyd
3. 圖的連通
連通分量
割點,割邊
4. 網路流
最大流
最小割
費用流
分數規劃
5. 樹相關
樹上倍增,公共祖先
樹鏈剖分
樹的分治演算法(點分治,邊分治,*動態?樹分治)
動態樹 (LCT,*樹分塊)
虛樹
*prufer編碼
7. 拓撲排序
8. 歐拉圖
9. 二分圖
*KM演算法
匈牙利演算法
1.7 數學相關
1. (擴展)歐幾里得演算法,篩法,快速冪
斐蜀定理
更相減損術
2. 歐拉函數與*降冪大法
3. 費馬小定理
4. 排列組合
lucas定理
5. 乘法逆元
6. 矩陣乘法
7. 數學期望與概率
8. 博弈論
sg函數
樹上刪邊游戲
9. *拉格朗日乘子法
10. 中國剩餘定理
11. 線性規劃與網路流
12. 單純型線性規劃
13. 辛普森積分
14. 模線性方程組
15. 容斥原理與莫比烏斯反演
16. 置換群
17. 快速傅里葉變換
18. *大步小步法(BSGS),擴展BSGS
1.8 動態規劃
1. 一般,背包,狀壓,區間,環形,樹形,數位動態規劃
記憶化搜索
斯坦納樹
背包九講
2. 斜率優化與* 四邊形不等式優化
3. 環 + 外向樹上的動態規劃
4. *插頭動態規劃
1.9 計算幾何
1. 計算幾何基礎
2. 三維計算幾何初步
3. *梯形剖分與*三角形剖分
4. 旋轉卡殼
5. 半平面交
6. pick定理
7. 掃描線
1.10 搜索相關
1. bfs,dfs
2. A* 演算法
3. 迭代加深搜索,雙向廣搜
1.11 特殊演算法
1. 莫隊演算法,*樹上莫隊
2. 模擬退火
3. 爬山演算法
4. 隨機增量法
1.12 其它重要工具與方法
1.模擬與貪心
2. 二分,三分法(求偏導)
3. 分治,CDQ分治
4. 高精度
5. 離線
6. ST表
1.13 STL
1. map
2. priority_queue
3. set
4. bitset
5. rope
1.14 非常見演算法
1. *朱劉演算法
2. *弦圖與區間圖
其實以上的演算法能學完1/3就已經很好了
望採納,謝謝

熱點內容
易享伺服器地址 發布:2024-11-08 15:55:59 瀏覽:752
愛奇藝的密碼哪裡看 發布:2024-11-08 15:52:45 瀏覽:533
安卓10和平板哪個更流暢 發布:2024-11-08 15:51:18 瀏覽:75
配置低也能玩的槍戰游戲有哪些 發布:2024-11-08 15:41:59 瀏覽:169
python中文匹配 發布:2024-11-08 15:41:06 瀏覽:400
通分新演算法 發布:2024-11-08 15:37:01 瀏覽:370
安卓多樂夠級為什麼沒有捕魚 發布:2024-11-08 15:32:27 瀏覽:657
高級資料庫系統 發布:2024-11-08 15:32:14 瀏覽:540
adovc資料庫 發布:2024-11-08 15:32:11 瀏覽:541
winclient怎麼配置ip 發布:2024-11-08 15:23:53 瀏覽:482