弹指间计算机协会 2020做游戏学编程:井字棋

简介: 弹指间计算机协会 2020做游戏学编程:井字棋

双人对战

总体流程

0.初始化

1.展示棋盘

2.玩家1落子

3.展示棋盘

4.判断是否胜利,若胜利,跳到9

5.玩家2落子

6.展示棋盘

7.判断是否胜利,若胜利,跳到9

8.若无人胜利,回到1

9.若已有人胜利,则回到0或结束。

初始化棋盘

void init_board(char arr[3][3]) {
  for (int i = 0; i < 3; i++) {
    for (int j = 0; j < 3; j++) {
      arr[i][j] = ' ';
    }
  }
}

输出棋盘

void display_board(char arr[3][3]) {
  system("cls");
  for (int i = 0; i < 3; i++) {
    printf(" %c|%c |%c\n", arr[i][0], arr[i][1], arr[i][2]);
    if (i < 2)
      printf("--|--|--");
    printf("\n");
  }
}

落子

void player_chess(char arr[3][3]) {
  int x,y;
  while (1) {
    printf("请输入你所要下棋的坐标:");
    scanf("%d%d", &x, &y);
    x--;
    y--;
    if (arr[x][y] == ' ' && x < 3 && y < 3) {
      arr[x][y] = 'X';
      break;
    }
    else {
      printf("这个位置已经被占或在格子之外,请重新下棋。\n");
      continue;
    }
  }
}

判断棋盘是否已满

int check_full(char arr[3][3]) {
  for (int i = 0; i < 3; i++)
    for (int j = 0; j < 3; j++)
      if (arr[i][j] == ' ')
        return 0;
  return 1;
}

判断胜利方

char check_win(char arr[3][3]) {
  int i = 0;
  int ret = 0;
  for (i = 0; i < 3; i++)
    if ((arr[i][0] == arr[i][1]) && (arr[i][2] == arr[i][1]))
      return arr[i][0];
  for (i = 0; i < 3; i++)
    if ((arr[0][i] == arr[1][i]) && (arr[2][i] == arr[1][i]))
      return arr[0][i];
  if ((arr[0][0] == arr[1][1]) && (arr[1][1] == arr[2][2]))
    return arr[0][0];
  if ((arr[0][2] == arr[1][1]) && (arr[1][1] == arr[2][0]))
    return arr[2][0];
  ret = check_full(arr);
  if (ret == 1)
    return 'q';
  return ' ';
}

主函数

char arr[3][3] = { 0 };char ret=0;
      init_board(arr);
      do {
        display_board(arr);
        player_chess(arr);
        display_board(arr);
        if (check_win(arr) != ' ') {
          ret = check_win(arr);
          break;
        }
        player2_chess(arr);
        display_board(arr);       
        ret = check_win(arr);
      } while (ret == ' ');
      display_board(arr);
      if (ret == 'X')
        printf("玩家1赢的游戏\n");
      else if (ret == 'O')
        printf("玩家2赢的游戏\n");
      else if (ret == 'q')
        printf("游戏平局\n");

人机对战

电脑整体逻辑

1.电脑找三连

2.电脑防止人三连

3.电脑按优先级落子。中心点优先级>角>边

电脑找三连

int countx,count0,pos0=-1;
  for (int i = 0; i < 3; i++) {
    countx = 0; count0 = 0; pos0 = -1;
    for (int j = 0; j < COL; j++) {
      if (arr[i][j] == 'O')
        countx++;
      if (arr[i][j] == ' ') {
        count0++;
        pos0 = j;
      }
    }
    if (countx == 2 && count0 == 1) {
      arr[i][pos0] = 'O';
      return;
    }
  }
  countx = 0; count0 = 0; pos0 = -1;
  for (int i = 0; i < 3; i++) {
    countx = 0; count0 = 0; pos0 = -1;
    for (int j = 0; j < 3; j++) {
      if (arr[j][i] == 'O')
        countx++;
      if (arr[j][i] == ' ') {
        count0++;
        pos0 = j;
      }
    }
    if (countx == 2 && count0 == 1) {
      arr[pos0][i] = 'O';
      return;
    }
  }
  countx = 0; count0 = 0; pos0 = -1;
  for (int i = 0; i < 3; i++) {
    if (arr[i][2 - i] == 'O')
      countx++;
    if (arr[i][2 - i] == ' ') {
      count0++;
      pos0 = i;
    }
  }
  if (countx == 2 && count0 == 1) {
    arr[pos0][2 - pos0] = 'O';
    return;
  }

