当前位置: 首页 > news >正文

用c语言实现简易三子棋

本篇适用于C语言初学者。

目录

完整代码: 

分步介绍:

声明:

代码主体部分:

模块功能实现:


完整代码: 

#include<stdio.h>
#include <stdlib.h>
#include <time.h>#define ROW 3
#define COL 3void InitBorad(char borad[ROW][COL], int row, int col);void DisplayBorad(char borad[ROW][COL], int row, int col);void PlayerMove(char borad[ROW][COL], int row, int col);void ComputerMove(char borad[ROW][COL], int row, int col);char IsWin(char borad[ROW][COL], int row, int col);void InitBorad(char borad[ROW][COL], int row, int col)
{int i = 0;for (i = 0; i < row; i++){int j = 0;for (j = 0; j < col; j++){borad[i][j] = ' ';}}
}void DisplayBorad(char borad[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 ", borad[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");}
}void PlayerMove(char borad[ROW][COL], int row, int col)
{int x = 0;int y = 0;while (1){printf("玩家下棋:>");scanf("%d %d", &x, &y);if (x >= 1 && x <= row && y >= 1 && y <= col){if (borad[x - 1][y - 1] == ' '){borad[x - 1][y - 1] = '*';break;}else{printf("该位置已被占有,请重新选择!\n");}}else{printf("输入错误,请重新选择!\n");}}
}void ComputerMove(char borad[ROW][COL], int row, int col)
{printf("电脑下棋:>\n");while (1){int x = rand() % row;int y = rand() % col;if (borad[x][y] == ' '){borad[x][y] = '#';break;}}
}//'*'玩家赢
//'#'电脑赢
//'C'继续游戏
//'Q'平局
//char IsWin(char borad[ROW][COL], int row, int col)
//{
//	int i = 0;
//	for (i = 0; i < row; i++)
//	{
//		if (borad[i][0] == borad[i][1] && borad[i][1] == borad[i][2] && borad[i][0] != ' ')
//			return borad[i][0];
//	}
//	for (i = 0; i < col; i++)
//	{
//		if (borad[0][i] == borad[1][i] && borad[1][i] == borad[2][i] && borad[0][i] != ' ')
//			return borad[0][i];
//	}
//	if (borad[0][0] == borad[1][1] && borad[1][1] == borad[2][2] && borad[0][0] != ' ')
//		return borad[0][0];
//	if (borad[0][2] == borad[1][1] && borad[1][1] == borad[2][0] && borad[0][2] != ' ')
//		return borad[0][2];
//	for (i = 0; i < row; i++)
//	{
//		int j = 0;
//		for (j = 0; j < col; j++)
//		{
//			if (borad[i][j] == ' ')
//				return 'C';
//		}
//	}
//	return 'Q';
//}//判断优化
char IsWin(char borad[ROW][COL], int row, int col)
{int i = 0;int flag = 1;//行for (i = 0; i < row; i++){flag = 1;int n = 0;if (borad[i][0] != ' '){while (n < row - 1){if (borad[i][n] != borad[i][n + 1]){flag = 0;break;}n++;}if (flag)return borad[i][0];}}//列for (i = 0; i < col; i++){flag = 1;int n = 0;if (borad[0][i] != ' '){while (n < col - 1){if (borad[n][i] != borad[n + 1][i]){flag = 0;break;}n++;}if (flag)return borad[0][i];}}//左对角线if (borad[0][0] != ' '){flag = 1;int n = 0;while (n < row - 1){if (borad[n][n] != borad[n + 1][n + 1]){flag = 0;break;}n++;}if (flag)return borad[0][0];}//右对角线int r = 0;int c = col - 1;if (borad[r][c] != ' '){flag = 1;while (r < row - 1){if (borad[r][c] != borad[r + 1][c - 1]){flag = 0;break;}r++;c--;}if (flag)return borad[r][c];}//继续for (i = 0; i < row; i++){int j = 0;for (j = 0; j < col; j++){if (borad[i][j] == ' ')return 'C';}}//平局return 'Q';
}void menu()
{printf("**********************************\n");printf("**********    1.play   ***********\n");printf("**********    0.exit   ***********\n");printf("**********************************\n");
}void game()
{char borad[ROW][COL] = { 0 };char ch = 0;//初始化InitBorad(borad, ROW, COL);//打印棋盘DisplayBorad(borad, ROW, COL);//玩家下棋while (1){//玩家下棋PlayerMove(borad, ROW, COL);DisplayBorad(borad, ROW, COL);//判断ch = IsWin(borad, ROW, COL);if (ch != 'C')break;//电脑下棋ComputerMove(borad, ROW, COL);DisplayBorad(borad, ROW, COL);ch = IsWin(borad, ROW, COL);if (ch != 'C')break;}if (ch == '*')printf("玩家赢!\n");else if (ch == '#')printf("电脑赢!\n");else if (ch == 'Q')printf("平局!\n");
}int main()
{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);return 0;
}

