返回顶部
首页 > 资讯 > 后端开发 > 其他教程 >C语言三子棋游戏的简单设计
  • 155
分享到

C语言三子棋游戏的简单设计

2024-04-02 19:04:59 155人浏览 安东尼
摘要

本文实例为大家分享了C语言三子棋游戏简单设计的具体代码,供大家参考,具体内容如下 题目思想: 用 3×3 的二维数组表示棋盘 每一个棋子的格子,也就是每个元素表示三种状态:分别是 1

本文实例为大家分享了C语言三子棋游戏简单设计的具体代码,供大家参考,具体内容如下

题目思想:

用 3×3 的二维数组表示棋盘
每一个棋子的格子,也就是每个元素表示三种状态:分别是
1.未落子 ‘ '
2.玩家落子 ‘X'
3.电脑落子 ‘O'
玩家通过输入数字作为落子位置的坐标(输入的行数与输入的列数)

直接上代码解析

1.创建出棋盘


#define _CRT_SECURE_NO_WARNINGS
//利用宏定义行和列
#define MAX_ROW 3
#define MAX_COL 3
#include <stdio.h>
#include <stdlib.h>


//  将初始化行和列的 '0' 变为空格 ' '
void init(char board[MAX_ROW][MAX_COL]) {
 //行初始化,将数组 0-2输出为' '  
 for(int row = 0; row < MAX_ROW; row++) {
  //列初始化
  for (int col = 0; col < MAX_COL; col++) {
   board[row][col] = ' ';
  }
 }
}

//  打印棋盘,定义printBoard,以二维数组的方式进行循环打印
void printBoard(char board[MAX_ROW][MAX_COL]) {
 for (int row = 0; row < MAX_ROW; row++) {
  for (int col = 0; col < MAX_COL; col++) {
   // 打印字符,使用 %c
   printf("%c", board[row][col]);
  }
  //每次打印完一行,进行换行操作,变成3×3的数组形成的棋盘
  printf("\n");
 }
}
int main() {
 //  首先创建棋盘并初始化
 //  这里不要用board[3][3],防止后面 3 与 3 搞混,可以利用宏定义
 char board[MAX_ROW][MAX_COL] = { 0 };
 //  使用 init 函数 初始化二维数组{0}应当变成空格  ' '
 //  此处也可以将 init函数定义中的双重 for 循环直接输入
 //  但将二维数组初始化为 ' ',表示了一个固定功能的逻辑,比较适合用函数定义的方法完成
 init(board);
 //  使用while循环,进行轮流落子
 while (1) {
  //1.先打印棋盘内容
  printBoard(board);
  //2.玩家落子
  //3.电脑落子
  //4.判定胜负
 }

 system("pause");
 return 0;
}

确实打印出来了,但是由于初始化将二维数组中的元素变为了空格 ‘ '
,所以输出结果看不到。

2.修改棋盘,使之打印出的是 3×3 的带有方格的棋盘


void printBoard(char board[MAX_ROW][MAX_COL]) {
 for (int row = 0; row < MAX_ROW; row++) {
  //在打印每一行之前加入横线
  printf("+--+--+--+\n");
  for (int col = 0; col < MAX_COL; col++) {
   // 打印字符,使用 %c
   // 每打印一列,在打印之前加入|
   printf("| %c", board[row][col]);
  }
  //打印之后加入|,形成 3 列。
  printf("|");
  //每次打印完一行,进行换行操作,变成3×3的数组形成的纵线棋盘
  printf("\n");
 }//打印完所有行之后在加入横线,形成横线棋盘
 printf("+--+--+--+\n");
}

3.玩家落子


//  玩家落子
void playerMove(char board[MAX_ROW][MAX_COL]) {
 printf("轮到玩家落子!\n");
 //加入while循环,保证用户输入错误时返回重新输入
 while (1) {
  printf("请输入落子位置的坐标(row col):");
  //添加屏幕输入模块,输入行和列坐标
  int row = 0;
  int col = 0;
  scanf("%d %d", &row, &col);
  //输入完了之后,一定要验证输入的内容,防止输入例如(10,20)超过棋盘坐标
  if (row < 0 || row >= MAX_ROW || col < 0 || col >= MAX_COL) {
   printf("您输入的坐标有误,请重新输入!\n");
   continue;//重新输入,继续循环
  }
  // 当前位置不为 ' ' ,说明有子了,也需要重新输入
  if (board[row][col] != ' ') {
   printf("当前位置有子,无法落子\n");
   continue;
  } 
  //玩家落子为 X ,结束当前循环
  board[row][col] = 'X';
  break;
 }
}

