python五子棋游戏15*15_在STM32上运行五子棋小游戏(15x15)
本程序算法資料來自下面網(wǎng)站.
----https://www.cnblogs.com/buptzym/archive/2012/06/20/2556052.html----
先定義一個數(shù)組 用于存儲整個棋盤的數(shù)據(jù).
u16 ChessBoard[15][15];//棋盤數(shù)據(jù).
一.己方下棋 基礎函數(shù).
1.在屏幕上顯示出來一個15*15的棋盤.
void DrawTable(void)//畫出15x15的棋盤.
{
int i;
for(i=0;i<15;i++)
{
LCD_DrawLine(8,16+i*16,232,16+i*16);
LCD_DrawLine(8+i*16,16,8+i*16,240);
}
}
2.//兩個數(shù)之差的絕對值
//x1,x2:需取差值的兩個數(shù)
//返回值:|x1-x2|
u16 my_abs(u16 x1,u16 x2)
{
if(x1>x2)return x1-x2;
else return x2-x1;
}
3.//x,y是橫縱坐標,Data是數(shù)組
//返回0:無子,1 :黑子,2:白子
u8 ReadData(u8 x,u8 y)
{
int temp;
temp=ChessBoard[x][y];
return temp;
}
4.//x,y是橫縱坐標,Data是數(shù)組
//dat 0:無子,1 :黑子,2:白子
void WriteData(u8 x,u8 y,u8 dat)
{
ChessBoard[x][y]=dat;
}
5.//畫出棋子,黑色或者白色.
void DrawChess(int x,int y,u16 color)
{
POINT_COLOR=color;? //畫筆色....
LCD_Draw_ALLCircle(8+x*16,16+y*16,8);
}
二.己方下棋應用函數(shù)
1.根據(jù)觸摸的位置在屏幕上落子.
將棋子限制在棋盤的交叉格上.
void TouchChess(u8 dat)//觸摸屏落子,
{
int x,y;
int chess_x,chess_y;
for(x=0;x<15;x++)
{
if(my_abs(8+x*16,tp_dev.x[0])<8)//附近范圍<8
{
chess_x=x;
}
}
for(y=0;y<15;y++)
{
if(my_abs(16+y*16,tp_dev.y[0])<8)
{
chess_y=y;
}
}
if(ReadData(chess_x,chess_y) == 0)//空白區(qū)域才能落子.
WriteData(chess_x,chess_y,dat);
}
三.單片機下棋.(單片機需要知道每個格子的各個方向上的權(quán)值,哪里權(quán)值大就下哪里.簡而言之就是哪個位置容易"成子"就下那里,如果是對方容易"成子"就下在哪里"堵他".
1.單片機下棋基礎函數(shù).
u16 GlobalData[8][15][15];
//黑棋 四個方向上的數(shù)據(jù)放在 GlobalData[0][15][15]----GlobalData[3][15][15]
//白棋 四個方向上的數(shù)據(jù)放在 GlobalData[4][15][15]----GlobalData[7][15][15]
u8 Max_x,Max_y;//最有利位置的坐標.
//讀取白方或黑方的各個位置的權(quán)值.
u8 ReadGlobalData(u8 x,u8 y,u8 i)
{
u8 temp;
temp=GlobalData[i][x][y];
return temp;
}
//寫入白方或黑方的各個位置的權(quán)值.
void WriteGlobalData(u8 temp,u8 x,u8 y,u8 dat)
{
GlobalData[temp][x][y] = dat;
}
//置零白方或黑方的各個位置的權(quán)值.
void RestGlobalData(void)
{
u8 i,j,k;
for(i=0;i<8;i++)
{
for(j=0;j<15;j++)
{
for(k=0;k<15;k++)
{
WriteGlobalData(i,j,k,0);
}
}
}
}
四.單片機下棋應用函數(shù).
1.//得到白方或黑方各個位置上,四個方向上的權(quán)值.
void Optimal(u8 color)//全局zuiyou棋子分析.color? 1--黑棋? 2--白棋
{
int i,d;
int x,y;
u8 temp;
switch(color)
{
case (1): temp=0; break;
case (2):temp=4; break;
}
for(x=0;x<15;x++)
{
for(y=0;y<15;y++)
{
if(ReadData(x,y) == 0)
{
d=0;
for(i=1;i<5;i++)//x方向.
{
if(ReadData(x-i,y) != color || (x-i) == 0)
break;
else
d++;
}
for(i=1;i<5;i++)
{
if(ReadData(x+i,y) != color || (x+i) == 14)
break;
else
d++;
}
WriteGlobalData(temp,x,y,d);
d=0;
for(i=1;i<5;i++)//y方向.
{
if(ReadData(x,y-i) != color || (y-i) == 0)
break;
else
d++;
}
for(i=1;i<5;i++)
{
if(ReadData(x,y+i) != color || (y+i) ==14)
break;
else
d++;
}
WriteGlobalData(temp+1,x,y,d);
d=0;
for(i=1;i<5;i++)//
{
if(ReadData(x-i,y-i) != color || (x-i) == 0 || (y-i) == 0)// "\"方向
break;
else
d++;
}
for(i=1;i<5;i++)
{
if(ReadData(x+i,y+i) != color || (x+i) == 14 || (y+i) == 14)//
break;
else
d++;
}
WriteGlobalData(temp+2,x,y,d);
d=0;
for(i=1;i<5;i++)//
{
if(ReadData(x-i,y+i) != color || (x-i) == 0 || (y+i) == 14)// "/"方向
break;
else
d++;
}
for(i=1;i<5;i++)
{
if(ReadData(x+i,y-i) != color || (x+i) == 14? || (y-i) == 0)//
break;
else
d++;
}
WriteGlobalData(temp+3,x,y,d);
}
}
}
}
2.//選擇白方或者黑方的最有利的位置落子.
//黑棋 四個方向上的數(shù)據(jù)放在 GlobalData[0][15][15]----GlobalData[3][15][15]
//白棋 四個方向上的數(shù)據(jù)放在 GlobalData[4][15][15]----GlobalData[7][15][15]
void Situationu(void)
{
int x,y;
u8 i;
u16 Mark;
u16 TotalMark,MaxMark=0;
u16 MarkTransform[5]={0,100,400,2000,10000};
Optimal(1);//heizi.
for(x=0;x<15;x++)
{
for(y=0;y<15;y++)
{
TotalMark=0;
for(i=0;i<4;i++)//四個方向
{
Mark = ReadGlobalData(x,y,i);
TotalMark += MarkTransform[Mark];
}
if(TotalMark > MaxMark)
{
Max_x=x;
Max_y=y;
MaxMark = TotalMark;
}
}
}
Optimal(2);//baizi.
for(x=0;x<15;x++)
{
for(y=0;y<15;y++)
{
TotalMark=0;
for(i=0;i<4;i++)
{
Mark = ReadGlobalData(x,y,i+4);
TotalMark += MarkTransform[Mark];
}
if(TotalMark > MaxMark)
{
Max_x=x;
Max_y=y;
MaxMark = TotalMark;
}
}
}
}
3.//選擇有利位置落子.
void SetChess(void)
{
Situationu();
WriteData(Max_x,Max_y,2);
}
單片機下棋之后要置零權(quán)值數(shù)組.
RestGlobalData();//置位權(quán)值數(shù)組.
五.判斷結(jié)果(判斷黑棋或者白棋是否達到勝利條件,在某個棋子的各個方向上是否有任意一方向上有四個相同棋子)
u8 ResultCheck(u8 color)//?返回值:0:都未成功,1 白方勝利, 2黑方勝利
{
int x,y;
// 判斷橫向
for(y=0;y<15;y++)
{
for(x=0;x<11;x++)
{
if(color == ReadData(x,y) &&
color == ReadData(x+1,y) &&
color == ReadData(x+2,y) &&
color == ReadData(x+3,y) &&
color == ReadData(x+4,y)? )
return color;
}
}
// 判斷縱向
for(y=0;y<11;y++)
{
for(x=0;x<15;x++)
{
if(color == ReadData(x,y) &&
color == ReadData(x,y+1) &&
color == ReadData(x,y+2) &&
color == ReadData(x,y+3) &&
color == ReadData(x,y+4)? )
return color;
}
}
// 判斷"\"方向
for(y=0;y<11;y++)
{
for(x=0;x<11;x++)
{
if(color == ReadData(x,y) &&
color == ReadData(x+1,y+1) &&
color == ReadData(x+2,y+2) &&
color == ReadData(x+3,y+3) &&
color == ReadData(x+4,y+4)? )
return color;
}
}
// 判斷"/"方向
for(y=0;y<11;y++)
{
for(x=4;x<15;x++)
{
if(color == ReadData(x,y) &&
color == ReadData(x-1,y+1) &&
color == ReadData(x-2,y+2) &&
color == ReadData(x-3,y+3) &&
color == ReadData(x-4,y+4)? )
return color;
}
}
// 不滿足勝利條件
return 0;
}
(1)這個程序沒有添加任何的交互界面,只有能夠運行的函數(shù).
如果想添加勝利交互界面可以根據(jù)ResultCheck()的返回值,彈出相應界面.
并清零棋盤數(shù)組ChessBoard[15][15]重新開始.
(2)顯而易見的這個程序只是機械式的向權(quán)值最大處落子,如果贏了一局之后按原先的步驟再次落子你依然會贏,并且單片機所走的步驟也不有任何的改變.所以請把它當做一個小小的游戲.
(3)希望對你有所幫助.一起學習~
因個人能力有限,難免有疏漏之處.
望通知已便改正.
總結(jié)
以上是生活随笔為你收集整理的python五子棋游戏15*15_在STM32上运行五子棋小游戏(15x15)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 查询linux服务器事物传输失败日志,查
- 下一篇: Python的闭包