写这个游戏,我们要先把大概思路的框架搭好:
1.3X3的棋盘
2.玩家下:要选择的位置是否在这个棋盘内,选择的位置是否已有棋子
3.电脑下:通过随机数产生位置坐标,同样要判断选择的位置是否已有棋子
4.不管是玩家还是电脑下完都要判断是否赢了
5.判赢:某行某列或对角线上是否有三个一样的,或棋盘是否满了,满了为平局
//头文件 sanziqi.h
#ifndef __SANZIQI_H__ //防止头文件被重复引用后,当预处理是在主函数里头文件被多次替换而耗时,
//当使用这条语句后,可避免头文件的重复引用
#define __SANZIQI_H__
#define ROW 3
#define COL 3
//菜单
void menu();
//游戏
void game();
//谁赢
void Who_Win(char ret);
//棋盘初始化
void Init_Board(char Board[ROW][COL], int row, int col);
//显示棋盘
void Display(char Board[ROW][COL], int row, int col);
//玩家走棋
void Player(char Board[ROW][COL], int row, int col);
//电脑走棋
void Computer(char Board[ROW][COL], int row, int col);
//判断棋盘是否满
int Is_Full(char Board[ROW][COL], int row, int col);
//判断是否有输赢
char Is_Win(char Board[ROW][COL], int row, int col);
#endif
//sanziqi.c
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<stdlib.h>
#include"sanziqi.h"
void menu()
{
printf("****************\n");
printf("*****1.play*****\n");
printf("*****0.exit*****\n");
printf("****************\n");
}
void Who_Win(char ret)
{
if (ret == 'O')
{
printf("玩家赢\n");
}
else
{
if (ret == 'X')
{
printf("电脑赢\n");
}
else
{
if (ret == 'q')
{
printf("平局\n");
}
}
}
}
void game()
{
char Board[ROW][COL] = { 0 };
char ret = 0;
Init_Board(Board, ROW, COL);
Display(Board, ROW, COL);
while (1)
{
Player(Board, ROW, COL);
printf("玩家走棋\n");
Display(Board, ROW, COL);
ret = Is_Win(Board, ROW, COL);//判断是否有人赢,若有人赢则退出这个循环
if (ret != 0)
{
Who_Win(ret);
break;
}
Computer(Board, ROW, COL);
printf("电脑走棋\n");
Display(Board, ROW, COL);
ret = Is_Win(Board, ROW, COL);//判断是否有人赢,若有人赢则退出这个循环
if (ret != 0)
{
Who_Win(ret);
break;
}
}
}
//初始化棋盘
void Init_Board(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 Display(char Board[ROW][COL], int row, int col)
{
int i = 0;
for (i = 0; i < 3; i++)
{
printf("| %c | %c | %c |\n", Board[i][0], Board[i][1], Board[i][2]);
if (i!= 2)
{
printf("-------------\n");
}
}
}
//玩家下棋
void Player(char Board[ROW][COL], int row, int col)
{
int i = 0;
int j = 0;
printf("请输入你要下的位置>\n");
while (1)
{
scanf("%d %d", &i, &j);
if (i<1 || i>3 || j<1 || j>3)
{
printf("输入错误,请重新输入坐标>\n");
}
else
{
//因为人习惯的坐标是从1开始的,所以输入后坐标要减1
if (Board[i - 1][j - 1] == ' ')
{
Board[i - 1][j - 1] = 'O';
break;
}
else
{
printf("此位置有棋子,请重新输入位置>\n");
}
}
}
}
//电脑下棋
void Computer(char Board[ROW][COL], int row, int col)
{
int i = 0;
int j = 0;
while (1)
{
//电脑的坐标是由随机数产生的
//任何数对某个数去余,假如这个数是是n,则余数的范围是0--(n-1)
i = rand() % 3;
j = rand() % 3;
if (Board[i][j] == ' ')
{
Board[i][j] = 'X';
break;
}
}
}
//判断棋盘是否满了
int Is_Full(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++)
{
if (Board[i][j] == ' ')
{
return 1;
}
}
}
return 0;
}
//判断是否赢有4种情况,还有一种是棋盘满了然后是平局
//1.三行中的某一行相等
//2.三列中的某一列相等
//3.右斜线相等
//4.左斜线相等
//注意:相等但不能等于空格
char Is_Win(char Board[ROW][COL], int row, int col)
{
int i = 0;
int j = 0;
for (i = 0; i < row; i++)
{
if (Board[i][0] == Board[i][1]
&& Board[i][1] == Board[i][2]
&& Board[i][0]!=' ')
return Board[i][0];
}
for (j = 0; j < row; j++)
{
if (Board[0][j] == Board[1][j]
&& Board[1][j] == Board[2][j]
&& Board[0][j]!=' ')
{
return Board[0][j];
}
}
if (Board[0][0] == Board[1][1]
&& Board[1][1] == Board[2][2]
&& Board[0][0]!=' ')
{
return Board[0][0];
}
if (Board[0][2] == Board[1][1]
&& Board[1][1] == Board[2][0]
&& Board[0][2]!=' ')
{
return Board[0][2];
}
if (Is_Full(Board, ROW, COL) == 0)
{
return 'q';
}
return 0;
}
//main.c
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<stdlib.h>
#include<time.h>
#include"sanziqi.h"
int main()
{
int input = 0;
srand((unsigned int) time(NULL));//产生随机数的一个起始时间
do
{
menu();
scanf("%d", &input);
switch (input)
{
case 1:game();
break;
case 0:
break;
default:printf("输入错误,请重新输入>\n");
break;
}
} while (input);
return 0;
}