【C语言】三子棋游戏

简介: 【C语言】三子棋游戏

C语言实现三子棋(简易版)

首先构建游戏的整体框架,(游戏的逻辑),实现为

  int main() {
    int input = 0;
    do{
        menu();
        printf("请选择> \n");
        scanf("%d", &input);
        switch(input) {
            case 1:
                game();
                break;
            case 0:
                printf("退出游戏\n");
                break;
            default:
                printf("输入错误,请重新输入\n");
                break;
        }
    }while(input);
}

一旦启动程序,就会出现菜单,选择1的时候启动程序,选择0的时候退出游戏,如果选择的数不符合规则,就会让你重新选择.

整体的菜单页面非常简单

void menu() {
    printf("****************************\n");
    printf("***********1.play***********\n");
    printf("***********0.exit***********\n");
    printf("****************************\n");
}

显示的结果为

具体实现就是这个game函数了,我们想到要下棋是不是要有棋盘?所以第一步我们应该打印棋盘,具体打印,我们应该将所有的棋盘都初始化为空格,

void init_board(char board[ROW][COL], int row, int col) {
  for (int i = 0; i < row; i++) {
    for (int j = 0; j < col; j++) {
      board[i][j] = ' ';
    }
  }
}

初始化之后,就是打印棋盘

void display_board(char board[ROW][COL], int row, int col) {
  for (int i = 0; i < row; i++) {
    for (int j = 0; j < col; j++) {
      printf(" %c ", board[i][j]);
      if (j < col - 1) {
        printf("|");
      }
    }
    printf("\n");
    if (i < row - 1) {
      for (int j = 0; j < col; j++) {
        printf("---");
        if (j < col - 1) {
          printf("|");
        }
      }
    }
    printf("\n");
  }
}

棋盘已经有了,就开始下棋了,首先是玩家下棋,我们可以选择一个坐标,让下棋的地方变为*,代表已经下过

void play_move(char board[ROW][COL], int row, int col) {
  int x = 0;
  int y = 0;
  while (1) {
    printf("请输入你要下的坐标> \n");
    scanf("%d %d", &x, &y);
    if (x >= 1 && x <= ROW && y >= 1 && y <= COL) {
      if (board[x - 1][y - 1] == ' ') {
        board[x - 1][y - 1] = '*';
        break;
      }
      else {
        printf("次坐标已被占用,请重新输入\n");
      }
    }
  }
}

玩家下完棋之后,就该电脑下棋了,电脑下棋,由于自己能力有限,只能每次随机生成两个坐标进行下棋。

生成随机数的方法

首先要有一个时间种子

然后就可以随机生成

void computer_move(char board[ROW][COL], int row, int col) {
  printf("电脑下棋> \n");
  while (1) {
    int x = rand() % row;
    int y = rand() % col;
    if (board[x][y] == ' ') {
      board[x][y] = '#';
      break;
    }
  }
}

在这里我们可以想到玩家和电脑下棋这也是一个循环,所以在调用函数的时候使用循环,只有分出胜负或平局的时候才结束循环。

所以我们要设计一个函数判断输赢

char is_win(char board[ROW][COL], int row, int col) {
  for (int i = 0; i < row; i++) {
    if (board[i][0] == board[i][1] && board[i][1] == board[i][2] && board[i][1] != ' ') {
      return board[i][1];
    }
  }
  for (int j = 0; j < col; j++) {
    if (board[0][j] == board[1][j] && board[1][j] == board[2][j] && board[1][j] != ' ') {
      return board[1][j];
    }
  }
  if (board[0][0] == board[1][1] && board[1][1] == board[2][2] && board[1][1] != ' ') {
    return board[1][1];
  }
  if (board[0][2] == board[1][1] && board[1][1] == board[2][0] && board[1][1] != ' ') {
    return board[1][1];
  }
  if (is_full(board, row, col)) {
    return 'Q';
  }
  return 'C';
}

返回*代表玩家赢

返回#代表电脑赢

返回Q代表平局

如果返回C代表游戏继续