4.电脑落子


// 电脑落子
void computerMove(char board[MAX_ROW][MAX_COL]) {
 printf("轮到电脑落子!\n");
 while (1) {
  //电脑落子时,产生随机位置,用到随机数种子,使随机数范围在棋盘坐标以内
  int row = rand() % MAX_ROW;
  int col = rand() % MAX_COL;
  if (board[row][col] != ' '){
   // 如果行列不是空格,说明有子了,就随机生成随机数
   continue;
  }
  board[row][col] = 'O';
  break;
 }
}

这里使用了清屏操作,让每次输入完后进行一次清屏,具体代码在总体代码里附上

5.判定胜负


//判断和棋的函数
int isFull(char board[MAX_ROW][MAX_COL]) {
 //如果在棋盘中找不到 ' ' ,就说明棋盘满了,只要找到 ' ' 说明没满
 //约定满了返回1,没满返回0
 for (int row = 0; row < MAX_ROW; row++) {
  for (int col = 0; col < MAX_COL; col++) {
   if (board[row][col] == ' ') {
    //没满
    return 0;
   }
  }
 }return 1;
}

// 判定胜负,由于要返回胜负,使用char定义
// 如果是玩家赢返回 X ,电脑赢返回 O,平局返回 P,胜负未分返回 ' '
char checkwinner(char board[MAX_ROW][MAX_COL]) {
 //1.检测所有行
 for (int row = 0; row < MAX_ROW; row++) {
  if (board[row][0] != ' ' &&
   board[row][0] == board[row][1]
   && board[row][0] == board[row][2]) {
   return board[row][0];
  }
 }
 //2.检测所有列
 for (int col = 0; col < MAX_ROW; col++) {
 if (board[0][col] != ' ' &&
  board[0][col] == board[1][col]
  && board[0][col] == board[2][col]) {
  return board[0][col];
 }
}
 //3.检测所有对角线
 if (board[0][0] != ' ' &&
  board[0][0] == board[1][1]
  && board[0][0] == board[2][2]) {
  return board[0][0];
 }
 if (board[2][0] != ' ' &&
  board[2][0] == board[1][1]
  && board[0][0] == board[0][2]) {
  return board[2][0];
 }
 // 判定和棋
 if (isFull(board)) {
  return 'p';
 }return ' ';

}

这个结果中很多人肯定看到了问题,玩家赢的同时还在显示电脑落子,怎么改?

6.注意还有一个问题:

如图,在主函数中先进行玩家落子,后进行电脑落子,在电脑落子之前玩家就赢了。修改程序如下:


int main() {
 //  首先创建棋盘并初始化
 //  这里不要用board[3][3],防止后面 3 与 3 搞混,可以利用宏定义
 char board[MAX_ROW][MAX_COL] = { 0 };
 //  使用 init 函数 初始化二维数组{0}应当变成空格  ' '
 //  此处也可以将 init函数定义中的双重 for 循环直接输入
 //  但将二维数组初始化为 ' ',表示了一个固定功能的逻辑,比较适合用函数定义的方法完成
 init(board);
 char winner = ' ';
 //  使用while循环,进行轮流落子
 while (1) {
  //1.先打印棋盘内容
  printBoard(board);
  //2.玩家落子
  playerMove(board);
  winner = checkwinner(board);
  if (winner != ' ') {
   //胜负已分,结束循环
   break;
  }
  //3.电脑落子
  computerMove(board);
  //4.判定胜负
  winner = checkwinner(board);
  if (winner != ' ') {
   //胜负已分,结束循环
   break; 
  }
 }
 if (winner = 'X') {
  printf("恭喜你,获胜了!\n");
 }
 else if (winner = 'O') {
  printf("很遗憾,你有点菜呀!\n");
 }
 else {
  printf("你和电脑五五开!\n");
 }
 system("pause");
 return 0;
}

