简介

五子棋是全国智力运动会竞技项目之一,是一种两人对弈的纯策略型棋类游戏。双方分别使用黑白两色的棋子,下在棋盘直线与横线的交叉点上,先形成五子连珠者获胜。

创作思路

首先我们需要提供一个菜单,让玩家来选择是否开始游戏;打印一个棋盘,让玩家先下棋,生成随机数,让电脑下棋(判断坐标的合法性),判断是否有五个棋子连成一条线,判断平局还是一方胜利。

一.代码实现

首先为了让代码可以修改和看起来更加方便我们将他分为三个部分

test.c

游戏的大体框架

game.h

函数的声明

game.c

整个游戏的实现

二.game.h

#pragma once
#include <stdio.h>
#include<time.h>
#include <stdlib.h>
#pragma warning (disable:4996)
menu();#define ROW 10
#define COL 10//初始化棋盘
void Initboard(char[ROW][COL], int, int);//打印棋盘
void Dispaly(char[ROW][COL], int, int);//玩家下棋
void playmove(char board[ROW][COL], int, int);//电脑下棋
void computermove(char board[ROW][COL], int, int);//判断输赢char is_win(char board[ROW][COL], int, int);

三.test.c

1.打印一个菜单

//菜单
menu()
{printf("*****************************\n");printf("*****      五子棋游戏     ****\n");printf("*****1.开始游戏 0 .退出游戏****\n");printf("*****    请输入你的选择    ****\n");printf("*****************************\n");}

构建一个游戏的框架

通过一个循环来让玩家选择,0退出游戏,1开始游戏,输入错误可以重新输入

int main()
{int input = 0;srand((unsigned int)time(NULL));//生成随机数do {menu();scanf("%d", &input);switch (input){case 0:printf("退出游戏\n");break;case 1:game();break;default:printf("输入有误,请重新输入\n");}} while (input);return 0;
}

四.game.c

game函数的实现

void game()
{char board[ROW][COL] = { 0 };
//初始化棋盘Initboard(board, ROW, COL);//打印棋盘Display(board, ROW, COL);//下棋char ret = '0';while(1){//玩家下棋printf("现在是玩家下棋\n");playmove(board, ROW, COL);Display(board, ROW, COL);//判断输赢ret=is_win(board, ROW, COL);if (ret !=' '){break;}//电脑下棋printf("现在是电脑下棋\n");computermove(board, ROW, COL);Display(board, ROW, COL);ret=is_win(board, ROW, COL);if (ret!=' '){break;}}if (ret == '*'){printf("恭喜你取得胜利\n");}else if (ret == '#'){printf("很遗憾,你输给了电脑\n");}else{printf("平局\n");}}

1.创建一个二维数组,初始化棋盘

将棋盘初始化为空棋盘

void Initboard(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] =' ';}}
}

2.打印棋盘

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

3 .玩家下棋

判断输入的坐标是否合法

