利用C语言代码实现三子棋游戏
目录
1. 创建test.c文件用以测试三子棋游戏的逻辑
1.1 主函数
1.2 test函数
1.3 menu函数
1.4 game函数
2. 创建game.h头文件进行函数的声明,符号的定义
3. 创建game.c文件实现游戏的运行
3.1 棋盘初始化函数
3.2 棋盘展示函数
3.3 玩家下棋函数
3.4 电脑下棋函数
3.5 判断输赢函数
1. 创建test.c文件用以测试三子棋游戏的逻辑
1.1 主函数
直接写上test函数用以测试
int main()
{test();return 0;
}
1.2 test函数
1.利用do while结构实现重复进入游戏的功能
2.利用menu函数实现游戏菜单的打印
3.利用game函数实现三子棋游戏的运行
void test()
{int input = 0;srand((unsigned int)time(NULL));do{menu();printf("请选择:>");scanf("%d", &input);switch (input){case 1:game(); //游戏break;case 0:printf("退出游戏\n");break;default:printf("选择错误\n");break;}} while (input);
}
1.3 menu函数
void menu()
{printf("****************************\n");printf("********** 1.play **********\n");printf("********** 0.exit **********\n");printf("****************************\n");
}
1.4 game函数
1.建立board数组存放下棋的数据
2.利用InitBoard函数初始化棋盘使其全为空格
3.利用DisplayBoard函数打印棋盘
4.利用while循环,player_move函数、computer_move函数实现玩家与电脑的轮流下棋
5.在玩家或电脑每完成一次下棋后,利用is_win函数返回棋盘状况,若玩家赢则返回 '*',若电脑赢则返回'#',若平局则返回'Q',若棋盘为填满,且未出现赢家,便可继续,返回'C',每次判断后若无法继续便通过break直接退出循环,在循环外判断是玩家还是电脑赢了,亦或者是平局;这样就可以避免在每次下棋后都要进行输赢的判断,避免代码的重复。
void game()
{char ret = 0;// 存放下棋的数据char board[ROW][COL] = { 0 };// 初始化棋盘全为空格InitBoard(board, ROW, COL);// 打印棋盘DisplayBoard(board, ROW, COL);while (1){// 玩家下棋player_move(board, ROW, COL);DisplayBoard(board, ROW, COL);// 判断输赢ret = is_win(board, ROW, COL);if (ret != 'C'){break;}// 电脑下棋computer_move(board, ROW, COL); //随机下棋DisplayBoard(board, ROW, COL);ret = is_win(board, ROW, COL);if (ret != 'C'){break;}}if (ret == '*'){printf("玩家赢了\n");}else if (ret == '#'){printf("电脑赢了\n");}else{printf("平局\n");}}
2. 创建game.h头文件进行函数的声明,符号的定义
在头文件中定义棋盘的行与列,后期若想修改,在此处修改ROW,COL的值即可
#include <stdio.h>#define ROW 3
#define COL 3// 初始化棋盘
void InitBoard(char board[ROW][COL], int row, int col);// 打印棋盘
void DisplayBoard(char board[ROW][COL], int row, int col);// 玩家下棋
void player_move(char board[ROW][COL], int row, int col);// 电脑下棋
void computer_move(char board[ROW][COL], int row, int col);// 判断输赢
char is_win(char board[ROW][COL], int row, int col);
3. 创建game.c文件实现游戏的运行
3.1 棋盘初始化函数
使数组的九个元素均空格‘ ’
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] = ' ';}}
}
3.2 棋盘展示函数
要求:依次打印3×3的数组元素,同时利用"|"与"---"分割数组的列与行;即利用for循环以此打印每个元素的列分割线,然后打印行分割线,同时最后一列与最后一行无需分割。
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]);if(j<col-1)printf("|");}printf("\n");//打印分割的行if (i < row - 1){for (j = 0; j < col; j++){printf("---");if (j < col - 1)printf("|");}printf("\n");}}}
3.3 玩家下棋函数
要求:输入坐标的行与列应当在数组范围内,同时坐标未被占用,否则应按提醒重新输入坐标
void player_move(char board[ROW][COL], int row, int col)
{int x = 0;int y = 0;printf("玩家下棋\n");while (1){printf("请输入坐标:>");scanf("%d %d", &x, &y);if (x > 0 && x <= row && y > 0 && y <= col){// 下棋if (board[x - 1][y - 1] == ' '){board[x - 1][y - 1] = '*';break;}else{printf("该坐标已被占用,请重新输入\n");}}else{printf("坐标非法,请重新输入\n");}}
}
3.4 电脑下棋函数
要求:此处只是简单使电脑随机下棋即可,利用rang与srand实现随即功能
#include <stdlib.h>
#include <time.h>void computer_move(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;}}
}
3.5 判断输赢函数
要求:依次判断各行、各列以及两条对角线,若满足赢的情况,则返回各行、列或者对角线中实际存储的值,避免又要在判断输赢条件后,又要对赢家是玩家或电脑进行判断。平局的情况则是在上述各行、各列以及两条对角线中未能判断出输赢,且棋盘已满的情况,此处可利用if_full函数的返回值判断棋盘是否已满;若经过上述判断后依旧无法返回值,则返回‘C’,游戏继续。
static int if_full(char board[ROW][COL], int row, int col) // 利用static使该函数在其他源文件无法使用
{int i = 0;for (i = 0; i < row; i++){int j = 0;for (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][1] != ' '){return board[i][1];}}// 判断列for (i = 0; i < col; i++){if (board[0][i] == board[1][i] && board[1][i] == board[2][i] && board[1][i] != ' '){return board[1][i];}}// 判断对角线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];}// 判断平局if (if_full(board, row, col) == 1){return 'Q';}// 继续return 'C'; }
利用C语言代码实现三子棋游戏相关推荐
- C语言,制作三子棋游戏
三子棋游戏是一个很好地数组应用实例,在这篇博客中我将分享我在初学C语言时编写三子棋游戏的思路和过程. 1.模块设置 设置一个测试模块test.c和一个函数模块game.c,测试模块放置主函数,函数模块 ...
- c语言程序设计中三子棋游戏,C语言实现简易版三子棋游戏
本文实例为大家共享了C语言实现三子棋游戏的详细代码,供大家参考,详细内容如下 什么是多文件? 多数大型的工程的头文件和源文件非常多,我们也不可能把所有的代码都写在同一个文件里,这样也不方便代码的阅读与 ...
- 【C语言/C++】三子棋游戏(数组知识扩充)
文章目录 1.引言 2.代码规划 3.构思代码 4.代码模块实现 1.游戏界面功能 2.初始化棋盘 3.打印棋盘 4.玩家下棋逻辑 5.简易电脑下棋逻辑 6.判断胜负 7.判断游戏是否平局 1.引言 ...
- 利用数组来实现简单三子棋游戏
实现一个三字棋游戏,通过数组提供位置,由人和电脑轮流进行下棋,由于个人水平,仅能实现电脑随机下棋,并进行判断输赢,可进行循环游戏. 首先创建文本 yuanma.c//游戏实现 game.c//代码编译 ...
- 【C语言】简单三子棋游戏/井字棋游戏
基本实现思路: 写出棋盘界面 通过二维数组来编辑棋子 玩家下棋/电脑下棋(随机) 输赢/平局的判断 在程序中,新建出两个源文件:"test.c" 和 "game.c&qu ...
- 初识C语言之三子棋游戏
提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 三子棋游戏的主要介绍 一.编写逻辑思维 二.游戏的初步实现 1.游戏的相关代码 2.游戏的试运行结果 总结 三子棋游戏的初步 ...
- C语言实现三子棋游戏 代码+思路+电脑下棋算法
C语言实现三子棋游戏 代码+思路+电脑下棋算法 重点: 当检测到电脑已经两子连续时,将会尝试获得胜利. 在检测到玩家即将胜利(连城两子)时,进行拦截 尝试胜利的优先级高于拦截,意味着如果玩家不能再下一 ...
- C语言-三子棋游戏的实现
C语言-三子棋游戏的实现 目录 C语言-三子棋游戏的实现 游戏背景介绍 游戏实现思路 test模块 menu模块 **game模块** init_board(初始化棋盘) print_board(打印 ...
- C语言程序设计——三子棋游戏
三子棋游戏又叫井字棋游戏,是很多人小时候都玩过的一种小游戏,游戏的玩法是两名玩家在三行三列的九个格子子里依次下棋,若一方的棋子有三个在横.竖,斜线三种中的任何一种连成一条线就获得游戏胜利.接下来就让我 ...
最新文章
- java做个简单的登录界面_java一个简单的登录界面制作
- 读取文件夹下所有的文件
- 【Android】 Android中Log调试详解
- with 关键字实现递归查询
- LiveVideoStack线上分享第五季(八):播放器的极致体验优化
- matlab自带四旋翼算例asbQuadcopter使用心得
- Ubuntu文本编辑器适合linux平台的其它版本
- 啊哈算法-擒贼先擒王(并查集)
- RobotLegs框架解析
- 如何使用ListView分页
- C++程序员必备知识
- 「整理了一些让人惊艳的古文情话」
- Allure报告的安装及环境变量的配置和在pytest中调用
- python3GUI--仿做一个网易云音乐By:PyQt5(附下载地址)
- 在Excel中填写空白单元格以完成表格
- 4个步骤让你空手套白狼,零投资净赚百万!颠覆传统的商业思维!
- 前端和Java后端分别需要学哪些技术?
- java-大数据-精品课程目录(超级全)
- ArcGIS JS 天地图之深色地图 地图夜间模式
- kubernetes搭建dashboard-v1.10.1