IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> C++知识库 -> 用C语言实现三子棋游戏 -> 正文阅读

[C++知识库]用C语言实现三子棋游戏

目录

test.c

1首先要有一个菜单

2接着对玩家做出的不同选择进行实现

3实现游戏函数的各个功能

game.c

初识化棋盘

打印棋盘

玩家下棋

电脑下棋

判断输赢

是否满子

哪一方赢

game.h


实现一个三子棋小游戏

下面是实现步骤:

总共有需要三个文件

第一,test.c

我们要在这个文件里面实现游戏的主体流程

第二,game.c

在这个文件里我们可以实现各个游戏函数的分装

第三,game.h

在这个文件里我们实现的是各个函数的声明

test.c

1首先要有一个菜单

让玩家可以做出选择

2接着对玩家做出的不同选择进行实现

选1就是开始游戏,所以我们进入到game函数里就好了

选0就是退出游戏,

其他选择的话就是选择错误,重新选择

这个我们可以用switch语句来实现

这里我们要先用的是do,while循环,条件里放入我们要输入的数

这样的话如果输入的数为0,即为假,正好会跳出循环,后面接上return 0的话程序就结束了

所以我们先把以上所描述的功能写出来

#include<stdio.h>
#include"game.h"
void menu()
{
 ? ?printf("***********\n");
 ? ?printf("***1play***\n");
 ? ?printf("***0exit***\n");
 ? ?printf("***********\n");
 ? ?
}
?
int main()
{
 ? ?menu();
 ? ?int input = 0;
 ? ?do
 ?  {
 ? ? ? ?printf("请选择\n");
 ? ? ? ?scanf("%d", &input);
 ? ? ? ?switch(input)
 ? ? ?  {
 ? ? ? ? ? ?case 1:
 ? ? ? ? ? ? ? ?game();
 ? ? ? ? ? ? ? ?break;
 ? ? ? ? ? ?case 0:
 ? ? ? ? ? ? ? ?printf("退出游戏\n");
 ? ? ? ? ? ? ? ?break;
 ? ? ? ? ? ?default:
 ? ? ? ? ? ? ? ?printf("选择错误,请重新选择\n");
 ? ? ?  }
 ?  }while(input);
 ? ?
 ? ?return 0;
}

3实现游戏函数的各个功能

我们要做的是三子棋,应该先有一个棋盘

所以我们就可以用二维数组来创建这样一个 3 * 3的棋盘

鉴于以后可能会想要不同行和列的棋盘

所以我们可以定义宏来表示数组的行和列,以后想要修改行数和列数也很方便

创建棋盘之后,我们要将棋盘里的元素进行初始化

接着还要打印出来呈现给玩家

然后就是下棋的过程,因为我们得不断下到一方赢或者棋盘满

所以我们可以用while循环来实现

接着就是

玩家下棋,展示棋盘,判断输赢

电脑下棋,展示棋盘,判断输赢

......

我们可以把以上功能表达出来

void game()
{
 ? ?char board[ROW][COL];//宏的定义放在game.h里面
 ? ?char ret = 0;//我们用ret这个变量去接收判断输赢的函数所返回的值
 ? ?
 ? ?IntBoard(board, ROW, COL);//这些具体的函数都会分装到game.c上面
 ? ?DisplayBoard(board, ROW, COL);
 ? ?//创建和展示棋盘之后,就是不断  下棋,展示,判断的过程了
 ? ?
 ? ?while(1)
 ?  {
 ? ? ? ?PlayerMove(board, ROW, COL);
 ? ? ? ?DisplayBoard(board, ROW, COL);
 ? ? ? ?ret = IsWin(board, ROW, COL);
 ? ? ? ?if(ret != 'C')//也就是指要么一方赢,要么棋盘满,就应该跳出循环,不再继续下棋了
 ? ? ? ? ? ?break;
 ? ? ? ?//这两步的区别就只是第一行而已
 ? ? ? ?ComputerMove(board, ROW, COL);
 ? ? ? ?DisplayBoard(board, ROW, COL);
 ? ? ? ?ret = IsWin(board, ROW, COL);
 ? ? ? ?if(ret != 'C')
 ? ? ? ? ? ?break;
 ?  }
 ? ?
 ? ?if(ret == '*')
 ? ? ? ?printf("玩家赢\n");
 ? ?else if(ret == '#')
 ? ? ? ?printf("电脑赢\n");
 ? ?else
 ? ? ? ?printf("平局\n");
}

game函数放在menu函数后面就好了

game.c

所以我们所需要分装到game.c里的函数有:

初始化棋盘,打印棋盘,玩家下棋,电脑下棋,判断输赢

那么接下来我们就在game.c里实现上述函数的功能

初识化棋盘

我们利用for循环把里面的元素都初始化为空格

#include"game.h"
void IntBoard(char board[ROW][COL], int row, int col)
{
 ? ?int i = 0;
 ? ?int j = 0;
 ? ?for(i = 0; i < row; i++)
 ?  {
 ? ? ? ?for(j = 0; j < col; j++)
 ? ? ?  {
 ? ? ? ? ? ?board[i][j] = ' ';
 ? ? ?  }
 ?  }
}

打印棋盘

这里要特别注意分割行的问题

