一共三个文件,观看循序:test.c -> game.h -> game.c

test.c

#include "game.h"
//自己创建的头文件要用""
void menu()
{printf("*****************************\n");printf("******     0. exit     ******\n");printf("******     1. play     ******\n");printf("*****************************\n");}
void game()//这里的game是把用的到的函数全放在这里
{//存储数据用的是二维数组char board[ROW][COL];//row和col是通过头文件#include "game.h"来定义的//char表示这个二维数组board的内容是char类型即字符类型//是创建一个函数来初始化棋盘,就是给二维数组初始化值initboard(board, ROW, COL);//要想把数组初始化,就需要把二维数组传过去,还有它的行数列数//打印棋盘,其实就是打印二维数组的每个元素displayboard(board,ROW,COL);//要想打印数组,也需要把二维数组传过去,还有它的行数列数char ret = 0;//用来接收游戏状态while (1)//因为不可能就下一步棋就完了{//玩家走一步棋playermove(board, ROW, COL);//因为玩家或电脑下棋都是要在二维数组所创建的棋盘上下displayboard(board, ROW, COL);//因为玩家下完了,还有打印输出一下,所以再调一次ret = win(board, ROW, COL);//win函数对游戏的状态进行判断并返回游戏状态if (ret != 'c'){break;//别忘了,这么代码还在一个while的循环中}//玩家下完一步棋就判断一次//电脑走一步棋computermove(board, ROW, COL);displayboard(board, ROW, COL);//判断输赢,但其实这个函数还有判断出四种结果来//因为这个游戏有四个状态,//1.玩家赢,函数返回#//2.电脑赢,函数返回*//3.平局,函数返回q//4.继续游戏,函数返回c//所以函数的类型是char// 所以编代码之前要先分析!!!ret = win(board, ROW, COL);if (ret != 'c'){break;//别忘了,这么代码还在一个while的循环中}//电脑下完一步棋就判断一次}if (ret == '#'){printf("玩家赢\n");}else if (ret == '*'){printf("电脑赢\n");}else if (ret == 'q'){printf("平局\n");}displayboard(board, ROW, COL);//不用每出一种结果就打印一次了,无论啥情况最后打印一次就行}
int main()
{srand((unsigned int)time(NULL));//这个开始值在这个游戏里就用一次就行//“(类型)”叫单目操作符(就是那个“(unsigned int)”),//其作用是:强制类型转换!int input = 0;do{menu();printf("请输入(0/1):");scanf("%d", &input);switch (input)//根据输入的input值进行判断{case 1://当input=1时{  printf("\n三子棋游戏开始:\n");game();break;}case 0:{printf("\n退出游戏\n");break;}default:{printf("\n输入错误,请重新输入\n");break;}}} while (input);//这里while (input)是对input的值进行判断,//要是非零即为真就继续在从do开始循环,要是为0则为假就停止循环return 0;
}

game.h

#pragma once
#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
//把函数的定义都放在头文件#include "game.h"里,
//那么在test.c文件中只有用到了这里的函数,只需要引用这个头文件就好//符号的定义
#define ROW  3//#define的作用就是定义符号的,在这里定义row这个符号
#define COL  3//这个定义后面直接写数字就好,不要加等号也不要加分号//函数的声明
void initboard(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 win(char board[ROW][COL], int row, int col);
//判断是否继续(其实就是判断棋盘是否满了)
int full(char board[ROW][COL], int row, int col);

game.c

//这个文件就是用来存放函数定义程序的
#include "game.h"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] = ' ';//把二维数组board每个元素初始化为空格,//但空格是字符所以用英文单引号。}}
}
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]);//%c是打印字符if (j < col - 1) {printf("|");}}printf("\n");if (i < row-1){int j = 0; for (j = 0; j < col; j++){printf("---");if (j < col - 1){printf("|");}}printf("\n");}}}
void playermove(char board[ROW][COL], int row, int col)
// row是数组board的行数,col是数组board的列数,不是地址。它们都为3
{printf("玩家走棋:\n");int i = 0;int j = 0;while (1){printf("\n请输入坐标(请用空格隔开):");scanf("%d%d", &i, &j);//弄了两个输入地址就要有两个%d//if (i <= row + 1 && j <= col + 1),当i=-1时也满足但i不可以等于-1if(i>=1&&i<=row&&j>=1&&j<=col)// row是数组board的行数,col是数组board的列数,不是地址。它们都为3{//还要进行数组内容的判断来//要是里面已经被下了,咱就不能再下这个坐标了if (board[i - 1][j - 1] == ' ')//因为玩家下的坐标基本就是从一开始的,而数组坐标是从0开始的{board[i - 1][j - 1] = '#';//直接给board[i - 1][j - 1]该地址所表示的数组元素赋值就行。break;}else{printf("\n该坐标已被占用,请重新输入\n");}}else{printf("\n坐标错误请重新输入\n");//输入错误了就要在重新再输入一次,所以又用到了scanf//所以要把scanf放在while循环中}}
}
void computermove(char board[ROW][COL], int row, int col)
{printf("电脑走棋:\n");while (1){int i = rand() % row;int j = rand() % col;if (board[i][j] == ' ')//因为玩家下的坐标基本就是从一开始的,而数组坐标是从0开始的{board[i][j] = '*';//直接赋值就行。break;//下完之后就要跳出来}//因为,电脑下的坐标也可能会被占用,那么就要重新下一次,就用到了while}
}int full(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 '1';//棋盘满了,平均}/*else{return 'p';}*///棋盘没满就放在循环外面}}//这样就把board这个二维数组的所有元素都与空格比较了一遍return '0';
}char win(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][1] != ' '){    //因为刚开始每一行/列都是空格,所以让board[i][1]!=' 'return board[i][1];//如果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];}char ret = full(board,row,col);if (ret == 1){return 'p';//棋盘满了,平局}else{return 'c';//棋盘没满}}

三步棋,跟着bit鹏哥学得相关推荐

  1. 收高德仍无解,阿里还有三步棋

    "行云"之前写了<阿里反腐需要一次遵义会议>,今天这一篇是为老东家出主意.行云口述,峰哥整理 有说法称,阿里收购高德违了法律,没申报之类,貌似商务部已经开始调查. 这多 ...

  2. 让机器人飞入寻常百姓家,优必选这三步棋很关键

    9月27日,机器人明星公司优必选在上海召开年度发布会,发布了便携式智能机器人悟空和全球首个大规模商用的服务机器人操作系统ROSA,同时与上海当代艺术馆达成跨界战略合作,并宣布日本Robi机器人之父高桥 ...

  3. 跟着鹏哥学C语言第一天

    学习C语言,在我心中可能是一件从小就向往的事情吧,相信很多人都有这个梦想,比如自己做出一款游戏,自己开发出属于自己的一款APP,是一件多么有成就的事情.但梦想不能只是说说而已,要付出行动,所以我开始在 ...

  4. 3初识常量变量(跟着鹏哥学C语言)

    初识常量变量 例子: 有些数据不能变:血型,性别,圆周率 有些数据一定可变:工资,年龄,体重 C语言描述: 常量--不能改变的量 变量--能被改变的量 %d-int %f-float %lf-doub ...

  5. 《跟着小吴哥学python》之 09 python中的编译与反编译

    pyc是由py文件经过编译后,生成的一种跨平台的字节码文件: 加载的速度有所提高,而且pyc是由python的虚拟机来执行的. pyc的内容,是跟python的版本相关的,不同版本编译后的pyc文件是 ...

  6. 《跟着小吴哥学python》之 08 python模块

    Python本身就内置了很多非常有用的模块,只要安装完毕,这些模块就可以立刻使用. 在Python中,安装第三方模块,是通过包管理工具pip完成的. 注意:Mac或Linux上有可能并存Python ...

  7. 《跟着小吴哥学python》之 14 Python http请求

    python 模拟get和post请求: get请求: import httplib,json url = "http://192.168.1.162:34343/metrics" ...

  8. 《跟着小吴哥学python》之 12 Python发送邮件

    利用python发送每日邮件,或者警告信息.以下实例就是简单的发送邮件代码: 1.需要申请一个邮箱 2.开启邮箱的smtp的发送服务 #!/usr/bin/env python #coding: ut ...

  9. 《跟着小吴哥学python》之 11 Python执行shell命令

    语法 引用模块包: import os, commands 1. os.system('cat /proc/cpuinfo') 返回执行结果.0或者其它.0为正常,其余为非正常. 2. output ...

  10. 《跟着小吴哥学python》之 13 Python访问mysql数据库

    1.安装mysql-python驱动模块 1.pip install mysql-python 2.如果你使用的默认安装的python也可以使用 yum 安装 MySQL-python yum ins ...

最新文章

  1. Linux系统的基本命令
  2. Windows Azure Storage (4) Windows Azure Storage Service存储服务之Blob Share Access Signature
  3. java中Vector
  4. AGC030D - Inversion Sum
  5. 【牛客 - 551F】CSL 的神奇序列(推公式,猜结论,母函数)
  6. 【ZOJ - 2836 】Number Puzzle (容斥原理)
  7. requests 证书验证
  8. 正则表达式(待补充)
  9. 学习python内一般函数知识
  10. 关于Connection的一个测试
  11. vyos as a firewall
  12. QtChart使用教程
  13. 前端,html,css,js,vue
  14. Spring Cloud Netflix 服务注册与发现 — Eureka 入门案例
  15. mysql千万测试表生成,随机id、username、age、sex、create_time
  16. 用Python自动化办公操作PPT,掌握这些技巧没压力!
  17. 华为轮值CEO徐直军:应对快速变化的世界
  18. java中强制退出jvm的代码
  19. 让你的查询支持中文拼音码模糊查询。
  20. 为了搞清楚类加载,竟然手撸JVM!

热门文章

  1. 计算机屏幕刷新频率,屏幕刷新率多少合适,教您电脑屏幕刷新率多少合适
  2. HTML内核超炫酷北漂鱼引导页源码
  3. ROS入门——解决RLException: Unable to launch [xxx-2]
  4. jib推送到harbor私有仓库并拉取镜像
  5. android 自定义通知铃声设置在哪,安卓手机铃声自定义:短信通知、来电铃声怎么设置?...
  6. Javascript特效:五彩小球
  7. Simon的新中文“百万格子”重磅推出
  8. hiberfil.sys彻底删除,释放C盘空间。
  9. 【BeEF】Ubuntu 20.04安装BeEF
  10. 【读书分享】《解忧杂货店》东野圭吾