当前版本修改宏常量大小(即n子棋)均可正确运行
1.主文件
//三子棋
#include"three.h"
void meau()
{
printf("******************\n");
printf("*****1.paly*******\n");
printf("*****0.exit*******\n");
}
void game()
{
char z ='a';
char board[HANG][LIE] = {0};//建立棋盘
reboard(board,HANG,LIE);//初始化棋盘
print_board(board, HANG, LIE);//打印棋盘
while (1)//下棋
{
player(board,HANG,LIE);
print_board(board, HANG, LIE);
//判断
z=ifwin(board,HANG,LIE);
if (z != 'C')
break;
computer(board,HANG,LIE);
print_board(board, HANG, LIE);
z = ifwin(board, HANG, LIE);
if (z != 'C')
break;
}
//结算
victory(z);
}
int main()
{
srand((unsigned int)time(NULL));
int input = 0;
do
{
meau();
printf("请选择:");
scanf("%d", &input);
switch (input)
{
case 1:
game();
break;
case 0:
printf("您已退出游戏\n");
break;
default:
printf("输入错误\n");
break;
}
} while (input);
return 0;
}
2.头文件
#pragma once
#include<time.h>
#include<stdlib.h>
#include<stdio.h>
#define HANG 3
#define LIE 3
//初始化
void reboard(char board[HANG][LIE], int han, int lie);
//打印棋盘
void print_board(char board[HANG][LIE], int han, int lie);
//玩家下棋
void player(char board[HANG][LIE],int han,int lie);
//电脑下棋
void computer(char board[HANG][LIE], int han, int lie);
//判断输赢
char ifwin(char board[HANG][LIE], int han, int lie);
//电脑赢# 玩家赢* 平局 P 继续C
//victory 电脑赢# 玩家赢* 平局 P
void victory(char z);
3.游戏内容
#define _CRT_SECURE_NO_WARNINGS
//游戏函数
#include"three.h"
void reboard(char board [HANG][LIE], int han, int lie)//初始化棋盘
{
int x = 0;
int y = 0;
for (x = 0; x < han; x++)
{
for (y = 0; y < lie; y++)
{
board[x][y] = ' ';
}
}
}
void print_board(char board[HANG][LIE], int han, int lie)//打印棋盘
{
int x = 0;
for (x = 0; x < han; x++)
{
int y = 0;
for (y = 0; y < lie; y++)
{
printf(" %c ", board[x][y]);
if(y<lie-1)
printf("|");
}
printf("\n");
if (x < han - 1)
{
int y = 0;
for (y = 0; y < lie; y++)
{
printf("---");
if (y < lie - 1)
printf("|");
}
printf("\n");
}
}
}
void player(char board[HANG][LIE], int han, int lie)//玩家下棋
{
int x = 0;
int y = 0;
printf("玩家请下棋:");
while (1)
{
scanf("%d %d", &x, &y);
if (x >= 1 && x <= han && y >= 1 && y <= lie)
{
if (board[x - 1][y - 1] == ' ')
{
board[x - 1][y - 1] = '*';
break;
}
else
printf("该位置已被占用,请重新输入\n");
}
else
printf("坐标非法,请重新输入\n");
}
}
void computer(char board[HANG][LIE], int han, int lie)//电脑下棋
{
printf("电脑下棋\n");
int x = 0;
int y = 0;
while (1)
{
x = rand() % han;
y = rand() % lie;
if (board[x][y] == ' ')
{
board[x][y] = '#';
break;
}
}
}
//平局返回1
int ping(char board[HANG][LIE], int han, int lie)
{
int x = 0;
for(x=0;x<han;x++)
{
int y=0;
for (y = 0; y < lie; y++)
{
if(board[x][y]==' ')
return 0;
}
}
return 1;
}
char ifwin(char board[HANG][LIE], int han, int lie)//判断输赢返回字符
{
//判断行
int h = 0;
for (h = 0; h < han; h++)
{
int sum = 0;
int n = 0;
for (n = 0; n < lie - 1; n++)
{
if (board[h][n] == board[h][n + 1] && board[h][n] != ' ')
sum++;
}
if (sum==lie-1)
{
return board[h][n];
}
}
//判断列
int li = 0;
for (li = 0; li < lie; li++)
{
int n = 0;
int sum = 0;
for (n = 0; n < han - 1; n++)
{
if (board[n][li] == board[n + 1][li] && board[n][li] != ' ')
sum++;
}
if(sum==han-1)
return board[n][li];
}
//判断对角线
//↘
int x = 0; int sum1 = 0;
for (x = 0; x < han-1; x++)
{
if (board[x][x] == board[x + 1][x + 1] && board[x][x] != ' ')
sum1++;
}
if (sum1==lie-1)
{
return board[0][0];
}
//↗
int a = han-1; int b = 0; int sum2 = 0;
while (b < lie-1 && a >= 0)
{
if (board[a][b] == board[a - 1][b + 1] && board[a][b] != ' ')
sum2++;
b++;
a--;
}
if(sum2==lie-1)
return board[a][b];
//平局?
if (ping(board, HANG, LIE))
{
return 'P';
}
else return 'C';
}
void victory(char z)//接收字符判断谁赢
{
if (z == '#')
printf("电脑赢\n");
if (z == '*')
printf("玩家赢\n");
if (z == 'P')
printf("平局\n");
}
4.总结
还未实现智能堵棋----在循环内判断是否胜利后加一个堵棋的函数?