void DisplayBoard(char board[ROW][COL], int row, int col)
{
 ? ?int i = 0;
 ? ?int j = 0;
 ? ?for(i = 0; i < row; i++)
 ?  {
 ? ? ? ?for(j = 0; j < col; j++)
 ? ? ?  {
 ? ? ? ? ? ?printf(" %c ", board[i][j]);
 ? ? ? ? ? ?if(j < col-1)
 ? ? ? ? ? ? ? ?printf("|");//每一列的每一个元素中间打印 | ? ? ?
 ? ? ?  }
 ? ? ? ?printf("\n");//每列打印完打印分割行
 ? ? ? ?
 ? ? ? ?if(i < row - 1)
 ? ? ?  {
 ? ? ? ? ? ?
 ? ? ? ? ? ?for(j = 0; j < col; j++)
 ? ? ? ? ?  {
 ? ? ? ? ? ? ? ?printf("---");
 ? ? ? ? ? ? ? ?if(j < col - 1)
 ? ? ? ? ? ? ? ? ? ?printf("|");
 ? ? ? ? ?  }
 ? ? ?  }
 ? ? ? ?printf("\n");//棋盘全都打印好之后打印分割行
 ?  }
}

玩家下棋

这里的实现思路是:

  1. 判断输入的位置有无越界

  2. 有则提示,没有则判断有无棋子

  3. 有则提示,没有则将该位置放入元素*

(因为玩家可能要连续输入几次,所以我们要用到while循环)

void PlayerMove(char board[ROW][COL], int row, int col)
{
 ? ?int x;
 ? ?int y;
 ? ?//玩家要输入的行和列
 ? ?
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");
    }
    else
        printf("坐标非法,请重新输入\n");
?
}

电脑下棋

这里的实现思路是:

  1. 生成随机数(这个数值不能越界)

  2. 将该位置放入元素#,这里不需要判断,因为本身就不需要输入

void ComputerMove(char board[ROW][COL], int row, int col)
{
 ? ?int x = 0;
 ? ?int y = 0;
 ? ?srand((unsigned int)time(NULL));
 ? ?printf("电脑走\n");
 ? ?while(1)
 ?  {
 ? ? ? ?x = rand() % row;//生成随机数,这里就需要用到时间戳了,我们还要做test.c里面包含一个<time.h>
 ? ? ? ?y = rand() % col;
 ? ? ? ?if(board[x][y] == ' ')
 ? ? ?  {
 ? ? ? ? ? ?board[x][y] = '#';
 ? ? ? ? ? ?break;
 ? ? ?  }
 ?  }
}

判断输赢

这里还要分为棋盘是否满子和一方赢

是否满子

实现思路:

这个比较简单,我们只要依次查看棋盘,若有一个元素为空格,即为满

然后注意一下返回值就好了

int IsFull(char board[ROW][COL], int row, int col)
{
 ? ?int i = 0;
 ? ?int j = 0;
 ? ?for(i = 0; i < row; i++)
 ?  {
 ? ? ? ?for(j = 0; j < col; j++)
 ? ? ?  {
 ? ? ? ? ? ?if(board[i][j] == ' ')
 ? ? ? ? ? ? ? ?return 0;
 ? ? ?  }
 ?  }
 ? ?return 1;
}

哪一方赢

实现思路:

根据规则,我们要判断是否有三个相同的棋子连成直线

所以,每一行,每一列判断一次,然后对角线再判断两次就好了

使用for循环和if语句来实现

char IsWin(char board[ROW][COL], int row, int col)
{
 ? ?int i = 0;
 ? ?int j = 0;
 ? ?for(i = 0; i < row; i++)//先判断行
 ?  {
 ? ? ? ?if(board[i][0] == board[i][1] && board[i][1] == board[i][2] && board[i][0] != ' ')
 ? ? ? ? ? ?return board[i][0];
 ?  }
 ? ?for(j = 0; j < col; j++)//再判断列
 ?  {
 ? ? ? ?if(board[0][i] == board[1][i] && board[1][i] == board[2][i] && board != ' ')
 ? ? ? ? ? ?return board[0][i];
 ?  }
 ? ?//接着是两次对角线
 ? ?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];
 ? ?//然后我们再这里直接调用IsFull函数,就不用在game函数里调用了,而且返回值都能统一管理
 ? ?if(IsFull(board, row, col))
 ?  {
 ? ? ? ?return 'Q';
 ?  }
 ? ?return 'C';
}

到这里我们的game.c文件的任务就完成了

game.h

然后我们还需要一个game.h文件来对函数进行声明

#define _CRT_SECURE_NO_WARNINGS
#pragma once
#include<stdio.h>
#include<stdlib.h>
#include<time.h>
?
#define ROW 3
#define COL 3
?
?
void IntBoard(char board[ROW][COL], int row, int col);
?
void DisplayBoard(char board[ROW][COL], int row, int col);
?
void PlayerMove(char board[ROW][COL], int row, int col);
?
void ComputerMove(char board[ROW][COL], int row, int col);
?
char IsWin(char board[ROW][COL], int row, int col);
?
int IsFull(char board[ROW][COL], int row, int col);
?

好了,到了这里我们的三子棋小游戏就完成了!快去试试吧!

点关注,不迷路~

  C++知识库 最新文章
【C++】友元、嵌套类、异常、RTTI、类型转换
通讯录的思路与实现(C语言)
C++PrimerPlus 第七章 函数-C++的编程模块(
Problem C: 算法9-9~9-12:平衡二叉树的基本
MSVC C++ UTF-8编程
C++进阶 多态原理
简单string类c++实现
我的年度总结
【C语言】以深厚地基筑伟岸高楼-基础篇(六
c语言常见错误合集
上一篇文章      下一篇文章      查看所有文章
加:2021-08-18 12:31:35  更:2021-08-18 12:31:48 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年12日历 -2024/12/27 6:00:38-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码
数据统计