大家好!又见面啦,这次给大家带来的是井字棋小游戏,话不多说,下面我们开始吧!

  1. 先创立头文件"game.h"用于放置游戏需要的函数声明,宏定义,其他头文件,源文件test.c用于实现游戏步骤,源文件game.c用于游戏实现。
  2. 做这些操作是分好类,以便于我们容易设计游戏思路。
  3. 这里先给大家展示部分游戏代码,最后会给大家展示所有代码。

首先是打印游戏菜单,然后进行选择是否游戏,如果我们玩完一把不过瘾还想再玩一把,所以我们创立一个循环来实现。代码如下:

void menu()
{printf("***************************\n");printf("*********1.paly************\n");printf("*********0.exit************\n");printf("***************************\n");
}
void test()
{srand((unsigned int)time(NULL)); //之后讲int input = 0;do{menu(); //打印菜单printf("请选择:>");scanf("%d", &input);switch (input)//判断输入的值{case 1:game(); break; case 0:printf("退出程序\n");break;default:printf("输入错误,请重新输入\n");}} while (input);
}
int main()
{test();return 0;
}

 这里我们选择do-while循环,原因是开始就要进行一次游戏选择。先打印菜单,通过玩家输入的input变量的值进行判断,然后游戏设计在game()函数里面实现。

游戏开始我们先创立井字棋二维数组:

 char board[ROW][COL];
#define ROW 3
#define COL 3

这里定义常数ROW和COL表示3*3的二维数组,也就是井字棋盘,这么做好处是修改这两个常数值就可以修改所有关于这两个常数的信息,后面我会继续提到 

先初始化数组:

 init_board(board, ROW, COL);
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] = ' ';}}
}

这里我们将3*3井字棋数组元素初始化为空格

打印棋盘:

 print_board(board, ROW, COL);
void print_board(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++){//打印每一列元素if (j != col - 1)printf(" %c |", board[i][j]);elseprintf(" %c ", board[i][j]);}printf("\n");//打印每一列轮廓if (i != row - 1){for (j = 0; j < col; j++){if (j != col - 1)printf("---|");elseprintf("---");}printf("\n");}}
}

 之后我们每次打印一次棋盘就调用这个函数就可以了

下面我们进行玩家移动:

     print_board(board, ROW, COL);
void player_move(char board[ROW][COL], int row, int col)
{printf("玩家下棋\n");while (1){printf("请输入坐标;>");int x = 0;int y = 0;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;}elseprintf("坐标被占用,请重新输入\n");}else{printf("坐标非法,请重新输入\n");}}
}
  1. 因为玩家下棋不只是下了一次,所有我们创立while循环,下了一次之后就停止循环。
  2. 玩家输入坐标可能有误,也可能坐标已经被占用,所有我们要判断玩家输入坐标的合法性
  3. 玩家输入坐标和我们棋盘坐标不一样,所有要进行对应,输入一次并赋值一次

注:玩家移动以后要打印一次棋盘显示给玩家看。

电脑移动:

     computer_board(board, ROW, COL);
void computer_board(char board[ROW][COL], int row, int col)
{printf("电脑下棋\n");while (1){int a = rand() % row;int b = rand() % col;if (board[a][b] == ' '){board[a][b] = '#';break;}}
}

这里电脑移动是通过随机数模上对应的行列数产生的坐标进行下棋的,需要调用rand()函数和srand()函数如下

 srand((unsigned int)time(NULL)); //之后讲

这是通过time()函数产生的时间戳是随机的然后被强制类型转换成无符号整型数。

rand()函数和srand()函数需要调用头文件<stdlib.h>,time()函数需要调用头文件<time.h>,记住就可以了

注:电脑移动一次也要打印一次棋盘给玩家看

判断输赢:

假设不平局:

is_win(board, ROW, COL);
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][0]!=' '){return board[i][0];//返回玩家或电脑的棋子}}int j = 0;//判断列for (j = 0; j < col; j++){if (board[0][j] == board[1][j] && board[1][j] == board[2][j] && board[0][j] != ' '){return board[0][j];//返回玩家或电脑的棋子}}//判断对角线for (i = 0; i < row; i++){for (j = 0; j < col; j++){if (board[0][0] == board[1][1] && board[1][1] == board[2][2] && board[0][0] != ' '){return board[0][0];//返回玩家或电脑的棋子}if (board[0][2] == board[1][1] && board[1][1] == board[2][0] && board[0][2] != ' '){return board[0][2];//返回玩家或电脑的棋子}}}

注意:这里函数是有返回值的这里我们返回is_win函数的值 

平局:

 int num = is_full(board, ROW, COL);if (num == 1)return 'Q';elsereturn 'C';

这里我们创建num变量用于接收函数is_full的返回值 ,再通过num的值判断函数is_win函数的返回值

char 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;
}

