基于Blazor写一个简单的五子棋游戏
写这个五子棋游戏,其实主要目的是想尝试一下微软新作Blazor。Blazor对于那些搞.NET的程序员,又想做一些前端工作,真的挺友好,不用一句JS就可搞定前端交互,美哉。现在已经有很流行的前端框架,如vue、react、angular等,微软出这个blazor框架,目前观测下来,在国外还满火的,国内就没什么声响了,一方面.net在国内影响本来也不大,另一方面搞.net的也怕被微软又给坑了,所以都是一种观望状态。
扯远了,回到正题,五子棋游戏,本质上还是个二维数组,值0表示空位,1表示黑子,2表示白子。
int[,] chess = new int[19,19];
chess[1,1] = 1;//黑子
chess[1,1] = 2;//白子
所有操作也是对这个二维数组进行搜索或赋值。实践起来差不多有四步。
画棋盘棋子
棋盘棋子由纯CSS编写,棋盘由 19x19个 div 组成。每个div的:after :before 构成横竖两条线条居中。棋子就是一个圆,加点径向渐变、阴影,看起来也差不多了。
如何判赢
当用户在棋盘落子后,其实就是 int[x,y] = 1
。基于此坐标,在横竖撇揦4个方向上,找是否有五个及以上的连子。如果找到就判赢,此局结束。下边以横向为例。
//横方向
var i = 1;//向两边搜索次数
var score = 1;//搜到的连子
var rightValid = true;//是否还能往右搜索
var leftValid = true;//是否还能往左搜索
while (i <= 5)
{
var right = cell + i;//往右
var left = cell - i;//往左
if (rightValid && right < 19)//如果还能往右且没超出边界
{
if (chess[row, right] == chesspiece)//如果是连子
{
score++;//加1
if (score >= 5) //如果已经超过4个了,就判赢
return true;
}
else //碰到空位或敌方棋子,中断搜索
rightValid = false;
}
if (leftValid && left >= 0) //如果还能往左且没超出边界
{
if (chess[row, left] == chesspiece)
{
score++; //加1
if (score >= 5)
return true;
}
else //碰到空位或敌方棋子,中断搜索
leftValid = false;
}
i++;
}
如何实现电脑走棋
走棋采用了遍历计分方式,即计算每一个空位的分数,计算规则如下,分数由高到底。
- 能走死对方
- 能走出活4连子(左右无档子)
- 能走出33
- 能走出死4连子(其中一边被档住)
- 能走出活3连子
- 能走出死3连子(其中一边被档住)
- 能走出2连子
策略
- 斜线分数权重会高于直线。
- 计算空位分数时,也会计算一个敌方在此位置的分数,如果敌方分数高于己方,会优先抢占该位置
这里对分数的计算,还需继续调优。策略部分还应该加上跳子等情况。有时间再弄吧。
其他处理,
如战场清理、谁先手等细节,这些都较为简单。
chess = new int[19,19];//重新实例化一下,即可清除棋盘所有棋子。
演示地址及源码
演示地址 : https://ut32.com/gobang/game
Github库 : https://github.com/ut32/gobang/
基于Blazor写一个简单的五子棋游戏的更多相关文章
- 原生js 基于canvas写一个简单的前端 截图工具
先看效果 <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <titl ...
- canvas写个简单的小游戏
之前在HTML5 Canvas属性和方法汇总一文中,介绍过Canvas的各种属性以及方法的说明,并列举了自己写的一些Canvas demo,接下来开始写一个简单的小游戏吧,有多简单,这么说吧,代码不到 ...
- 分享:计算机图形学期末作业!!利用WebGL的第三方库three.js写一个简单的网页版“我的世界小游戏”
这几天一直在忙着期末考试,所以一直没有更新我的博客,今天刚把我的期末作业完成了,心情澎湃,所以晚上不管怎么样,我也要写一篇博客纪念一下我上课都没有听,还是通过强大的度娘完成了我的作业的经历.(当然作业 ...
- 用C写一个简单的推箱子游戏(二)
下面接着上一篇随笔<用C写一个简单的推箱子游戏(一)>来写 tuidong()函数是用来判断游戏人物前方情况的函数,是推箱子游戏中非常重要的一个函数,下面从它开始继续介绍推箱子的小程序怎么 ...
- 用C写一个简单的推箱子游戏(一)
我现在在读大二,我们有一门课程叫<操作系统>,课程考查要求我们可以写一段程序或者写Windows.iOS.Mac的发展历程.后面我结合网上的资料参考,就想用自己之前简单学过的C写一关的推箱 ...
- java语言写一个建议的五子棋
经过16天的java学习,也学得了不少关于Java方面的知识,我想分享一下我用java写的一个简单的五子棋. 游戏规则: (1)对局双方各执一色棋子.(2)空棋盘开局.(3)白先.黑后,交替下子,每次 ...
- (原创)如何使用boost.asio写一个简单的通信程序(一)
boost.asio相信很多人听说过,作为一个跨平台的通信库,它的性能是很出色的,然而它却谈不上好用,里面有很多地方稍不注意就会出错,要正确的用好asio还是需要花一番精力去学习和实践的,本文将通过介 ...
- 动手写一个简单版的谷歌TPU-矩阵乘法和卷积
谷歌TPU是一个设计良好的矩阵计算加速单元,可以很好的加速神经网络的计算.本系列文章将利用公开的TPU V1相关资料,对其进行一定的简化.推测和修改,来实际编写一个简单版本的谷歌TPU.计划实现到行为 ...
- 动手写一个简单版的谷歌TPU-指令集
系列目录 谷歌TPU概述和简化 基本单元-矩阵乘法阵列 基本单元-归一化和池化(待发布) TPU中的指令集 SimpleTPU实例: (计划中) 拓展 TPU的边界(规划中) 重新审视深度神经网络中的 ...
随机推荐
- TPO6-1Powering the Industrial Revolution
The source had long been known but not exploited. Early in the eighteenth century, a pump had come i ...
- NOIP 2004 T3 合唱队形(DP、最长上升/下降子序列)
链接:https://ac.nowcoder.com/acm/contest/1082/C来源:牛客网 题目描述 N位同学站成一排,音乐老师要请其中的(N-K)位同学出列,使得剩下的K位同学排成合唱队 ...
- mysql truncate 的问题
问题是微信群里一伙计提的 `mysql truncate 空表都需要3 4秒,要优化解决` 一开始觉得这莫名其妙,因为作这种操作的都是后台运维,不是实时的对外服务,运维又不差这3秒 其反应trunca ...
- pandas常用小trick(持续更新)
记录一下pandas常用的小技巧,时间长了干别的去了会忘记,记录一下: 1. 在处理数据过程中涉及到label和null的处理方法 # 方法一 df['height'][df.height < ...
- python之处理json字符串
一.如何从文件中读取json字符串 通过json模块可以处理json数据. 1.loads()方法 loads(json_object)将json字符串转换成dict类型. import json # ...
- form提供的两种数据传输方式 get和post method=”post“和method=”get”
虽然它们都是数据的提交方式,但是在实际传输时确有很大的不同,并且可能会对数据产生严重的影响.虽然为了方便的得到变量值,Web容器已经屏蔽了二者的一些差异,但是了解二者的差异在以后的编程也会很有帮助的. ...
- [LC] 198. House Robber
You are a professional robber planning to rob houses along a street. Each house has a certain amount ...
- HTML颜色表
1.配色原则 2.HTML颜色表 颜色名列表 单击一个颜色名或者16进制值,就可以查看与不同文字颜色搭配的背景颜色 3.总参考表:
- spring boot 配置文件properties和YAML详解
spring boot 配置文件properties和YAML详解 properties中配置信息并获取值. 1:在application.properties配置文件中添加: 根据提示创建直接创建. ...
- 以elasticsearch-hadoop 向elasticsearch 导数,丢失数据的问题排查
实际这是很久之前的问题了,当时没时间记录 这里简单回顾 项目基于 数据架构不方便说太细,最精简的 somedata-> [kafka]->spark-stream->elastics ...