一 主函数
#define _CRT_SECURE_NO_WARNINGS 1
#define _WINSOCK_DEPRECATED_NO_WARNINGS
#include<stdio.h>
#include"game.h"
#include"game.c"
void meau()
{
printf("*************************************\n");
printf("*************************************\n");
printf("*************************************\n");
printf("*****1 play or 0 exit*****\n");
printf("*************************************\n");
printf("*************************************\n");
printf("*************************************\n");
}
void game()
{
char board[ROW][COL] = { 0 };//生成数组
initboard(board, ROW, COL);//创建棋盘;
displayboard(board, ROW, COL);
while (1)//下棋循环,没有break就死循环;
{
char ret = ' ';//对ret进行初始化;
player1move(board, ROW, COL);//玩家下
displayboard(board, ROW, COL);//展示棋盘;
ret = win(board, ROW, COL);//给ret一个返回值;
if (ret == '*')//判断是否胜利,下同
{
printf("玩家1赢\n");
break;
}
else if (ret == '0')
{
printf("玩家2赢\n");
break;
}
else if(ret=='x')
{
printf("平局\n");
break;
}
computermove(board, ROW, COL);
displayboard(board, ROW, COL);
ret = win(board, ROW, COL);
if (ret == '*')
{
printf("玩家1赢\n");
break;
}
else if (ret == '0')
{
printf("玩家2赢\n");
break;
}
else if (ret == 'x')
{
printf("平局\n");
break;
}
}
}
int main()//主函数
{
int input = 0;
do
{
meau();//生成菜单。
printf("请选择:>\n");
scanf("%d", &input);//玩家输入1或2
switch (input)//switch分支,按照玩家输入的数,选择是否开始游戏。
{
case 1:
printf("开始游戏\n");
game();//最重要的游戏运行程序;
printf("游戏结束,是否继续?\n");
break;
case 0:
printf("退出,欢迎下次继续\n");
break;
default:
printf("输入错误,请在输入一次\n");
break;
}
} while (input);//若输入1,则恒为真;若输入0,则为假,直接跳过。
return 0;
}
二 游戏运行程序
1 生成棋盘
void initboard(char board[ROW][COL], int row, int col)//生成棋盘;两次循环,对应二维数组;
{
int i = 0;
int j = 0;
for (i = 0; i < row; i++)
{
for (j = 0; j < col; j++)
{
board[i][j] = ' ';//令数组元素初始为零
}
}
}
2展示棋盘
void displayboard(char board[ROW][COL], int row, int col)
{
Sleep(300);//停止300秒
system("cls");//清空屏幕中的内容
int i = 0;
for (i = 0; i < row; i++)
{
int j = 0;
for (j = 0; j < col; j++)//打印分割行
{
printf(" %c ", board[i][j]);
if (j < col - 1)
printf("|");
}
int a = i + 1;
printf("%d", a);
printf("\n");
if (i < row - 1)//打印列
{
for (j = 0; j < col; j++)
{
printf("---");
if (j < col - 1)
printf("|");
}
printf("\n");
}
}
int j = 0;//打印棋盘的坐标
for (j = 0; j < col; j++)
{
printf(" %d ", j + 1);
}
printf("\n");
}
3玩家轮流下棋
void player1move(char board[ROW][COL], int row, int col)
{
int x = 0;
int y = 0;
while (1)
{
printf("\n");
printf("请玩家1下棋:>\n");
scanf("%d%d", &x, &y);
if (x >= 1 && x <= ROW && y >= 1 && y <= COL)//判断是否落子合法
{
if (board[x - 1][y - 1] == ' ')//判断落子位置是否有其他的棋子
{
board[x - 1][y - 1] = '*';
break;
}
else
{
printf("该位置已有棋子:%c,请重新下棋\n", board[x - 1][y - 1]);
}
}
else
{
printf("非法下棋,请重新输入\n");
}
}
}
4判断输赢
char win(char board[ROW][COL], int row, int col)//是否胜利
{
int i = 0;
for (i = 0; i < row; i++)//行相等
{
if (board[i][0] == board[i][1]&& board[i][1]== board[i][2] && board[i][2]== '*')
{
return ret = '*';
break;
}
else if (board[i][0] == board[i][1] && board[i][1] == board[i][2] && board[i][2] == '0')
{
return ret = '0';
break;
}
}
for (i = 0; i < col; i++)//列相等
{
if (board[0][i] == board[1][i] && board[2][i] == board[1][i] && board[2][i] == '*')
{
return ret = '*';
break;
}
else if (board[0][i] == board[1][i] && board[2][i] == board[1][i] && board[2][i] == '0')
{
return ret = '0';
break;
}
}
if (board[0][0] == board[1][1] && board[2][2] == board[1][1] && board[0][0] == '*')//分别判断正斜是否相等
{
return ret = '*';
}
else if (board[0][0] == board[1][1] && board[2][2] == board[1][1] && board[0][0] == '0')
{
return ret = '0';
}
if (board[2][0] == board[1][1] && board[1][1] == board[0][2] && board[1][1] == '*')
{
return ret = '*';
}
if (board[2][0] == board[1][1] && board[1][1] == board[0][2] && board[1][1] == '0')
{
return ret = '0';
}
int n = 0;
for (i = 0; i < row; i++)//判断是否平局
{
int j = 0;
for (j = 0; j < col; j++)
{
if (board[i][j] == ' ')
n++;
}
}//如果没有一个位置是空格,那么n==0,则棋盘已经下满
if (n == 0)
return ret = 'x';
printf("n=%d", n);
}
三 运行效果
四 总共的三个文件
1 主文件test.c
#define _CRT_SECURE_NO_WARNINGS 1
#define _WINSOCK_DEPRECATED_NO_WARNINGS
#include<stdio.h>
#include"game.h"
#include"game.c"
void meau()
{
printf("*************************************\n");
printf("*************************************\n");
printf("*************************************\n");
printf("*****1 play or 0 exit*****\n");
printf("*************************************\n");
printf("*************************************\n");
printf("*************************************\n");
}
void game()
{
char board[ROW][COL] = { 0 };//生成数组
initboard(board, ROW, COL);//创建棋盘;
displayboard(board, ROW, COL);
while (1)//下棋循环,没有break就死循环;
{
char ret = ' ';//对ret进行初始化;
player1move(board, ROW, COL);//玩家下
displayboard(board, ROW, COL);//展示棋盘;
ret = win(board, ROW, COL);//给ret一个返回值;
if (ret == '*')//判断是否胜利,下同
{
printf("玩家1赢\n");
break;
}
else if (ret == '0')
{
printf("玩家2赢\n");
break;
}
else if(ret=='x')
{
printf("平局\n");
break;
}
computermove(board, ROW, COL);
displayboard(board, ROW, COL);
ret = win(board, ROW, COL);
if (ret == '*')
{
printf("玩家1赢\n");
break;
}
else if (ret == '0')
{
printf("玩家2赢\n");
break;
}
else if (ret == 'x')
{
printf("平局\n");
break;
}
}
}
int main()//主函数
{
int input = 0;
do
{
meau();//生成菜单。
printf("请选择:>\n");
scanf("%d", &input);//玩家输入1或2
switch (input)//switch分支,按照玩家输入的数,选择是否开始游戏。
{
case 1:
printf("开始游戏\n");
game();//最重要的游戏运行程序;
printf("游戏结束,是否继续?\n");
break;
case 0:
printf("退出,欢迎下次继续\n");
break;
default:
printf("输入错误,请在输入一次\n");
break;
}
} while (input);//若输入1,则恒为真;若输入0,则为假,直接跳过。
return 0;
}
2 game.c
#include"game.h"
#define _CRT_SECURE_NO_WARNINGS 1
char ret;
void initboard(char board[ROW][COL], int row, int col)//生成棋盘;两次循环,对应二维数组;
{
int i = 0;
int j = 0;
for (i = 0; i < row; i++)
{
for (j = 0; j < col; j++)
{
board[i][j] = ' ';//令数组元素初始为零
}
}
}
void displayboard(char board[ROW][COL], int row, int col)
{
Sleep(300);//停止300秒
system("cls");//清空屏幕中的内容
int i = 0;
for (i = 0; i < row; i++)
{
int j = 0;
for (j = 0; j < col; j++)//打印分割行
{
printf(" %c ", board[i][j]);
if (j < col - 1)
printf("|");
}
int a = i + 1;
printf("%d", a);
printf("\n");
if (i < row - 1)//打印列
{
for (j = 0; j < col; j++)
{
printf("---");
if (j < col - 1)
printf("|");
}
printf("\n");
}
}
int j = 0;//打印棋盘的坐标
for (j = 0; j < col; j++)
{
printf(" %d ", j + 1);
}
printf("\n");
}
void player1move(char board[ROW][COL], int row, int col)
{
int x = 0;
int y = 0;
while (1)
{
printf("\n");
printf("请玩家1下棋:>\n");
scanf("%d%d", &x, &y);
if (x >= 1 && x <= ROW && y >= 1 && y <= COL)//判断是否落子合法
{
if (board[x - 1][y - 1] == ' ')//判断落子位置是否有其他的棋子
{
board[x - 1][y - 1] = '*';
break;
}
else
{
printf("该位置已有棋子:%c,请重新下棋\n", board[x - 1][y - 1]);
}
}
else
{
printf("非法下棋,请重新输入\n");
}
}
}
void computermove(char board[ROW][COL], int row, int col)
{
int j = 0;
int x = 0;
int y = 0;
while (1)
{
printf("\n");
printf("请玩家2下棋:>\n");
scanf("%d%d", &x, &y);
if (x >= 1 && x <=ROW && y >= 1 && y <= COL)
{
if (board[x - 1][y - 1] == ' ')
{
board[x - 1][y - 1] = '0';
break;
}
else
{
printf("该位置已有棋子:%c,请重新下棋\n", board[x - 1][y - 1]);
}
}
else
{
printf("非法下棋,请重新输入\n");
}
}
}
char win(char board[ROW][COL], int row, int col)//是否胜利
{
int i = 0;
for (i = 0; i < row; i++)//行相等
{
if (board[i][0] == board[i][1]&& board[i][1]== board[i][2] && board[i][2]== '*')
{
return ret = '*';
break;
}
else if (board[i][0] == board[i][1] && board[i][1] == board[i][2] && board[i][2] == '0')
{
return ret = '0';
break;
}
}
for (i = 0; i < col; i++)//列相等
{
if (board[0][i] == board[1][i] && board[2][i] == board[1][i] && board[2][i] == '*')
{
return ret = '*';
break;
}
else if (board[0][i] == board[1][i] && board[2][i] == board[1][i] && board[2][i] == '0')
{
return ret = '0';
break;
}
}
if (board[0][0] == board[1][1] && board[2][2] == board[1][1] && board[0][0] == '*')//分别判断正斜是否相等
{
return ret = '*';
}
else if (board[0][0] == board[1][1] && board[2][2] == board[1][1] && board[0][0] == '0')
{
return ret = '0';
}
if (board[2][0] == board[1][1] && board[1][1] == board[0][2] && board[1][1] == '*')
{
return ret = '*';
}
if (board[2][0] == board[1][1] && board[1][1] == board[0][2] && board[1][1] == '0')
{
return ret = '0';
}
int n = 0;
for (i = 0; i < row; i++)//判断是否平局
{
int j = 0;
for (j = 0; j < col; j++)
{
if (board[i][j] == ' ')
n++;
}
}//如果没有一个位置是空格,那么n==0,则棋盘已经下满
if (n == 0)
return ret = 'x';
}
3 game.h
#pragma once
#define ROW 3
#define COL 3
#define _CRT_SECURE_NO_WARNINGS 1
void initboard(char board[ROW][COL], int row, int col);
void displayboard(char board[ROW][COL], int row, int col);
void player1move(char board[ROW][COL], int row, int col);
void computermove(char board[ROW][COL], int row, int col);
char win(char board[ROW][COL], int row, int col);
#include<stdio.h>
#include<windows.h>
#include<stdlib.h>