python五子棋游戏15*15_在STM32上运行五子棋小游戏(15x15)
本程序算法资料来自下面网站.
----https://www.cnblogs.com/buptzym/archive/2012/06/20/2556052.html----
先定义一个数组 用于存储整个棋盘的数据.
u16 ChessBoard[15][15];//棋盘数据.
一.己方下棋 基础函数.
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.//两个数之差的绝对值
//x1,x2:需取差值的两个数
//返回值:|x1-x2|
u16 my_abs(u16 x1,u16 x2)
{
if(x1>x2)return x1-x2;
else return x2-x1;
}
3.//x,y是横纵坐标,Data是数组
//返回0:无子,1 :黑子,2:白子
u8 ReadData(u8 x,u8 y)
{
int temp;
temp=ChessBoard[x][y];
return temp;
}
4.//x,y是横纵坐标,Data是数组
//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);
}
二.己方下棋应用函数
1.根据触摸的位置在屏幕上落子.
将棋子限制在棋盘的交叉格上.
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)//空白区域才能落子.
WriteData(chess_x,chess_y,dat);
}
三.单片机下棋.(单片机需要知道每个格子的各个方向上的权值,哪里权值大就下哪里.简而言之就是哪个位置容易"成子"就下那里,如果是对方容易"成子"就下在哪里"堵他".
1.单片机下棋基础函数.
u16 GlobalData[8][15][15];
//黑棋 四个方向上的数据放在 GlobalData[0][15][15]----GlobalData[3][15][15]
//白棋 四个方向上的数据放在 GlobalData[4][15][15]----GlobalData[7][15][15]
u8 Max_x,Max_y;//最有利位置的坐标.
//读取白方或黑方的各个位置的权值.
u8 ReadGlobalData(u8 x,u8 y,u8 i)
{
u8 temp;
temp=GlobalData[i][x][y];
return temp;
}
//写入白方或黑方的各个位置的权值.
void WriteGlobalData(u8 temp,u8 x,u8 y,u8 dat)
{
GlobalData[temp][x][y] = dat;
}
//置零白方或黑方的各个位置的权值.
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);
}
}
}
}
四.单片机下棋应用函数.
1.//得到白方或黑方各个位置上,四个方向上的权值.
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.//选择白方或者黑方的最有利的位置落子.
//黑棋 四个方向上的数据放在 GlobalData[0][15][15]----GlobalData[3][15][15]
//白棋 四个方向上的数据放在 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);
}
单片机下棋之后要置零权值数组.
RestGlobalData();//置位权值数组.
五.判断结果(判断黑棋或者白棋是否达到胜利条件,在某个棋子的各个方向上是否有任意一方向上有四个相同棋子)
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)这个程序没有添加任何的交互界面,只有能够运行的函数.
如果想添加胜利交互界面可以根据ResultCheck()的返回值,弹出相应界面.
并清零棋盘数组ChessBoard[15][15]重新开始.
(2)显而易见的这个程序只是机械式的向权值最大处落子,如果赢了一局之后按原先的步骤再次落子你依然会赢,并且单片机所走的步骤也不有任何的改变.所以请把它当做一个小小的游戏.
(3)希望对你有所帮助.一起学习~
因个人能力有限,难免有疏漏之处.
望通知已便改正.
python五子棋游戏15*15_在STM32上运行五子棋小游戏(15x15)相关推荐
- 掉进悬崖的小白,捡到python基础秘籍,学习第一周——语法基础,小游戏,无脑循环
掉进悬崖的小白,捡到python基础秘籍,学习第一周--语法基础,小游戏,无脑循环 人生苦短,我用python 语言的种类: 语言的发展: 什么是python 搭建 Python开发环境: 集成开发环 ...
- 基于STM32的贪吃蛇小游戏
基于STM32的贪吃蛇小游戏 初学32一个月,学的并不多,便想着做一个贪吃蛇小游戏,因为有51单片机做贪吃蛇的经验,所以实现出来并不困难. 作品简介 游戏面版将在4.3寸480*800)液晶上显示,初 ...
- 用python做C语言的猜数字游戏,[Python3 练习] 007 简单的猜数字小游戏
题目:简单的猜数字小游戏 (1) 描述 程序随机生成一个数字,玩家用键盘输入所猜数字,在规定次数内猜对为胜. (2) 要求 程序随机生成一个 1 到 100 的自然数 有 7 次机会去猜 机会用尽之前 ...
- 使用LiteOS Studio图形化查看LiteOS在STM32上运行的奥秘
摘要:本文带来基于LiteOS一站式开发工具LiteOS Studio,通过单步调试,来动态分析LiteOS的启动流程. 编者按:在LiteOS大揭秘系列,我们和读者们分享了<LiteOS是怎么 ...
- python小游戏-16行代码实现3D撞球小游戏!-源码下载
python小游戏-16行代码实现3D撞球小游戏!-源码下载 所属网站分类: 资源下载 > python小游戏 作者:搞笑 链接: http://www.pythonheidong.com/bl ...
- stm32仿真不能设置断点_使用LiteOS Studio图形化查看LiteOS在STM32上运行的奥秘
摘要:本文带来基于LiteOS一站式开发工具LiteOS Studio,通过单步调试,来动态分析LiteOS的启动流程. 编者按:在LiteOS大揭秘系列,我们和读者们分享了<LiteOS是怎么 ...
- 树莓派可以玩linux游戏吗,如何在树莓派上玩经典PC游戏
Raspberry Pi提供了令人难以置信的游戏和其他软件库.您可能知道它为模拟其他平台奠定了良好的基础,但是您知道它可以运行复古的PC软件吗? 在Windows之前,就有MS-DOS.可以通过几种不 ...
- Unity 游戏实例开发集合 之 FlyPin (见缝插针) 休闲小游戏快速实现
Unity 游戏实例开发集合 之 FlyPin (见缝插针) 休闲小游戏快速实现 目录 Unity 游戏实例开发集合 之 FlyPin (见缝插针) 休闲小游戏快速实现 一.简单介绍 二.FlyPin ...
- 如何抓住QQ小游戏买量红利:休闲与内购小游戏买量优化方法分享
2019年5月,Qzone小游戏.玩一玩整合升级为全新QQ小游戏平台,其以开放的社交生态和关系链,为开发者带来了巨大的流量红利. 为了帮助更多开发者适应和了解新市场.本文将介绍QQ小游戏投放规模现状以 ...
最新文章
- js控制文本栏只能输入数字
- Linux怎么查询全部容器时间,docker容器与Linux主机环境获取时间不一致
- JavaScript采用append添加的元素错误
- this的用法(java篇)
- meta viewport相关
- 计算机的硬件简介,计算机基础之硬件简介(Day2)(示例代码)
- TCP协议及TCP正常连接与断开
- python数据结构和算法讲解_【学习】python数据结构和算法
- 前端现在有发展前途吗?应届生好找工作吗?
- 力扣每日一刷 -两个数组的交集II
- [转]浅谈算法和数据结构: 八 平衡查找树之2-3树
- .net core 介绍好文章
- scala学习笔记(四)样本类与模式匹配
- BLS门限签名介绍及实现
- iphone手机投影到电脑屏幕上
- 不确定性管理,更需要领导力
- SSH日期录入,日期精确不能精准到时分秒处理
- 0823 - 如何走出状态低谷?
- 力荐神器级员工考核工具:谷歌OKR
- win10修复计算机摁什么,win10修复引导工具怎么用?老司机教你使用win10修复引导工具...
热门文章
- python excel行数计算不对_数十万数据Excel数据不好处理怎么办?几行Python搞定
- 数据库---mysql的索引和引擎
- 软件工程 之 画扇面
- mysql 命令 _Mysql常用命令行大全
- pythonstdin_如何写入Python子进程'stdin?
- 如何把html转换cad,Tab2Xls插件(捷克版)将AutoCAD表格转换为XLS、CSV或HTML。
- 桶式排序 php,PHP实现桶排序算法
- win10共享打印错误0x0000006_Win10连接共享打印机提示0x80070035错误的解决办法
- 一页纸项目管理模板_项目管理职场必备读物!这一次全部送给你!
- 黄金分割小数点后100位小数的c语言编程,黄金分割数小数点后100位