电脑防止人三连

int countx,count0,pos0=-1;
  for (int i = 0; i < 3; i++) {
    countx = 0; count0 = 0; pos0 = -1;
    for (int j = 0; j < COL; j++) {
      if (arr[i][j] == 'X')
        countx++;
      if (arr[i][j] == ' ') {
        count0++;
        pos0 = j;
      }
    }
    if (countx == 2 && count0 == 1) {
      arr[i][pos0] = 'O';
      return;
    }
  }
  countx = 0; count0 = 0; pos0 = -1;
  for (int i = 0; i < 3; i++) {
    countx = 0; count0 = 0; pos0 = -1;
    for (int j = 0; j < 3; j++) {
      if (arr[j][i] == 'X')
        countx++;
      if (arr[j][i] == ' ') {
        count0++;
        pos0 = j;
      }
    }
    if (countx == 2 && count0 == 1) {
      arr[pos0][i] = 'O';
      return;
    }
  }
  countx = 0; count0 = 0; pos0 = -1;
  for (int i = 0; i < 3; i++) {
    if (arr[i][2 - i] == 'X')
      countx++;
    if (arr[i][2 - i] == ' ') {
      count0++;
      pos0 = i;
    }
  }
  if (countx == 2 && count0 == 1) {
    arr[pos0][2 - pos0] = 'O';
    return;
  }

按优先级落子

if (arr[1][1] == ' ') {
    arr[1][1] = 'O';
    return;
  }
  if (arr[0][2] == ' ') {
    arr[0][2] = 'O';
    return;
  }
  if (arr[2][0] == ' ') {
    arr[2][0] = 'O';
    return;
  }
  if (arr[0][0] == ' ') {
    arr[0][0] = 'O';
    return;
  }
  if (arr[2][2] == ' ') {
    arr[2][2] = 'O';
    return;
  }
  if (arr[0][1] == ' ') {
    arr[0][1] = 'O';
    return;
  }
  if (arr[1][0] == ' ') {
    arr[1][0] = 'O';
    return;
  }
  if (arr[1][2] == ' ') {
    arr[1][2] = 'O';
    return;
  }
  if (arr[2][1] == ' ') {
    arr[2][1] = 'O';
    return;
  }

完整代码

