1.游戏介绍:
三子棋是一种简单而又经典的棋类游戏,通常是由两名玩家进行。目标是在一个3x3的棋盘上,通过将自己的棋子(通常是"X"和"O")放置在棋盘的空格上,以先完成3子连线(横、竖、斜线)为胜利条件。
2.代码实现:
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef unsigned int uint;
typedef unsigned long long ull;
typedef long double ld;
#define pii pair<int,int>
#define pll pair<ll,ll>
#define pil pair<int,ll>
#define pli pair<ll,int>
#define se second
#define fi first
#define endl '\n'
#define rep(i, a, b) for (int i=a;i<b;++i)
#define per(i, a, b) for (register int i=a;i>b;--i)
#define IOS ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);
const ll MOD = 998244353;
const int N = 1e5 + 10;
void init_menu()
{
printf("*******************\n");
printf("**** 1.play ****\n");
printf("**** 0.exit ****\n");
printf("*******************\n");
printf("请输入数字确定是否进入游戏\n");
}
void game_menu(int arr[][5])
{
rep(x,0,9)
printf(" - ");
printf("\n");
rep(i,1,4)
{
rep(j,1,5)
{
printf(" ");
switch(arr[i][j])
{
case 0: printf("| ");break;
case 1: printf("| * ");break;
case 2: printf("| # ");break;
}
}
printf("\n");
if(i<4){
rep(x,0,9)
printf(" - ");
}
printf("\n");
}
}
int is_win(int arr[][5])
{
rep(i,1,4)
{
if(arr[i][1]==arr[i][2]&&arr[i][2]==arr[i][3]&&arr[i][1])
{
if(arr[i][1]==1)
return 1;
else return 2;
}
if(arr[1][i]==arr[2][i]&&arr[2][i]==arr[3][i]&&arr[1][i])
{
if(arr[1][i]==1)
return 1;
else return 2;
}
}
if(arr[1][1]==arr[2][2]&&arr[2][2]==arr[3][3]&&arr[1][1])
{
if(arr[1][1]==1)
return 1;
else return 2;
}
if(arr[1][3]==arr[2][2]&&arr[2][2]==arr[3][1]&&arr[1][3])
{
if(arr[3][1]==1)
return 1;
else return 2;
}
rep(i,1,4)
{
rep(j,1,4)
{
if(!arr[i][j])
return 0;
}
}
return 3;
}
void game(int arr[][5])
{
game_menu(arr);
while(1)
{
printf("玩家下棋,请输入下棋坐标\n");
int x,y;
while(1)
{
scanf("%d%d",&x,&y);
if(x>0&&x<4&&y>0&&y<4&&arr[x][y]==0)
break;
else
printf("坐标错误,请重新输入\n");
}
arr[x][y]=1;
game_menu(arr);
int answer=is_win(arr);
if(answer==1)
{
printf("玩家赢!恭喜你!\n");
break;
}
else if(answer==3)
{
printf("平局,欢迎再来!\n");
break;
}
printf("电脑下棋\n");
while(1)
{
x=rand()%3+1,y=rand()%3+1;
if(arr[x][y]==0)
break;
}
arr[x][y]=2;
game_menu(arr);
answer=is_win(arr);
if(answer==2)
{
printf("电脑赢!继续加油!\n");
break;
}
else if(answer==3)
{
printf("平局,欢迎再来!\n");
break;
}
}
}
int main() {
srand((uint)time(NULL));
int choose=1;
int tap[5][5]={0};
while(choose)
{
init_menu();
scanf("%d",&choose);
if(choose==1)
{
game(tap);
}
else if(choose!=0)
{
printf("输入数字错误,请重新输入\n");
}
}
printf("游戏结束\n");
return 0;
}
3.代码基本逻辑:
通过 init_menu() 函数选择是否游戏,将游戏主体逻辑封装在 game() 函数中, 通过game_menu函数封装游戏界面,is_win 函数判断游戏结局。
4.拓展:
本文中的电脑下棋逻辑是根据随机判断的,如果根据博弈判断下棋的话,最终只可能是平局,及开局对角线对子,两点堵的逻辑。