#include<windows.h>
#include<stdlib.h>
#include<stdio.h>
#include<conio.h>
#include<math.h>
#include<time.h>
#define len 15 int chessmessage[len][len];
int worb = ;
int count = ;
int m; void star_print(); //打印游戏开始函数
void movegb(char key); //光标的移动
void renjiboyi(); //人机博弈
void shuangrenboyi(); //双人博弈
void initial(); //初始化棋盘数据
void borad_print(); //打印棋盘数据
int chessjudge(int x, int y); //判断能否下子
int chessjudgewin(int x, int y, int worb); //判断输赢
int chesscomputer(); //电脑下棋
int chessscore(int x, int y, int worb); //棋盘权值函数
void print(int m); struct zuobiao
{
int x;
int y;
}weizhi = { , }; void gotoxy(int x, int y) //建立坐标函数
{
COORD c;
c.X = x;
c.Y = y;
SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE), c);
} void star_print()
{
printf("\n\n\n\n\n");
printf(" ********************* 【五子棋】 *******************\n\n\n");
printf(" *********************【游戏说明】 ******************\n");
printf(" \n");
printf(" 【1】: 黑子由机器使用 \n");
printf(" -------------------------------------------------\n");
printf(" 【2】: 白子由人使用 \n");
printf(" \n");
printf(" ****************************************************\n");
printf("\n\n 【人机博弈按:1】 【双人博弈按:2】 【退出按:Esc】");
} void borad_print()
{ int i, j, k; print(m); for (j = ; j<len; j++)
{
for (i = ; i<len; i++)
{ if (chessmessage[j][i] == )
printf("●");
else if (chessmessage[j][i] == )
printf("○");
else if (j == && i == )
printf("┏");
else if (j == && i == len - )
printf("┓");
else if (j == len - && i == )
printf("┗");
else if (j == len - && i == len - )
printf("┛");
else if (j == && i != && i != len - )
printf("┯");
else if (j != && j != len - && i == )
printf("┠");
else if (j != && j != len - && i == len - )
printf("┨");
else if (j == len - && i != && i != len - )
printf("┷");
else if (j != && j != len - && i != && i != len - )
printf("┼"); if (j> && j<len - && i<len - )
printf("—"); if (j == && i != len - )
printf("━");
else if (j == len - && i != len - )
printf("━"); } printf("\n"); if (j >= && j<len - )
{
for (k = ; k<len; k++)
{
if (k == || k == len - )
printf("┃ ");
else printf("│ ");
} if (j == )
printf(" 【 操作 - PS 】");
if (j == )
printf(" 【 从玩按:n 】");
if (j == )
printf(" 【返回按:Backspace】");
if (j == )
printf(" 【退出按:Esc】");
if(j == )
printf(" 【 空格下子 】");
if(j == )
printf(" 【上,下,左,右】");
if(j == )
printf(" 【 移动光标 】"); }
printf("\n"); }
} void print(int x)
{
if (x == )
printf("\n\n 【五子棋--人机博弈】\n\n\n");
else printf("\n\n 【五子棋--双人博弈】\n\n\n");
} void movegb(char key)/*光标的移动*/
{
switch (key)
{ case 0x48:if (weizhi.y>)weizhi.y--; if (weizhi.y<)weizhi.y = len + ; break;
/*光标向上移动*/ case 0x50:if (weizhi.y<len + )weizhi.y++; if (weizhi.y>len + )weizhi.y = ; break;
/*光标向下移动*/ case 0x4B:if (weizhi.x>-)weizhi.x--; if (weizhi.x<)weizhi.x = len - ; break;
/*光标向左移动*/ case 0x4D:if (weizhi.x<len)weizhi.x++; if (weizhi.x>len - )weizhi.x = ; break;
/*光标向右移动*/
}
gotoxy( * weizhi.x, * weizhi.y);
} void initial()
{
int i, j; for (j = ; j<len; j++) //重置对局数据
{
for (i = ; i<len; i++)
{
chessmessage[i][j] = ;
}
} worb = ; count = ; system("cls"); borad_print(); weizhi.x = ;
weizhi.y = ; gotoxy(weizhi.x, weizhi.y); } int chessjudge(int x, int y)
{
if (chessmessage[x][y] != )
return ; return ;
} int chessjudgewin(int x, int y, int worb)
{
int row, col, count; row = x, col = y; count = ;
while (chessmessage[row][col] == worb && col < len)
{
count++;
col++;
}
col = y - ;
while (chessmessage[row][col] == worb && col >= )
{
count++;
col--;
}
if (count >= )
return ; row = x, col = y; count = ;
while (chessmessage[row][col] == worb && row < len)
{
count++;
row++;
}
row = x - ;
while (chessmessage[row][col] == worb && row >= )
{
count++;
row--;
}
if (count >= )
return ; row = x, col = y; count = ;
while (chessmessage[row][col] == worb && col < len && row < len)
{
count++;
col++;
row++;
}
col = y - , row = x - ;
while (chessmessage[row][col] == worb && col >= && row >= )
{
count++;
col--;
row--;
}
if (count >= )
return ; row = x, col = y; count = ;
while (chessmessage[row][col] == worb && col < len && row >= )
{
count++;
col++;
row--;
}
col = y - , row = x + ;
while (chessmessage[row][col] == worb && col >= && row < len)
{
count++;
col--;
row++;
}
if (count >= )
return ; return ; } int chesscomputer()
{
int i, j, cscore, cscorel, pscore, pscorel, row1, col1, row2, col2, x, y; cscore = pscore = ; row1 = row2 = col1 = col2 = ;
if (count == )
{
srand((unsigned)time(NULL));
row1 = rand() % ;
col1 = rand() % ;
count++; while (chessjudge(row1, col1))
{
row1 = rand() % ;
col1 = rand() % ;
} chessmessage[row1][col1] = ;
worb = - worb; x = abs(weizhi.x - col1);
y = abs(weizhi.y - - row1); if (weizhi.x - col1>)
for (i = ; i < x; i++)
movegb(0x4B);
else for (i = ; i < x; i++)
movegb(0x4D); if (weizhi.y - - row1>)
for (i = ; i < y; i++)
movegb(0x48);
else for (i = ; i < y; i++)
movegb(0x50); printf("●"); } else {
for (i = ; i < len; i++)
{
for (j = ; j < len; j++)
{
if (!chessjudge(i, j))
{
cscorel = chessscore(i, j, ); if (cscorel > cscore)
{
cscore = cscorel;
row1 = i;
col1 = j;
} pscorel = chessscore(i, j, ); if (pscorel > pscore)
{
pscore = pscorel;
row2 = i;
col2 = j;
}
}
}
} if (count == )
{
chessmessage[row1][col1] = ;
worb = - worb;
count++;
x = abs(weizhi.x - col1);
y = abs(weizhi.y - - row1); if (weizhi.x - col1>)
for (i = ; i < x; i++)
movegb(0x4B);
else for (i = ; i < x; i++)
movegb(0x4D); if (weizhi.y - - row1>)
for (i = ; i < y; i++)
movegb(0x48);
else for (i = ; i < y; i++)
movegb(0x50); printf("●"); } else{ if (cscore >= pscore)
{
chessmessage[row1][col1] = ;
worb = - worb;
count++;
x = abs(weizhi.x - col1);
y = abs(weizhi.y - - row1); if (weizhi.x - col1>)
for (i = ; i < x; i++)
movegb(0x4B);
else for (i = ; i < x; i++)
movegb(0x4D); if (weizhi.y - - row1>)
for (i = ; i < y; i++)
movegb(0x48);
else for (i = ; i < y; i++)
movegb(0x50); printf("●"); if (chessjudgewin(row1, col1, ))
{
gotoxy(, );
printf("【 黑子胜利 】");
return ;
}
} else
{
chessmessage[row2][col2] = ;
worb = - worb;
count++;
x = abs(weizhi.x - col2);
y = abs(weizhi.y - - row2); if (weizhi.x - col2>)
for (i = ; i < x; i++)
movegb(0x4B);
else for (i = ; i < x; i++)
movegb(0x4D); if (weizhi.y - - row2>)
for (i = ; i < y; i++)
movegb(0x48);
else for (i = ; i < y; i++)
movegb(0x50);
printf("●"); if (chessjudgewin(row2, col2, ))
{
gotoxy(, );
printf("【 黑子胜利 】");
return ;
}
}
}
} return ;
} int chessscore(int x, int y, int worb) //棋盘权值函数
{
int count3, count4, sumscore = ;
char u, d, l, r, lu, ld, ru, rd; //u上 d下 l左 r右 lu左斜上 ld左斜下 ru右斜上 rd右斜下
int row, col, count1, count2; //1表示横向 2表示竖向 3表示斜上方向 4表示斜下方向 count1 = count2 = count3 = count4 = ;
l = r = u = d = lu = ld = ru = rd = ; chessmessage[x][y] = worb; //模拟下棋 /*---------------------------------------①判断横向棋子并记录空格子---------------------------*/
row = x, col = y + ;
while (chessmessage[row][col] == worb && col < len)
{
count1++;
col++;
}
while (col < len && chessmessage[row][col] == )
{
r++;
col++;
}
row = x, col = y - ;
while (chessmessage[row][col] == worb && col >= )
{
count1++;
col--;
}
while (col >= && chessmessage[row][col] == )
{
l++;
col--;
}
/*------------------------------------------------------------------------------------------*/ /*-------------------------------------②判断竖向棋子并记录空格子---------------------------*/
row = x + , col = y;
while (chessmessage[row][col] == worb && row < len)
{
count2++;
row++;
}
while (row < len && chessmessage[row][col] == )
{
d++;
row++;
}
row = x - , col = y;
while (chessmessage[row][col] == worb && row >= )
{
count2++;
row--;
}
while (row >= && chessmessage[row][col] == )
{
u++;
row--;
}
/*------------------------------------------------------------------------------------------*/ /*------------------------------------③判断斜上向棋子并记录空格子--------------------------*/
row = x - , col = y + ;
while (chessmessage[row][col] == worb && col < len && row >= )
{
count3++;
col++;
row--;
}
while (col < len && row >= && chessmessage[row][col] == )
{
ru++;
col++;
row--;
}
row = x + , col = y - ;
while (chessmessage[row][col] == worb && col >= && row < len)
{
count3++;
col--;
row++;
}
while (col >= && row < len && chessmessage[row][col] == )
{
ld++;
col--;
row++;
}
/*------------------------------------------------------------------------------------------*/ /*-----------------------------------④判断斜下向棋子并记录空格子---------------------------*/
row = x + , col = y + ;
while (chessmessage[row][col] == worb && col < len && row < len)
{
count4++;
col++;
row++;
}
while (col < len && row < len && chessmessage[row][col] == )
{
rd++;
col++;
row++;
}
row = x - , col = y - ;
while (chessmessage[row][col] == worb && col >= && row >= )
{
count4++;
col--;
row--;
}
while (col >= && row >= && chessmessage[row][col] == )
{
lu++;
col--;
row--;
}
/*------------------------------------------------------------------------------------------*/ chessmessage[x][y] = ; if (count1 >= || count2 >= || count3 >= || count4 >= ) //判断五子
{
return sumscore = ;
} if ((count1 == && count2 == && l >= && r >= && u >= && d >= ) ||
(count1 == && count3 == && l >= && r >= && ru >= && ld >= ) ||
(count1 == && count4 == && l >= && r >= && rd >= && lu >= ) ||
(count2 == && count3 == && u >= && d >= && ru >= && ld >= ) ||
(count2 == && count4 == && u >= && d >= && lu >= && rd >= ) ||
(count3 == && count4 == && ru >= && ld >= && lu >= && rd >= )) //判断双活四
{
return sumscore = ;
} if ((count1 == && l >= && r >= ) || (count2 == && u >= && d >= ) ||
(count3 == && ru >= && ld >= ) || (count4 == && lu >= && rd >= )) //判断活四
{
return sumscore = ;
} if ((count1 == && ((l == && r >= ) || (l >= && r == ))) || (count2 == && ((u == && d >= ) || (u >= && d == ))) ||
(count3 == && ((ld == && ru >= ) || (ld >= && ru == ))) || (count4 == && ((lu == && rd >= ) || (lu >= && rd == ))))
{
sumscore = sumscore + ; //成四
} if( ( count1 == && count2 == && l >= && r >= && u >= && d >=) ||
( count1 == && count3 == && l >= && r >= && ru >= && ld >= ) ||
( count1 == && count4 == && l >= && r >= && rd >= && lu >= ) ||
( count2 == && count3 == && u >= && d >= && ru >= && ld >= ) ||
( count2 == && count4 == && u >= && d >= && lu >= && rd >= ) ||
( count3 == && count4 == && ru >= && ld >= && lu >= && rd >=) ) //判断双活三
{
return sumscore + ;
} if ((count1 == && l >= && r >= ) || (count2 == && u >= && d >= ) ||
(count3 == && ru >= && ld >= ) || (count4 == && lu >= && rd >= ))
{
sumscore = sumscore + ;
return sumscore;
} //判断活三 if ((count1 == && count2 == && l >= && r >= && u >= && d >= ) ||
(count1 == && count3 == && l >= && r >= && ru >= && ld >= ) ||
(count1 == && count4 == && l >= && r >= && rd >= && lu >= ) ||
(count2 == && count3 == && u >= && d >= && ru >= && ld >= ) ||
(count2 == && count4 == && u >= && d >= && lu >= && rd >= ) ||
(count3 == && count4 == && ru >= && ld >= && lu >= && rd >= ))
{
sumscore = sumscore + ; //判断双活二
} if ((count1 == && l >= && r >= ) || (count2 == && u >= && d >= ) ||
(count3 == && ru >= && ld >= ) || (count4 == && lu >= && rd >= ))
{
sumscore = sumscore + ; //单活二
} return sumscore; } void renjiboyi()
{
int c = ,w = ;
char key; m = ; while ()
{ initial();
w = ; while ()
{ key = _getch(); if(w == )
{
weizhi.x = ;
weizhi.y = ;
gotoxy(weizhi.x, weizhi.y);
w++;
} if (key == ) //退出游戏
{
exit();
}
else if (key == ) //返回主界面
{
break;
}
else if (key == ) //重新玩
{
break;
}
else if (key == )
{
if (count == len * len)
{
gotoxy(, );
printf("【 平局 】");
count = ;
break;
}
else if (worb == )
{ if (chessjudge(weizhi.y - , weizhi.x) == )
{
printf("○"); chessmessage[weizhi.y - ][weizhi.x] = worb; count++; if (chessjudgewin(weizhi.y - , weizhi.x, worb))
{
gotoxy(, );
printf("【 白子胜利 】"); key = _getch(); while(key != && key != && key != )
key = _getch(); if(key == || key == )
break;
else exit();
} else
{
worb = - worb; c = chesscomputer(); if(c)
{
key = _getch(); while(key != && key != && key != )
{
key = _getch();
} if(key == || key == )
break;
else exit();
}
} } } }
else //光标移动
{
key = _getch();
movegb(key);
} } if (key == )
break; }
} void shuangrenboyi()
{
int w = ;
char key;
m = ; while()
{
initial();
w = ; while()
{
key = _getch(); if(w == )
{
weizhi.x = ;
weizhi.y = ;
gotoxy(weizhi.x, weizhi.y);
w++;
} if (key == ) //退出游戏
{
exit();
}
else if (key == ) //返回主界面
{
break;
}
else if (key == ) //重新玩
{
break;
}
else if(key == )
{
if(worb == )
{ if(chessjudge(weizhi.y-,weizhi.x) == )
{
chessmessage[weizhi.y-][weizhi.x] = ;
printf("○");
count++;
if(chessjudgewin(weizhi.y-,weizhi.x,worb))
{
gotoxy(, );
printf("【 白子胜利 】"); key = _getch(); while(key != && key != && key != )
key = _getch(); if(key == || key == )
break;
else exit(); } worb = - worb;
} } else
{
if(chessjudge(weizhi.y-,weizhi.x) == )
{
chessmessage[weizhi.y-][weizhi.x] = ;
printf("●");
count++;
if(chessjudgewin(weizhi.y-,weizhi.x,worb))
{
gotoxy(, );
printf("【 黑子胜利 】"); key = _getch(); while(key != && key != && key != )
key = _getch(); if(key == || key == )
break;
else exit();
} worb = - worb;
}
} }
else
{
key = _getch(); movegb(key);
} } if (key == )
break;
} } int main()
{
int choice = ; system("title 【五子棋】 --- [14003101班-冉云杰] 制作");
system("color f2");
system("mode con cols=83 lines=35"); while ()
{
star_print(); printf("\n\n\n 【请输入你的选择】:"); while ()
{
choice = _getch(); if (choice == )
{
exit();
} else if (choice == ) //人机博弈
{
renjiboyi();
break;
}
else if (choice == ) //双人博弈
{
shuangrenboyi();
break;
} } system("cls"); } return ;
}

