#include <stdio.h>
void Output(char chessboard[][8]); //显示棋盘中下子的情况
int Check(char chessboard[][8], int moves[][8], char player); //检查一方是否有地方可下子
void PlayStep(char chessboard[][8], int row, int col, char player); //在指定位置下子
void AutoPlayStep(char chessboard[][8], int moves[][8], char player); //计算机在思考下子
int GetMaxScore(char chessboard[][8], char player); //获取分数
int BestPlay(char chessboard[][8], int moves[][8], char player); //最优下子
int main()
{
char chessboard[8][8]; //保存棋盘中各单元格下子的状态
int isDown[8][8] = { 0 }; //保存棋盘中各位置是否可以下子,可下子的位置为1,其余位置为0
int row, col, x, y;
int iCount = 0; //已下棋子数量
int player = 0; //下棋方
int SkipPlay = 0; //跳过下子的次数,若为2,表示双方都不能下子
int Score[2]; //保存计算机和游戏者的得分
char select;
printf("黑白棋\n\n");
printf("游戏者执黑先下,计算机执白,按Enter开始:\n");
scanf("%c", &select);
do
{
if (player == 0) //计算下棋方(0表示游戏者,1表示计算机)
player = 1;
else
player = 0;
iCount = 4; //累计下子数
for (row = 0; row < 8; row++) //棋盘各位置清空
for (col = 0; col < 8; col++)
chessboard[row][col] = 0;
chessboard[3][3] = chessboard[4][4] = 1; //在棋盘中间位置放置白棋
chessboard[3][4] = chessboard[4][3] = -1; //在棋盘中间位置放置黑棋
printf("\n棋盘初始状态:\n");
Output(chessboard); //显示初始棋盘下子的状况
do
{
if (player == 1) //若是游戏者下棋(下白子)
{
player = 0;
if (Check(chessboard, isDown, 2)) //判断是否可下黑子
{
while(1) //死循环,直到用户输入正确的坐标为止
{
fflush(stdin);
printf("输入下子的位置(行 列):");
scanf("%d%c", &x, &y);
x--; //计算行坐标位置
if(y >= 'a')
y = y - 'a' + 1;
else
y = y - 'A' + 1;
y--; //计算列位置
if (x >= 0 && y >= 0 && x < 8 && y < 8 && isDown[x][y]) //若行列坐标输入有效
{
PlayStep(chessboard, x, y, 2); //在指定坐标位置下黑子
iCount++; //累加下子数
break;
}
else
printf("坐标输入错误,请重新输入。\n");
}
printf("\n你下子后的状态:\n");
Output(chessboard); //显示棋子状态
printf("按任意键计算机下子。\n");
getch();
}
else if (++SkipPlay < 2) //若无效下子的次数小于2
{
fflush(stdin); //清除输入缓冲区
printf("你没位置可下,按Enter键让对方下子。");
scanf("%c", &select);
} else
printf("双方都没地方下子,游戏结束!\n");
}
else //若是计算机下棋(下黑子)
{
player = 1;
if (Check(chessboard, isDown, 1)) //检查是否可下白子
{
SkipPlay = 0; //清除无效下子次数
AutoPlayStep(chessboard, isDown, 1); //计算机下一个白子
iCount++; //累加下子数
printf("\n计算机下子后的状态:\n");
Output(chessboard); //显示棋子状态
}
else
{
if (++SkipPlay < 2) //若无效下子次数小于2
printf("我没位置可走,请你走。\n");
else
printf("双方都没地方下子,游戏结束!");
}
}
}while (iCount < 64 && SkipPlay < 2); //下子数量小于64 且无效下子的次数小于2
Output(chessboard); //显示各双方棋子的状况
Score[0] = Score[1] = 0; //清空计分变量
for (row = 0; row < 8; row++) //循环统计各单元格黑白棋子的数量
{
for (col = 0; col < 8; col++)
{
Score[0] += chessboard[row][col] == -1; //统计黑子数
Score[1] += chessboard[row][col] == 1; //统计白子数
}
}
printf("最终成绩:\n");
printf("计算机:%d\n游戏者:%d\n", Score[0], Score[1]);
fflush(stdin); //清空输入缓冲区
printf("继续下一局(y/n)?:");
scanf("%c", &select);
}while (select == 'y' || select == 'Y');
printf("Game Over!\n");
getch();
return 0;
}
void Output(char chessboard[][8]) //显示棋盘上棋子的状态
{
int row, col;
printf("\n ");
for (col = 0; col < 8; col++) //输出列标号
printf(" %c ", 'A' + col);
printf("\n");
printf(" ┌"); //输出项部横线
for (col = 0; col < 7; col++) //输出一行
printf("─┬");
printf("─┐\n");
for (row = 0; row < 8; row++)
{
printf("%2d│", row + 1); //输出行号
for (col = 0; col < 8; col++) //输出棋盘各单元格中棋子的状态
{
if (chessboard[row][col] == 1) //白棋
printf("○│");
else if (chessboard[row][col] == -1) //黑棋
printf("●│");
else //未下子处
printf(" │");
}
printf("\n");
if (row < 8 - 1)
{
printf(" ├"); //输出交叉线
for (col = 0; col < 8 - 1; col++) //输出一行
printf("─┼");
printf("─┤\n");
}
}
printf(" └");
for (col = 0; col < 8 - 1; col++) //最后一行的横线
printf("─┴");
printf("─┘\n");
}
int Check(char chessboard[][8], int isDown[][8], char player) //检查某一方是否还有下子的地方
{
int rowdelta, coldelta, row, col, x, y = 0;
int iStep = 0;
char opponent = (player == 1) ? -1 : 1; //对方棋子
char myplayer = -1 * opponent; //我方棋子
for (row = 0; row < 8; row++) //将isDown数组全部清0
for (col = 0; col < 8; col++)
isDown[row][col] = 0;
for (row = 0; row < 8; row++) //循环判断棋盘中哪些单元格可以下子
{
for (col = 0; col < 8; col++)
{
if (chessboard[row][col] != 0) //若棋盘上对应位置不为空(表示已经有子)
continue; //继续处理下一个单元格
for (rowdelta = -1; rowdelta <= 1; rowdelta++) //循环检查上下行
{
for (coldelta = -1; coldelta <= 1; coldelta++) //循环检查左右列
{
if (row + rowdelta < 0 || row + rowdelta >= 8
|| col + coldelta < 0 || col + coldelta >= 8
|| (rowdelta == 0 && coldelta == 0)) //检查若坐标超过棋盘 或为当前单元格
continue; //继续循环
if (chessboard[row + rowdelta][col + coldelta] == opponent) //若(row,col)四周有对手下的子
{
x = row + rowdelta; //以对手下子位置为坐标
y = col + coldelta;
while(1) //对对手下子为起始点,向四周查找自己方的棋子,以攻击对方棋子
{
x += rowdelta; //对手下子的四周坐标
y += coldelta;
if (x < 0 || x >= 8 || y < 0 || y >= 8) //超过棋盘
break; //退出循环
if (chessboard[x][y] == 0) //若对应位置为空
break;
if (chessboard[x][y] == myplayer) //若对应位置下的子是当前棋手的
{
isDown[row][col] = 1; //设置移动数组中对应位置为1 (该位置可下子,形成向对手进攻的棋形)
iStep++; //累加可下子的位置数量
break;
}
}
}
}
}
}
}
return iStep; //返回可下的位置数量(若返回值为0,表示没地方可下)
}
void PlayStep(char chessboard[][8], int row, int col, char player) //在指定位置下子
{
int rowdelta = 0;
int coldelta = 0;
int x = 0;
int y = 0;
char opponent = (player == 1) ? -1 : 1; //对方棋子
char myplayer = -1 * opponent; //我方棋子
chessboard[row][col] = myplayer; //保存所下的棋子
for (rowdelta = -1; rowdelta <= 1; rowdelta++) //检查所下子四周的棋子
{
for (coldelta = -1; coldelta <= 1; coldelta++)
{
if (row + rowdelta < 0 || row + rowdelta >= 8 || col + coldelta < 0
|| col + coldelta >= 8 || (rowdelta == 0 && coldelta == 0)) //若坐标超过棋盘界限
continue; //继续下一位置
if (chessboard[row + rowdelta][col + coldelta] == opponent) //若该位置是对手的棋子
{
x = row + rowdelta; //以对手棋为坐标
y = col + coldelta;
while(1) //在对手棋子四周寻找我方棋子
{
x += rowdelta;
y += coldelta;
if (x < 0 || x >= 8 || y < 0 || y >= 8) //若坐标超过棋盘
break; //退出循环
if (chessboard[x][y] == 0) //若对应位置为空
break; //退出循环
if (chessboard[x][y] == myplayer) //若对应位置是我方模子
{
while (chessboard[x -= rowdelta][y -= coldelta] == opponent) //循环处理
chessboard[x][y] = myplayer; //将中间的棋子都变成我方棋子
break; //退出循环
没有合适的资源?快使用搜索试试~ 我知道了~
yuanwenjian.rar_零基础学算法
共171个文件
c:143个
in:23个
h:5个
1.该资源内容由用户上传,如若侵权请联系客服进行举报
2.虚拟产品一经售出概不退款(资源遇到问题,请及时私信上传者)
2.虚拟产品一经售出概不退款(资源遇到问题,请及时私信上传者)
版权申诉
0 下载量 99 浏览量
2022-09-14
20:18:47
上传
评论
收藏 140KB RAR 举报
温馨提示
零基础学算法的源码,个人觉得挺好的,故分享之,希望能对其他人有帮助。
资源推荐
资源详情
资源评论
收起资源包目录
yuanwenjian.rar_零基础学算法 (171个子文件)
8-27 b&wchess.c 10KB
7-2 BigInt1.c 10KB
9-21 rectang.c 8KB
7-7 ParkCharge.c 8KB
7-10 lzw.c 8KB
3-3.c 7KB
3-3 ThreadBinTree.c 7KB
7-8 Maze1.c 6KB
7-3 BigInt2.c 6KB
3-5 HuffmanTree.c 6KB
7-9 Maze2.c 5KB
8-28 24dot.c 5KB
5-4 BinarySortTree.c 5KB
3-1 BinTree.c 5KB
6-27 PolynMinus.c 5KB
8-29 10half.c 5KB
6-26 PolynAdd.c 5KB
7-4 NumberTrans.c 4KB
6-19 Gauss.c 4KB
2-13 CalcExp.c 4KB
7-6 toPosfix.c 4KB
8-19 knight3.c 4KB
8-25 gameoflife.c 4KB
8-3 bank.c 3KB
9-11 equal.c 3KB
程序1-5.c 3KB
9-15 martian.c 3KB
3-4.c 3KB
8-15 backpack1.c 3KB
3-10 GraphTrav.c 3KB
9-8 drawing.c 3KB
8-16 backpack2.c 3KB
3-2 BinTreeTest.c 3KB
6-24 MatrixInverse.c 3KB
8-17 knight1.c 3KB
2-5 ChainList.c 3KB
2-7 AddressList.c 3KB
5-5 IndexSearch.c 3KB
9-6 seat.c 3KB
3-4 ThreadBinTreeTest.c 3KB
8-12 magic3.c 2KB
9-18 fruit.c 2KB
8-21 queens2.c 2KB
6-14 Factorial2.c 2KB
9-4 soldier.c 2KB
6-18 PI4.c 2KB
4-8 MergeSort.c 2KB
8-14 hanoi2.c 2KB
2-2 SeqList.c 2KB
9-3 prime.c 2KB
2-6 ChainListTest.c 2KB
2-3 SeqListTest.c 2KB
7-5 parenthesis.c 2KB
6-22 MatrixMul.c 2KB
8-22 frog.c 2KB
8-24 stone.c 2KB
3-6 AdjMatrixGraph.c 2KB
8-10 magic1.c 2KB
9-24 fetch.c 2KB
2-10 BankQueue.c 2KB
3-8 AdjListGraph.c 2KB
3-14 Dijkstra.c 2KB
程序1-10.c 2KB
9-22 buylow.c 2KB
8-20 queens1.c 2KB
8-11 magic2.c 2KB
9-13 peanuts.c 2KB
6-23 Matrix2to1.c 2KB
8-18 knight2.c 2KB
4-2 BubbleSort.c 1KB
4-5 HeapSort.c 1KB
3-12 Prim.c 1KB
6-12 Goldbach2.c 1KB
6-2 friend.c 1KB
9-25 missile.c 1KB
5-6 HashSearch.c 1KB
8-26 shuffle.c 1KB
9-14 fbi.c 1KB
程序1-8.c 1KB
8-23 3flag.c 1KB
9-19 chorus.c 1KB
9-10 medic.c 1KB
6-21 Newton.c 1KB
4-7 ShellSort.c 1KB
4-3 QuickSort.c 1KB
6-25 MatrixSparsity.c 1KB
6-7 PrimeNum1.c 1KB
6-9 PalindromeNum1.c 1KB
9-20 card.c 1KB
6-11 Goldbach1.c 1KB
9-2 series2.c 1KB
5-3 BinarySearch.c 1KB
6-4 AutomorphicNum.c 1KB
9-9 tree.c 1006B
9-17 save.c 1004B
4-6 InsertSort.c 995B
7-1 Josephus.c 987B
3-11 GraphTravTest.c 971B
8-5 well.c 966B
3-15 DijkstraTest.c 955B
共 171 条
- 1
- 2
资源评论
钱亚锋
- 粉丝: 86
- 资源: 1万+
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功