全部函数


#define _CRT_SECURE_NO_WARNINGS
//利用宏定义行和列
#define MAX_ROW 3
#define MAX_COL 3
#include <stdio.h>
#include <stdlib.h>
#include <time.h>


//  将初始化行和列的 '0' 变为空格 ' '
void init(char board[MAX_ROW][MAX_COL]) {
 //行初始化,将数组 0-2输出为' '  
 for(int row = 0; row < MAX_ROW; row++) {
  //列初始化
  for (int col = 0; col < MAX_COL; col++) {
   board[row][col] = ' ';
  }
 }
 //设置随机数种子,为电脑落子
 //只要程序启动时,设置一次即可
 srand((unsigned int)time(0));
}

//  打印棋盘,定义printBoard,以二维数组的方式进行循环打印
void printBoard(char board[MAX_ROW][MAX_COL]) {
 //每次打印之前先清屏
 system("cls");
 for (int row = 0; row < MAX_ROW; row++) {
  //在打印每一行之前加入横线
  printf("+--+--+--+\n");
  for (int col = 0; col < MAX_COL; col++) {
   // 打印字符,使用 %c
   // 每打印一列,在打印之前加入|
   printf("| %c", board[row][col]);
  }
  //打印之后加入|,形成 3 列。
  printf("|");
  //每次打印完一行,进行换行操作,变成3×3的数组形成的纵线棋盘
  printf("\n");
 }//打印完所有行之后在加入横线,形成横线棋盘
 printf("+--+--+--+\n");
}

//  玩家落子
void playerMove(char board[MAX_ROW][MAX_COL]) {
 printf("轮到玩家落子!\n");
 //加入while循环,保证用户输入错误时返回重新输入
 while (1) {
  printf("请输入落子位置的坐标(row col):");
  //添加屏幕输入模块,输入行和列坐标
  int row = 0;
  int col = 0;
  scanf("%d %d", &row, &col);
  //输入完了之后,一定要验证输入的内容,防止输入例如(10,20)超过棋盘坐标
  if (row < 0 || row >= MAX_ROW || col < 0 || col >= MAX_COL) {
   printf("您输入的坐标有误,请重新输入!\n");
   continue;//重新输入,继续循环
  }
  // 当前位置不为 ' ' ,说明有子了,也需要重新输入
  if (board[row][col] != ' ') {
   printf("当前位置有子,无法落子\n");
   continue;
  } 
  //玩家落子为 X ,结束当前循环
  board[row][col] = 'X';
  break;
 }
}

// 电脑落子
void computerMove(char board[MAX_ROW][MAX_COL]) {
 printf("轮到电脑落子!\n");
 while (1) {
  //电脑落子时,产生随机位置,用到随机数种子,使随机数范围在棋盘坐标以内
  int row = rand() % MAX_ROW;
  int col = rand() % MAX_COL;
  if (board[row][col] != ' '){
   // 如果行列不是空格,说明有子了,就随机生成随机数
   continue;
  }
  board[row][col] = 'O';
  break;
 }
}


//判断和棋的函数
int isFull(char board[MAX_ROW][MAX_COL]) {
 //如果在棋盘中找不到 ' ' ,就说明棋盘满了,只要找到 ' ' 说明没满
 //约定满了返回1,没满返回0
 for (int row = 0; row < MAX_ROW; row++) {
  for (int col = 0; col < MAX_COL; col++) {
   if (board[row][col] == ' ') {
    //没满
    return 0;
   }
  }
 }return 1;
}

// 判定胜负,由于要返回胜负,使用char定义
// 如果是玩家赢返回 X ,电脑赢返回 O,平局返回 P,胜负未分返回 ' '
char checkwinner(char board[MAX_ROW][MAX_COL]) {
 //1.检测所有行
 for (int row = 0; row < MAX_ROW; row++) {
  if (board[row][0] != ' ' 
   && board[row][0] == board[row][1]
   && board[row][0] == board[row][2]) {
   return board[row][0];
  }
 }
 //2.检测所有列
 for (int col = 0; col < MAX_ROW; col++) {
 if (board[0][col] != ' ' 
  && board[0][col] == board[1][col]
  && board[0][col] == board[2][col]) {
  return board[0][col];
 }
}
 //3.检测所有对角线
 if (board[0][0] != ' ' &&
  board[0][0] == board[1][1]
  && board[0][0] == board[2][2]) {
  return board[0][0];
 }
 if (board[2][0] != ' ' &&
  board[2][0] == board[1][1]
  && board[0][0] == board[0][2]) {
  return board[2][0];
 }
 // 判定和棋
 if (isFull(board)) {
  return 'p';
 }return ' ';

}

