实现步骤

  • 第1步---打印一个菜单提示选择是否进入游戏
  • 第2步---创建棋盘
  • 第3步---初始化棋盘
  • 第4步---打印棋盘
  • 第5步---下棋,并判断输赢
  • 第6步---将上述函数做成项目
  • 完整代码

第1步—打印一个菜单提示选择是否进入游戏

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


下面部分可不需要,按个人需求选择
进入游戏则提示游戏开始,并在0.5秒后清空屏幕

void playgame()
{printf("游戏开始!\n");Sleep(500);//待机0.5秒钟system("cls");//清空屏幕
}

演示效果就没有等0.5秒让屏幕清空

第2步—创建棋盘

创建一个3*3的二维数组作为棋盘,这里之所以能用ROW和COL是因为使用了#define定义了ROW和COL为3,后面会贴出具体代码,先继续往下看
放入0使棋盘(数组不完全初始化)全为0(本人习惯赋初值为0)
不知道数组不完全初始化的小伙伴可以百度了解一下

char board[ROW][COL] = { 0 };

第3步—初始化棋盘

创建好棋盘之后可以先不初始化,而是先打印看一下是否全为0,检查棋盘是否创建好了
然后初始化为1再次打印看一下初始化函数是否写错

void voidchequerboard(char board[ROW][COL]) {int i = 0, j = 0;for (i = 0; i < ROW; i++) {for (j = 0; j < COL; j++) {board[i][j] = ' ';//初始化的内容}}
}

第4步—打印棋盘

加入边框,在边框中输出数据,更加形象
如果需要实现的更好可以自行参考easyx库实现

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

演示效果中可以看到有一个3*3的棋盘
下面的提示则是我们接下来要完成的功能

第5步—下棋,并判断输赢

下棋
玩家下则提示玩家输入坐标,并检查坐标是否合法
电脑则是随机下棋,并未封装算法函数,感兴趣的小伙伴可以自己实现一下

void playboard(char board[ROW][COL]) {int x = 0, y = 0;while (1) {printf("玩家走>:\n");printf("请输入坐标>:\n");scanf("%1d%1d", &x, &y);//考虑使用%1d格式化输入if (board[x-1][y-1] == ' ' && x <= ROW && y <= COL&& x> 0 && y > 0) {board[x-1][y-1] = '*';break;}else {printf("坐标非法或已被占用,请重新输入!\n");}}char ret = Iswin(board);//Sleep(500);system("cls");printchequerboard(board);if (ret == 'C') {printf("电脑走>:\n");while (1) {x = rand() % ROW;y = rand() % COL;if (board[x][y] == ' ') {board[x][y] = '#';break;}}Sleep(500);system("cls");printchequerboard(board);ret = Iswin(board);}if (ret == 'C') {playboard(board);}else if (ret == '*') {printf("玩家赢\n");}else if (ret == '#') {printf("电脑赢\n");}else {printf("平局\n");}
}

判断输赢,将所有胜的情况都判断一下,并返回赢家的棋子符号
*表示玩家,#表示电脑,
若是没有出现赢家则判断棋盘是否满了,若没满则返回C表示继续,若满了则返回D表示平局
当然了,具体返回什么符号和用什么符号表示赢家,平局,继续由自己决定,我建议选择有意义的字母比如我表示继续的C就是continue的首字母

char Iswin(char board[ROW][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][1] != ' ')return board[i][1];}for (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];}for (i = 0; i < ROW; i++) {for (j = 0; j < COL; j++) {if (board[i][j] == ' ')return 'C';}}return 'D';
}

演示效果

第6步—将上述函数做成项目

这里有两种选择一种是全部做成一个源文件
另一种是将函数的声明,定义,测试分开形成3个源文件
首先第一种就没必要多说了,直接做成源文件即可,唯一需要注意的就是,如果没有提前声明函数,就需要在调用前定义它即可。
我们来看看第另一种方式,多个源文件方式

可以看到有两个 .c文件和一个 .h文件 .h文件表示头文件可以像库函数一样引用,所以我们将函数的定义和需要用到的库函数头文件放到我们创建的头文件中,这样可以减少库函数的拷贝次数变相减少代码行数(不明白的小伙伴可以百度一下库函数调用的规则),然后在源文件中引用我们创建的头文件即可,我们将测试放在了test源文件中,而函数的定义则是放在了另一个源文件中,这样可以更好的,更直观的从test文件看到你的代码功能,也方便调试时的观察那个函数模块出了问题,下面贴出了完整代码。