最后综合的代码

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#define ROW 3
#define COL 3
void init_board(char board[ROW][COL], int row, int col) {
  for (int i = 0; i < row; i++) {
    for (int j = 0; j < col; j++) {
      board[i][j] = ' ';
    }
  }
}
void display_board(char board[ROW][COL], int row, int col) {
  for (int i = 0; i < row; i++) {
    for (int j = 0; j < col; j++) {
      printf(" %c ", board[i][j]);
      if (j < col - 1) {
        printf("|");
      }
    }
    printf("\n");
    if (i < row - 1) {
      for (int j = 0; j < col; j++) {
        printf("---");
        if (j < col - 1) {
          printf("|");
        }
      }
    }
    printf("\n");
  }
}
void play_move(char board[ROW][COL], int row, int col) {
  int x = 0;
  int y = 0;
  while (1) {
    printf("请输入你要下的坐标> \n");
    scanf("%d %d", &x, &y);
    if (x >= 1 && x <= ROW && y >= 1 && y <= COL) {
      if (board[x - 1][y - 1] == ' ') {
        board[x - 1][y - 1] = '*';
        break;
      }
      else {
        printf("次坐标已被占用,请重新输入\n");
      }
    }
  }
}
void computer_move(char board[ROW][COL], int row, int col) {
  printf("电脑下棋> \n");
  while (1) {
    int x = rand() % row;
    int y = rand() % col;
    if (board[x][y] == ' ') {
      board[x][y] = '#';
      break;
    }
  }
}
int is_full(char board[ROW][COL], int row, int col) {
  for (int i = 0; i < row; i++) {
    for (int j = 0; j < col; j++) {
      if (board[i][j] != ' ') {
        return 0;
      }
    }
  }
  return 1;
}
char is_win(char board[ROW][COL], int row, int col) {
  for (int i = 0; i < row; i++) {
    if (board[i][0] == board[i][1] && board[i][1] == board[i][2] && board[i][1] != ' ') {
      return board[i][1];
    }
  }
  for (int j = 0; j < col; j++) {
    if (board[0][j] == board[1][j] && board[1][j] == board[2][j] && board[1][j] != ' ') {
      return board[1][j];
    }
  }
  if (board[0][0] == board[1][1] && board[1][1] == board[2][2] && board[1][1] != ' ') {
    return board[1][1];
  }
  if (board[0][2] == board[1][1] && board[1][1] == board[2][0] && board[1][1] != ' ') {
    return board[1][1];
  }
  if (is_full(board, row, col)) {
    return 'Q';
  }
  return 'C';
}
void menu() {
  printf("****************************\n");
  printf("***********1.play***********\n");
  printf("***********0.exit***********\n");
  printf("****************************\n");
}
void game() {
  char board[ROW][COL] = { 0 };
  init_board(board, ROW, COL);
  display_board(board, ROW, COL);
  while (1) {
    play_move(board, ROW, COL);
    display_board(board, ROW, COL);
    if (is_win(board, ROW, COL) != 'C') {
      break;
    }
    computer_move(board, ROW, COL);
    display_board(board, ROW, COL);
    if (is_win(board, ROW, COL) != 'C') {
      break;
    }
  }
  if (is_win(board, ROW, COL) == '*') {
    printf("玩家赢\n");
  }
  if (is_win(board, ROW, COL) == '#') {
    printf("电脑赢\n");
  }
  if (is_win(board, ROW, COL) == 'Q') {
    printf("平局\n");
  }
}
int main() {
  int input = 0;
  srand((unsigned int)time(NULL));
  do {
    menu();
    printf("请选择> \n");
    scanf("%d", &input);
    switch (input) {
    case 1:
      game();
      break;
    case 0:
      printf("退出游戏\n");
      break;
    default:
      printf("选择错误,请重新输入\n");
      break;
    }
  } while (input);
  return 0;
}
相关文章
|
2月前
|
C语言
C语言之斗地主游戏
该代码实现了一个简单的斗地主游戏,包括头文件引入、宏定义、颜色枚举、卡牌类、卡牌类型类、卡牌组合类、玩家类、游戏主类以及辅助函数等,涵盖了从牌的生成、分配、玩家操作到游戏流程控制的完整逻辑。
89 8
|
3月前
|
C语言
扫雷游戏(用C语言实现)
扫雷游戏(用C语言实现)
142 0
|
5月前
|
机器学习/深度学习 C语言
九/十:《初学C语言》— 扫雷游戏实现和函数递归基础
【8月更文挑战第5天】本篇文章用C语言采用多文件编写实现了一个基础的扫雷游戏(附源码),并讲解了关于函数递归的基础概念及其相对应的习题练习(附源码)
48 1
九/十:《初学C语言》— 扫雷游戏实现和函数递归基础
|
2月前
|
存储 算法 C语言
用C语言开发游戏的实践过程,包括选择游戏类型、设计游戏框架、实现图形界面、游戏逻辑、调整游戏难度、添加音效音乐、性能优化、测试调试等内容
本文探讨了用C语言开发游戏的实践过程,包括选择游戏类型、设计游戏框架、实现图形界面、游戏逻辑、调整游戏难度、添加音效音乐、性能优化、测试调试等内容,旨在为开发者提供全面的指导和灵感。
53 2
|
6月前
|
存储 C语言 开发者
C语言实战 | Flappy Bird游戏
【7月更文挑战第4天】Flappy Bird是由越南开发者制作的简单却极具挑战性的游戏,玩家需控制小鸟穿越水管障碍。游戏涉及角色初始化、显示和更新。小鸟和水管结构体存储数据,使用变量和数组。初始化小鸟和水管,显示背景、小鸟和水管,更新小鸟位置及碰撞检测。代码示例展示了小鸟和水管的状态管理,当小鸟与管道碰撞或触地时,游戏结束。游戏的成功在于其独特的虐心体验。
88 0
C语言实战 | Flappy Bird游戏
|
2月前
|
C语言 Windows
C语言课设项目之2048游戏源码
C语言课设项目之2048游戏源码,可作为课程设计项目参考,代码有详细的注释,另外编译可运行文件也已经打包,windows电脑双击即可运行效果
43 1
|
3月前
|
编译器 C语言
猜数字游戏实现#C语言
猜数字游戏实现#C语言
109 1
|
3月前
|
存储 C语言
揭秘C语言:泊舟的猜数字游戏
揭秘C语言:泊舟的猜数字游戏
103 2
|
3月前
|
存储 算法 安全
C语言实现扫雷游戏
C语言实现扫雷游戏
|
3月前
|
算法 编译器 C语言
【C语言】实现猜数字游戏(分支语句与循环语句的运用)
【C语言】实现猜数字游戏(分支语句与循环语句的运用)