C语言 五子棋2
#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的更多相关文章
- c语言五子棋
#include <stdio.h>#include <stdlib.h>#include <windows.h>#include <conio.h> ...
- C语言 五子棋
#include <stdlib.h> #include <stdio.h> #include <conio.h> #include <string.h> ...
- C 语言控制台实现五子棋项目
花了一天时间实现了控制台五子棋项目,把项目贴上来.也算是告一段落了. 为了进一步了解C语言编程,熟悉优秀的编码风格,提升编码能力,丰富项目经验.所以在编程初期选择了控制台小游戏<单机五子棋> ...
- 用c语言实现简单的五子棋
用c语言实现简单的五子棋 这个小游戏是从零开始的实现的,框架灵感来自于小游戏<走迷宫>. 游戏代码配置: 二维数组+简单逻辑+getch读取键盘+windows函数(刷屏,改颜色,改窗口大 ...
- C/C++编程笔记:C语言开发经典游戏项目《五子棋》,内含源码
上一节给大家分享了扫雷游戏的源代码,本篇文章当然也不会让大家失望,专门针对C语言入门或者学习了部分知识之后的小伙伴来练手的游戏项目——<五子棋大战>,本期并不是使用的easyX,因为考虑到 ...
- 使用Java语言编写一个五子棋UI界面并实现网络对战功能(非局域网)
使用Java语言编写一个五子棋UI界面并实现网络对战功能(非局域网) 一,前期准备 1,Java IDE(Eclipse)与JDK的安装与配置jdk-15.0.1-免配置路径版提取码:earu免安装版 ...
- C语言实现五子棋简单功能
/******************************************************************** C-4.29-1: 实现五子棋游戏 操作说明:用方向键或者& ...
- 笔记:C语言图形基本函数及实例五子棋游戏
初始化图形界面 int gdriver; int gmode; gdriver = DETECT; initgraph(&gdriver,&gmode,"" ); ...
- C语言实现五子棋
可以称得上史上最简单的五子棋版本了. 可以使用curses库来改进页面和下棋方式. 并且对于输入的坐标没有进行鉴别,如果输入的坐标超过棋盘大小,就会段错误退出. 我改进了一点,但是还是没有完全避免这个 ...
随机推荐
- Hbase(五) hbase内部原理
一.系统架构 客户端连接hbase依赖于zookeeper,hbase存储依赖于hadoop client: 1.包含访问 hbase 的接口, client 维护着一些 cache(缓存) 来加快对 ...
- 解题:POI 2012 Cloakroom
题面 首先,单独处理每个询问复杂度显然不可承受,还是考虑通过排序使得限制更容易达到:按照$a$将物品排序,按照$m$将询问排序,这样肯定是要不断添加物品才能达到要求,顺着做一遍就行了 然后发现$b$的 ...
- Python3 字典 fromkeys()方法
Python3 字典 描述 Python 字典 fromkeys() 函数用于创建一个新字典,以序列seq中元素做字典的键,value为字典所有键对应的初始值. 语法 fromkeys()方法语法: ...
- selenium测试 - open Firefox
环境:Python2.7+selenium3+Firefox47 问题1: 在打开火狐浏览器时报错:‘geckodriver‘ executable needs to be in PATH fro ...
- 简化版SMO算法标注
''' 随机选择随机数,不等于J ''' def selectJrand(i,m): j=i #we want to select any J not equal to i while (j==i): ...
- Listener 介绍
当 web 应用在 web 容器中运行时,web 应用内部会不断地发生各种事件:如 web 应用启动.web 应用停止,用户 session 开始.用户 session 结束.用户请求到达等. 实际上 ...
- Git之安装及使用
学习使用Git来管理平时自己写的demo代码和阅读的一些源码,因为一直在windows中操作所以开始学习用Git Bash操作在github上的代码.git命令和svn命令是很相似的,我觉得没有必要把 ...
- 「Python」人脸识别应用
人脸识别主要步骤: face_recognition 库的安装 安装此库,首先需要安装编译dlib,此处我们偷个懒,安装软件Anaconda(大牛绕过),此软件预装了dlib. 安装好后,我们直接通过 ...
- 这年头不会点Git真不行!!!
版本控制 说到版本控制,脑海里总会浮现大学毕业是写毕业论文的场景,你电脑上的毕业论文一定出现过这番景象! 1 2 3 4 5 6 7 8 9 10 11 毕业论文_初稿.doc 毕业论文_修改1.do ...
- bzoj 2844: albus就是要第一个出场 高斯消元
LINK 题意:看题目不如看样例解释.给出有n个数的集合,对这些子集中的数求异或,升序统计所有子集得到的数(重复会被计入),询问一个数x,问这个数出现的第一个位置 思路:在这里要求一个所有可能出现的异 ...