C语言 五子棋2的更多相关文章

  1. c语言五子棋

    #include <stdio.h>#include <stdlib.h>#include <windows.h>#include <conio.h> ...

  2. C语言 五子棋

    #include <stdlib.h> #include <stdio.h> #include <conio.h> #include <string.h> ...

  3. C 语言控制台实现五子棋项目

    花了一天时间实现了控制台五子棋项目,把项目贴上来.也算是告一段落了. 为了进一步了解C语言编程,熟悉优秀的编码风格,提升编码能力,丰富项目经验.所以在编程初期选择了控制台小游戏<单机五子棋> ...

  4. 用c语言实现简单的五子棋

    用c语言实现简单的五子棋 这个小游戏是从零开始的实现的,框架灵感来自于小游戏<走迷宫>. 游戏代码配置: 二维数组+简单逻辑+getch读取键盘+windows函数(刷屏,改颜色,改窗口大 ...

  5. C/C++编程笔记:C语言开发经典游戏项目《五子棋》,内含源码

    上一节给大家分享了扫雷游戏的源代码,本篇文章当然也不会让大家失望,专门针对C语言入门或者学习了部分知识之后的小伙伴来练手的游戏项目——<五子棋大战>,本期并不是使用的easyX,因为考虑到 ...

  6. 使用Java语言编写一个五子棋UI界面并实现网络对战功能(非局域网)

    使用Java语言编写一个五子棋UI界面并实现网络对战功能(非局域网) 一,前期准备 1,Java IDE(Eclipse)与JDK的安装与配置jdk-15.0.1-免配置路径版提取码:earu免安装版 ...

  7. C语言实现五子棋简单功能

    /******************************************************************** C-4.29-1: 实现五子棋游戏 操作说明:用方向键或者& ...

  8. 笔记:C语言图形基本函数及实例五子棋游戏

    初始化图形界面 int gdriver; int gmode; gdriver = DETECT; initgraph(&gdriver,&gmode,"" ); ...

  9. C语言实现五子棋

    可以称得上史上最简单的五子棋版本了. 可以使用curses库来改进页面和下棋方式. 并且对于输入的坐标没有进行鉴别,如果输入的坐标超过棋盘大小,就会段错误退出. 我改进了一点,但是还是没有完全避免这个 ...

随机推荐

  1. 信息收集利器——Nmap

    环境:kali2.0 常用的Nmap命令总结: 1.扫描单个IP地址 nmap 192.168.56.1 2.扫描一个网络中IP地址范围 nmap 192.168.56.1-255 3.扫描目标主机的 ...

  2. Hbase(四) 过滤器查询

    引言:过滤器的类型很多,但是可以分为两大类——比较过滤器,专用过滤器过滤器的作用是在服务端判断数据是否满足条件,然后只将满足条件的数据返回给客户端: 一.hbase过滤器的分类 1.比较过滤器 行键过 ...

  3. ROS中的CMakeLists.txt (转)

    在ROS的编程过程中,如果CMakeLists.txt如果写不好,编译就很难成功.如果看不懂CMakeLists.txt那么很多错误你也不知道时什么回事.所以深入了解它是很右必要的.现在我们就来看看它 ...

  4. [Java多线程]-线程池的基本使用和部分源码解析(创建,执行原理)

    前面的文章:多线程爬坑之路-学习多线程需要来了解哪些东西?(concurrent并发包的数据结构和线程池,Locks锁,Atomic原子类) 多线程爬坑之路-Thread和Runable源码解析 多线 ...

  5. SpringBoot ( 八 ) :RabbitMQ 详解

    原文出处: 纯洁的微笑 RabbitMQ 即一个消息队列,主要是用来实现应用程序的异步和解耦,同时也能起到消息缓冲,消息分发的作用. 消息中间件在互联网公司的使用中越来越多,刚才还看到新闻阿里将Roc ...

  6. ELK Betas 6.0安装及使用

    Betas 6.0安装及使用 注意: Elastic官网更新非常的快,每个版本的文档有会有不同,具体需要去官网查看最新文档进行配置调整. Beats 平台集合了多种单一用途数据采集器.这些采集器安装后 ...

  7. OpenCV---分水岭算法

    推文: OpenCV学习(7) 分水岭算法(1)(原理简介简单明了) OpenCV-Python教程:31.分水岭算法对图像进行分割(步骤讲解不错) 使用分水岭算法进行图像分割 (一)获取灰度图像,二 ...

  8. mysql数据库使用sql命令窗口查询的数据,改成sql语句导入到mysql数据库中

    1.查询语句为select * from t_table;导出的数据格式如下: 2.将数据文本备份,然后使用NOTEPAD++打开,然后只拷贝数据到新建txt中,然后进行如下替换: 1)将“ | ”分 ...

  9. BZOJ2588:LCA+主席树来实现树上两点之间第K大点权查询

    对于每个节点维护这个节点到根的权值线段树 对于每个询问(x,y),这条路径上的线段树 tree[x]+tree[y]-tree[lca(x,y)]-tree[fa[lca(x,y)]] #includ ...

  10. (3.1)用ictclas4j进行中文分词,并去除停用词

    酒店评论情感分析系统——用ictclas4j进行中文分词,并去除停用词 ictclas4j是中科院计算所开发的中文分词工具ICTCLAS的Java版本,因其分词准确率较高,而备受青睐. 注:ictcl ...