主函数代码;
#define _CRT_SECURE_NO_WARNINGS
#include "game.h"
int main()
{
int a = 0;
int b = 0;//计数下了多少手
int jiziqi = 0;
srand((unsigned int)time(NULL));
do
{
kaishi();
scanf("%d", &a);
switch (a)
{
case 1:
do
{
printf("\n请选择玩几子棋:");
scanf("%d", &jiziqi);
if (jiziqi != 3)
{
printf("\n目前仅支持三子棋 嘿嘿::\n请重新选择\n");
}
else
break;
} while (1);
//选择模式 人机对战 好友对战
int mo= model1();
if (mo == 1)
{
int nandu = model2();
if (nandu == 1)
{
char qipan[X][Y];
chushihua(qipan, X, Y);
dayin(qipan, X, Y);
int panduan = 0;
do
{
zuobiao(X, Y);
printf("你的棋为X\n");
player(qipan, X, Y);
b++;
dayin(qipan, X, Y);
panduan = whowin(qipan, X, Y, b, jiziqi);
if (panduan == 1)
{
b = 0; break;
}
AI(qipan, b);
/*computer(qipan, X, Y);*/
b++;
dayin(qipan, X, Y);
panduan = whowin(qipan, X, Y, b, jiziqi);
if (panduan == 1)
{
b = 0; break;
}
} while (1);
}
else
{
char qipan[X][Y];
chushihua(qipan, X, Y);
dayin(qipan, X, Y);
int panduan = 0;
do
{
zuobiao(X, Y);
printf("你的棋为X\n");
player(qipan, X, Y);
b++;
dayin(qipan, X, Y);
panduan = whowin(qipan, X, Y, b, jiziqi);
if (panduan == 1)
{
b = 0; break;
}
/*AI(qipan, b);*/
computer(qipan, X, Y);
b++;
dayin(qipan, X, Y);
panduan = whowin(qipan, X, Y, b, jiziqi);
if (panduan == 1)
{
b = 0; break;
}
} while (1);
}
}
//玩家对战
else
{
char qipan[X][Y];
chushihua(qipan, X, Y);
dayin(qipan, X, Y);
int panduan = 0;
do
{
zuobiao(X, Y);
printf("先手的棋为X\n");
player1(qipan, X, Y);
b++;
dayin(qipan, X, Y);
panduan = whowin2(qipan, X, Y, b, jiziqi);
if (panduan == 1)
{
b = 0; break;
}
zuobiao(X, Y);
printf("后手的棋为O\n");
player2(qipan, X, Y);
b++;
dayin(qipan, X, Y);
panduan = whowin2(qipan, X, Y, b, jiziqi);
if (panduan == 1)
{
b = 0; break;
}
} while (1);
}
printf("\n****** 1继续游戏 2退出游戏 ******\n");
printf("\n是否继续游戏嘛:");
int linshi = 0;
scanf("%d", &linshi);
if(linshi==1)
{
printf("\n\n");
break;
}
case 2: printf("\n游戏结束\n"); a = 2; break;
default: printf("\n输入有误,请重新选择:\n"); break;
}
} while (a != 2);
return 0;
}
自建函数库:
#define _CRT_SECURE_NO_WARNINGS
#include "game.h"
//游戏开头
void kaishi()
{
printf("********* 佰木BM learning ********\n");
printf("**********************************\n");
printf("**********************************\n");
printf("****** 1开始游戏 2退出游戏 ******\n");
printf("**********************************\n");
printf("**********************************\n");
printf("请输入你的选择:");
}
//模式1 人机对战返回1 好友对战返回2
int model1()
{
printf("**********************************\n");
printf("**********************************\n");
printf("**********************************\n");
printf("**** 1人机对战 or 2好友对战 ****\n");
printf("**********************************\n");
printf("**********************************\n");
printf("**********************************\n");
int a = 0;
do {
printf("请输入你的选择:");;
scanf("%d", &a);
if(a==1)
return 1;
else
{
if (a==2)
return 2;
else
printf("\n输入有误,请重新选择\n");
}
} while(1);
}
int model2()
{
printf("\n\n**********************************\n");
printf("**** 1人工智能 or 2人工智障 ****\n");
printf("**********************************\n");
printf("\n请选择人机难度:");
int nandu = 0;
do {
scanf("%d", &nandu);
if(nandu==1)
return nandu;
else
{
if (nandu == 2)
return nandu;
else
printf("\n输入错误请重新输入;");
}
} while (1);
}
//棋盘初始化
void chushihua(char qipan[X][Y], int x, int y)
{
int i = 0;
int j = 0;
for (i = 0; i <= x - 1; ++i)
{
for (j = 0; j <= y - 1; ++j)
qipan[i][j] = ' ';
}
}
//棋盘坐标对应表
void zuobiao(int x, int y)
{
int i = 0;
int j = 0;
for (i = 0; i <= x - 1; ++i)
{
for (j = 0; j <= y - 1; ++j)
{
printf(" (%d,%d) ", i + 1, j + 1);
if (j < y - 1)
printf("|");
}
printf("\n");
for (j = 0; j <= y - 1; ++j)
{
if (i < x - 1)
printf("------- ");
}
printf("\n");
}
return 0;
}
//打印当前棋盘情况
void dayin(char qipan[X][Y], int x, int y)
{
printf("\n");
int i = 0;
int j = 0;
for (i = 0; i <= x - 1; ++i)
{
for (j = 0; j <= y - 1; ++j)
{
printf(" %c ", qipan[i][j]);
if (j < y-1)
printf("|");
}
printf("\n");
for (j = 0; j <= y - 1; ++j)
{
if (i < x - 1)
printf("--- ");
}
printf("\n");
}
printf("\n");
}
//玩家下 (X号棋) 人机对战
void player(char qipan[X][Y], int x, int y)
{
int a = 0, b = 0;
printf("到你(X)下棋了:");
do
{
scanf("%d %d", &a, &b);
if ((qipan[a - 1][b - 1] != ' ') || (a <= 0) || (a > x) || (b <= 0) || (b > y))
printf("\n此位置无效,请重新输入:");
else
{
qipan[a - 1][b - 1] = 'X';
break;
}
} while (1);
}
//玩家1下 (X号棋) 好友对战
void player1(char qipan[X][Y], int x, int y)
{
int a = 0, b = 0;
printf("到先手(X)下棋了:");
do
{
scanf("%d %d", &a, &b);
if ((qipan[a - 1][b - 1] != ' ') || (a <= 0) || (a > x) || (b <= 0) || (b > y))
printf("\n此位置无效,请重新输入:");
else
{
qipan[a - 1][b - 1] = 'X';
break;
}
} while (1);
}
//玩家2下 O号棋)
void player2(char qipan[X][Y], int x, int y)
{
int a = 0, b = 0;
printf("到后手(O)下棋了:");
do
{
scanf("%d %d", &a, &b);
if ((qipan[a - 1][b - 1] != ' ') || (a <= 0) || (a > x) || (b <= 0) || (b > y))
printf("\n此位置无效,请重新输入:");
else
{
qipan[a - 1][b - 1] = 'O';
break;
}
} while (1);
}
//电脑下 (O号棋) (初级难度)
void computer(char qipan[X][Y], int x, int y)
{
int a = 0, b = 0;
printf("到人工智障下棋了:");
do
{
a = rand()% x;
b = rand()% y;
if (qipan[a][b] == ' ')
{
qipan[a][b] = 'O';
printf("(%d,%d)", a+1, b+1);
break;
}
} while (1);
}
// AI电脑 后手 下棋 (三子棋) (O号棋)
void AI(char qipan[X][Y], int b)
{
printf("到AI棋圣下棋了:");
int i = 0, j = 0;
//找自己的两颗棋
for (i = 0; i <= 2; ++i)
{
if ((qipan[i][0] == qipan[i][1]) && (qipan[i][1] == 'O') && (qipan[i][2] == ' '))
{
qipan[i][2] = 'O';
printf("(%d,3)\n", i + 1);
return 0;
}
if ((qipan[i][1] == qipan[i][2]) && (qipan[i][1] == 'O') && (qipan[i][0] == ' '))
{
qipan[i][0] = 'O';
printf("(%d,1)\n", i + 1);
return 0;
}
if ((qipan[i][0] == qipan[i][2]) && (qipan[i][0] == 'O') && (qipan[i][1] == ' '))
{
qipan[i][1] = 'O';
printf("(%d,2)\n", i + 1);
return 0;
}
}
for (j = 0; j <= 2; ++j)
{
if ((qipan[0][j] == qipan[1][j]) && (qipan[0][j] == 'O') && (qipan[2][j] == ' '))
{
qipan[2][j] = 'O';
printf("(3,%d)\n", j + 1);
return 0;
}
if ((qipan[1][j] == qipan[2][j]) && (qipan[1][j] == 'O') && (qipan[0][j] == ' '))
{
qipan[0][j] = 'O';
printf("(1,%d)\n", j + 1);
return 0;
}
if ((qipan[0][j] == qipan[2][j]) && (qipan[0][j] == 'O') && (qipan[1][j] == ' '))
{
qipan[1][j] = 'O';
printf("(2,%d)\n", j + 1);
return 0;
}
}
if ((qipan[0][0] == qipan[1][1]) && (qipan[1][1] == 'O') && (qipan[2][2] == ' '))
{
qipan[2][2] = 'O';
printf("(3,3)\n");
return 0;
}
if ((qipan[0][0] == qipan[2][2]) && (qipan[0][0] == 'O') && (qipan[1][1] == ' '))
{
qipan[1][1] = 'O';
printf("(2, 2)\n");
return 0;
}
if ((qipan[1][1] == qipan[2][2]) && (qipan[1][1] == 'O') && (qipan[0][0] == ' '))
{
qipan[0][0] = 'O';
printf("(1, 1)\n");
return 0;
}
if ((qipan[0][2] == qipan[1][1]) && (qipan[1][1] == 'O') && (qipan[2][0] == ' '))
{
qipan[2][0] = 'O';
printf("(3, 1)\n");
return 0;
}
if ((qipan[0][2] == qipan[2][0]) && (qipan[0][2] == 'O') && (qipan[1][1] == ' '))
{
qipan[1][1] = 'O';
printf("(2, 2)\n");
return 0;
}
if ((qipan[2][0] == qipan[1][1]) && (qipan[1][1] == 'O') && (qipan[0][2] == ' '))
{
qipan[0][2] = 'O';
printf("(1, 3)\n");
return 0;
}
//堵对手的两个棋
for (i = 0; i <= 2; ++i)
{
if ((qipan[i][0] == qipan[i][1]) && (qipan[i][1] == 'X') && (qipan[i][2] == ' '))
{
qipan[i][2] = 'O';
printf("(%d,3)\n", i + 1);
return 0;
}
if ((qipan[i][1] == qipan[i][2]) && (qipan[i][1] == 'X') && (qipan[i][0] == ' '))
{
qipan[i][0] = 'O';
printf("(%d,1)\n", i + 1);
return 0;
}
if ((qipan[i][0] == qipan[i][2]) && (qipan[i][0] == 'X') && (qipan[i][1] == ' '))
{
qipan[i][1] = 'O';
printf("(%d,2)\n", i + 1);
return 0;
}
}
for (j = 0; j <= 2; ++j)
{
if ((qipan[0][j] == qipan[1][j]) && (qipan[0][j] == 'X') && (qipan[2][j] == ' '))
{
qipan[2][j] = 'O';
printf("(3,%d)\n", j + 1);
return 0;
}
if ((qipan[1][j] == qipan[2][j]) && (qipan[1][j] == 'X') && (qipan[0][j] == ' '))
{
qipan[0][j] = 'O';
printf("(1,%d)\n", j + 1);
return 0;
}
if ((qipan[0][j] == qipan[2][j]) && (qipan[0][j] == 'X') && (qipan[1][j] == ' '))
{
qipan[1][j] = 'O';
printf("(2,%d)\n", j + 1);
return 0;
}
}
if ((qipan[0][0] == qipan[1][1]) && (qipan[1][1] == 'X') && (qipan[2][2] == ' '))
{
qipan[2][2] = 'O';
printf("(3,3)\n");
return 0;
}
if ((qipan[0][0] == qipan[2][2]) && (qipan[0][0] == 'X') && (qipan[1][1] == ' '))
{
qipan[1][1] = 'O';
printf("(2, 2)\n");
return 0;
}
if ((qipan[1][1] == qipan[2][2]) && (qipan[1][1] == 'X') && (qipan[0][0] == ' '))
{
qipan[0][0] = 'O';
printf("(1, 1)\n");
return 0;
}
if ((qipan[0][2] == qipan[1][1]) && (qipan[1][1] == 'X') && (qipan[2][0] == ' '))
{
qipan[2][0] = 'O';
printf("(3, 1)\n");
return 0;
}
if ((qipan[0][2] == qipan[2][0]) && (qipan[0][2] == 'X') && (qipan[1][1] == ' '))
{
qipan[1][1] = 'O';
printf("(2, 2)\n");
return 0;
}
if ((qipan[2][0] == qipan[1][1]) && (qipan[1][1] == 'X') && (qipan[0][2] == ' '))
{
qipan[0][2] = 'O';
printf("(1, 3)\n");
return 0;
}
//上述情况都没有的话 抢占中间位置
if (qipan[1][1] == ' ')
{
qipan[1][1] = 'O';
printf("(2, 2)\n");
return 0;
}
if (b == 1) //AI第一手无中间位置 就抢占四个角
{
switch ((rand() % 4 + 1))
{
case 1: qipan[0][0] = 'O'; printf("(1,1)"); return 0;
case 2: qipan[2][2] = 'O'; printf("(3,3)"); return 0;
case 3: qipan[2][0] = 'O'; printf("(3,1)"); return 0;
case 4: qipan[0][2] = 'O'; printf("(1,3)"); return 0;
}
}
if (b == 3) //AI第二手.防止玩家偷鸡,抢四个角的位置
{
if (qipan[0][0] == ' ')
{
qipan[0][0] = 'O';return 0;
}
else
{
if (qipan[2][2] == ' ')
{
qipan[2][3] = 'O'; return 0;
}
else
{
if (qipan[0][2] == ' ')
{
qipan[0][2] = 'O'; return 0;
}
else
{
if (qipan[2][0] == ' ')
{
qipan[2][0] = 'O'; return 0;
}
}
}
}
}
if (b > 1)// 除了上面的情况 随机下
{
int xx = 0, yy = 0;
do
{
xx = rand() % 3;
yy = rand() % 3;
if (qipan[xx][yy] == ' ')
{
qipan[xx][yy] = 'O';
printf("(%d,%d)", xx + 1, yy + 1);
break;
}
} while (1);
}
}
//判断是否取胜 (人机对战) (针对三子棋的判断方法) //出结果了返回1 继续下返回0
int whowin(char qipan[X][Y], int x, int y,int b,int jiziqi)
{
if (b >= (jiziqi * 2 - 1))
{
int win = whowin1(qipan, x, y, b, jiziqi);
if(win!=4)
{
if (win ==3)
{
printf("平局\n\n\n"); return 1;
}
else
{
if (win ==2)
{
printf("很遗憾,你输了,电脑获胜\n 再接再厉\n\n\n"); return 1;
}
else
{
printf("恭喜你获得了胜利\n\n\n"); return 1;
}
}
}
}
return 0;
}
//判断是否取胜 (好友对战) (针对三子棋的判断方法) //出结果了返回1 继续下返回0
int whowin2(char qipan[X][Y], int x, int y, int b, int jiziqi)
{
if (b >= (jiziqi * 2 - 1))
{
int win = whowin1(qipan, x, y, b, jiziqi);
if (win != 4)
{
if (win == 3)
{
printf("平局\n\n\n"); return 1;
}
else
{
if (win == 2)
{
printf("恭喜后手玩家2(O形棋)获胜\n\n\n"); return 1;
}
else
{
printf("恭喜先手玩家1(X形棋)获胜\n\n\n"); return 1;
}
}
}
}
return 0;
}
int whowin1(char qipan[X][Y], int x, int y, int b, int jiziqi) //返回 1玩家赢 2电脑赢(玩家2赢) 3平局 4继续游戏
{
int i = 0, j = 0;
//判断玩家赢
for (i = 0; i <= x - 1; ++i)
{
if ((qipan[i][0] == qipan[i][1]) && (qipan[i][1] == qipan[i][2]) && (qipan[i][0] == 'X'))
return 1;
}
for (j = 0; j <= y - 1; ++j)
{
if ((qipan[0][j] == qipan[1][j]) && (qipan[1][j] == qipan[2][j]) && (qipan[0][j] == 'X'))
return 1;
}
if((qipan[0][0]==qipan[1][1])&&(qipan[1][1] == qipan[2][2])&&(qipan[1][1] =='X'))
return 1;
if ((qipan[0][2] == qipan[1][1]) && (qipan[1][1] == qipan[2][0]) && (qipan[1][1] == 'X'))
return 1;
//判断电脑赢
for (i = 0; i <= x - 1; ++i)
{
if ((qipan[i][0] == qipan[i][1]) && (qipan[i][1] == qipan[i][2]) && (qipan[i][0] == 'O'))
return 2;
}
for (j = 0; j <= y - 1; ++j)
{
if ((qipan[0][j] == qipan[1][j]) && (qipan[1][j] == qipan[2][j]) && (qipan[0][j] == 'O'))
return 2;
}
if ((qipan[0][0] == qipan[1][1]) && (qipan[1][1] == qipan[2][2]) && (qipan[1][1] == 'O'))
return 2;
if ((qipan[0][2] == qipan[1][1]) && (qipan[1][1] == qipan[2][0]) && (qipan[1][1] == 'O'))
return 2;
//其他情况
if (b ==( x * y))
return 3;
else
return 4;
}
头文件 函数声明文件:
#pragma once
#include<stdio.h>
#include<time.h>
#include<stdlib.h>
//棋盘大小
#define X 3
#define Y 3
void kaishi();//游戏开头
void chushihua(char qipan[X][Y], int x, int y);// 棋盘初始化 每个都为空格打印出来及什么都不显示
int model1();//模式1 人机对战返回1 好友对战返回2
int model2();//模式2 确定人机难度 1人工智能 2人工智障
void zuobiao(int x, int y);//棋盘坐标对应表
void dayin(char qipan[X][Y], int x, int y);//打印当前棋盘情况
void player(char qipan[X][Y], int x, int y); //玩家下 (X号棋) 人机对战
void player2(char qipan[X][Y], int x, int y);//玩家2下 好友对战 (O号棋)
void player(char qipan[X][Y], int x, int y);//玩家1下 (X号棋) 好友对战
void computer(char qipan[X][Y], int x, int y); //电脑下 (O号棋)()初级难度
void AI(char qipan[X][Y],int b);//AI下棋
int whowin(char qipan[X][Y], int x, int y, int b, int jiziqi); //判断是否取胜 (针对三子棋的判断方法)
int whowin1(char qipan[X][Y], int x, int y, int b, int jiziqi);// 确定什么棋三连了 返回 1玩家赢 2电脑赢 3平局 4继续游戏
int whowin2(char qipan[X][Y], int x, int y, int b, int jiziqi);//判断是否取胜 (好友对战) (针对三子棋的判断方法) //出结果了返回1 继续下返回0
三子棋 人机对战(人机难度选择) 好友对战
最新推荐文章于 2025-05-05 15:52:33 发布