弹指间计算机协会 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;
}


目录
相关文章
|
编译器 API 开发工具
游戏编程之十四 游戏使计算机的发展超越了晶体管时代
游戏编程之十四 游戏使计算机的发展超越了晶体管时代
39 0
408王道计算机组成原理强化——输入输出系统大题(I/O)
408王道计算机组成原理强化——输入输出系统大题(I/O)
373 1
408王道计算机组成原理强化——输入输出系统大题(I/O)
|
6月前
|
人工智能 算法 机器人
Scratch3.0——助力新进程序员理解程序(难度案例三、五子棋双人对战-电脑需要AI写不出来)
Scratch3.0——助力新进程序员理解程序(难度案例三、五子棋双人对战-电脑需要AI写不出来)
109 0
【C语言】民间传统游戏——三子棋详细教学
三子棋(介绍) 游戏分为双方对战,双方依次在9宫格棋盘上摆放棋子,率先将自己的三个棋子走成一条线就视为胜利,而对方就算输了,但是三子棋在很多时候会出现和棋的局面。 🌞
|
人工智能 算法 固态存储
这才是模块化电脑该有的样子:一人打造的超迷你计算机,震动了整个极客圈
这才是模块化电脑该有的样子:一人打造的超迷你计算机,震动了整个极客圈
137 0
|
存储 机器学习/深度学习 人工智能
一文总结那些年我们追过的计算机发展史
一文总结那些年我们追过的计算机发展史
243 0
一文总结那些年我们追过的计算机发展史
|
存储 算法 程序员
计算机发展史人物篇之查尔斯巴贝奇
他在24岁时就被选为英国皇家学会会员、卢卡斯讲座数学教授,参与创建了英国天文学会和统计学会,并且还是天文学会金奖获得者;是巴黎伦理科学院、爱尔兰皇家学会和美国科学学院的成员之一。却因为差分机被人嘲笑了一辈子。
1218 0
计算机发展史人物篇之查尔斯巴贝奇
弹指间计算机协会做游戏学编程活动2019:飞机大战
弹指间计算机协会做游戏学编程活动2019:飞机大战
58 0
Pyhton实践项目之(一)五子棋人机对战
Pyhton实践项目之(一)五子棋人机对战
117 0
|
存储 算法 芯片
计算机最魔幻的事情就是它能感知到你的思想(三)
我们之前的文章提到了操作系统的三个抽象,它们分别是进程、地址空间和文件,除此之外,操作系统还要控制所有的 I/O 设备。操作系统必须向设备发送命令,捕捉中断并处理错误。它还应该在设备和操作系统的其余部分之间提供一个简单易用的接口。操作系统如何管理 I/O 是我们接下来的重点。
68 0
计算机最魔幻的事情就是它能感知到你的思想(三)