完整代码

game.h

#pragma once#include<stdio.h>
#include<stdlib.h>
#include<windows.h>
#include<time.h>
#define ROW 3
#define COL 3//开始游戏
void playgame();
//打印菜单
void menu();
//初始化棋盘
void voidchequerboard(char board[ROW][COL]);
//打印棋盘
void printchequerboard(char board[ROW][COL]);
//开始下棋
void playboard(char board[ROW][COL]);
//判断输赢  返回*表示玩家赢,#表示电脑赢,返回C表示继续,返回D表示平局
char Iswin(char board[ROW][COL]);

test.c

#define _CRT_SECURE_NO_WARNINGS#include"game.h"void game()
{char board[ROW][COL] = { 0 };//设置棋盘playgame(); //提示游戏开始voidchequerboard(board);//初始化棋盘printchequerboard(board);//打印棋盘playboard(board);//开始下棋
}
int main()
{int n = 0;srand((unsigned int) time(NULL)); while (1) {menu();scanf("%d", &n);switch (n) {case 1:game();break;case 0:printf("游戏结束!\n"); return 0;default:printf("输入错误,请重新输入!\n"); break;}}return 0;
}

game.c

#define _CRT_SECURE_NO_WARNINGS#include"game.h"char Iswin(char board[ROW][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][1] != ' ')return board[i][1];}for (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];}for (i = 0; i < ROW; i++) {for (j = 0; j < COL; j++) {if (board[i][j] == ' ')return 'C';}}return 'D';
}
void printchequerboard(char board[ROW][COL]) {int i = 0, j = 0;for (i = 0; i < ROW; i++) {if (i == 0) {for (int k = 0; k < ROW; k++) {printf(" ---");}printf("\n");}for (j = 0; j < COL; j++) {if (j == 0) {printf("|");}printf(" %c ", board[i][j]);printf("|");}if (j == COL) {printf("\n");for (j = 0; j < ROW; j++) {printf(" ---");}if (1) {printf("\n");}}}
}
void playboard(char board[ROW][COL]) {int x = 0, y = 0;while (1) {printf("玩家走>:\n");printf("请输入坐标>:\n");scanf("%1d%1d", &x, &y);//考虑使用%1d格式化输入if (board[x-1][y-1] == ' ' && x <= ROW && y <= COL&& x> 0 && y > 0) {board[x-1][y-1] = '*';break;}else {printf("坐标非法或已被占用,请重新输入!\n");}}char ret = Iswin(board);//Sleep(500);system("cls");printchequerboard(board);if (ret == 'C') {printf("电脑走>:\n");while (1) {x = rand() % ROW;y = rand() % COL;if (board[x][y] == ' ') {board[x][y] = '#';break;}}Sleep(500);system("cls");printchequerboard(board);ret = Iswin(board);}if (ret == 'C') {playboard(board);}else if (ret == '*') {printf("玩家赢\n");}else if (ret == '#') {printf("电脑赢\n");}else {printf("平局\n");}
}
void voidchequerboard(char board[ROW][COL]) {int i = 0, j = 0;for (i = 0; i < ROW; i++) {for (j = 0; j < COL; j++) {board[i][j] = ' ';}}
}
void menu()
{printf("***********************\n");printf("*** 1.play  0.exit  ***\n");printf("***********************\n");
}
void playgame()
{printf("游戏开始!\n");Sleep(500);//待机0.5秒钟system("cls");//清空屏幕
}

由于这是本人的第一篇博客难免有疏漏或说错的地方,如有发现欢迎留言指正,或私信本人。
本篇博客就到此结束了,希望对小伙伴能有所帮助。
咱们下篇博客见。

C语言实现三子棋小游戏---超详细讲解相关推荐

  1. 使用C语言编写三子棋小游戏

    使用C语言编写三子棋小游戏: 首先进行分析: 1.需要将游戏实现分为三个部分:头文件,函数功能实现,游戏组合测试. 2.游戏可以循环进行,不必多次打开,可采用 do...while循环结构. 3.游戏 ...

  2. 趣讲用c语言实现三子棋小游戏

    目录 直接先看看最后运行效果吧 三子棋如何设计的,及其步骤 1,源文件已经头文件的创建 2.创建主函数 3.test函数的创建 4.game函数的创建和运行 5.五个函数的实现 a.init_boar ...

  3. 【牛客刷题】上手用C语言写一个三子棋小游戏超详解哦(电脑优化)

    作者:[南航科院小张 南航科院小张的博客 专栏:从c语言的入门到进阶 学习知识不只是要懂,还要会用:想要找到好的工作,这里给大家介绍一件可以斩获诸多大厂offer的利器–牛客网 点击免费注册和我一起开 ...

  4. C语言实现三子棋小游戏(编程思路以及代码详解)

    目录 前言 一.三子棋游戏的实现逻辑 二.创建菜单并控制游戏开始或游戏结束 三.创建棋盘并且初始化棋盘 四.打印棋盘并验证打印棋盘和初始化棋盘模块的实现 五.玩家下棋 六.电脑下棋 六.输赢判断 七. ...

  5. 用C语言实现三子棋小游戏(C语言菜单创建--设置光标,隐藏光标)

    文章目录 前言 一.菜单设置 二.三子棋游戏 1.各部分代码 2.运行结果 总结 前言 本文主要用C语言实现三子棋(简易版)小游戏,同时介绍C语言中的菜单设置. 一.菜单设置 我们在C语言中设置菜单一 ...

  6. C语言实现三子棋小游戏(源码+教程)

    我猜中了开头,却猜不到这结局.--<大话西游> 目录 1.设计框架 2.设计流程 2.1菜单 2.2初始化棋子 2.3初始化棋盘 2.4玩家输入落子的坐标 2.5电脑随机生成棋子 2.6判 ...

  7. C语言实现猜数字小游戏(详细讲解)

    本篇文章的重点是讲解如何使用C语言实现猜数字这个简单的小游戏 封面就是运行大概样子 首先我们对这个游戏的流程进行一个梳理: 1.显示菜单 2.选择是否开始游戏 3.如果开始游戏自动生成一个范围之间的随 ...

  8. 呆头呆脑的电脑----三子棋小游戏(C语言版)

    目录 1.需求分析 2.程序架构 3.代码实现(分函数呈现) (1)主函数代码实现 分析: 异常处理: (2)菜单函数的实现 分析: (3)游戏函数的实现 分析: (4)棋盘的初始化 分析: (5)棋 ...

  9. 三子棋小游戏(超详细)

    目录 一.实现三子棋游戏的基本逻辑 二.具体的函数实现 1. 菜单函数 2. 棋盘的实现 2.1 棋盘的初始化 2.2 棋盘的打印 3. 玩家下棋 4. 电脑下棋 5.判断棋盘状态 三. 三个文件 3 ...

最新文章

  1. python编程基础是什么-一 python编程基础
  2. matlab randint函数
  3. CDT源代码框架分析改造 线程对象的改造 添加标签 区分断点跟跟踪点
  4. [SDOI2011] 计算器
  5. java 循环do while,Javawhile循环与do…while循环 - Java教程
  6. 函数计算搭建 Serverless Web 应用(二)- 自定义域名
  7. linux定时任务每两天执行,Linux定时任务 crontab每秒执行 实现2种方法
  8. win7 php zend,win7系统打开WZend Studio PHP出错的解决方法
  9. Nanachi发布:基于 React 的多端小程序转译框架
  10. 小程序【笔记002】逻辑层简介
  11. VBA 打开文件对话框
  12. Struts(一)struts2.2概述与MVC模式深度剖析
  13. GridWorld实训总结报告
  14. 百度地图开发 —— 去除百度地图左下角Logo
  15. 台州银行笔试考什么_历年台州银行笔试和面试经验分享
  16. Java--反射机制
  17. 手把手带你用Python完成一个数据分析项目,能写进简历,拿走不谢!(另送15个实战案例)...
  18. iPhone手机小技巧:使用备忘录创建清单
  19. uni-app 实现微信分享
  20. ReentrantLock源码分析

热门文章

  1. 导航组件—Android应用中使用导航图
  2. RFID 冷库仓库管理解决方案
  3. 关于柯尼卡美能达bizhub250出现c2557错误解决方法
  4. 毕业2年转行软件测试获得12K+,不考研月薪过万的梦想实现了
  5. python用for循环画雪花图形_超详细讲解如何五步画出立体彩色雪花
  6. BAT,你好!字幕组,再见!——也许要跟美剧说再见了~
  7. Openlab实验平台实验--Mininet 常用命令
  8. Docker Quickstart Terminal启动报错“Unable to verify the Docker daemon”和步骤“Finalize”出错
  9. Oracle安装 配置 使用 方法总结
  10. linux系统运维实例分享