综上所述判断输赢我们创立一个临时变量ret用于接收is_win函数的返回值

 char ret = 0;

我们来看下面图片ret 的情况: 

 注意我们每次电脑或者玩家下完一次棋后都要进行输赢判定

game()总体框架如下:

void game()
{char board[ROW][COL];//初始化棋盘init_board(board, ROW, COL);print_board(board, ROW, COL);char ret = 0;while (1){//玩家移动player_move(board, ROW, COL);print_board(board, ROW, COL);ret = is_win(board, ROW, COL);if (ret != 'C')break;//电脑移动computer_board(board, ROW, COL);print_board(board, ROW, COL);ret = is_win(board, ROW, COL);if (ret != 'C')break;}if (ret == '*')printf("玩家赢了\n");else if (ret == '#')printf("电脑赢了\n");else if (ret == 'Q');printf("平局\n");
} 

下面我们展示全部代码:

test.c

#define  _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<stdlib.h>
#include<time.h>
#include"game.h"
void game()
{char board[ROW][COL];//初始化棋盘init_board(board, ROW, COL);print_board(board, ROW, COL);char ret = 0;while (1){//玩家移动player_move(board, ROW, COL);print_board(board, ROW, COL);ret = is_win(board, ROW, COL);if (ret != 'C')break;//电脑移动computer_board(board, ROW, COL);print_board(board, ROW, COL);ret = is_win(board, ROW, COL);if (ret != 'C')break;}if (ret == '*')printf("玩家赢了\n");else if (ret == '#')printf("电脑赢了\n");else if (ret == 'Q');printf("平局\n");
}
void menu()
{printf("***************************\n");printf("*********1.paly************\n");printf("*********0.exit************\n");printf("***************************\n");
}
void test()
{srand((unsigned int)time(NULL)); //之后讲int input = 0;do{menu(); //打印菜单printf("请选择:>");scanf("%d", &input);switch (input)//判断输入的值{case 1:game(); break; case 0:printf("退出程序\n");break;default:printf("输入错误,请重新输入\n");}} while (input);
}
int main()
{test();return 0;
}

game.c