int main() {
 //  首先创建棋盘并初始化
 //  这里不要用board[3][3],防止后面 3 与 3 搞混,可以利用宏定义
 char board[MAX_ROW][MAX_COL] = { 0 };
 //  使用 init 函数 初始化二维数组{0}应当变成空格  ' '
 //  此处也可以将 init函数定义中的双重 for 循环直接输入
 //  但将二维数组初始化为 ' ',表示了一个固定功能的逻辑,比较适合用函数定义的方法完成
 init(board);
 char winner = ' ';
 //  使用while循环,进行轮流落子
 while (1) {
  //1.先打印棋盘内容
  printBoard(board);
  //2.玩家落子
  playerMove(board);
  winner = checkwinner(board);
  if (winner != ' ') {
   //胜负已分,结束循环
   break;
  }
  //3.电脑落子
  computerMove(board);
  //4.判定胜负
  winner = checkwinner(board);
  if (winner != ' ') {
   //胜负已分,结束循环
   break; 
  }
 }
 if (winner = 'X') {
  printf("恭喜你,获胜了!\n");
 }
 else if (winner = 'O') {
  printf("很遗憾,你有点菜呀!\n");
 }
 else {
  printf("你和电脑五五开!\n");
 }
 system("pause");
 return 0;
}

结果如下

我们的三子棋棋盘小游戏就算结束啦!

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持编程网。

--结束END--

本文标题: C语言三子棋游戏的简单设计

