多文件编程:在编写代码的过程中不可能都把代码都放到一个文件里面,这里把游戏执行的代码和声明功能函数还有功能函数的实现分开编写,这样可以提高代码的可读性,方便修改代码,减少耦合,提高函数的复用性,界面简洁干净。

PS:这里把游戏的功能函数声明放在 game.h里面,把功能函数的实现写到 game.app里面,这里虽然文件名字可以不相同,但是最好相同,这样让人阅读代码的时候一眼就会看出来是一整个模块。

game.h

#pragma once
#define  _CRT_SECURE_NO_WARNINGS 1
#include<iostream>//方便以后改棋盘
#define ROW 3
#define COL 3//初始化棋盘
void init_board(char board[ROW][COL], int row, int col);//打印棋盘
void dispaly_board(char board[ROW][COL],int row,int col);//玩家走
void play_move(char board[ROW][COL], int row, int col, char n);//电脑下棋
void computer_move(char board[ROW][COL], int row, int col, char n);//判断输赢
char IsWin(char board[ROW][COL], int row, int col);

 game.cpp

#include"game.h"void init_board(char board[ROW][COL], int row, int col)
{for (int i = 0; i < ROW;i++) {for (int j = 0; j < COL;j++) {board[i][j] = ' ';}}
}//这种写法用ROW 和 COL 控制,以后想改棋盘大小就不用改动函数了。
void dispaly_board(char board[ROW][COL], int row, int col)
{for (int i = 0; i < ROW; i++) {for (int j = 0; j < COL;j++) {printf(" %c ",board[i][j]);if (j < COL - 1) {printf("|");}}printf("\n");if (i < ROW - 1) { //控制printf("---");打印的行数,最后一行不打印for (int k = 0; k < COL; k++) {if (k < COL - 1) { //控制最后一列的打印printf("---|");}else {printf("---");}}}printf("\n");}
}void play_move(char board[ROW][COL], int row, int col,char n)
{int x = 0,y = 0;printf("玩家下棋:>\n");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] = n;break;}else {printf("已经有棋子,重新输入。\n");}}else {printf("输入错误,重新输入。\n");}}
}void computer_move(char board[ROW][COL],int row,int col,char n)
{int x = 0, y = 0;printf("玩家下棋:>\n");while (1) {x = rand() % row;y = rand() % col;if (board[x][y] == ' ') {board[x][y] = n;break;}}
}int is_full(char board[ROW][COL], int row, int col)
{for (int i = 0; i < row;i++) {for (int j = 0; j < col; j++) {if (board[i][j]==' ') {return 0;}}}return 1;
}char IsWin(char board[ROW][COL], int row, int col)
{//判断行for (int i = 0; i < row;i++) {if (board[i][0]== board[i][1]&& board[i][1]== board[i][2]&& board[i][2]!=' ') {return board[i][2];}}//判断列for (int j = 0; j < col; j++) {if (board[0][j] == board[1][j] && board[1][j] == board[2][j] && board[2][j] != ' ') {return board[2][j];}}//判断对角线if (board[0][0] == board[1][1] && board[1][1] == board[2][2] && board[2][2] != ' ') {return board[2][2];}if (board[0][2] == board[1][1] && board[1][1] == board[2][0] && board[2][0] != ' ') {return board[2][0];}if (is_full(board, row, col)==1) {return 'Q';}return 'C';
}

 三子棋.cpp