#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
#include<stdlib.h>
#include<time.h>
#define ROW 3
#define COL 3
int check_full(char arr[ROW][COL]);
void init_board(char arr[ROW][COL]) {
  for (int i = 0; i < ROW; i++) {
    for (int j = 0; j < COL; j++) {
      arr[i][j] = ' ';
    }
  }
}
void display_board(char arr[ROW][COL]) {
  system("cls");
  for (int i = 0; i < ROW; i++) {
    printf(" %c|%c |%c\n", arr[i][0], arr[i][1], arr[i][2]);
    if (i < 2)
      printf("--|--|--");
    printf("\n");
  }
}
void player_chess(char arr[ROW][COL]) {
  int x = 0;
  int y = 0;
  while (1) {
    printf("请输入你所要下棋的坐标:");
    scanf("%d%d", &x, &y);
    x--;
    y--;
    if (arr[x][y] == ' ' && x < ROW && y < ROW) {
      arr[x][y] = 'X';
      break;
    }
    else {
      printf("这个位置已经被占或在格子之外,请重新下棋。\n");
      continue;
    }
  }
}
void player2_chess(char arr[ROW][COL]) {
  int x = 0;
  int y = 0;
  while (1) {
    printf("请输入你所要下棋的坐标:,\n先输入纵轴坐标后横轴坐标\n取值范围1~3");
    scanf("%d%d", &x, &y);
    x--;
    y--;
    if (arr[x][y] == ' ' && x < ROW && y < ROW) {
      arr[x][y] = 'O';
      break;
    }
    else {
      printf("这个位置已经被占或在格子之外,请重新下棋。\n");
      continue;
    }
  }
}
void computer_chess(char arr[ROW][COL]) {
  int countx,count0,pos0=-1;
  for (int i = 0; i < 3; i++) {
    countx = 0; count0 = 0; pos0 = -1;
    for (int j = 0; j < COL; j++) {
      if (arr[i][j] == 'O')
        countx++;
      if (arr[i][j] == ' ') {
        count0++;
        pos0 = j;
      }
    }
    if (countx == 2 && count0 == 1) {
      arr[i][pos0] = 'O';
      return;
    }
  }
  for (int i = 0; i < 3; i++) {
    countx = 0; count0 = 0; pos0 = -1;
    for (int j = 0; j < 3; j++) {
      if (arr[j][i] == 'O')
        countx++;
      if (arr[j][i] == ' ') {
        count0++;
        pos0 = j;
      }
    }
    if (countx == 2 && count0 == 1) {
      arr[pos0][i] = 'O';
      return;
    }
  }
  countx = 0; count0 = 0; pos0 = -1;
  for (int i = 0; i < 3; i++) {
    if (arr[i][i] == 'O')
      countx++;
    if (arr[i][i] == ' ') {
      count0++;
      pos0 = i;
    }
  }
  countx = 0; count0 = 0; pos0 = -1;
  for (int i = 0; i < 3; i++) {
    if (arr[i][2 - i] == 'O')
      countx++;
    if (arr[i][2 - i] == ' ') {
      count0++;
      pos0 = i;
    }
  }
  if (countx == 2 && count0 == 1) {
    arr[pos0][2 - pos0] = 'O';
    return;
  }
  for (int i = 0; i < 3; i++) {
    countx = 0; count0 = 0; pos0 = -1;
    for (int j = 0; j < COL; j++) {
      if (arr[i][j] == 'X')
        countx++;
      if (arr[i][j] == ' ') {
        count0++;
        pos0 = j;
      }
    }
    if (countx == 2 && count0 == 1) {
      arr[i][pos0] = 'O';
      return;
    }
  }
  for (int i = 0; i < 3; i++) {
    countx = 0; count0 = 0; pos0 = -1;
    for (int j = 0; j < 3; j++) {
      if (arr[j][i] == 'X')
        countx++;
      if (arr[j][i] == ' ') {
        count0++;
        pos0 = j;
      }
    }
    if (countx == 2&& count0 == 1) {
        arr[pos0][i] = 'O'; 
        return;
    }
  }
  countx = 0; count0 = 0; pos0 = -1;
  for (int i = 0; i < 3; i++) {
    if (arr[i][i] == 'X')
      countx++;
    if (arr[i][i] == ' ') {
      count0++;
      pos0 = i;
    }
  }
  if (countx == 2 && count0 == 1) {
    arr[pos0][pos0] = 'O';
    return;
  }
  countx = 0;count0 = 0; pos0 = -1;
  for (int i = 0; i < 3; i++) {
    if (arr[i][2-i] == 'X')
      countx++;
    if (arr[i][2-i] == ' ') {
      count0++;
      pos0 = i;
    }
  }
  if (countx == 2 && count0 == 1) {
    arr[pos0][2-pos0] = 'O';
    return;
  }
  if (arr[1][1] == ' ') {
    arr[1][1] = 'O';
    return;
  }
  if (arr[0][2] == ' ') {
    arr[0][2] = 'O';
    return;
  }
  if (arr[2][0] == ' ') {
    arr[2][0] = 'O';
    return;
  }
  if (arr[0][0] == ' ') {
    arr[0][0] = 'O';
    return;
  }
  if (arr[2][2] == ' ') {
    arr[2][2] = 'O';
    return;
  }
  if (arr[0][1] == ' ') {
    arr[0][1] = 'O';
    return;
  }
  if (arr[1][0] == ' ') {
    arr[1][0] = 'O';
    return;
  }
  if (arr[1][2] == ' ') {
    arr[1][2] = 'O';
    return;
  }
  if (arr[2][1] == ' ') {
    arr[2][1] = 'O';
    return;
  }
}
int check_full(char arr[ROW][COL]) {
  int i = 0;
  int j = 0;
  for (i = 0; i < ROW; i++)
    for (j = 0; j < COL; j++)
      if (arr[i][j] == ' ')
        return 0;
  return 1;
}
char check_win(char arr[ROW][COL]) {
  int i = 0;
  int ret = 0;
  for (i = 0; i < ROW; i++)
    if ((arr[i][0] == arr[i][1]) && (arr[i][2] == arr[i][1]))
      return arr[i][0];
  for (i = 0; i < COL; i++)
    if ((arr[0][i] == arr[1][i]) && (arr[2][i] == arr[1][i]))
      return arr[0][i];
  if ((arr[0][0] == arr[1][1]) && (arr[1][1] == arr[2][2]))
    return arr[0][0];
  if ((arr[0][2] == arr[1][1]) && (arr[1][1] == arr[2][0]))
    return arr[2][0];
  ret = check_full(arr);
  if (ret == 1)
    return 'q';
  return ' ';
}
int main() {
  char arr[ROW][COL] = { 0 };
  int input = 1;
  while (input) {
    printf("请选择是否开始游戏:\n");
    printf("1:玩家先手,电脑后手\n2:玩家后手,电脑先手\n3:双人对战,\n0:结束游戏");
    scanf("%d", &input);
    switch (input) {
    case 3: {
      char ret = 0;
      init_board(arr);
      do {
        display_board(arr);
        player_chess(arr);
        display_board(arr);
        if (check_win(arr) != ' ') {
          ret = check_win(arr);
          break;
        }
        player2_chess(arr);
        ret = check_win(arr);
      } while (ret == ' ');
      display_board(arr);
      if (ret == 'X')
        printf("玩家1赢的游戏\n");
      else if (ret == 'O')
        printf("玩家2赢的游戏\n");
      else if (ret == 'q')
        printf("游戏平局\n");
    }
        break;
    case 2: {
      char ret = 0;
      init_board(arr);
      do {
        display_board(arr);
        computer_chess(arr);
        display_board(arr);
        if (check_win(arr) != ' ') {
          ret = check_win(arr);
          break;
        }
        player_chess(arr);
        ret = check_win(arr);
      } while (ret == ' ');
      display_board(arr);
      if (ret == 'X')
        printf("玩家赢的游戏\n");
      else if (ret == 'O')
        printf("电脑赢的游戏\n");
      else if (ret == 'q')
        printf("游戏平局\n");
    }
        break;
    case 1: {
      char ret = 0;
      init_board(arr);
      do {
        display_board(arr);
        player_chess(arr);
        display_board(arr);
        if (check_win(arr) != ' ') {
          ret = check_win(arr);
          break;
        }
        computer_chess(arr);
        ret = check_win(arr);
      } while (ret == ' ');
      display_board(arr);
      if (ret == 'X')
        printf("玩家赢的游戏\n");
      else if (ret == 'O')
        printf("电脑赢的游戏\n");
      else if (ret == 'q')
        printf("游戏平局\n");
    }
        break;
    case 0:break; break;
    default:;
    }
  }
  system("pause");
  return 0;
}


