目录

1. 创建test.c文件用以测试三子棋游戏的逻辑

1.1 主函数

1.2 test函数

1.3 menu函数

1.4 game函数

2. 创建game.h头文件进行函数的声明,符号的定义

3. 创建game.c文件实现游戏的运行

3.1 棋盘初始化函数

3.2 棋盘展示函数

3.3 玩家下棋函数

3.4 电脑下棋函数

3.5 判断输赢函数


1. 创建test.c文件用以测试三子棋游戏的逻辑

1.1 主函数

直接写上test函数用以测试

int main()
{test();return 0;
}

1.2 test函数

1.利用do while结构实现重复进入游戏的功能

2.利用menu函数实现游戏菜单的打印

3.利用game函数实现三子棋游戏的运行

void test()
{int input = 0;srand((unsigned int)time(NULL));do{menu();printf("请选择:>");scanf("%d", &input);switch (input){case 1:game();  //游戏break;case 0:printf("退出游戏\n");break;default:printf("选择错误\n");break;}} while (input);
}

1.3 menu函数

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

1.4 game函数

1.建立board数组存放下棋的数据

2.利用InitBoard函数初始化棋盘使其全为空格

3.利用DisplayBoard函数打印棋盘

4.利用while循环,player_move函数、computer_move函数实现玩家与电脑的轮流下棋

5.在玩家或电脑每完成一次下棋后,利用is_win函数返回棋盘状况,若玩家赢则返回 '*',若电脑赢则返回'#',若平局则返回'Q',若棋盘为填满,且未出现赢家,便可继续,返回'C',每次判断后若无法继续便通过break直接退出循环,在循环外判断是玩家还是电脑赢了,亦或者是平局;这样就可以避免在每次下棋后都要进行输赢的判断,避免代码的重复。

void game()
{char ret = 0;// 存放下棋的数据char board[ROW][COL] = { 0 };// 初始化棋盘全为空格InitBoard(board, ROW, COL);// 打印棋盘DisplayBoard(board, ROW, COL);while (1){// 玩家下棋player_move(board, ROW, COL);DisplayBoard(board, ROW, COL);// 判断输赢ret = is_win(board, ROW, COL);if (ret != 'C'){break;}// 电脑下棋computer_move(board, ROW, COL);  //随机下棋DisplayBoard(board, ROW, COL);ret = is_win(board, ROW, COL);if (ret != 'C'){break;}}if (ret == '*'){printf("玩家赢了\n");}else if (ret == '#'){printf("电脑赢了\n");}else{printf("平局\n");}}

2. 创建game.h头文件进行函数的声明,符号的定义

在头文件中定义棋盘的行与列,后期若想修改,在此处修改ROW,COL的值即可

#include <stdio.h>#define ROW 3
#define COL 3// 初始化棋盘
void InitBoard(char board[ROW][COL], int row, int col);// 打印棋盘
void DisplayBoard(char board[ROW][COL], int row, int col);// 玩家下棋
void player_move(char board[ROW][COL], int row, int col);// 电脑下棋
void computer_move(char board[ROW][COL], int row, int col);// 判断输赢
char is_win(char board[ROW][COL], int row, int col);

3. 创建game.c文件实现游戏的运行

3.1 棋盘初始化函数

使数组的九个元素均空格‘ ’

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

3.2 棋盘展示函数

要求:依次打印3×3的数组元素,同时利用"|"与"---"分割数组的列与行;即利用for循环以此打印每个元素的列分割线,然后打印行分割线,同时最后一列与最后一行无需分割。

void DisplayBoard(char board[ROW][COL], int row, int col)
{int i = 0;for (i = 0; i < row; i++){//打印数据int j = 0;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");}}}

3.3 玩家下棋函数

要求:输入坐标的行与列应当在数组范围内,同时坐标未被占用,否则应按提醒重新输入坐标

void player_move(char board[ROW][COL], int row, int col)
{int x = 0;int y = 0;printf("玩家下棋\n");while (1){printf("请输入坐标:>");scanf("%d %d", &x, &y);if (x > 0 && x <= row && y > 0 && y <= col){// 下棋if (board[x - 1][y - 1] == ' '){board[x - 1][y - 1] = '*';break;}else{printf("该坐标已被占用,请重新输入\n");}}else{printf("坐标非法,请重新输入\n");}}
}

3.4 电脑下棋函数

要求:此处只是简单使电脑随机下棋即可,利用rang与srand实现随即功能

#include <stdlib.h>
#include <time.h>void computer_move(char board[ROW][COL], int row, int col)
{int x = 0;int y = 0;printf("电脑下棋:>\n");while (1){x = rand() % row;  //0-2y = rand() % col;  //0-2if (board[x][y] == ' '){board[x][y] = '#';break;}}
}

3.5 判断输赢函数

要求:依次判断各行、各列以及两条对角线,若满足赢的情况,则返回各行、列或者对角线中实际存储的值,避免又要在判断输赢条件后,又要对赢家是玩家或电脑进行判断。平局的情况则是在上述各行、各列以及两条对角线中未能判断出输赢,且棋盘已满的情况,此处可利用if_full函数的返回值判断棋盘是否已满;若经过上述判断后依旧无法返回值,则返回‘C’,游戏继续。

static int if_full(char board[ROW][COL], int row, int col)  // 利用static使该函数在其他源文件无法使用
{int i = 0;for (i = 0; i < row; i++){int j = 0;for (j = 0; j < col; j++){if (board[i][j] == ' '){return 0;  //没满}}}return 1;  // 满了
}char is_win(char board[ROW][COL], int row, int col)
{int i = 0;// 判断行for (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 (i = 0; i < col; i++){if (board[0][i] == board[1][i] && board[1][i] == board[2][i] && board[1][i] != ' '){return board[1][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];}// 判断平局if (if_full(board, row, col) == 1){return 'Q';}// 继续return 'C';  }

利用C语言代码实现三子棋游戏相关推荐

  1. C语言,制作三子棋游戏

    三子棋游戏是一个很好地数组应用实例,在这篇博客中我将分享我在初学C语言时编写三子棋游戏的思路和过程. 1.模块设置 设置一个测试模块test.c和一个函数模块game.c,测试模块放置主函数,函数模块 ...

  2. c语言程序设计中三子棋游戏,C语言实现简易版三子棋游戏

    本文实例为大家共享了C语言实现三子棋游戏的详细代码,供大家参考,详细内容如下 什么是多文件? 多数大型的工程的头文件和源文件非常多,我们也不可能把所有的代码都写在同一个文件里,这样也不方便代码的阅读与 ...

  3. 【C语言/C++】三子棋游戏(数组知识扩充)

    文章目录 1.引言 2.代码规划 3.构思代码 4.代码模块实现 1.游戏界面功能 2.初始化棋盘 3.打印棋盘 4.玩家下棋逻辑 5.简易电脑下棋逻辑 6.判断胜负 7.判断游戏是否平局 1.引言 ...

  4. 利用数组来实现简单三子棋游戏

    实现一个三字棋游戏,通过数组提供位置,由人和电脑轮流进行下棋,由于个人水平,仅能实现电脑随机下棋,并进行判断输赢,可进行循环游戏. 首先创建文本 yuanma.c//游戏实现 game.c//代码编译 ...

  5. 【C语言】简单三子棋游戏/井字棋游戏

    基本实现思路: 写出棋盘界面 通过二维数组来编辑棋子 玩家下棋/电脑下棋(随机) 输赢/平局的判断 在程序中,新建出两个源文件:"test.c" 和 "game.c&qu ...

  6. 初识C语言之三子棋游戏

    提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 三子棋游戏的主要介绍 一.编写逻辑思维 二.游戏的初步实现 1.游戏的相关代码 2.游戏的试运行结果 总结 三子棋游戏的初步 ...

  7. C语言实现三子棋游戏 代码+思路+电脑下棋算法

    C语言实现三子棋游戏 代码+思路+电脑下棋算法 重点: 当检测到电脑已经两子连续时,将会尝试获得胜利. 在检测到玩家即将胜利(连城两子)时,进行拦截 尝试胜利的优先级高于拦截,意味着如果玩家不能再下一 ...

  8. C语言-三子棋游戏的实现

    C语言-三子棋游戏的实现 目录 C语言-三子棋游戏的实现 游戏背景介绍 游戏实现思路 test模块 menu模块 **game模块** init_board(初始化棋盘) print_board(打印 ...

  9. C语言程序设计——三子棋游戏

    三子棋游戏又叫井字棋游戏,是很多人小时候都玩过的一种小游戏,游戏的玩法是两名玩家在三行三列的九个格子子里依次下棋,若一方的棋子有三个在横.竖,斜线三种中的任何一种连成一条线就获得游戏胜利.接下来就让我 ...

最新文章

  1. java做个简单的登录界面_java一个简单的登录界面制作
  2. 读取文件夹下所有的文件
  3. 【Android】 Android中Log调试详解
  4. with 关键字实现递归查询
  5. LiveVideoStack线上分享第五季(八):播放器的极致体验优化
  6. matlab自带四旋翼算例asbQuadcopter使用心得
  7. Ubuntu文本编辑器适合linux平台的其它版本
  8. 啊哈算法-擒贼先擒王(并查集)
  9. RobotLegs框架解析
  10. 如何使用ListView分页
  11. C++程序员必备知识
  12. 「整理了一些让人惊艳的古文情话」
  13. Allure报告的安装及环境变量的配置和在pytest中调用
  14. python3GUI--仿做一个网易云音乐By:PyQt5(附下载地址)
  15. 在Excel中填写空白单元格以完成表格
  16. 4个步骤让你空手套白狼,零投资净赚百万!颠覆传统的商业思维!
  17. 前端和Java后端分别需要学哪些技术?
  18. java-大数据-精品课程目录(超级全)
  19. ArcGIS JS 天地图之深色地图 地图夜间模式
  20. kubernetes搭建dashboard-v1.10.1

热门文章

  1. linux下squashfs使用方法,squashfs 文件系统简介
  2. 特别实用的JAVA小技巧
  3. CocosCreator动画弹窗
  4. 腾讯云运维工程师认证TCA--真题(最新2022.12)
  5. JS实现数据按拼音首字母排序
  6. MySQL Benchmark(全文)
  7. DeepFM: Deep+FM的pytorch实现
  8. linux 查看java进程的端口_linux lsof/netstat查看进程和端口号相关命令:
  9. AI落地步入深水区 , 旷视、依图、云从、商汤该学会赚钱了
  10. 中诚信征信闫文涛:个人征信和企业征信未来将走向融合