void playmove(char board[ROW][COL], int row, int col)
{printf("玩家下棋:>");int x = 0;int y = 0;while (1){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");}}
}

4.电脑下棋

这里我们用时间生成随机数,别忘记了引头文件time.h

 srand((unsigned int)time(NULL));

void computermove(char board[ROW][COL], int row, int col)
{int x = 0;int y = 0;printf("电脑下棋>\n");while (1){x = rand() % ROW;//确保坐标的合法性y = rand() % COL;//确保坐标的合法性if (board[x][y] == ' '){board[x][y] = '#';break;}}
}

5.判断结果

//返回值表述当前游戏状况;
//1.返回*表示玩家获胜
//2.返回#表示电脑获胜
//3.返回' '表示还未分出胜负
//4.返回q表示棋盘满了和棋
char is_win(char board[ROW][COL], int row, int col)
{//1.行连成一条线,赢家产生int i = 0;int j = 0;for ( i = 0; i < ROW; i++){for ( j = 0; j < COL - 4; j++){if (board[i][j] != ' ' &&board[i][j] == board[i][j + 1] &&board[i][j] == board[i][j + 2] &&board[i][j] == board[i][j + 3] &&board[i][j] ==board[i][j + 4]){return board[i][j];}}}//2.列连成一条线,赢家产生for ( j = 0; j < COL; j++) {for ( i = 0; i < COL - 4; i++){if (board[i][j] != ' ' && board[i][j] == board[i + 1][j] &&board[i][j] ==board[i + 2][j] && board[i][j] == board[i + 3][j] && board[i][j] ==board[i + 4][j]){return board[i][j];}}}//3.对角线连成一条线,赢家产生for ( i = 0; i < COL - 4; i++){if (board[i][i] != ' ' &&board[i][i] == board[i + 1][i + 1] &&board[i][i] == board[i + 2][i + 2] &&board[i][i] == board[i + 3][i + 3] &&board[i][i] == board[i + 4][i + 4]){return board[i][i];}if (board[i][i + 4] != ' ' &&board[i][i + 4] == board[i + 1][i + 3] &&board[i][i + 4] == board[i + 2][i + 2] &&board[i][i + 4] == board[i + 3][i + 1] &&board[i][i + 4] == board[i + 4][i]) {return board[i][i + 4];}}//4.判断棋盘是否满了for (i = 0; i < row; i++){for (j = 0; j < col; j++){if (board[i][j] == ' '){return ' ';}}}return 'q';
}

全部代码

test.c

#include "game.h"
int main()
{int input = 0;srand((unsigned int)time(NULL));do {menu();scanf("%d", &input);switch (input){case 0:printf("退出游戏\n");break;case 1:game();break;default:printf("输入有误,请重新输入\n");}} while (input);return 0;
}

game.c

#include "game.h"
//菜单
menu()
{printf("*****************************\n");printf("*****      五子棋游戏     ****\n");printf("*****1.开始游戏 0 .退出游戏****\n");printf("*****    请输入你的选择    ****\n");printf("*****************************\n");}//初始化棋盘
void Initboard(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 Display(char board[ROW][COL], int row, int col)
{int i = 0;int j = 0;for (i = 1; i <=col; i++){printf("  %d ", i);}printf("\n");for (i = 0; i <=row; i++){int k = 0;int x = 0;for (j = 0; j <= col; j++){if (j <col){printf("+---");}if (j == col){printf("+");printf("\n");}}for (k = 0; k <col; k++){if(i<row)printf("| %c ", board[i][k]);if (k + 1 == col&&i<row){printf("|");printf("\n");}}            }
}void playmove(char board[ROW][COL], int row, int col)
{printf("玩家下棋:>");int x = 0;int y = 0;while (1){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");}}
}void computermove(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;}}
}//返回值表述当前游戏状况;
//1.返回*表示玩家获胜
//2.返回#表示电脑获胜
//3.返回' '表示还未分出胜负
//4.返回q表示棋盘满了和棋
char is_win(char board[ROW][COL], int row, int col)
{//1.行连成一条线,赢家产生int i = 0;int j = 0;for ( i = 0; i < ROW; i++){for ( j = 0; j < COL - 4; j++){if (board[i][j] != ' ' &&board[i][j] == board[i][j + 1] &&board[i][j] == board[i][j + 2] &&board[i][j] == board[i][j + 3] &&board[i][j] ==board[i][j + 4]){return board[i][j];}}}//2.列连成一条线,赢家产生for ( j = 0; j < COL; j++) {for ( i = 0; i < COL - 4; i++){if (board[i][j] != ' ' && board[i][j] == board[i + 1][j] &&board[i][j] ==board[i + 2][j] && board[i][j] == board[i + 3][j] && board[i][j] ==board[i + 4][j]){return board[i][j];}}}//3.对角线连成一条线,赢家产生for ( i = 0; i < COL - 4; i++){if (board[i][i] != ' ' &&board[i][i] == board[i + 1][i + 1] &&board[i][i] == board[i + 2][i + 2] &&board[i][i] == board[i + 3][i + 3] &&board[i][i] == board[i + 4][i + 4]){return board[i][i];}if (board[i][i + 4] != ' ' &&board[i][i + 4] == board[i + 1][i + 3] &&board[i][i + 4] == board[i + 2][i + 2] &&board[i][i + 4] == board[i + 3][i + 1] &&board[i][i + 4] == board[i + 4][i]) {return board[i][i + 4];}}//4.判断棋盘是否满了for (i = 0; i < row; i++){for (j = 0; j < col; j++){if (board[i][j] == ' '){return ' ';}}}return 'q';
}void game()
{//初始化棋盘char board[ROW][COL] = { 0 };Initboard(board, ROW, COL);//打印棋盘Display(board, ROW, COL);//下棋char ret = '0';while (1){//玩家下棋printf("现在是玩家下棋\n");playmove(board, ROW, COL);Display(board, ROW, COL);//判断输赢ret = is_win(board, ROW, COL);if (ret != ' '){break;}//电脑下棋printf("现在是电脑下棋\n");computermove(board, ROW, COL);Display(board, ROW, COL);ret = is_win(board, ROW, COL);if (ret != ' '){break;}}if (ret == '*'){printf("恭喜你取得胜利\n");}else if (ret == '#'){printf("很遗憾,你输给了电脑\n");}else{printf("平局\n");}}

以上就是所有内容了,创作不易,请大家多多支持 !

用C实现五子棋对战——超详细教程相关推荐

  1. 手把手从零开始搭建k8s集群超详细教程

    本教程根据B站课程云原生Java架构师的第一课K8s+Docker+KubeSphere+DevOps同步所做笔记教程 k8s集群搭建超详细教程 1. 基本环境搭建 1. 创建私有网络 2. 创建服务 ...

  2. 安装64位Oracle 10g超详细教程

    安装64位Oracle 10g超详细教程 1. 安装准备阶段 1.1 安装Oracle环境 经过上一篇博文的过程,已经完成了对Linux系统的安装,本例使用X-Manager来实现与Linux系统的连 ...

  3. mysql超详细教程_MySQL8.0.23安装超详细教程

    前言 最近在做一个人脸识别的项目,需要用数据库保存学生信息与前段交互. MySQL的优点 1.mysql性能卓越,服务稳定,很少出现异常宕机. 2.mysql开放源代码且无版权制约,自主性及使用成本低 ...

  4. WebRTC VideoEngine超详细教程(三)——集成X264编码和ffmpeg解码

    转自:http://blog.csdn.net/nonmarking/article/details/47958395 本系列目前共三篇文章,后续还会更新 WebRTC VideoEngine超详细教 ...

  5. 二进制安装部署 4 kubernetes集群---超详细教程

    二进制安装部署kubernetes集群---超详细教程 前言:本篇博客是博主踩过无数坑,反复查阅资料,一步步搭建完成后整理的个人心得,分享给大家~~~ 本文所需的安装包,都上传在我的网盘中,需要的可以 ...

  6. 【超详细教程】使用Windows Live Writer 2012和Office Word 2013 发布文章到博客园全面总结...

    [超详细教程]使用Windows Live Writer 2012和Office Word 2013 发布文章到博客园全面总结 原文 http://www.cnblogs.com/liuxianan/ ...

  7. mysql 8.0.22_最新版MySQL 8.0.22下载安装超详细教程(Windows 64位)

    前言 前几天下载安装了最新版的MySQL 8.0.22,遇到了不少问题,参考了一些方法,最终得以解决.今天将自己的安装过程记录下来,希望对各位有所帮助. 一.MySQL 8.0.22官网下载 点击进入 ...

  8. post修改服务器数据源,postgresql安装及配置超详细教程

    1. 安装 根据业务需求选择版本,官网下载 初始化数据库 执行完初始化任务之后,postgresql 会自动创建和生成两个用户和一个数据库: linux 系统用户 postgres:管理数据库的系统用 ...

  9. 微服务Springcloud超详细教程+实战(二)

    微服务Springcloud超详细教程+实战(二) -------------------------------------- 远程调用方式 无论是微服务还是分布式服务(都是SOA,都是面向服务编程 ...

  10. rtl8811au黑苹果10.15_荣耀MagicBook I5黑苹果折腾记(超详细教程与排坑)

    本文主要介绍如何安装Win10 + Mac OS双系统,以及安装过程中可能遇到的一些坑. 本人的机型是:MagicBook I5-8250U MX150独显 8GB+256GB (VLT-W50),更 ...

最新文章

  1. sqlite3.h--dbhelp.h数据库底层文件
  2. (chap3 Http报文内的http信息) HTTP报文格式
  3. 计算机常用的数制及编码
  4. [Codevs] 1081 线段树练习 2 ----“分块!”
  5. SUN:开源在Web2.0时代
  6. 算法学习四:算法性能分析理论基础——函数增长与渐进分析
  7. ios 通知接收两次_苹果健康体系又进一步,iOS 14.3支持有氧适能通知
  8. UnityWebPlayer使用(2) 动态改变src
  9. listary文件查找工具下载及使用
  10. 天梯图excl_处理器2014最全天梯图
  11. 基于springboot的paypal支付demo
  12. 肯德尔相关性分析_肯德尔的Tau机器学习相关性
  13. 小米 秋招 笔试 编程题 句子反转
  14. Flutter 全能型选手GetX —— 简介
  15. 毕业了,异地恋只能分手吗?
  16. 广东智汇盟获颁广州市番禺区慈善会捐赠证书
  17. 【CCTC 2017】来自Mesosphere、美团点评、hyper.sh、凡泰极客、深圳睿云的容器与运维技术实战...
  18. JavaScript怎么获取当前时间的年月日?
  19. 究竟是什么挡住了普通人的逆袭道路
  20. 浮点数与十六进制互相转换

热门文章

  1. 计算机安全超级工具集
  2. C++常见设计模式之工厂模式(简单工厂模式、工厂方法模式、抽象工厂模式)
  3. 温州计算机职称考试成绩查询,职业资格证书可上网查询认证
  4. sis最新ip地址2020入口一_最新天猫双十一2020淘宝双十一红包活动加码揭秘 京东双11玩法攻略_互联网...
  5. 查看Casio PDA 的物理地址 MAC (DT-X7系列)
  6. 关于 联想昭阳 E43A 无线开关设置的 正确解决办法
  7. 小米笔记本pro充电测试软件,小米笔记本 Pro 评测:高端已成,性价比不变
  8. 基于Tensorflow Object Detection API 的哆啦A梦检测
  9. 形态学空间格局分析(MSPA)—ArcGIS结合Guidos软件
  10. 怎么禁止使用计算机的软件,电脑如何禁止程序运行 一键彻底禁止电脑软件运行方法...