分步介绍:

声明:

#include<stdio.h>
#include <stdlib.h>
#include <time.h>//定义表示符常量分别表示行(ROW)和列(COL)
#define ROW 3
#define COL 3
//初始化棋盘
void InitBorad(char borad[ROW][COL], int row, int col);
//打印棋盘
void DisplayBorad(char borad[ROW][COL], int row, int col);
//玩家移动
void PlayerMove(char borad[ROW][COL], int row, int col);
//电脑移动
void ComputerMove(char borad[ROW][COL], int row, int col);
//判断输赢实现
char IsWin(char borad[ROW][COL], int row, int col);

代码主体部分:

//游戏菜单
void menu()
{printf("**********************************\n");printf("**********    1.play   ***********\n");printf("**********    0.exit   ***********\n");printf("**********************************\n");
}void game()
{//定义一个模拟棋盘的二维数组char borad[ROW][COL] = { 0 };char ch = 0;//调用函数初始化棋盘(二维数组)InitBorad(borad, ROW, COL);//调用函数打印棋盘(二维数组)DisplayBorad(borad, ROW, COL);while (1){//调用函数玩家下棋PlayerMove(borad, ROW, COL);DisplayBorad(borad, ROW, COL);//进行输赢判断ch = IsWin(borad, ROW, COL);//C表示继续游戏                        if (ch != 'C')break;//调用函数电脑下棋ComputerMove(borad, ROW, COL);//进行输赢判断DisplayBorad(borad, ROW, COL);ch = IsWin(borad, ROW, COL);if (ch != 'C')break;}// * 表示玩家赢if (ch == '*')printf("玩家赢!\n");// # 表示电脑赢else if (ch == '#')printf("电脑赢!\n");//Q表示平局else if (ch == 'Q')printf("平局!\n");
}
//主函数(程序入口)
int main()
{//存储选择的变量int input = 0;//使用time()库(time.h)函数和srand()库(stdlib.h)函数确定随机数生成起点,将time()返回值强制转换成无符号整型(unsigned int)。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);return 0;
}

模块功能实现:

