c语言井字棋人人,人机版and超详细代码

2024-03-21 17:40

本文主要是介绍c语言井字棋人人,人机版and超详细代码,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

注意 注意 注意 “文章末尾有完整代码”
刚学完c语言,就想试试写个简单的井字棋,看了好多博主的,能看到的写的都不咋样,要vip的咱也看不到。综合许多博主的。也写出了一个不咋样的代码。不过代码很详细的很适合c新手观看。

头文件,定义全局变量

#include <stdlib.h>
#include <windows.h>
#include <time.h>
int QP[3][3];//为2是显示空,0为圆,1为三角形
int user=0;//0的时候圆出,1的时候三角形出
int win_or_lose=2;//2未分出胜负,1时候三角形胜出,0的时候圆胜出,3时候游戏失败

程序中所有函数

void menu();//主菜单
void renren();//人人模式
void renji();//人机模式
void gotoxy(int x,int y);//控制输出位置
void draw();//画出井字棋表格
void usertype();//判断玩家状态
void renjiusertype();
void dngo();//下棋
void renjidngo();
void update();//更新数据,填充棋子
void winlose();//判断输赢

运行过程

主页面
这里插入图片描述
人人模式
在这里插入图片描述人机模式
在这里插入图片描述
这个函数看起来挺不眼熟的,可以上百度看一下详细解释
他可以实现程序运行窗口坐标化,想在那里输出就直接gotoxy(x,y),窗口的光标就直接跳转到(x,y)

