【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;
}
相关文章
|
3天前
|
算法 C语言 C++
【C语言实战项目】三子棋游戏
【C语言实战项目】三子棋游戏
33 1
|
3天前
|
程序员 C语言
【C语言实战项目】猜数字游戏
【C语言实战项目】猜数字游戏
32 0
【C语言实战项目】猜数字游戏
|
3天前
|
C语言
关于使用C语言编写一个简单的猜数字游戏
关于使用C语言编写一个简单的猜数字游戏
26 0
|
3天前
|
算法 C语言
【C语言】三子棋游戏实现代码
【C语言】三子棋游戏实现代码
【C语言】三子棋游戏实现代码
|
3天前
|
C语言
C语言-------扫雷游戏的代码实现
C语言-------扫雷游戏的代码实现
29 0
|
3天前
|
算法 C语言 C++
【C语言-扫雷游戏全功能详解】
【C语言-扫雷游戏全功能详解】
40 1
|
3天前
|
C语言
C语言之详解数组【附三子棋和扫雷游戏实战】(二)
C语言之详解数组【附三子棋和扫雷游戏实战】(二)
|
3天前
|
C语言
C语言实战演练之游戏框架
C语言实战演练之游戏框架
|
3天前
|
存储 算法 C语言
【C 言专栏】用 C 语言开发游戏的实践
【5月更文挑战第5天】本文探讨了使用C语言开发游戏的实践,包括选择适合的游戏类型(如贪吃蛇、俄罗斯方块),设计游戏框架、图形界面和逻辑,以及音效添加。文章还强调了性能优化、测试调试、跨平台挑战及未来发展趋势。对于热衷于C语言的开发者,这是一次挑战与乐趣并存的探索之旅。
【C 言专栏】用 C 语言开发游戏的实践
|
3天前
|
C语言
以c语言为基础实现的简易扫雷游戏(游戏代码附在文章最后,如有需要请自取)
以c语言为基础实现的简易扫雷游戏(游戏代码附在文章最后,如有需要请自取)
50 1

相关实验场景

更多