Android 蓝牙五子棋[可人机对战]——完整篇

本文介绍了作者基于Android实现的一款蓝牙五子棋游戏,包括人机对战功能和蓝牙通信模块。游戏算法采用博弈树进行判断,存在优化空间。项目涵盖了蓝牙基础知识和游戏的主要模块,如BleGameActivity和PeopleGameView。虽然存在内存管理和细节问题,但已具备基本功能。作者计划未来可能加入联网对战或研究其他项目,目前主要专注于学习。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

前言

我之前做了个人机对战的五子棋, AI算法很垃圾, 然后各种逻辑很糟糕, 已经很久没有维护了, 今天看了篇文章, 是用了蓝牙和Wifi的五子棋对战, 我觉得很有意思, 毕竟自己没做过蓝牙连接这方面的项目, 然后我就把以前做的五子棋搬了出来.


蓝牙的基础知识

我在前面就有写过一篇比较详细的文章, 兄弟们可以到前面看一看, Android 蓝牙五子棋[可人机对战] —— 蓝牙通信篇


项目解析

  • 文件结构

    这里写图片描述

  • 人机对战算法

    这个算法呢, 就是一个朋友写的, 使用了博弈树来进行判断对战, 其实原理很简单: 通过计算各个点的权重.
    有兴趣的朋友可以下载项目来研究下,这个算法不是很好,计算得比较慢, 一共写了6棵树, 我这里只用了2,3,4, 所以比较快.哪天有空,我也来研究一下ai算法.

  • 主要的模块

    • 蓝牙游戏模块

      BleGameActivity.java
      public 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;
              }
          }
          
         
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值