基于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的边界(规划中) 重新审视深度神经网络中的 ...
随机推荐
- python学习——list
list 序列是Python中最基本的数据结构.序列中的每个元素都分配一个数字 - 它的位置,或索引,第一个索引是0,第二个索引是1,依此类推.Python有6个序列的内置类型,但最常见的是列表和元组 ...
- << 和>> 的计算公式
在java中,一个数左移n位,就是将这个数乘以2的n次方,右移就是将这个数除以2的n次方. 如: 8>>2 = 2 (8/2^2) 15 << 3 = 120 (15*(2 ...
- DOM(Document Object Model)
DOM(Document Object Model): 结点的概念:整个文档就是由层次不同的多个节点组成,可以说结点代表了全部内容. 结点类型 1.元素结点 对于元素结点的n ...
- 染色dp(确定一行就可行)
题:https://codeforces.com/contest/1027/problem/E 题意:给定n*n的方格,可以染黑白,要求相邻俩行”完全“不同或完全相同,对于列也是一样.然后限制不能拥有 ...
- linux进程(一)
回顾:CentOS6的启动过程开机自检->找硬盘->操作系统->内核->进程->登录 Systemd借鉴了很多launchd的思想,他的重要特性如下:1.同SysVini ...
- 2010提高组-C]关押罪犯(扩展域并查集
题:https://www.cometoj.com/problem/0073 #include<bits/stdc++.h> using namespace std; ; struct n ...
- Python迭代器和关键字 global ,nonlocal
1.关键字 global : 可以修改全局变量 可以在局部作用域声明一个全局变量,剪切 : 此时局部作用域没有该变量,全局作用域中有 name = 1 def func(): global name ...
- spring事务管理(xml配置)与spring自带连接数据库JdbcTemplate
什么是事务,很通俗的话来说就是,我们日常生活中总会出现在银行转账的业务,加入A向B转账100元,此时A的账户中应该减少100元,B的账户中增加100元,但是如果在A转完账B还没有接受的时候,服务器出现 ...
- bootstrap实现多选项及回显
1.前端 <link rel="stylesheet" href="${ctxStatic}/js/bootstrap-select-1.12.2/dist/css ...
- MOOC(7)- case依赖、读取json配置文件进行多个接口请求-测试类中调用封装的mock(10)
封装mock后,在单元测试中调用 # -*- coding: utf-8 -*- # @Time : 2020/2/11 8:35 # @File : test_class_10.py.py # @A ...