Giter Club home page Giter Club logo

gobang's Introduction

五子棋AI

✨🎉🎉🎉✨ 2023/11 重写了全部代码,代码更加简洁易懂,并修复了之前存在的AI可能会偶尔走错棋的问题,棋力更加稳定,React也更新到了最新的V18版本。

本仓库代码仅供个人业余研究AI用,代码肯定存在有很多不完善的地方,精力和专业所限请谅解

二维码

极小化极大算法的五子棋AI实现。 扫描上方二维码,或者打开此页面可以直接体验 http://gobang2.light7.cn/

截图

如果你对机器学习、神经网络有兴趣,这里有一个基于Alpha Zero原理的AI alpha-zero-gobang 正在开发中,Tensorflow2.x实现,有兴趣的可以关注交流。

需要交流的同学可以加QQ群 622613966,进群验证信息请填写 gobang

更新日志

  • 2023/11/23 更新:V3版本重写了所有代码,现在代码更加简洁易懂,并修复了之前存在的AI可能会偶尔走错棋的问题,棋力更加稳定。
  • 2020/11/29 更新: 修复了评分的明显bug,随机开局库可配置,网站已修复,可以愉快玩耍了

教程

我写了非常详细的中文教程,教你如何一步步编写自己的五子棋AI:

注意教程中的代码与代码仓库的有一定区别,但原理是一样的。

安装依赖

先执行 npm install 安装依赖。然后有如下命令可用:

  • npm test 运行单元测试
  • npm run js 编译JS
  • npm run less 编译less
  • npm run watch 进入watch模式 自动编译文件
  • npm run build 编译生成dist目录

基本算法

  • 极大极小值搜索
  • Alpha Beta剪枝
  • 启发式评估函数
  • Zobrist缓存
  • 迭代加深
  • 算杀 VCT
  • ...

gobang's People

Contributors

lihongxun945 avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

gobang's Issues

npm test 出错

10 passing (25s)
7 failing

  1. 测试的时候碰到的Bug
    冲四双三不能赢,因为对手可以冲四防双三,bug:

    AssertionError: expected false to be true

    • expected - actual

    -false
    +true

    at Context. (dist/main.bundle.js:1931:135)
    at processImmediate (internal/timers.js:464:21)

  2. 测试 gen 函数
    应该能生成冲四防守点:

    AssertionError: expected false to be true

    • expected - actual

    -false
    +true

    at Context. (dist/main.bundle.js:2031:145)
    at processImmediate (internal/timers.js:464:21)

  3. 开局测试
    测试浦月开局:
    Error: Timeout of 2000ms exceeded. For async tests and hooks, ensure "done()" is called; if returning a Promise, ensure it resolves. (/Library/WebServer/Documents/wzq/dist/main.bundle.js)
    at processImmediate (internal/timers.js:464:21)

  4. 测试Star路径的bug
    [6, 4] 能赢:
    Error: Timeout of 2000ms exceeded. For async tests and hooks, ensure "done()" is called; if returning a Promise, ensure it resolves. (/Library/WebServer/Documents/wzq/dist/main.bundle.js)
    at processImmediate (internal/timers.js:464:21)

  5. Test Time
    无意义冲四过多的时候会不会很慢:
    Error: Timeout of 2000ms exceeded. For async tests and hooks, ensure "done()" is called; if returning a Promise, ensure it resolves. (/Library/WebServer/Documents/wzq/dist/main.bundle.js)
    at processImmediate (internal/timers.js:464:21)

  6. Test Time
    此处有杀棋, 只有 [6, 5], [5, 4] 两种走法有杀棋:
    Error: Timeout of 2000ms exceeded. For async tests and hooks, ensure "done()" is called; if returning a Promise, ensure it resolves. (/Library/WebServer/Documents/wzq/dist/main.bundle.js)
    at processImmediate (internal/timers.js:464:21)

  7. 非常长的时间
    由于活三冲四太多,导致思考非常久:
    Error: Timeout of 2000ms exceeded. For async tests and hooks, ensure "done()" is called; if returning a Promise, ensure it resolves. (/Library/WebServer/Documents/wzq/dist/main.bundle.js)
    at processImmediate (internal/timers.js:464:21)

