C语言---会思考的三子棋
学了二维数组我们就可以试着写一个三子棋小游戏了,但电脑随机的操作让整个游戏根本没难度,所以我给大家带来了一个不是那么笨的三子棋,将人的思维带给电脑,代码如下:
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<windows.h>
#include<stdlib.h>
#include<time.h>
#define ROW 3 //宏定义棋盘长宽
#define COL 3
void mvue() //打印游戏菜单函数
{printf("*************************************\n");printf("*********** 1.开始游戏 *************\n");printf("*********** 0.退出游戏 *************\n");printf("*************************************\n");
}
//******************棋盘内部置空******************************
void initialization(char disc[ROW][COL] )
{int i = 0;for (i = 0; i < ROW; i++){int n = 0;for (n = 0; n < COL; n++){disc[i][n] = ' ';}}
}
//*****************创建棋盘外观,打印棋盘********************************
void print(char disc[ROW][COL] )
{printf("+---+---+---+\n");for (int row = 0; row < ROW; row++){printf("| %c | %c | %c |\n", disc[row][0], disc[row][1], disc[row][2]);printf("+---+---+---+\n");}}
//*****************玩家下棋******************************
void a_fallingseed(char disc[ROW][COL])
{while (1){printf("输入一个坐标(例2,2):");int x = 0;int y = 0;scanf("%d,%d", &x, &y);if ((x > 0 && x <= ROW) && (y > 0 && y <= COL)){if (disc[x - 1][y - 1] == ' '){disc[x - 1][y - 1] = '*';break;}elseprintf("坐标已有棋子\n");}else{printf("坐标非法\n");}}}
//********************电脑下棋****************************
int b_fallingseed(char disc[ROW][COL])//判断敌方横是否为2
{for (int i = 0; i < ROW; i++){int judge1 = 0;int n = 0;for ( n = 0; n < COL; n++){if(disc[i][n] == '*')judge1++;}if (judge1 == 2){for (int max = 0; max < COL; max++){if (disc[i][max] == ' '){disc[i][max] = '#';return 0;}}}}//-------------------------------------------for (int i = 0; i < COL; i++) //判断敌方纵是否为2 {int judge2 = 0;int n = 0;for (n = 0; n < ROW; n++){if(disc[n][i] == '*')judge2++;}if (judge2 == 2){for (int max = 0; max < COL; max++){if (disc[max][i] == ' '){disc[max][i] = '#';return 0;}}}}//----------------判断敌方右斜是否为2 ---------------------------int pa = 0;int pb = 0;int judge3 = 0;for (pa = 0; pa < ROW && pb < COL; pa++,pb++){if (disc[pa][pb] == '*'){judge3++;}if (judge3 == 2){if (disc[0][0] == ' '){disc[0][0] = '#';return 0;}else if (disc[1][1] == ' '){disc[1][1] = '#';return 0;}else{disc[2][2] = '#';return 0;}}}//--------------判断敌方左斜是否为2 -------------------------int judge4 = 0;int pc = 0;int pd = 0;for (pc = 0, pd = COL - 1; pc < ROW && pd >= 0; pc++, pd--){if (disc[pc][pd] == '*'){judge4++;}if (judge4 == 2){if (disc[0][2] == ' '){disc[0][2] = '#';return 0;}else if (disc[1][1] == ' '){disc[1][1] = '#';return 0;}else{disc[2][0] = '#';return 0;}}}if (disc[1][1] == ' ') //如果没有必走棋,抢中心位置{disc[1][1] = '#';return 0;}else //如果中心位置已被占随机下一步棋{ //这里的随机步还可以优化,让电脑随着你写的一个// 算法落子,每一步占据最大优势,但是这里是最难的,所以我没写while (1){int row = rand() % ROW;int col = rand() % COL;if (disc[row][col] == ' '){disc[row][col] = '#';return 0;}}}
}
int iswin(char disc[ROW][COL]) //判断继续游戏还是平局
{int i = 0;int y = 0;for (i = 0; i < ROW; i++){for (y = 0; y < COL; y++){if (disc[i][y] == ' ')return 1;}}return 0;
}
//---------------------------------------------------
char Win(char disc[ROW][COL]) //判断输赢
{for (int i = 0; i < ROW; i++){if (disc[i][0] == disc[i][1] && disc[i][1] == disc[i][2] && disc[i][1] != ' '){return disc[i][1];}}for (int y = 0; y < COL; y++){if (disc[0][y] == disc[1][y] && disc[1][y] == disc[2][y] && disc[1][y] != ' '){return disc[0][y];}}if (disc[0][0] == disc[1][1] && disc[1][1] == disc[2][2] && disc[1][1] != ' '){return disc[1][1];}else if (disc[0][2] == disc[1][1] && disc[1][1] == disc[2][0] && disc[1][1] != ' '){return disc[1][1];}else{int c = iswin(disc);if (c == 0)return 'Q';elsereturn ' ';}
}
void game() //游戏执行过程总函数
{printf("玩家先(0)电脑先(1)\n");int vit = 0;scanf("%d", &vit);if (vit == 0) //玩家先{char disc[ROW][COL] = { 0 };initialization(disc);//初始化棋盘函数print(disc, ROW, COL); //创建棋盘外观char is = ' ';//判断根据while (1){a_fallingseed(disc);//玩家下棋*print(disc, ROW, COL); //打印棋盘is = Win(disc); //判断胜负if (is != ' '){break;}b_fallingseed(disc);//电脑下棋#print(disc, ROW, COL);//打印棋盘is = Win(disc); //判断胜负if (is != ' '){break;}}if (is == '*'){printf("玩家胜利\n");}else if (is == '#'){printf("电脑胜利\n");}else if (is == 'Q')printf("平局\n");}else if (vit == 1) //电脑先{char disc[ROW][COL] = { 0 };initialization(disc);//初始化棋盘函数//print(disc, ROW, COL); //创建棋盘外观char is = ' ';//判断根据while (1){b_fallingseed(disc);//电脑下棋#//print(disc, ROW, COL); //打印棋盘is = Win(disc); //判断胜负if (is != ' '){break;}print(disc, ROW, COL);a_fallingseed(disc);//玩家下棋*//print(disc, ROW, COL);//打印棋盘is = Win(disc); //判断胜负if (is != ' '){break;}}if (is == '*'){printf("玩家胜利\n");}else if (is == '#'){printf("电脑胜利\n");}else if (is == 'Q')printf("平局\n");}
}
//*************************************************************
int main()
{int input = 0;srand((unsigned int)time(NULL));do{//system("cls");mvue();scanf("%d", &input);switch (input){case 1:game(); //逐步实现游戏过程的函数break;case 0:printf("退出游戏\n");break;default:printf("选择错误\n");break;}} while (input);return 0;
}
目前有两个最大的缺点
1.就是随机落子那一块,整个代码只是让电脑不会输的太挫,能够正常操作,如果解决电脑随机落子那一块那么电脑可以算是一个不错的对手了
2.电脑不会去判断自己是否有两个棋子达成条件,而是一味的去堵玩家,不过这一块的代码相对好实现,稍微调整一下复制粘贴判断玩家的棋子代码就可以了,这里我没时间去做修改了,有兴趣的朋友可以试一试
C语言---会思考的三子棋相关推荐
- 如何用C语言来实现【三子棋游戏】
目录 一.前言 二.思维导图 三.思路分析 四.运行结果 五.算法细节 1.游戏相关的测试 2.游戏函数的声明 3.游戏函数的实现 (1)初始化棋盘的函数 (2)打印棋盘的函数 (3)玩家下棋的函数 ...
- 【C语言】通过C语言实现简单的三子棋
[C语言]通过C语言实现简单的三子棋 文章目录 [C语言]通过C语言实现简单的三子棋 前言 一.本次小小小小项目前提 二.游戏简易菜单 1.菜单打印 2.游戏菜单的逻辑执行 三.三子棋游戏 1.初始化 ...
- 入门级c语言小游戏———实现三子棋(图文详解,代码可复制)
想必大家都曾有过上课和同桌一起下三子棋的经历吧,你有没有想过在计算机上写一个三子棋游戏呢?欢迎打开本篇博客,接下来和博主一起用c语言实现简易版三子棋吧! 文章目录 一.问题描述 二.基本实现流程 三. ...
- C语言的简单运用——三子棋
前言 学习新知识固然重要,但如何运用所学的知识解决生活中的问题更为重要.只会学而不会用,何异于纸上谈兵.那么就让我们来看看如何用C语言来实现一个简单的三子棋吧! 目录 前言 一点建议 一.游戏菜单 1 ...
- 【C语言小游戏】三子棋(井字棋)
hello,csdn的伙伴们,大家好,我们已经学习到了分支与循环,函数,数组这三大块知识,那么我们现在就可以尝试综合运用前面所学的知识,来完成一个简单的小游戏-----三子棋(井字棋) 目录 一.采用 ...
- 【C语言实现五子棋、三子棋人机对战,包含电脑人工智能对战(可攻可守)】(非标题党)
C语言--五子棋.井字棋人机对"战" 针对C语言学习过程中的五子棋.三子棋实现记录 五子棋人机对战 C语言--五子棋.井字棋人机对"战" 实际效果 一.头文件( ...
- c语言程序设计中三子棋游戏,C语言实现简易版三子棋游戏
本文实例为大家共享了C语言实现三子棋游戏的详细代码,供大家参考,详细内容如下 什么是多文件? 多数大型的工程的头文件和源文件非常多,我们也不可能把所有的代码都写在同一个文件里,这样也不方便代码的阅读与 ...
- 用c语言实现小游戏三子棋
小游戏之三子棋 小游戏之三子棋 三子棋的基本玩法 游戏制作思路 制作步骤 1.菜单 2.初始化棋盘 3.打印棋盘 4.玩家下棋 5.电脑下棋 6.判断胜利 完整代码 小结 三子棋的基本玩 ...
- C语言实战项目1——三子棋(可转变为N子棋)
文章目录 前言 一.三子棋实现步骤 1.什么是三子棋? 2.C语言实现逻辑 3.函数实现 二.源代码 1.头文件 2.函数实现 3.主函数 总结 前言 学习就是一个总结以及融汇贯通的的过程,适当的对知 ...
最新文章
- what should you do if you want to become an expert in one domain
- 利用matlab点云工具处理点云
- ActiveXObject
- 最新高清IT职业技能图谱(15图)
- 玩玩小爬虫——试搭小架构
- Python urllib爬取百度首页
- 在B/S系统中引入定时器的功能
- [洛谷P3381]【模板】最小费用最大流
- 在ubuntu20.04上安装最新版的qq
- 对话Ruby创始人松本行弘、阿里高级技术专家朴灵!
- 如何在 Excel 图表中添加或删除次坐标轴?
- vue项目使用 Recorder.js 实现录音功能
- FPGA--ZCU106通过SFP+/SGMII模块传输数据-第一讲(全网唯一)
- Bit-M Accelerator全新上线
- ng-alain php,在angular中基于ng-alain如何定义自己的select组件?
- C语言基本的语法规定
- ElastiSearch与Solr和Lucene
- 【C语言必经之路——第13节】C语言中的数据类型详解
- 记一次对Pixiv日榜的爬虫
- 【RocketMQ】消息的存储设计