目录
相关文章
|
2月前
|
机器学习/深度学习 传感器 人工智能
计算机在艺术领域的应用
计算机在艺术领域的应用
|
7月前
|
编译器 API 开发工具
游戏编程之十四 游戏使计算机的发展超越了晶体管时代
游戏编程之十四 游戏使计算机的发展超越了晶体管时代
28 0
|
13天前
程序设计:引爆炸弹 (计蒜客 - A1139)
程序设计:引爆炸弹 (计蒜客 - A1139)
|
12月前
|
人工智能 算法 固态存储
这才是模块化电脑该有的样子:一人打造的超迷你计算机,震动了整个极客圈
这才是模块化电脑该有的样子:一人打造的超迷你计算机,震动了整个极客圈
109 0
弹指间计算机协会做游戏学编程活动2019:飞机大战
弹指间计算机协会做游戏学编程活动2019:飞机大战
45 0
|
存储 机器学习/深度学习 人工智能
一文总结那些年我们追过的计算机发展史
一文总结那些年我们追过的计算机发展史
189 0
一文总结那些年我们追过的计算机发展史
|
存储 算法 程序员
计算机发展史人物篇之查尔斯巴贝奇
他在24岁时就被选为英国皇家学会会员、卢卡斯讲座数学教授,参与创建了英国天文学会和统计学会,并且还是天文学会金奖获得者;是巴黎伦理科学院、爱尔兰皇家学会和美国科学学院的成员之一。却因为差分机被人嘲笑了一辈子。
866 0
计算机发展史人物篇之查尔斯巴贝奇
|
机器学习/深度学习 程序员 Python
团体程序设计天梯赛-模拟赛(上)
团体程序设计天梯赛-模拟赛
616 0
团体程序设计天梯赛-模拟赛(上)
|
算法
团体程序设计天梯赛-模拟赛(下)
团体程序设计天梯赛-模拟赛(下)
398 0
团体程序设计天梯赛-模拟赛(下)
【“玩物立志”scratch少儿编程】坦克动荡-“穿墙控制”和“子弹反弹”的实现-含完整代码
【“玩物立志”scratch少儿编程】坦克动荡-“穿墙控制”和“子弹反弹”的实现-含完整代码
492 0
【“玩物立志”scratch少儿编程】坦克动荡-“穿墙控制”和“子弹反弹”的实现-含完整代码