本文链接: https://lsjlt.com/news/155011.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • C语言三子棋游戏的简单设计
    本文实例为大家分享了C语言三子棋游戏简单设计的具体代码,供大家参考,具体内容如下 题目思想: 用 3×3 的二维数组表示棋盘 每一个棋子的格子,也就是每个元素表示三种状态:分别是 1...
    99+
    2024-04-02
  • C语言设计三子棋小游戏
    三子棋想必大家都不陌生,随便画个井字便可以游戏,如下图 接下来我将介绍如何用C语言实现简易的三字棋游戏 先确定好文件布局 进入程序首先我们要设计一个菜单,如下图 这个用很容易实...
    99+
    2024-04-02
  • C语言简单实现三子棋游戏
    本文实例为大家分享了C语言简单实现三子棋游戏的具体代码,供大家参考,具体内容如下 设计思路 1. 二维数组实现棋盘 2. 设计并打印出棋盘 3. 玩家先手 4. 每一次下棋后判断输赢...
    99+
    2024-04-02
  • C语言实现简单三子棋小游戏
    三子棋介绍 三子棋,民间传统游戏,又叫九宫棋、圈圈叉叉、一条龙等。将正方形对角线连起来,相对两边依次摆上三个双方棋子,只要将自己的三个棋子走成一条线,对方就算输了。如果两个人都掌握了...
    99+
    2024-04-02
  • C语言实现三子棋简单小游戏
    三子棋 ,也叫井字棋,是一款大家都玩过的经典小游戏,也是一个适合初学c语言的小伙伴练练手的小项目。 1.整个棋盘采用二维数组存储,下棋时只要获取到x,y两个方向的坐标访问二维数组中的...
    99+
    2024-04-02
  • C语言代码实现简单三子棋游戏
    三子棋是我们小时候经常玩的游戏,今天就分享一下如何用c语言简单实现三子棋吧 编译软件VS2019 c语言实现三子棋运用到了二维数组的知识,在编写三子棋程序时用到了多文件编译(不是必须...
    99+
    2024-04-02
  • 利用C语言实现简单三子棋游戏
    本文实例为大家分享了C语言实现简单三子棋游戏的具体代码,供大家参考,具体内容如下 创建文件 只要弄清了二维数组的相关知识,我们就可以去实现简单的三子棋。对于初学者可谓是成就感满满~~...
    99+
    2024-04-02
  • C语言如何实现简单的三子棋游戏
    本文小编为大家详细介绍“C语言如何实现简单的三子棋游戏”,内容详细,步骤清晰,细节处理妥当,希望这篇“C语言如何实现简单的三子棋游戏”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。棋盘的实现众所周知,三子棋棋盘其实...
    99+
    2023-06-17
  • C语言怎么实现简单的三子棋游戏
    小编给大家分享一下C语言怎么实现简单的三子棋游戏,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!棋盘的实现众所周知,三子棋棋盘其实是一个就九方格,所以我们首先要定义...
    99+
    2023-06-20
  • C语言实现简单的三子棋游戏源码
    本文实例为大家分享了C语言实现简单的三子棋游戏的具体代码,供大家参考,具体内容如下 1、游戏的整体划分 因为C语言是面向过程的,我将游戏抽象出来玩家下棋,电脑下棋,在判断输赢这一过程...
    99+
    2024-04-02
  • C语言实现简易三子棋游戏
    利用数组来创建一个三子棋小游戏的步骤如下: 1、建立一个可以容纳九个元素的3*3棋盘。并初始化,使所有位置都为三。 2、打印棋盘,使其尽可能美观。 3、玩家通过输入坐标(row,co...
    99+
    2024-04-02
  • 怎么用C语言简单实现三子棋游戏
    本篇内容主要讲解“怎么用C语言简单实现三子棋游戏”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“怎么用C语言简单实现三子棋游戏”吧!本文实例为大家分享了C语言简单实现三子棋游戏的具体代码,供大家参...
    99+
    2023-06-20
  • C语言版三子棋游戏
    很多人从小都玩过三子棋,相信很多人都对这个游戏的实现有所疑问。那么今天我们就用C语言自己来实现一下。 首先 如流程图所示: 说明一下:首先我们以输入1/0,来判断是否进入游戏。当输...
    99+
    2024-04-02
  • C语言版的三子棋游戏
    本文实例为大家分享了C语言版三子棋游戏的具体代码,供大家参考,具体内容如下 一、游戏说明 三子棋相信大家都不陌生,小时候经常在纸上画出九宫格就可以直接和小伙伴一起玩,规则就是谁先在九...
    99+
    2024-04-02
  • C语言实现简单五子棋游戏
    在生活中五子棋是一个十分普遍的一款游戏,今天让我们一起来实现这款游戏。 1.初始化棋盘 char ret; //数据存储在一个二维数组中,玩家下去*,电脑下去#. char ...
    99+
    2024-04-02
  • C语言实现简单的五子棋游戏
    本文实例为大家分享了c语言实现简单五子棋游戏的具体代码,供大家参考,具体内容如下 环境vs2017 一、游戏设计思想 1.该代码设置为 玩家1(*) vs 玩家2(O) 2.选择玩游...
    99+
    2024-04-02
  • C语言实现三子棋游戏简易版
    前言 提示:是黑白棋的一种。三子棋是一种民间传统游戏,又叫九宫棋、圈圈叉叉、一条龙、井字棋等。将正方形对角线连起来,相对两边依次摆上三个双方棋子,只要将自己的三个棋子走成一条线,对方...
    99+
    2024-04-02
  • C语言实现简易的三子棋小游戏
    本文实例为大家分享了C语言实现三子棋小游戏的具体代码,供大家参考,具体内容如下 1.基本流程 1.菜单界面选择开始或者退出游戏。2.创建棋盘并初始化。3.打印棋盘。4.玩家落子并打印...
    99+
    2022-11-13
    C语言 三子棋
  • C语言版三子棋小游戏
    本文实例为大家分享了C语言版三子棋小游戏的具体代码,供大家参考,具体内容如下 ①游戏效果 有一个3*3的棋盘 每次下棋后(电脑和玩家),棋盘会更新数据 会有...
    99+
    2024-04-02
  • C语言实现三子棋游戏
    本文实例为大家分享了C语言实现三子棋游戏的具体代码,供大家参考,具体内容如下 game.h 设置头文件 #define ROW 3 #define COL 3 #include&...
    99+
    2024-04-02
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作