#define  _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<stdlib.h>
#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] = ' ';}}
}
void print_board(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++){//打印每一列元素if (j != col - 1)printf(" %c |", board[i][j]);elseprintf(" %c ", board[i][j]);}printf("\n");//打印每一列轮廓if (i != row - 1){for (j = 0; j < col; j++){if (j != col - 1)printf("---|");elseprintf("---");}printf("\n");}}
}
void player_move(char board[ROW][COL], int row, int col)
{printf("玩家下棋\n");while (1){printf("请输入坐标;>");int x = 0;int y = 0;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;}elseprintf("坐标被占用,请重新输入\n");}else{printf("坐标非法,请重新输入\n");}}
}
void computer_board(char board[ROW][COL], int row, int col)
{printf("电脑下棋\n");while (1){int a = rand() % row;int b = rand() % col;if (board[a][b] == ' '){board[a][b] = '#';break;}}
}
char 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 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][0]!=' '){return board[i][0];//返回玩家或电脑的棋子}}int j = 0;//判断列for (j = 0; j < col; j++){if (board[0][j] == board[1][j] && board[1][j] == board[2][j] && board[0][j] != ' '){return board[0][j];//返回玩家或电脑的棋子}}//判断对角线for (i = 0; i < row; i++){for (j = 0; j < col; j++){if (board[0][0] == board[1][1] && board[1][1] == board[2][2] && board[0][0] != ' '){return board[0][0];//返回玩家或电脑的棋子}if (board[0][2] == board[1][1] && board[1][1] == board[2][0] && board[0][2] != ' '){return board[0][2];//返回玩家或电脑的棋子}}}int num = is_full(board, ROW, COL);if (num == 1)return 'Q';elsereturn 'C';}

game.h

#define  _CRT_SECURE_NO_WARNINGS
#define ROW 3
#define COL 3
void init_board(char board[ROW][COL], int row, int col);
void print_board(char board[ROW][COL],int row, int col);
void player_move(char board[ROW][COL], int row, int col);
void computer_board(char board[ROW][COL],int row,int col);
char is_win(char board[ROW][COL],int row,int col);

好啦,今天就分享到这里啦,快来叫上好朋友一起玩吧!欢迎评论区留言,感谢支持!

三子棋游戏--简易版相关推荐

  1. C语言三子棋游戏进阶版详解(包括多子棋)

    目录 一,总体思路介绍 二,具体思路的实现 1.初始化游戏界面 2.初始化棋盘 3.打印棋盘 4.玩家移动 5.电脑移动 6.判断输赢 三,源码展示 game.h game.c test.c 一,总体 ...

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

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

  3. 关于三子棋游戏的简易实现与N子棋胜利判断方法

    关于三子棋游戏的简易实现与N子棋胜利判断方法 要实现三子棋游戏,主要需要实现以下几个要求:> 需要一个棋盘,既然需要一个棋盘,棋盘是在一个平面上的,所以我们需要创建一个二维数组 棋盘的打印 玩家 ...

  4. 趣味益智小游戏 三子棋+五子棋 优化版(可任意选择棋盘大小)

    前言 今天牛牛给大家分享的是c语言实现三子棋和五子棋游戏,初学者可能有些不理解的地方,记得私信提问哦,牛牛会一 一回答的. 目录 前言 一.游戏介绍 二.游戏设计思路 2.1 主函数测试区(test. ...

  5. c语言程序下三子棋,C语言实现三子棋游戏(初级版)

    本文实例为大家分享了C语言实现三子棋游戏的具体代码,供大家参考,具体内容如下 game.h #include #include #include #define ROW 3 #define COL 3 ...

  6. 三子棋游戏(呆呆详解版)

    文章目录 一.问题 二.游戏基本流程 三.代码具体实现步骤 1.菜单界面 2.创建棋盘 3.初始化棋盘 4.打印棋盘 5.玩家下棋 6.电脑下棋 7.判断哪一方获胜 四.完整代码 五.代码运行演示 六 ...

  7. 简易的三子棋游戏(C语言)

    目录: 1.游戏介绍 2.游戏效果 3.源代码 (1)头文件命名为为game.h (2)游戏文件命名为game.c (3)测试文件命名为test.c 1.游戏介绍 三子棋是一种民间传统游戏,又叫九宫棋 ...

  8. 使用c语言实现三子棋游戏

    下面简介如何使用c语言的基础语法实现三子游戏的底层逻辑: 首先是菜单模块 使用switch语句进入游戏模块 前置交互完成,开始进入游戏函数. 第一部分棋盘创建,使用二维数组实现. a.初始化棋盘 为什 ...

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

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

最新文章

  1. CVPR2021 | 实现图像的“无限放大”,超详细局部隐式图像函数(LIIF)解读
  2. 重磅!泰晤士发布重量级学科排名,90所中国大陆高校上榜
  3. 在AI人工智能时代,大学或需要重新定位
  4. Gartner:中国CIO们正将IT预算投向数字化
  5. 第八周项目一-数组作数据成员(2)
  6. android mvp模式例子_关于Android市场这件事,没有饱和的市场只有饱和的思维
  7. [官方教程] [ES4封装教程]1.使用 VMware Player 创建适合封装的虚拟机
  8. GRTN赋能淘系内容业务的演进路线及未来规划
  9. ffplay的快捷键以及选项
  10. 如何把静态成员导出_dll导入导出及local vftable问题
  11. spark开发demo
  12. 直播纠纷处理指引已出台,电商直播严监管来了!
  13. oreilly免费电子书
  14. android MVX杂谈
  15. oracle 数据库不用了,改用SQL,要学SQL了,第一个手工写的存储过程
  16. 网络基础虚拟化VRRP/MSTP冗余技术
  17. android html字体大小,android Html.fromHtml font 标签支持设置字体大小和颜色
  18. 03_泰坦尼克号幸存者分析(下)
  19. centos7 apache 虚拟目录 You don't have permission to access / on this server 解决方法
  20. Cowalkers健步走小程序

热门文章

  1. CRM系统哪种品牌的好?这五款简单好用!
  2. 五一倒计时,最近工作不是很顺心
  3. iOS屏幕旋转,强制横竖屏
  4. 连接JLINK 提示未找到ulink的解决方法
  5. Spring Boot Freemark HTML 生成 PDF、生成水印Logo、docx文件生成PDF,Jar包运行可读取模板文件、字体文件
  6. C语言改变变量指定位置值
  7. 三态门三个状态vhdl_基本逻辑门和三态门实验报告.docx
  8. 【网络设备】switch vlan划分详细步骤
  9. 万能搜索——迷宫C语言
  10. amd python mkl_pip install“无效要求:'numpy1.13.1+mklcp36cp36mwin_amd64'”