MOCHA Tests completed with 7 failure(s)

ERROR mocha-webpack exited with code 7.
npm ERR! Test failed. See above for more details.

盘面未清洗

老师,你现在还在维护这个吗,这个程序现在存在个问题,就是只要是AI先手,点击开始,这里盘面是不会清理的。

关于棋子位置问题

您好,想请教一下棋子的位置是如何计算出来的?
Board.vue 15行:
style="{ marginTop: (1.5 + rowIndex*6.53) + '%', marginLeft: (1.5 + cIndex*6.53) + '%', }"
Board.vue 57行:
offset = width*0.044, step = width*0.065;

上面代码里面的1.5,6.53,0.044,0.065这些值是如何计算出来的呢?

npm install 出错

npm WARN optional Skipping failed optional dependency /chokidar/fsevents: npm WARN notsup Not compatible with your operating system or architecture: [email protected]

使用的是win10 ubuntu18.04子系统

你好,非常谢谢你的分享。但是有一个疑问

假设,按照你说的,每层搜索的棋子是50个,每个棋子go之后,需要更新空白的点分别机器和人computer[][]和human[][]在该处的得分,这个计算过程,我这边非常耗时,我粗略的估算了一下,这个更新的计算量:8(个方向) * 8 (每个方向的棋子,只算空白位置)* 2 (人和机器)* 4(个方向)(9) = 受影响的空白棋数量 * 2 (角色) (点评估算法)= 4608 ,这个常数可不能忽略。
所以,我这样更新每次计算出来都非常慢,慢到最后需要1分钟才能计算出结果,而且我的deep = 2,还只是评估2步,所以我想请教你,你是如何看

评估函数有问题

当x xxx x empty=count-1
你的代码:
if (empty === 1 || empty == count - 1) {
//第1个是空位
if (count >= 6) {
return score.FIVE;
}
if (block === 0) {
switch (count) {
case 2:
return score.TWO / 2;
case 3:
return score.THREE;
case 4:
return score.BLOCKED_FOUR;
case 5:
return score.FOUR;
}
}
但这个不是稳赢的吗

认输后重新开局出错

复现方法:开始 -> 选择电脑先走 -> 随便走几步,然后认输 -> 点开始,电脑先走

image

evaluate-point中的bug

evaluate-point.js中220行

if(empty == -1 && (x<len-1 && y<len-1) && board[x+1][y-1] == role)

应该写成

if (empty == -1 && (x < len - 1 && y > 0) && board[x + 1][y - 1] == role)

类似地,244行

if(empty == -1 && (x>0 && y>0) && board[x-1][y+1] == role)

应该写成

if (empty == -1 && (x > 0 && y < len - 1) && board[x - 1][y + 1] == role)

项目是使用vscode软件编写的嘛

在使用vscode搭建vue环境时 .npm install 会一直出错,可以请教一下如何解决嘛,错误提示如下
PS C:\Users\yf-wyr\Desktop\Wuziqi> npm install
npm WARN old lockfile
npm WARN old lockfile The package-lock.json file was created with an old version of npm,
npm WARN old lockfile so supplemental metadata must be fetched from the registry.
npm WARN old lockfile
npm WARN old lockfile This is a one-time fix-up, please be patient...
npm WARN old lockfile
npm WARN deprecated [email protected]: Critical bug fixed in v3.0.1, please upgrade to the latest version.
npm WARN deprecated [email protected]: Critical bug fixed in v2.0.1, please upgrade to the latest version.
npm WARN deprecated [email protected]: update to [email protected]
npm WARN deprecated [email protected]: Critical bug fixed in v3.0.1, please upgrade to the latest version.
npm WARN deprecated [email protected]: This version has been deprecated in accordance with the hapi support policy (hapi.im/support). Please upgrade to the latest version to get the best features, bug fixes, and security patches. If you are unable to upgrade at this time, paid support is
available for older versions (hapi.im/commercial).
npm WARN deprecated [email protected]: flatten is deprecated in favor of utility frameworks such as lodash.
npm WARN deprecated [email protected]: This loader has been deprecated. Please use eslint-webpack-plugin
npm WARN deprecated [email protected]: Please use the native JSON object instead of JSON 3
npm WARN deprecated [email protected]: Please see https://github.com/lydell/urix#deprecated
npm WARN deprecated [email protected]: request-promise-native has been deprecated because it extends the now deprecated request package, see request/request#3142
npm WARN deprecated [email protected]: this library is no longer supported
npm WARN deprecated [email protected]: Browserslist 2 could fail on reading Browserslist >3.0 config used in other tools.
npm WARN deprecated [email protected]: Browserslist 2 could fail on reading Browserslist >3.0 config used in other tools.
npm WARN deprecated [email protected]: Browserslist 2 could fail on reading Browserslist >3.0 config used in other tools.
npm WARN deprecated [email protected]: This version has been deprecated in accordance with the hapi support policy (hapi.im/support). Please upgrade to the latest version to get the best features, bug fixes, and security patches. If you are unable to upgrade at this time, paid support is
available for older versions (hapi.im/commercial).
npm WARN deprecated [email protected]: This version has been deprecated in accordance with the hapi support policy (hapi.im/support). Please upgrade to the latest version to get the best features, bug fixes, and security patches. If you are unable to upgrade at this time, paid support is available for older versions (hapi.im/commercial).
npm WARN deprecated [email protected]: Chokidar 2 does not receive security updates since 2019. Upgrade to chokidar 3 with 15x fewer dependencies
npm WARN deprecated [email protected]: https://github.com/lydell/resolve-url#deprecated
npm WARN deprecated [email protected]: CircularJSON is in maintenance only, flatted is its successor.
npm WARN deprecated [email protected]: use String.prototype.padStart()
npm WARN deprecated [email protected]: See https://github.com/lydell/source-map-url#deprecated
npm WARN deprecated [email protected]: This version has been deprecated in accordance with the hapi
support policy (hapi.im/support). Please upgrade to the latest version to get the best features, bug fixes, and security patches. If you are unable to upgrade at this time, paid support is available for older versions (hapi.im/commercial).
npm WARN deprecated [email protected]: 3.x is no longer supported
npm WARN deprecated [email protected]: This module moved to @hapi/sntp. Please make sure to switch over as this distribution is no longer supported and may contain bugs and critical security issues.
npm WARN deprecated [email protected]: The querystring API is considered Legacy. new code should use the URLSearchParams API instead.
npm WARN deprecated [email protected]: This version has been deprecated in accordance with the hapi
support policy (hapi.im/support). Please upgrade to the latest version to get the best features, bug fixes, and security patches. If you are unable to upgrade at this time, paid support is available for older versions (hapi.im/commercial).
npm WARN deprecated [email protected]: This version has been deprecated in accordance with the hapi
support policy (hapi.im/support). Please upgrade to the latest version to get the best features, bug fixes, and security patches. If you are unable to upgrade at this time, paid support is available for older versions (hapi.im/commercial).
npm WARN deprecated [email protected]: This version has been deprecated in accordance with the hapi
support policy (hapi.im/support). Please upgrade to the latest version to get the best features, bug fixes, and security patches. If you are unable to upgrade at this time, paid support is available for older versions (hapi.im/commercial).
npm WARN deprecated [email protected]: babel-eslint is now @babel/eslint-parser. This package will no longer receive updates.
npm WARN deprecated [email protected]: request has been deprecated, see request/request#3142
npm WARN deprecated [email protected]: request has been deprecated, see request/request#3142
npm WARN deprecated [email protected]: request has been deprecated, see request/request#3142
npm WARN deprecated [email protected]: request has been deprecated, see request/request#3142
npm WARN deprecated [email protected]: See https://github.com/lydell/source-map-resolve#deprecated
npm WARN deprecated [email protected]: this library is no longer supported
npm WARN deprecated [email protected]: this library is no longer supported
npm WARN deprecated [email protected]: Please upgrade to version 7 or higher. Older versions may use Math.random() in certain circumstances, which is known to be problematic. See https://v8.dev/blog/math-random for details.
npm WARN deprecated [email protected]: Legacy versions of mkdirp are no longer supported. Please update to mkdirp 1.x. (Note that the API surface has changed to use Promises in 1.x.)
npm WARN deprecated [email protected]: this library is no longer supported
npm WARN deprecated [email protected]: This module moved to @hapi/hawk. Please make sure to switch over as this distribution is no longer supported and may contain bugs and critical security issues.
npm WARN deprecated [email protected]: support for ECMAScript is superseded by uglify-js as of v3.13.0
npm WARN deprecated [email protected]: This version has been deprecated in accordance with the hapi support policy (hapi.im/support). Please upgrade to the latest version to get the best features, bug fixes, and security patches. If you are unable to upgrade at this time, paid support is
available for older versions (hapi.im/commercial).
npm WARN deprecated [email protected]: This version has been deprecated in accordance with the hapi support policy (hapi.im/support). Please upgrade to the latest version to get the best features, bug fixes, and security patches. If you are unable to upgrade at this time, paid support is
available for older versions (hapi.im/commercial).
npm WARN deprecated [email protected]: This version of tar is no longer supported, and will not receive security updates. Please upgrade asap.
npm WARN deprecated [email protected]: Critical security vulnerability fixed in v0.21.1. For more information, see axios/axios#3410
npm WARN deprecated [email protected]: This version of 'buffer' is out-of-date. You must update to
v4.9.2 or newer
npm WARN deprecated [email protected]: This SVGO version is no longer supported. Upgrade to v2.x.x.
npm WARN deprecated [email protected]: core-js@<3.4 is no longer maintained and not recommended for usage due to the number of issues. Because of the V8 engine whims, feature detection in old
core-js versions could cause a slowdown up to 100x even if nothing is polyfilled. Please, upgrade your dependencies to the actual version of core-js.
npm ERR! code 1
npm ERR! path C:\Users\yf-wyr\Desktop\Wuziqi\node_modules\node-sass
npm ERR! command failed
npm ERR! command C:\WINDOWS\system32\cmd.exe /d /s /c node scripts/build.js
npm ERR! Building: C:\Program Files\nodejs\node.exe C:\Users\yf-wyr\Desktop\Wuziqi\node_modules\node-gyp\bin\node-gyp.js rebuild --verbose --libsass_ext= --libsass_cflags= --libsass_ldflags= --libsass_library=
npm ERR! gyp info it worked if it ends with ok
npm ERR! gyp verb cli [
npm ERR! gyp verb cli 'C:\Program Files\nodejs\node.exe',
npm ERR! gyp verb cli 'C:\Users\yf-wyr\Desktop\Wuziqi\node_modules\node-gyp\bin\node-gyp.js',
npm ERR! gyp verb cli 'rebuild',
npm ERR! gyp verb cli '--verbose',
npm ERR! gyp verb cli '--libsass_ext=',
npm ERR! gyp verb cli '--libsass_cflags=',
npm ERR! gyp verb cli '--libsass_ldflags=',
npm ERR! gyp verb cli '--libsass_library='
npm ERR! gyp verb cli ]
npm ERR! gyp info using [email protected]
npm ERR! gyp info using [email protected] | win32 | x64
npm ERR! gyp verb command rebuild []
npm ERR! gyp verb command clean []
npm ERR! gyp verb clean removing "build" directory
npm ERR! gyp verb command configure []
npm ERR! gyp verb check python checking for Python executable "python2" in the PATH
npm ERR! gyp verb which failed Error: not found: python2
npm ERR! gyp verb which failed at getNotFoundError (C:\Users\yf-wyr\Desktop\Wuziqi\node_modules\which\which.js:13:12)
npm ERR! gyp verb which failed at F (C:\Users\yf-wyr\Desktop\Wuziqi\node_modules\which\which.js:68:19)
npm ERR! gyp verb which failed at E (C:\Users\yf-wyr\Desktop\Wuziqi\node_modules\which\which.js:80:29)
npm ERR! gyp verb which failed at C:\Users\yf-wyr\Desktop\Wuziqi\node_modules\which\which.js:89:16
npm ERR! gyp verb which failed at C:\Users\yf-wyr\Desktop\Wuziqi\node_modules\isexe\index.js:42:5
npm ERR! gyp verb which failed at C:\Users\yf-wyr\Desktop\Wuziqi\node_modules\isexe\windows.js:36:5
npm ERR! gyp verb which failed at FSReqCallback.oncomplete (node:fs:198:21)
npm ERR! gyp verb which failed python2 Error: not found: python2
npm ERR! gyp verb which failed at getNotFoundError (C:\Users\yf-wyr\Desktop\Wuziqi\node_modules\which\which.js:13:12)
npm ERR! gyp verb which failed at F (C:\Users\yf-wyr\Desktop\Wuziqi\node_modules\which\which.js:68:19)
npm ERR! gyp verb which failed at E (C:\Users\yf-wyr\Desktop\Wuziqi\node_modules\which\which.js:80:29)
npm ERR! gyp verb which failed at C:\Users\yf-wyr\Desktop\Wuziqi\node_modules\which\which.js:89:16
npm ERR! gyp verb which failed at C:\Users\yf-wyr\Desktop\Wuziqi\node_modules\isexe\index.js:42:5
npm ERR! gyp verb which failed at C:\Users\yf-wyr\Desktop\Wuziqi\node_modules\isexe\windows.js:36:5
npm ERR! gyp verb which failed at FSReqCallback.oncomplete (node:fs:198:21) {
npm ERR! gyp verb which failed code: 'ENOENT'
npm ERR! gyp verb which failed }
npm ERR! gyp verb check python checking for Python executable "python" in the PATH
npm ERR! gyp verb which succeeded python C:\Python310\python.EXE
npm ERR! gyp verb check python version C:\Python310\python.EXE -c "import platform; print(platform.python_version());" returned: "3.10.2\r\n"
npm ERR! gyp verb could not find "C:\Python310\python.EXE". checking python launcher
npm ERR! gyp verb could not find "C:\Python310\python.EXE". guessing location
npm ERR! gyp verb ensuring that file exists: C:\Python27\python.exe
npm ERR! gyp ERR! configure error
npm ERR! gyp ERR! stack Error: Can't find Python executable "C:\Python310\python.EXE", you can set the PYTHON env variable.
npm ERR! gyp ERR! stack at PythonFinder.failNoPython (C:\Users\yf-wyr\Desktop\Wuziqi\node_modules\node-gyp\lib\configure.js:492:19)
npm ERR! gyp ERR! stack at PythonFinder. (C:\Users\yf-wyr\Desktop\Wuziqi\node_modules\node-gyp\lib\configure.js:517:16)
npm ERR! gyp ERR! stack at C:\Users\yf-wyr\Desktop\Wuziqi\node_modules\graceful-fs\polyfills.js:284:29
npm ERR! gyp ERR! stack at FSReqCallback.oncomplete (node:fs:198:21)
npm ERR! gyp ERR! System Windows_NT 10.0.18363
npm ERR! gyp ERR! command "C:\Program Files\nodejs\node.exe" "C:\Users\yf-wyr\Desktop\Wuziqi\node_modules\node-gyp\bin\node-gyp.js" "rebuild" "--verbose" "--libsass_ext=" "--libsass_cflags=" "--libsass_ldflags=" "--libsass_library="
npm ERR! gyp ERR! cwd C:\Users\yf-wyr\Desktop\Wuziqi\node_modules\node-sass
npm ERR! gyp ERR! node -v v16.14.0
npm ERR! gyp ERR! node-gyp -v v3.7.0
npm ERR! gyp ERR! not ok
npm ERR! Build failed with error code: 1

npm ERR! A complete log of this run can be found in:
npm ERR! C:\Program Files\nodejs\node_cache_logs\2022-03-09T03_23_41_490Z-debug-0.log
PS C:\Users\yf-wyr\Desktop\Wuziqi>

胜负结算的小bug

今天玩的时候发现了个小bug
看图我先连成五子,但是没有算我胜利,ai又下了一步,就出现双方都五个子连在一起了。
image1
然后我发现还能继续下,于是我就继续连,直到ai连成五子然后判我负了
Snipaste_2022-11-10_14-21-19

求教,如何运行起来?

npm install 之后,npm test,npm run js。。。。全部都无法执行?在package.json文件里只找到了:
"scripts": {
"build": "tsc --build",
"clean": "tsc --build --clean",
"start": "node app"
},
这三个可执行语句。
但是运行npm run build 后显示:

npm run build
[email protected] build
tsc --build
error TS5083: Cannot read file 'D:/****/五子棋/gobang-master 2/gobang-master/gobang-master/tsconfig.json'.
Found 1 error.

算到被杀仍然走了闲棋

image
AI执黑棋下65手之后加载了皱眉的动画,应该是看到了白棋能双四.也就是AI在预料到会输的情况下仍然走了一步不必要的棋.

Multiple bugs in AI

image

  1. Doesn't win 浦月 which should be a sure win. Move 5 is a sure loss for Black.
  2. Shows happy emote for move 7, which is a bad move anyway.
  3. Suicidal move 27 which doesn't make sense at all.

判断输赢Bug

在我右下角白棋走完已经连成5子的情况下,电脑黑棋仍然继续走了一部,并且弹出提示说computer wins。截图是我点了一步悔棋之后的局面,之后再点悔棋就无效了。
image

求助

博主,请问哪个是最终版本啊,就是最新网页那种效果的

两个 Bug

如图 (萌新模式(4~6))
Screenshot_2021-05-12-18-18-30-628_com mmbox xbrowser

Bug 1: 判断输赢 Bug
下到 47 时黑已连成五子而未赢,下到 48 时白已连成五子而未赢,下到 49 时黑已连成六子还是没赢,下到 50 时白子连成五子就赢了,不对
Bug 2: 重子 Bug
20 下方两个棋重叠了

几步就把它赢了

还需要改进哦。五子棋的正式规则好像很复杂,否则先行的有较大优势。

“六子棋”

image
我是白子,我赢了,但系统没有判定。应该是#24的复现

在靠近边上开局,棋力下降明显

你好,我之前按照你博客的思路有实现过python的版本。刚刚又和你最新(2018/07/07)的版本下过一局,我执黑在角落开局,最终赢下了比赛(我是休闲玩家,很多名词比如算杀都是在这次写AI的时候才第一次听说)。我就是一路感觉下来,基于极大极小搜索的AI引擎好像对于这种“角落开局”,会陷入一种困境——进行无意义冲四、往边上下、等等一些非常“愚蠢”的下法,最终就导致其棋力下降(如果我执黑在中间下的话是很难赢的。。)。
不知道作者你有没有思考过这个问题,如有想法,还请赐教!谢谢!

~

发现一开始把棋子下到角落里面电脑要思考好久哎

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.