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库来改进页面和下棋方式. 并且对于输入的坐标没有进行鉴别,如果输入的坐标超过棋盘大小,就会段错误退出. 我改进了一点,但是还是没有完全避免这个 ...
随机推荐
- '0','\0',NULL,EOF的区别
要看是不是一个东西,打印一下即可 printf("%d %d %d %d\n",'0','\0',NULL,EOF); 输出: 48 0 0 -1 结论: '\0'与NULL 都是 ...
- Qt每次运行都是重新编译问题
按理说,Qt使用了makefile技术只会编译刚修改的源文件,但有时会遇到一运行项目就会重新编译的问题,严重浪费了时间. 问题就出在你的系统时间上,系统时间的不准确会影响makefile机制的判断过程 ...
- DLL初试
环境: VC++6.0 步骤: 1.建立一个WIN32 DYNAMIC-LINK LIBRARY工程,编写CPP文件,文件内容例如: #include "stdafx.h" #in ...
- sklearn中的model_selection模块(1)
sklearn作为Python的强大机器学习包,model_selection模块是其重要的一个模块: 1.model_selection.cross_validation: (1)分数,和交叉验证分 ...
- SpringCloud(二)注册服务提供者搭建
上文已经写了如何去搭建注册中心,仅有注册中心是远远不够的,所以我们需要注册到注册中心并提供服务的节点,这里称为注册服务提供者 前提 阅读上文,并成功搭建注册中心,环境无需改变 项目搭建 这里我们需要新 ...
- phpStudy 虚拟主机
转载:http://blog.csdn.net/sinat_35861664/article/details/53557574 windows下配置虚拟主机,实现多域名访问本地项目目录 1.Apach ...
- 在Windows下安装MongoDB
概述 读者可以通过本文来学习在Windows操作系统上安装MongoDB. 从2.2版本开始,Mongo DB不在支持Windows XP.请使用最近的windows来安装最近发布的MongoDB.本 ...
- [POJ 2559]Largest Rectangle in a Histogram 题解(单调栈)
[POJ 2559]Largest Rectangle in a Histogram Description A histogram is a polygon composed of a sequen ...
- 在Unity中实现屏幕空间反射Screen Space Reflection(2)
traceRay函数 在上一篇中,我们有如下签名的traceRay函数 bool traceRay(float3 start, float3 direction, out float2 hitPixe ...
- 2008 Round 1A C Numbers (矩阵快速幂)
题目描述: 请输出(3+√5)^n整数部分最后3位.如果结果不超过2位,请补足前导0. 分析: 我们最容易想到的方法肯定是直接计算这个表达式的值,但是这样的精度是不够的.朴素的算法没有办法得到答案.但 ...