File size: 4,081 Bytes
079c32c
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
/*
这段代码是一个JavaScript模块,用于与Web Worker进行通信。Web Worker可以在后台线程中执行代码,使得主线程(通常是UI线程)不会因为复杂的或者耗时的任务而被阻塞。
在这个例子中,Web Worker 负责执行一个名为 MinmaxWorker 的任务,可能是一个实现了极小化极大算法(Minimax Algorithm)的工作线程,它通常用于棋类游戏中的人工智能决策。
该模块提供了四个函数:start, move, end, 和 undo,
每个函数都通过 worker.postMessage 发送一个包含 action 和其他必要信息的对象给Worker。
Worker接收这些信息后将执行相应的AI计算任务,完成后通过 worker.onmessage 将结果信息传回给主线程。
每个函数返回一个Promise对象,这意味着它们都是异步的,可以在未来的某个时间点解决(resolve)或拒绝(reject)。
主线程在接收到信息后,通过 resolve 方法将Promise对象的状态改为已解决,并返回结果数据,从而可以在异步函数中使用 await 表达式获取这些数据。
*/

// bridge.js: 从当前目录下的'minmax.worker'文件导入MinmaxWorker类
import MinmaxWorker from './minmax.worker';

// 创建MinmaxWorker的实例
const worker = new MinmaxWorker();

// `start` 函数,异步初始化游戏,传入棋盘大小、AI是否先手和搜索深度
export const start = async (board_size, aiFirst, depth) => {
  // 返回一个新的Promise对象
  return new Promise((resolve, reject) => {
    // 向worker发送初始化游戏的消息
    worker.postMessage({
      action: 'start',
      payload: {
        board_size, // 棋盘大小
        aiFirst,    // AI是否先手
        depth       // 搜索深度
      },
    });
    // 当worker发送消息回来时触发
    worker.onmessage = (event) => {
      // 从事件中解构出action和payload
      const { action, payload } = event.data;
      // 如果action是'start',则解决(resolve)这个promise
      if (action === 'start') {
        resolve(payload);
      }
    };
  })
};

// `move` 函数,异步执行一个移动,传入移动的位置和搜索深度
export const move = async (position, depth) => {
  // 返回一个新的Promise对象
  return new Promise((resolve, reject) => {
    // 向worker发送执行移动的消息
    worker.postMessage({
      action: 'move',
      payload: {
        position, // 移动的位置
        depth     // 搜索深度
      },
    });
    // 当worker发送消息回来时触发
    worker.onmessage = (event) => {
      // 从事件中解构出action和payload
      const { action, payload } = event.data;
      // 如果action是'move',则解决(resolve)这个promise
      if (action === 'move') {
        resolve(payload);
      }
    };
  })
};

// `end` 函数,异步结束游戏
export const end = async () => {
  // 返回一个新的Promise对象
  return new Promise((resolve, reject) => {
    // 向worker发送结束游戏的消息
    worker.postMessage({
      action: 'end',
    });
    // 当worker发送消息回来时触发
    worker.onmessage = (event) => {
      // 从事件中解构出action和payload
      const { action, payload } = event.data;
      // 如果action是'end',则解决(resolve)这个promise
      if (action === 'end') {
        resolve(payload);
      }
    };
  })
};

// `undo` 函数,异步执行撤销上一步操作
export const undo = async () => {
  // 返回一个新的Promise对象
  return new Promise((resolve, reject) => {
    // 向worker发送撤销上一步操作的消息
    worker.postMessage({
      action: 'undo',
    });
    // 当worker发送消息回来时触发
    worker.onmessage = (event) => {
      // 打印接收到的撤销操作相关的信息
      console.log('undo', event);
      // 从事件中解构出action和payload
      const { action, payload } = event.data;
      // 如果action是'undo',则解决(resolve)这个promise
      if (action === 'undo') {
        resolve(payload);
      }
    };
  })
};