1.游戏步骤
1.初始化棋盘
2.电脑下棋
3.判断输赢
4.显示棋盘
5.人下棋
6.判断输赢
7.显示棋盘
2~7应该在循环体中,直到判断出输赢,然后跳出循环
2.声明函数
头文件代码块
#ifndef __SANZIQI_H__
#define __SANZIQI_H__
#define ROW 3
#define CLU 3
//1.初始化棋盘
void initBoard(char arr[ROW][CLU], int row, int clu);
//2.电脑下棋
void cmpPlay(char arr[ROW][CLU], int row, int clu);
//4.人下棋
void humPlay(char arr[ROW][CLU], int row, int clu);
//5.显示棋盘
void displayBoard(char arr[ROW][CLU], int row, int clu);
//6.判断输赢
char isWin(char arr[ROW][CLU], int row, int clu);
#endif
3.定义函数
源文件代码
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <stdlib.h>
#include "test.h"
void game()//游戏过程
{
char arr[3][3] = {0};
initBoard(arr,ROW,CLU);
while(1)
{
char c = ' ';
cmpPlay(arr,ROW,CLU);
displayBoard(arr,ROW,CLU);
c = isWin(arr,ROW,CLU);
if(c == 'O')
{
printf("电脑赢\n");
break;
}
else if(c == 'X')
{
printf("you win\n");
displayBoard(arr,ROW,CLU);
break;
}
else if(c == 'P')
{
printf("平局\n");
displayBoard(arr,ROW,CLU);
break;
}
humPlay(arr,ROW,CLU);
c = isWin(arr,ROW,CLU);
if(c == 'O')
{
printf("电脑赢\n");
break;
}
else if(c == 'X')
{
printf("you win\n");
displayBoard(arr,ROW,CLU);
break;
}
else if(c == 'P')
{
printf("平局\n");
displayBoard(arr,ROW,CLU);
break;
}
}
}
//判断输赢
char isWin(char arr[ROW][CLU], int row, int clu)
{
//电脑赢
if(((arr[0][0] == arr[0][1] && arr[0][1] == arr[0][2])
&&(arr[0][1] == 'O'))
||((arr[1][0] == arr[1][1] && arr[1][1] == arr[1][2])
&&(arr[1][1] == 'O'))
||((arr[2][0] == arr[2][1] && arr[2][1] == arr[2][2])
&&(arr[2][1] == 'O'))//第一行或第二行或第三行数组元素全为‘O’
||((arr[0][0] == arr[1][0] && arr[1][0] == arr[2][0])
&&(arr[1][0] == 'O'))
||((arr[0][1] == arr[1][1] && arr[1][1] == arr[2][1])
&&(arr[1][1] == 'O'))
||((arr[0][2] == arr[1][2] && arr[1][2] == arr[2][2])
&&(arr[1][2] == 'O'))//第一列或第二列或第三列数组元素全为‘O’
||((arr[0][0] == arr[1][1] && arr[1][1] == arr[2][2])
&&(arr[1][1] == 'O'))
||((arr[0][2] == arr[1][1] && arr[1][1] == arr[2][0])
&&(arr[1][1] == 'O')))//两条对角线其中一条对角线数组元素全为‘O’
return 'O';
//人赢
else if(((arr[0][0] == arr[0][1] && arr[0][1] == arr[0][2])
&&(arr[0][1] == 'X'))
||((arr[1][0] == arr[1][1] && arr[1][1] == arr[1][2])
&&(arr[1][1] == 'X'))
||((arr[2][0] == arr[2][1] && arr[2][1] == arr[2][2])
&&(arr[2][1] == 'X'))//第一行或第二行或第三行数组元素全为‘X’
||((arr[0][0] == arr[1][0] && arr[1][0] == arr[2][0])
&&(arr[1][0] == 'X'))
||((arr[0][1] == arr[1][1] && arr[1][1] == arr[2][1])
&&(arr[1][1] == 'X'))
||((arr[0][2] == arr[1][2] && arr[1][2] == arr[2][2])
&&(arr[1][2] == 'X'))//第一列或第二列或第三列数组元素全为‘X’
||((arr[0][0] == arr[1][1] && arr[1][1] == arr[2][2])
&&(arr[1][1] == 'X'))
||((arr[0][2] == arr[1][1] && arr[1][1] == arr[2][0])
&&(arr[1][1] == 'X')))//两条对角线其中一条对角线数组元素全为‘X’
return 'X';
//平局
else
{
int i = 0;
for(i = 0; i < 3; i++)
{
int j = 0;
for(j = 0; j < 3; j++)
{
if( arr[i][j] == ' ')
return 'q';
}
return 'P';
}
}
}
//人下棋
void humPlay(char arr[ROW][CLU], int row, int clu)
{
do
{
printf("请输入坐标(x,y)->\n");
int x = 0;
int y = 0;
scanf("%d%d",&x,&y);
x = x - 1;
y = y - 1;
if(arr[x][y]==' ')
{
arr[x][y] = 'X';
break;
}
else
{
printf("输入错误,请重新输入\n");
}
}while(1);
}
//电脑下棋
void cmpPlay(char arr[ROW][CLU], int row, int clu)
{
while(1)
{
int x = rand()%3;
int y = rand()%3;
if(arr[x][y] == ' ')
{
arr[x][y] = 'O';
break;
}
}
}
//棋盘显示
void displayBoard(char arr[ROW][CLU],
int row, int clu)
{
int i = 0;
for(i = 0; i < 3; i++)
{
int j = 0;
for(j = 0; j < 3; j++ )
{
printf("%2c|",arr[i][j]);
}
printf("\n");
printf("_________\n");
}
}
//初始化棋盘
void initBoard(char arr[ROW][CLU], int row, int clu)
{
int i = 0;
for(i = 0; i < 3; i++)
{
int j = 0;
for(j = 0; j < 3; j++ )
{
arr[i][j] = ' ';
}
}
}
//游戏菜单
int meau()
{
int choose = 0;
printf("*********************\n");
printf("********1.play*******\n");
printf("********0.exit*******\n");
printf("*********************\n");
printf("请输入->\n");
scanf("%d", &choose);
return choose;
}
int main()
{
int choose = 0;
do
{
choose = meau();
switch (choose)
{
case 1:
game();
break;
case 0:
printf("退出游戏、n");
break;
default:
printf("输入错误,请重新输入:\n");
break;
}
} while (choose);
return 0;
}
运行结果
菜单选择1.play:
菜单选择输入错误:
输入正确坐标:
输入错误坐标:
判断出输赢: