前言
我之前做了个人机对战的五子棋, AI算法很垃圾, 然后各种逻辑很糟糕, 已经很久没有维护了, 今天看了篇文章, 是用了蓝牙和Wifi的五子棋对战, 我觉得很有意思, 毕竟自己没做过蓝牙连接这方面的项目, 然后我就把以前做的五子棋搬了出来.
蓝牙的基础知识
我在前面就有写过一篇比较详细的文章, 兄弟们可以到前面看一看, Android 蓝牙五子棋[可人机对战] —— 蓝牙通信篇
项目解析
-
文件结构
-
人机对战算法
这个算法呢, 就是一个朋友写的, 使用了博弈树来进行判断对战, 其实原理很简单: 通过计算各个点的权重.
有兴趣的朋友可以下载项目来研究下,这个算法不是很好,计算得比较慢, 一共写了6棵树, 我这里只用了2,3,4, 所以比较快.哪天有空,我也来研究一下ai算法. -
主要的模块
-
蓝牙游戏模块
BleGameActivity.javapublic class BleGameActivity extends Activity implements PeopleGameView.onBluetoothListener { @InjectView(R.id.tv_pgv_win) TextView mIsWin; @InjectView(R.id.view_pgv) PeopleGameView mPeopleGameView; @InjectView(R.id.btn_pgv_return) Button mBtnPgvReturn; @InjectView(R.id.btn_pgv_again) Button mBtnPgvAgain; @InjectView(R.id.btn_pgv_msg) Button mBtnPgvMsg; private ConnectedThread mConnectedThread; private BluetoothSocket mSocket; private ListPopupWindow mWindowCompat; private List<String> mMessage; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, WindowManager.LayoutParams.FLAG_FULLSCREEN); setContentView(R.layout.activity_ble_game); getWindow().addFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_NAVIGATION); getWindow().addFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS); ButterKnife.inject(this); init(); } //初始化 private void init() { String[] message = getResources().getStringArray(R.array.array_message); mMessage = Arrays.asList(message); mPeopleGameView.setTextView(mIsWin); mPeopleGameView.setCallBack(this); //获取信息 Intent intent = getIntent(); String adress = intent.getStringExtra("adress"); boolean isStart = intent.getBooleanExtra("isStart", false); if (adress != null) { mSocket = SocketManager.getmBleSocketHm(adress); manageClientSocket(isStart); mPeopleGameView.setAdress(adress); mPeopleGameView.setIsStart(isStart); } popupWindow(); } //开启连接线程 public void manageClientSocket(boolean isStart) { mConnectedThread = new ConnectedThread(mSocket, mPeopleGameView, isStart); mConnectedThread.start(); } //发送信息 @Override public void onCommand(String temp) { mConnectedThread.write(temp.getBytes()); } @OnClick({R.id.btn_pgv_return, R.id.btn_pgv_again, R.id.btn_pgv_msg}) public void onClick(View view) { switch (view.getId()) { case R.id.btn_pgv_msg: mWindowCompat.show(); break; case R.id.btn_pgv_return: String command = "return"; mConnectedThread.write(command.getBytes()); mPeopleGameView.returnUp(); break; case R.id.btn_pgv_again: String restartCommand = "restart"; mConnectedThread.write(restartCommand.getBytes()); mPeopleGameView.restartGame(); break; } }
-