void gotoxy(int x,int y)
{COORD pos={x,y};//存储x,y坐标HANDLE hout=GetStdHandle(STD_OUTPUT_HANDLE);//获取标准设备句柄SetConsoleCursorPosition(hout,pos);//将获取到的句柄host,移动到pos}

画出棋盘为什么我画的棋盘比别人好看(狗头),这些符号都是在word里面复制的

void draw()
{gotoxy(46,2);printf("井字棋C语言版");gotoxy(42,5); printf("┏━━━━━━━━━━━━━━━━━━━━━━━┓");gotoxy(42,6); printf("┃       ┃       ┃       ┃");gotoxy(42,7); printf("┃       ┃       ┃       ┃");gotoxy(42,8); printf("┃       ┃       ┃       ┃");gotoxy(42,9); printf("┣━━━━━━━╋━━━━━━━╋━━━━━━━┫");gotoxy(42,10);printf("┃       ┃       ┃       ┃");gotoxy(42,11);printf("┃       ┃       ┃       ┃");gotoxy(42,12);printf("┃       ┃       ┃       ┃");gotoxy(42,13);printf("┣━━━━━━━╋━━━━━━━╋━━━━━━━┫");gotoxy(42,14);printf("┃       ┃       ┃       ┃");gotoxy(42,15);printf("┃       ┃       ┃       ┃");gotoxy(42,16);printf("┃       ┃       ┃       ┃");gotoxy(42,17);printf("┗━━━━━━━━━━━━━━━━━━━━━━━┛");
}

下棋子了,要注意没输入一次,就要清空原来的数据,还有就是下棋子坐标要认真找,用笔算算可能更快

void dngo()
{  int x,y;/*清空坐标*/Loop:gotoxy(72,14);printf("请输入x坐标:   ");gotoxy(72,15);printf("请输入y坐标:   ");/*输入坐标*/gotoxy(72,14);printf("请输入x坐标:");scanf("%d",&x);gotoxy(72,15);printf("请输入y坐标  ");scanf("%d",&y);/*实现用户交换*/if(QP[x-1][y-1]==2)//判断棋盘是否为空{if(user==0)//圆棋下{QP[x-1][y-1]=0;}else//三角形棋下{QP[x-1][y-1]=1;}}else{goto Loop;}update();}
void update()
{int a,b;for(a=0;a<3;a++){for(b=0;b<3;b++){if(QP[a][b]==0){gotoxy(46+b*8,7+a*4);//跳转棋盘位置printf("●");}if(QP[a][b]==1){gotoxy(46+b*8,7+a*4);//跳转棋盘位置printf("▲");}}}
}

实现人人对战,主要就是看win_or_lose=多少, 然后得到输赢就返回主菜单
人机的时候用srand(随机种子)rand(随机函数),简称人工智障

void renren()
{int a,b;for(a=0;a<3;a++){for(b=0;b<3;b++){QP[a][b]=2;}}draw();do{usertype();dngo();/*实现交换*/if(user==0){user=1;}else{user=0;}win_or_lose=2;winlose();}while(win_or_lose==2);if(win_or_lose==0){gotoxy(72,22);printf("game over");gotoxy(72,23);printf("圆棋胜利");gotoxy(72,24);system("pause");system("cls");menu();}if(win_or_lose==1){gotoxy(72,22);printf("game over");gotoxy(72,23);printf("三角形棋胜利");gotoxy(72,24);system("pause");system("cls");menu();}if(win_or_lose==3){gotoxy(72,22);printf("game over");gotoxy(72,23);printf("未分出胜负");gotoxy(72,24);system("pause");system("cls");menu();}
}

判断胜负函数,这个很直白也特别的多,貌似还有一个小小的bug,注意棋盘下满就和局了

void winlose()
{if(QP[0][0]==0 && QP[0][1]==0 && QP[0][2]==0){win_or_lose=0;}else if(QP[0][0]==1 && QP[0][1]==1 && QP[0][2]==1){win_or_lose=0;}//第一行结束if(QP[1][0]==0 && QP[1][1]==0 && QP[1][2]==0){win_or_lose=0;}else if(QP[1][0]==1 && QP[1][1]==1 && QP[1][2]==1){win_or_lose=1;}//第二行结束if(QP[2][0]==0 && QP[2][1]==0 && QP[2][2]==0){win_or_lose=0;}else if(QP[2][0]==1 && QP[2][1]==1 && QP[2][2]==1){win_or_lose=1;}//第三行结束if(QP[0][0]==0 && QP[1][0]==0 && QP[2][0]==0){win_or_lose=0;}else if(QP[0][0]==1 && QP[1][0]==1 && QP[2][0]==1){win_or_lose=1;}//第一列结束if(QP[0][1]==0 && QP[1][1]==0 && QP[2][1]==0){win_or_lose=0;}else if(QP[0][1]==1 && QP[1][1]==1 && QP[2][1]==1){win_or_lose=1;}//第二列结束if(QP[0][2]==0 && QP[1][2]==0 && QP[2][2]==0){win_or_lose=0;}else if(QP[0][2]==1 && QP[1][2]==1 && QP[2][2]==1){win_or_lose=1;}//第三列结束if(QP[0][0]==0 && QP[1][1]==0 && QP[2][2]==0){win_or_lose=0;}else if(QP[0][0]==1 && QP[1][1]==1 && QP[2][2]==1){win_or_lose=1;}//主对角结束if(QP[0][2]==0 && QP[1][1]==0 && QP[2][0]==0){win_or_lose=0;}else if(QP[0][2]==1 && QP[1][1]==1 && QP[2][0]==1){win_or_lose=1;}//负对角结束[1]if(QP[0][0]!=2 && QP[0][1]!=2 && QP[0][2]!=2 && QP[1][2]!=2 && QP[1][2]!=2 && QP[1][0]!=2 && QP[2][0]!=2 && QP[2][1]!=2 && QP[2][2]!=2){win_or_lose=3;}
}

然后然后就是全部的代码了
是不是又想复制粘贴了


#include <stdio.h>
#include <stdlib.h>
#include <windows.h>
#include <time.h>
int QP[3][3];//为2是显示空,0为圆,1为三角形
int user=0;//0的时候圆出,1的时候三角形出
int win_or_lose=2;//2未分出胜负,1时候三角形胜出,0的时候圆胜出,3时候游戏失败
void menu();//主菜单
void renren();//人人模式
void renji();//人机模式
void gotoxy(int x,int y);//控制输出位置
void draw();//画出井字棋表格
void usertype();//判断玩家状态
void renjiusertype();
void dngo();//下棋
void renjidngo();
void update();//更新数据,填充棋子
void winlose();//判断输赢
int main(void)
{menu();}void renren()
{int a,b;for(a=0;a<3;a++){for(b=0;b<3;b++){QP[a][b]=2;}}draw();do{usertype();dngo();/*实现交换*/if(user==0){user=1;}else{user=0;}win_or_lose=2;winlose();}while(win_or_lose==2);if(win_or_lose==0){gotoxy(72,22);printf("game over");gotoxy(72,23);printf("圆棋胜利");gotoxy(72,24);system("pause");system("cls");menu();}if(win_or_lose==1){gotoxy(72,22);printf("game over");gotoxy(72,23);printf("三角形棋胜利");gotoxy(72,24);system("pause");system("cls");menu();}if(win_or_lose==3){gotoxy(72,22);printf("game over");gotoxy(72,23);printf("未分出胜负");gotoxy(72,24);system("pause");system("cls");menu();}
}
void renji()
{int a,b;for(a=0;a<3;a++){for(b=0;b<3;b++){QP[a][b]=2;}}draw();do{renjiusertype();renjidngo();/*实现交换*/if(user==0){user=1;}else{user=0;}win_or_lose=2;winlose();}while(win_or_lose==2);if(win_or_lose==0){gotoxy(72,22);printf("game over");gotoxy(72,23);printf("圆棋胜利");gotoxy(72,24);system("pause");system("cls");menu();}if(win_or_lose==1){gotoxy(72,22);printf("game over");gotoxy(72,23);printf("三角形棋胜利");gotoxy(72,24);system("pause");system("cls");menu();}if(win_or_lose==3){gotoxy(72,22);printf("game over");gotoxy(72,23);printf("未分出胜负");gotoxy(72,24);system("pause");system("cls");menu();}}
void menu()
{int input;gotoxy(30,10);printf("************************************************");gotoxy(30,11);printf("*****************1.人人模式*********************");gotoxy(30,12);printf("*****************2.人机模式*********************");gotoxy(30,13);printf("*****************3.退出游戏*********************");gotoxy(30,14);printf("************************************************\n");gotoxy(30,15);printf("请输入你的选择:  ");scanf("%d",&input);switch(input){case 1:system("cls");renren();break;case 2:system("cls");renji();break;case 0:return 0;}}
void gotoxy(int x,int y)
{COORD pos={x,y};//存储x,y坐标HANDLE hout=GetStdHandle(STD_OUTPUT_HANDLE);//获取标准设备句柄SetConsoleCursorPosition(hout,pos);//将获取到的句柄host,移动到pos}
void draw()
{gotoxy(46,2);printf("井字棋C语言版");gotoxy(42,5); printf("┏━━━━━━━━━━━━━━━━━━━━━━━┓");gotoxy(42,6); printf("┃       ┃       ┃       ┃");gotoxy(42,7); printf("┃       ┃       ┃       ┃");gotoxy(42,8); printf("┃       ┃       ┃       ┃");gotoxy(42,9); printf("┣━━━━━━━╋━━━━━━━╋━━━━━━━┫");gotoxy(42,10);printf("┃       ┃       ┃       ┃");gotoxy(42,11);printf("┃       ┃       ┃       ┃");gotoxy(42,12);printf("┃       ┃       ┃       ┃");gotoxy(42,13);printf("┣━━━━━━━╋━━━━━━━╋━━━━━━━┫");gotoxy(42,14);printf("┃       ┃       ┃       ┃");gotoxy(42,15);printf("┃       ┃       ┃       ┃");gotoxy(42,16);printf("┃       ┃       ┃       ┃");gotoxy(42,17);printf("┗━━━━━━━━━━━━━━━━━━━━━━━┛");
}
void usertype()
{if(user==0){gotoxy(72,12);printf("           ");//跳转到printf("当前棋子:▲"),用空白把他覆盖gotoxy(72,10);printf("当前棋子:●");}else if(user==1){gotoxy(72,10);printf("            ");gotoxy(72,12);printf("当前棋子:▲");}
}
void renjiusertype()
{if(user==0){gotoxy(72,12);printf("                 ");//跳转到printf("当前棋子:▲"),用空白把他覆盖gotoxy(72,10);printf("到你出棋了:●");}else if(user==1){gotoxy(72,10);printf("                  ");gotoxy(72,12);printf("电脑棋子:▲");}
}
void dngo()
{  int x,y;/*清空坐标*/Loop:gotoxy(72,14);printf("请输入x坐标:   ");gotoxy(72,15);printf("请输入y坐标:   ");/*输入坐标*/gotoxy(72,14);printf("请输入x坐标:");scanf("%d",&x);gotoxy(72,15);printf("请输入y坐标  ");scanf("%d",&y);/*实现用户交换*/if(QP[x-1][y-1]==2)//判断棋盘是否为空{if(user==0)//圆棋下{QP[x-1][y-1]=0;}else//三角形棋下{QP[x-1][y-1]=1;}}else{goto Loop;}update();}
void renjidngo()
{    int x,y;/*实现用户交换*/if(user==0)//圆棋人下{/*清空坐标*/
Loop:gotoxy(72,14);printf("请输入x坐标:   ");gotoxy(72,15);printf("请输入y坐标:   ");/*输入坐标*/gotoxy(72,14);printf("请输入x坐标:");scanf("%d",&x);gotoxy(72,15);printf("请输入y坐标  ");scanf("%d",&y);if(QP[x-1][y-1]==2){QP[x-1][y-1]=0;}else{goto Loop;}}else//三角型机器下{srand(time(NULL));
Noop:x=rand()%3+1;y=rand()%3+1;if(QP[x-1][y-1]==2){QP[x-1][y-1]=1;}else{goto Noop;}}update();}
void update()
{int a,b;for(a=0;a<3;a++){for(b=0;b<3;b++){if(QP[a][b]==0){gotoxy(46+b*8,7+a*4);//跳转棋盘位置printf("●");}if(QP[a][b]==1){gotoxy(46+b*8,7+a*4);//跳转棋盘位置printf("▲");}}}
}
void winlose()
{if(QP[0][0]==0 && QP[0][1]==0 && QP[0][2]==0){win_or_lose=0;}else if(QP[0][0]==1 && QP[0][1]==1 && QP[0][2]==1){win_or_lose=0;}//第一行结束if(QP[1][0]==0 && QP[1][1]==0 && QP[1][2]==0){win_or_lose=0;}else if(QP[1][0]==1 && QP[1][1]==1 && QP[1][2]==1){win_or_lose=1;}//第二行结束if(QP[2][0]==0 && QP[2][1]==0 && QP[2][2]==0){win_or_lose=0;}else if(QP[2][0]==1 && QP[2][1]==1 && QP[2][2]==1){win_or_lose=1;}//第三行结束if(QP[0][0]==0 && QP[1][0]==0 && QP[2][0]==0){win_or_lose=0;}else if(QP[0][0]==1 && QP[1][0]==1 && QP[2][0]==1){win_or_lose=1;}//第一列结束if(QP[0][1]==0 && QP[1][1]==0 && QP[2][1]==0){win_or_lose=0;}else if(QP[0][1]==1 && QP[1][1]==1 && QP[2][1]==1){win_or_lose=1;}//第二列结束if(QP[0][2]==0 && QP[1][2]==0 && QP[2][2]==0){win_or_lose=0;}else if(QP[0][2]==1 && QP[1][2]==1 && QP[2][2]==1){win_or_lose=1;}//第三列结束if(QP[0][0]==0 && QP[1][1]==0 && QP[2][2]==0){win_or_lose=0;}else if(QP[0][0]==1 && QP[1][1]==1 && QP[2][2]==1){win_or_lose=1;}//主对角结束if(QP[0][2]==0 && QP[1][1]==0 && QP[2][0]==0){win_or_lose=0;}else if(QP[0][2]==1 && QP[1][1]==1 && QP[2][0]==1){win_or_lose=1;}//负对角结束[1]if(QP[0][0]!=2 && QP[0][1]!=2 && QP[0][2]!=2 && QP[1][2]!=2 && QP[1][2]!=2 && QP[1][0]!=2 && QP[2][0]!=2 && QP[2][1]!=2 && QP[2][2]!=2){win_or_lose=3;}
}

这篇关于c语言井字棋人人,人机版and超详细代码的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/833407

相关文章

从基础到高级详解Go语言中错误处理的实践指南

《从基础到高级详解Go语言中错误处理的实践指南》Go语言采用了一种独特而明确的错误处理哲学,与其他主流编程语言形成鲜明对比,本文将为大家详细介绍Go语言中错误处理详细方法,希望对大家有所帮助... 目录1 Go 错误处理哲学与核心机制1.1 错误接口设计1.2 错误与异常的区别2 错误创建与检查2.1 基础

Java集合之Iterator迭代器实现代码解析

《Java集合之Iterator迭代器实现代码解析》迭代器Iterator是Java集合框架中的一个核心接口,位于java.util包下,它定义了一种标准的元素访问机制,为各种集合类型提供了一种统一的... 目录一、什么是Iterator二、Iterator的核心方法三、基本使用示例四、Iterator的工

Java 线程池+分布式实现代码

《Java线程池+分布式实现代码》在Java开发中,池通过预先创建并管理一定数量的资源,避免频繁创建和销毁资源带来的性能开销,从而提高系统效率,:本文主要介绍Java线程池+分布式实现代码,需要... 目录1. 线程池1.1 自定义线程池实现1.1.1 线程池核心1.1.2 代码示例1.2 总结流程2. J

Python中isinstance()函数原理解释及详细用法示例

《Python中isinstance()函数原理解释及详细用法示例》isinstance()是Python内置的一个非常有用的函数,用于检查一个对象是否属于指定的类型或类型元组中的某一个类型,它是Py... 目录python中isinstance()函数原理解释及详细用法指南一、isinstance()函数

Python的pandas库基础知识超详细教程

《Python的pandas库基础知识超详细教程》Pandas是Python数据处理核心库,提供Series和DataFrame结构,支持CSV/Excel/SQL等数据源导入及清洗、合并、统计等功能... 目录一、配置环境二、序列和数据表2.1 初始化2.2  获取数值2.3 获取索引2.4 索引取内容2

Go语言中json操作的实现

《Go语言中json操作的实现》本文主要介绍了Go语言中的json操作的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧... 目录 一、jsOChina编程N 与 Go 类型对应关系️ 二、基本操作:编码与解码 三、结构体标签(Struc

JS纯前端实现浏览器语音播报、朗读功能的完整代码

《JS纯前端实现浏览器语音播报、朗读功能的完整代码》在现代互联网的发展中,语音技术正逐渐成为改变用户体验的重要一环,下面:本文主要介绍JS纯前端实现浏览器语音播报、朗读功能的相关资料,文中通过代码... 目录一、朗读单条文本:① 语音自选参数,按钮控制语音:② 效果图:二、朗读多条文本:① 语音有默认值:②

Vue实现路由守卫的示例代码

《Vue实现路由守卫的示例代码》Vue路由守卫是控制页面导航的钩子函数,主要用于鉴权、数据预加载等场景,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着... 目录一、概念二、类型三、实战一、概念路由守卫(Navigation Guards)本质上就是 在路

uni-app小程序项目中实现前端图片压缩实现方式(附详细代码)

《uni-app小程序项目中实现前端图片压缩实现方式(附详细代码)》在uni-app开发中,文件上传和图片处理是很常见的需求,但也经常会遇到各种问题,下面:本文主要介绍uni-app小程序项目中实... 目录方式一:使用<canvas>实现图片压缩(推荐,兼容性好)示例代码(小程序平台):方式二:使用uni

JAVA实现Token自动续期机制的示例代码

《JAVA实现Token自动续期机制的示例代码》本文主要介绍了JAVA实现Token自动续期机制的示例代码,通过动态调整会话生命周期平衡安全性与用户体验,解决固定有效期Token带来的风险与不便,感兴... 目录1. 固定有效期Token的内在局限性2. 自动续期机制:兼顾安全与体验的解决方案3. 总结PS