#define  _CRT_SECURE_NO_WARNINGS 1
#include<iostream>
#include"game.h"//界面
void menu()
{printf("***************\n");printf("**** 1.play ***\n");printf("**** 2.exit ***\n");printf("***************\n");
}void play()
{char ret = 0;char 棋盘[ROW][COL]={0};init_board(棋盘, ROW, COL); //初始化棋盘dispaly_board(棋盘, ROW, COL); //画出棋盘while (1) {play_move(棋盘, ROW, COL, '*'); //玩家下棋dispaly_board(棋盘, ROW, COL);ret = IsWin(棋盘, ROW, COL);if (ret!='C') {break;}computer_move(棋盘, ROW, COL, '#');//电脑下棋dispaly_board(棋盘, ROW, COL);ret = IsWin(棋盘, ROW, COL);if (ret != 'C') {break;}}if (ret=='*') {printf("玩家赢了。\n");}else if (ret=='#'){printf("电脑赢了。\n");} else{printf("平局。\n");}}void game()
{srand((unsigned int)time(NULL));int select = 0;do{menu();printf("请选择:>\n");scanf("%d",&select);switch (select) {case 1:play();system("pause");system("cls");break;case 2:exit(0);break;default:printf("输入错误\n");}} while (1);
}int main()
{game();return 0;
}

我们这里用二维数组来存三子棋的棋子,就是说相当于用二维数组当做三子棋的棋盘 ,里面存的字符就是棋子。然后每次游玩的时候,相当于在数组中放上字符,当几个方向上的棋子相同了,就是字符都相等了,然后判断输赢。

这里电脑移动取的随机值。
这里要注意,写功能函数的时候不要把棋盘的大小写死,这样以后想改棋盘的时候要修改整个函数,提高了工作量。使用 #define ROW 3 ,以后想改棋盘大小就动这两个的大小就行了。

为什么这里功能函数里面的判断不直接用宏定义的 ROW 和 COL 来做循环的条件判断呢,而是作为一个参数传入,这样不是多此一举吗。这是因为如果以后这个函数被使用到别的项目上以后,宏定义消失了还是要进行函数的修改,使用这种写法,直接把宏当做参数,不用动函数的内部结构。

二维数组的应用:三子棋相关推荐

  1. c语言:三子棋游戏(二维数组的运用)

    三子棋游戏(又称9宫格游戏): 游戏规则: 玩家和电脑随机下子,当一方的三子连成一条线,可以为 横连  纵连  斜连.或者棋盘下满则此时判断为平局,游戏结束 实现程序的思路: 首先我们需要定义游戏菜单 ...

  2. 井字棋 二维数组java_LeetCode 面试题 16.04. 井字游戏 Java

    一看到井字棋游戏最先想到决策树,这个题是直接判断输赢.注意不是9个格子,是N*N个格子.那么第一步应该把一维数组放到二维数组中,否则无法遍历. 遇到X,转换成1.遇到O,转换成-1.否则为0 遍历二维 ...

  3. 二维数组实战项目--------《扫雷游戏》

    接上期介绍的三子棋游戏,今天给大家介绍与其相似的扫雷游戏!(源码在文章末尾) 一  . 游戏开发框架 建立游戏菜单 建立扫雷的棋盘 初始化棋盘 布置雷 排雷(判断是否踩雷) 游戏结束 二 . 游戏开发 ...

  4. 【C语言数组】一、二维数组冒泡排序

    目录 1. 一维数组的创建和初始化 1.1 一维数组的创建 1.2 数组的初始化 1.3 一维数组的使用 1.4 一维数组在内存中的存储 2. 二维数组的创建和初始化 2.1 二维数组的创建 2.2 ...

  5. JAVA描述算法和数据结构(01):稀疏数组和二维数组转换

    一.基本简介 1.基础概念 在矩阵中,若数值为0的元素数目远远多于非0元素的数目,并且非0元素分布没有规律时,则称该矩阵为稀疏矩阵:与之相反,若非0元素数目占大多数时,则称该矩阵为稠密矩阵.定义非零元 ...

  6. java 二维数据结构_JAVA描述算法和数据结构(01):稀疏数组和二维数组转换

    一.基本简介 1.基础概念 在矩阵中,若数值为0的元素数目远远多于非0元素的数目,并且非0元素分布没有规律时,则称该矩阵为稀疏矩阵:与之相反,若非0元素数目占大多数时,则称该矩阵为稠密矩阵.定义非零元 ...

  7. 使用二维数组和函数解决八皇后问题(c++)

    八皇后问题 问题 思路 代码 解释 问题 八皇后问题 八皇后问题(英文:Eight queens),是由国际西洋棋棋手马克斯·贝瑟尔于1848年提出的问题,是回溯算法的典型案例. 问题表述为:在8×8 ...

  8. java使用二维数组和控制台实现五子棋单机版

    这次我们使用二维数组在控制台上实现五子棋的游戏,先看成果图: 思考下这个项目要怎么做,其实很简单:15x15的棋盘,黑子先下,并且只能下在中间.当一个棋子下到棋盘后,以这个棋子为中心向其他方向延伸:上 ...

  9. C语言学习笔记09-数组、字符数组、字符串数组、二维数组(单字符输入输出putchar、getchar,字符串输入输出的scanf、gets、puts)

    C语言数组   数组作用:可以用来保存很多记录(可以看成一种大容器).一些简单游戏也基本由数组实现,如游戏地图(二维数组)等等.   一个数组 划分 多个单元(下标区分) -存放-> 多个同类元 ...

  10. 使用二维数组,实现五子棋功能

    使用二维数组,实现五子棋功能 注意:我们使用的是纯面向过程的思想!!! 我们先来看一下棋盘长什么样 知道了模样,我们还需要知道程序需要哪些功能,根据这些功能写出相应的方法.那既然用到方法,我们需要确定 ...

最新文章

  1. 微信小程序图片上传到服务器再自动替换,微信小程序批量上传图片到服务器,并实现预览,删除功能...
  2. linux进程操作命令,linux常用进程命令
  3. SQL点滴5—产生时间demention,主要是时间转换
  4. 【数学基础】一份非常适合人工智能学习的高等数学基础材料中文版 (国内教材精华)...
  5. 写一个 JavaScript 框架:比 setTimeout 更棒的定时执行
  6. C#微信公众号开发系列教程五(接收事件推送与消息排重)
  7. HDU3183 A Magic Lamp —— 贪心(单调队列优化)/ RMQ / 线段树
  8. .NET core3.1使用cookie进行身份认证
  9. mysql set类型 查询,MYSQL SET字段类型怎么查询
  10. 判断是否包含某个头文件
  11. 基于VM10+Win7安装Mac OSX10.11 El Capitan
  12. python 好用的库_12个超好用的Python库,都帮你们整理好了!
  13. 微信小程序个人服务器搭建
  14. Kylin Error:Cannot start job scheduler due to lack of job lock
  15. 计算机具有理性和逻辑思维吗,我们的理性和逻辑思维能力真的有那么重要吗?...
  16. 深信服设备连接linux,deepin官方论坛-深度科技官网旗下网站
  17. HTML设置网站标题前的logo
  18. [ULK11]信号(三):从信号传递到原程序恢复执行
  19. java流程控制原理与方法_1.从本质上看,计算机控制系统的工作原理可归纳为三个步骤,以下不属这三个步骤的是 ( )。_学小易找答案...
  20. jy-11-AJAX--承租红+成恒

热门文章

  1. 移动开发之微信小程序——资料集合
  2. 英语论文引用中的常用缩写含义
  3. 千里达v1000时速_20速碳纤维山地车千里达V1000评测
  4. 我们的后花园需要如何保护
  5. MATLAB数字图像处理 实验一:图像处理基本操作(平移、放大、缩小、旋转、插值)
  6. java语法正则表达式_详解Java正则表达式语法
  7. 如何判断行业和公司的「钱途」
  8. java模块化实践(基于jdk11)-1
  9. labeltool标注工具使用说明
  10. 机器学习实战(SVM)