//利用嵌套循环实现对棋盘(二维数组)的初始化,初始化为空格
void InitBorad(char borad[ROW][COL], int row, int col)
{int i = 0;for (i = 0; i < row; i++){int j = 0;for (j = 0; j < col; j++){borad[i][j] = ' ';}}
}
//利用嵌套循环实现对棋盘的打印
void DisplayBorad(char borad[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 ", borad[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");}
}
//玩家下棋实现细节
void PlayerMove(char borad[ROW][COL], int row, int col)
{int x = 0;int y = 0;while (1){printf("玩家下棋:>");//输入想要下棋地方的坐标:行从1开始,列从1开始(数组下标从0开始,因此需要对输入数据减1)scanf("%d %d", &x, &y);//对输入信息所对应的坐标进行判断和处理if (x >= 1 && x <= row && y >= 1 && y <= col){if (borad[x - 1][y - 1] == ' '){borad[x - 1][y - 1] = '*';break;}else{printf("该位置已被占有,请重新选择!\n");}}else{printf("输入错误,请重新选择!\n");}}
}
//电脑下棋实现细节
void ComputerMove(char borad[ROW][COL], int row, int col)
{printf("电脑下棋:>\n");while (1){//代码主体部分已通过srand()设置随机数生成起点,此处调用rand()库(stdlib.h)函数生成两个随机数,分别作为二维数组的行下标和列下标int x = rand() % row;int y = rand() % col;//对坐标进行判断和处理if (borad[x][y] == ' '){borad[x][y] = '#';break;}}
}//'*'玩家赢
//'#'电脑赢
//'C'继续游戏
//'Q'平局
//此注释内容为原始判断方法实现内容
//char IsWin(char borad[ROW][COL], int row, int col)
//{
//	int i = 0;
//	for (i = 0; i < row; i++)
//	{
//		if (borad[i][0] == borad[i][1] && borad[i][1] == borad[i][2] && borad[i][0] != ' ')
//			return borad[i][0];
//	}
//	for (i = 0; i < col; i++)
//	{
//		if (borad[0][i] == borad[1][i] && borad[1][i] == borad[2][i] && borad[0][i] != ' ')
//			return borad[0][i];
//	}
//	if (borad[0][0] == borad[1][1] && borad[1][1] == borad[2][2] && borad[0][0] != ' ')
//		return borad[0][0];
//	if (borad[0][2] == borad[1][1] && borad[1][1] == borad[2][0] && borad[0][2] != ' ')
//		return borad[0][2];
//	for (i = 0; i < row; i++)
//	{
//		int j = 0;
//		for (j = 0; j < col; j++)
//		{
//			if (borad[i][j] == ' ')
//				return 'C';
//		}
//	}
//	return 'Q';
//}//判断优化
//'*'玩家赢
//'#'电脑赢
//'C'继续游戏
//'Q'平局
char IsWin(char borad[ROW][COL], int row, int col)
{int i = 0;int flag = 1;//行的判断实现//循环遍历行for (i = 0; i < row; i++){//作为实现判断依据的变量,假设游戏已经结束。flag = 1;//作为遍历一行内容的变量int n = 0;if (borad[i][0] != ' '){while (n < row - 1){if (borad[i][n] != borad[i][n + 1]){//如果本行三个落棋地方不一样,置flag变量为0,表示游戏未结束flag = 0;break;}n++;}//如果游戏结束,返回达成胜利条件坐标所存的字符作为判断玩家or电脑赢的依据if (flag)return borad[i][0];}}//列//具体实现细节同行for (i = 0; i < col; i++){flag = 1;int n = 0;if (borad[0][i] != ' '){while (n < col - 1){if (borad[n][i] != borad[n + 1][i]){flag = 0;break;}n++;}//如果游戏结束,返回达成胜利条件坐标所存的字符作为判断玩家or电脑赢的依据if (flag)return borad[0][i];}}//左对角线//左对角线规律:行加一,列加一。   剩余实现原理同行if (borad[0][0] != ' '){flag = 1;int n = 0;while (n < row - 1){if (borad[n][n] != borad[n + 1][n + 1]){flag = 0;break;}n++;}//如果游戏结束,返回达成胜利条件坐标所存的字符作为判断玩家or电脑赢的依据if (flag)return borad[0][0];}//右对角线//右对角线规律:开始时行为零(数组)列为col - 1,此后行加一,列减一,直至行为数组下标最大值或者列为0。  剩余实现原理同行int r = 0;int c = col - 1;if (borad[r][c] != ' '){flag = 1;while (r < row - 1){if (borad[r][c] != borad[r + 1][c - 1]){flag = 0;break;}r++;c--;}//如果游戏结束,返回达成胜利条件坐标所存的字符作为判断玩家or电脑赢的依据if (flag)return borad[r][c];}//继续//前面判断并未生效,因此说明此时未有赢家诞生,对数组进行遍历,看看是否还有可以落棋的地方来判断是否游戏继续或者平局for (i = 0; i < row; i++){int j = 0;for (j = 0; j < col; j++){//如果有 ' ' 证明有地方可以落棋,返回 'C' 表示游戏继续 if (borad[i][j] == ' ')return 'C';}}//平局//如果上述判断均未生效,且遍历数组发现没有可以落棋的坐标返回'Q'表示平局return 'Q';
}

http://www.lryc.cn/news/360266.html

相关文章:

  • 2024年华为OD机试真题-执行时长-Python-OD统一考试(C卷D卷)
  • 对未知程序所创建的 PDF 文档的折叠书签层级全展开导致丢签的一种解决方法
  • 计算机系统结构之FORK和JOIN
  • Yocto - virtual/kernel介绍
  • 如何在 DigitalOcean 云服务器上创建自定义品牌名称服务器
  • 心链6----开发主页以及后端数据插入(多线程并发)定时任务
  • 【Linux】日志管理
  • AI 绘画爆火背后:扩散模型原理及实现
  • 详解智慧互联网医院系统源码:开发医院小程序教学
  • 【技术实操】银河高级服务器操作系统实例分享,数据库日志文件属主不对问题分析
  • 函数的创建和调用
  • 数模混合芯片设计中的修调技术是什么?
  • MySQL 自定义函数(实验报告)
  • 一次职业院校漏洞挖掘
  • 洪师傅代驾系统开发 支持公众号H5小程序APP 后端Java源码
  • View->Bitmap缩放到自定义ViewGroup的任意区域(Matrix方式绘制Bitmap)
  • Centos 7部署NTP
  • 【前缀和】42. 接雨水
  • 我的名字叫大数据
  • 数据库漫谈-infomix
  • 【Qt】Qt界面美化指南:深入理解QSS样式表的应用与实践
  • 七彩云南文化旅游网站的设计
  • 7-zip安装教程
  • oracle 12c DB卸载流程
  • Docker学习笔记 - 创建自己的image
  • java web爬虫
  • MySQL开发教程和具体应用案例
  • QT C++ 模型视图结构 QTableView 简单例子
  • 2024年3月电子学会Python编程等级考试(四级)真题题库
  • 深入分析 Android BroadcastReceiver (一)