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)希望对你有所帮助.一起学习~

因个人能力有限,难免有疏漏之处.

望通知已便改正.

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/508171.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

点名册_骑士新书《万界点名册》十万收藏火爆气势不减当年修真聊天群

最近好多人都在讨论圣骑士的传说新书《万界点名册》&#xff0c;新书还没有发布&#xff0c;起点就给了闪屏推荐&#xff0c;引得的很多读者心痒痒的想要看看到底是怎样的神作。所以才发布两万多字的新书投资人就快一万人了&#xff0c;收藏也突破了十万。这速度好像是坐了火箭…

hadoop重启后 9000端口不在

原因可能是hadoop的namenode还未启动成功,可以去查看namenode的日志,是否有错误日志,如果没有错误日志,耐心等待namenode的恢复

500张思维导图记38000单词_思维导图记单词,环环相扣难遗忘——2020奇速英语夏令营第三天...

2020年8月6日&#xff0c;是奇速英语19期夏令营第二批单词阅读营正式上课的第3天&#xff0c;为了激发各班学员学习兴趣&#xff0c;保证学习效果&#xff0c;奇速英语专门制定了小组PK的积分奖励制在今天的学习当中发挥了极大的效果。在这一机制的刺激和奇速英语老师们的高效教…

语音识别热词_出门问问 TWS 耳机语音交互解决方案

随着芯片、算法商在技术及应用方面的演进&#xff0c;尤其是连接、降噪方向的重大突破&#xff0c;越来越多的手机及耳机厂商推出了自家功能丰富、交互舒适的 TWS 耳机。近日&#xff0c;出门问问新品发布会上推出的 TicPods 2 系列产品&#xff0c;在人机交互和语音助理方面&a…

egret 变量_egret性能优化总结

## 来自官方的优化建议(1) 少使用Alpha混合。(2) 显式停止计时器&#xff0c;让它们准备好进行垃圾回收。(3)使用事件侦听器并在不需要时删除这些侦听器。(4) 在不需要触摸交互性时显式禁用触摸交互性。(5) 合理使用dispatchEvents 函数。(6) 尽可能重用对象&#xff0c;建立对…

go tcp连接_TCP漫谈之keepalive和time_wait

TCP是一个有状态通讯协议&#xff0c;所谓的有状态是指通信过程中通信的双方各自维护连接的状态。一、TCP keepalive先简单回顾一下TCP连接建立和断开的整个过程。(这里主要考虑主流程&#xff0c;关于丢包、拥塞、窗口、失败重试等情况后面详细讨论。)首先是客户端发送syn(Syn…

纠错码较副本优势与minio纠错码配置

1. 优势 纠错码是什么,怎么保障数据不丢失 纠错码采用数据块校验块方式进行存储,副本采用真实副本存储纠错码更利于存储,副本更利于计算 2. 业界配置 EMC对象存储系统ECS 12 4 和 102 冗余度分别为 1.33 、 1.2 阿里云盘古集群chunk存储 83 冗余度1.375 Google RS(6,3) i…

mysql update 联合更新_Mysql update多表联合更新的方法小结

下面我建两个表&#xff0c;并执行一系列sql语句&#xff0c;仔细观察sql执行后表中数据的变化&#xff0c;很容易就能理解多表联合更新的用法student表 class表1. 执行 UPDATE student s , class c SET s.class_nametest00,c.stu_nametest00 WHERE s.class_id c.idstudent表 …

java mysql读取多条数据_myeclipse 使用Java访问mysql数据库,数据库中有多条记录,为何只能读出一条数据??...

Java源代码如下&#xff1a;publicListgetAllMsgList(){ListmsgListnewArrayList();DBConnectiondbnewDBConnection();Connectionconndb.getConn();Stringsql"select*frommsg...Java 源代码如下&#xff1a;public List getAllMsgList() { List msgList new ArrayList();…

基于corundumstudio建立websocket长连接

依赖 <!--socket io --><dependency><groupId>io.socket</groupId><artifactId>socket.io-client</artifactId><version>1.0.1</version></dependency><dependency><groupId>com.corundumstudio.socketio&…

mysql查询开启事务_MySQL中的查询事务问题

之前帮同学做个app的后台&#xff0c;使用了MySQLMyBatis&#xff0c;遇到了一个查询提交的问题&#xff0c;卡了很久&#xff0c;现在有时间了来复盘下环境情况假设有学生表&#xff1a;USE test;CREATE TABLE student (Id int NOT NULL PRIMARY KEY AUTO_INCREMENT,Name varc…

通过gparted 调整 ubuntu 磁盘

1. 启动和安装 1. 安装 sudo apt-get install gparted 2. 启动 sudo gparted2.配置 如果想扩充磁盘,需要有未分配空间,且该未分配空间位于partition相邻的格子

mysql增加布尔字段_JDBC对MySQL数据库布尔字段的操作方法

本文实例讲述了JDBC对MySQL数据库布尔字段的操作方法。分享给大家供大家参考。具体分析如下&#xff1a;在Mysql数据库如果要使用布尔字段&#xff0c;而应该设置为BIT(1)类型此类型在Mysql中不能通过MySQLQueryBrowser下方的Edit与Apply Changed去编辑只能通过语句修改&#x…

linux查看mysql表空间使用率_Oracle查看数据库表空间使用情况sql语句

Oracle查看数据库表空间使用情况sql语句SELECT UPPER(F.TABLESPACE_NAME) "表空间名",D.TOT_GROOTTE_MB "表空间大小(M)",D.TOT_GROOTTE_MB - F.TOTAL_BYTES "已使用空间(M)",TO_CHAR(ROUND((D.TOT_GROOTTE_MB - F.TOTAL_…

mysql 不同服务器不同库之间的访问_不同服务器数据库之间的数据操作

--创建链接服务器exec sp_addlinkedserver ITSV , , SQLOLEDB , 远程服务器名或ip地址 exec sp_addlinkedsrvlogin ITSV , false ,null, 用户名 , 密码 --查询示例select * from ITSV.数据库名.dbo.表名--导入示例select * into 表 from ITSV.数据库名.dbo.表名--以后不再使用…

mysql 禁止转义_必须转义哪些字符才能阻止(我的)SQL注入?

6 个答案:答案 0 :(得分&#xff1a;46)关于退格字符的猜测&#xff1a;想象一下&#xff0c;我发送了一封电子邮件“嗨&#xff0c;这是根据需要更新数据库的查询”和带有的附加文本文件INSERT INTO students VALUES ("Bobby Tables",12,"abc",3.6);你捕获…

mysql 失效转移_MySQL基于MHA的FailOver过程

大家好&#xff0c;我是anyux。本文介绍MySQL基于MHA的FailOver过程。MHA FailOver过程详解什么是FailOver故障转移主库宕机&#xff0c;一直到业务恢复正常的处理过程如何处理FailOver1.快速监控到主库宕机2.选择新主节点&#xff0c;选择策略mysqladmin ping检查数据库状态&a…

mysql 设置 character_set_server_MySQL:简单记录character_set_server影响参数

Waiting for global read lock&#xff1a;由于flush table with read lock调用函数lock_global_read_lock导致DML操作堵塞。Waiting for commit lock &#xff1a;由于flush table with read lock 调用函数make_global_read_lock_block_commit导致事务不能提交现象堵塞COMMIT和…