20200710 千锤百炼软工人第五天

今天很遗憾没有学习JAVA语言.........

今天是完成的小学期之前的几个任务的完善工作

在此附上源代码和运行截图

 

#include<iostream>
using namespace std;
class Game
{
private:
 char status[9];               //字符数组
 char p, c;
 int score[9]; int fail, counter;//计算下了多少次
public:
 ~Game(void);
 Game();
 void Print();
 int Cal(int, int);
 bool Judge(int, int, int);
 void play();
};
Game::~Game(void)
{
}
Game::Game()
{
 for (int i = 0; i<9; i++)
 {
  status[i] = '1' + i;        //按照ASCLL表
  counter = 0;
  fail = 0;
 }
}
void  Game::Print()            //打印棋盘
{
 cout << "----------------" << endl;
 cout << " " << status[0] << " | " << status[1] << " | " << status[2] << endl;
 cout << "----------------" << endl;
 cout << " " << status[3] << " | " << status[4] << " | " << status[5] << endl;
 cout << "----------------" << endl;
 cout << " " << status[6] << " | " << status[7] << " | " << status[8] << endl;
}
int Game::Cal(int i, int j)    //计算分值
{
 int result = 0;
 if ((status[i - 1] == c) && (status[j - 1] == c))
 {
  result = 50;
  fail = 2;                 //计算机赢
 }
 if ((status[i - 1] == p) && (status[j - 1] == p))
 {
  result = 25;
 }
 if (((status[i - 1] == c) && (status[j - 1]<'A')) || (status[i - 1]<'A') && (status[j - 1] == c))
  result = 10;
 if (((status[i - 1] == p) && (status[j - 1]<'A')) || (status[i - 1]<'A') && (status[j - 1] == p))
  result = 8;
 if ((status[i - 1]<'A') && (status[j - 1]<'A'))
  result = 4;
 return result;
}
bool Game::Judge(int i, int j, int k)  //判断是否为直线
{
 return((status[i - 1] == p) && (status[j - 1] == p) && (status[k - 1] == p));
}
void Game::play()
{
 int n = 0, max = 0, temp = 0, xu;
 Print();
 cout << "请选择下棋顺序(1、先下 2、后下):" << endl;
 cin >> xu;
 cout << "请选择棋子(‘X’或'O')" << endl;
 cin >> p;
 if (p = 'X')c = 'O';
 else c = 'X';
 if (xu == 2)
 {
  status[4] = c;
  counter++;
  Print();
  cout << "computer plays 5!" << endl;
 }
 do
 {
  do
  {
   cout << "请输入1--9:" << endl;
   cin >> n;
  } while (status[n - 1] >= 'A');
  status[n - 1] = p;
  counter++;
  if (Judge(1, 2, 3) || Judge(4, 5, 6) || Judge(7, 8, 9) || Judge(1, 4, 7) || Judge(2, 5, 8) || Judge(3, 6, 9) || Judge(1, 5, 9) || Judge(3, 5, 7))
   fail = 1;
  if ((fail == 0) && (counter<9))
   for (int k = 0; k<9; k++)                    // 暴力计算所有分值
    if (status[k]<'A')
    {
     switch (k)
     {
     case 0:score[0] = Cal(2, 3) + Cal(4, 7) + Cal(5, 9); break;
     case 1:score[1] = Cal(1, 3) + Cal(5, 8); break;
     case 2:score[2] = Cal(1, 2) + Cal(6, 9) + Cal(5, 7); break;
     case 3:score[3] = Cal(5, 6) + Cal(1, 7); break;
     case 4:score[4] = Cal(4, 6) + Cal(2, 8) + Cal(1, 9) + Cal(3, 7); break;
     case 5:score[5] = Cal(4, 5) + Cal(3, 9); break;
     case 6:score[6] = Cal(1, 4) + Cal(3, 5) + Cal(8, 9); break;
     case 7:score[7] = Cal(2, 5) + Cal(7, 9); break;
     case 8:score[8] = Cal(7, 8) + Cal(3, 6) + Cal(1, 5); break;
     }
    }
    else score[k] = -1;                      //已经有棋子了
    max = score[0];                          //假定最大分值
    for (int k = 1; k<9; k++)                   //暴力选出最大分值
     if (score[k]>max)
     {
      max = score[k];
      temp = k;
     }
    status[temp] = c;
    counter++;
    cout << "computer play" << temp + 1 << "!" << endl;
    Print();
 } while ((fail == 0) && (counter<9));
 if (fail == 0)cout << "和棋!" << endl;
 else if (fail == 1)
  cout << "你赢了!" << endl;
 else
  cout << "你输了!" << endl;
}
int main()
{
 cout << "欢迎进入人机下棋游戏" << endl;
 Game G;
 G.play();
}
 
posted @ 2020-07-10 19:08  黄某人233  阅读(192)  评论(0编辑  收藏  举报