三子棋的整体思路:
1.打印游戏菜单,包括进入游戏,退出游戏。
2.打印棋盘,同时创建并初始化数组全为空格。
3.开始游戏(保存棋子信息在二维数组中,电脑的棋子为X,玩家棋子为0;)
3.1 .电脑走,检查输赢平局,并打印棋盘。
3.2.玩家走,检查输赢平局,打印棋盘。
函数声明
#ifndef __GAME_H__
#define __GAME_H__
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<time.h>
#define ROW 3
#define COL 3
void InitArr(char arr[ROW][COL], int row, int col);
void PrintBoard(char arr[ROW][COL], int row, int col);
void ComputerMove(char arr[ROW][COL], int row, int col);
void PlayerMove(char arr[ROW][COL], int row, int col);
char IsWin(char arr[ROW][COL], int row, int col);
int IsFull(char arr[ROW][COL], int row, int col);
#endif //__GAME_H__
函数实现
#define _CRT_SECURE_NO_WARNINGS
#include "game.h"
void InitArr(char arr[ROW][COL], int row, int col)//初始化数组,全为空格
{
memset(&arr[0][0], ' ', row*col*sizeof(arr[0][0]));
}
void PrintBoard(char arr[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 (j != col - 1)
{
printf(" %c |", arr[i][j]);
}
else
{
printf(" %c ", arr[i][j]);
}
}
printf("\n");
if (i<row-1)
{
for (j = 0; j < col; j++)
{
if (j != col - 1)
{
printf("---|");
}
else
{
printf("---");
}
}
printf("\n");
}
/*printf(" %c | %c | %c \n", arr[row][0], arr[row][1], arr[row][2]);
if (row < 2)
{
printf("---|---|---\n");
}*/
}
}
void ComputerMove(char arr[ROW][COL], int row, int col)
{
int x = 0;
int y = 0;
printf("电脑走...\n");
while (1)
{
x = rand() % row;//电脑产生0-2的随机数
y = rand() % row;
if (arr[x][y] == ' ')//若棋盘已被占用,重新产生坐标
{
arr[x][y] = 'X';
break;
}
}
}
void PlayerMove(char arr[ROW][COL], int row, int col)
{
int x = 0;
int y = 0;
printf("玩家走...\n");
while (1)
{
printf("请输入坐标\n");
scanf("%d %d", &x, &y);
if (x > 0 && x <= row && y > 0 && y <= col)
{
if (arr[x - 1][y - 1] == ' ')
{
arr[x - 1][y - 1] = 'O';
break;
}
else
{
printf("坐标被占用,请重新输入\n");
}
}
else
{
printf("您的输入有误,请重新输入\n");
}
}
}
int IsFull(char arr[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 (arr[i][j] == ' ')
return 0;
}
}
return 1;
}
//检查是否胜利,每种情况count都要重新初始化为0;
char IsWin(char arr[ROW][COL], int row, int col)
{
int i = 0;
int j = 0;
int count = 0;
for (i = 0; i < row; i++)
{
int count = 0;
if (arr[i][0] != ' ')
{
for (j = 1; j < col; j++)
{
if (arr[i][0] == arr[i][j]) //检查行连续三个相同
{
count++;
}
}
if (count == (col - 1))
{
return arr[i][0];
}
}
}
for (j = 0; j < col; j++)
{
int count = 0;
if (arr[0][j] != ' ')
{ //检查列是否相同
for (i = 1; i < col; i++)
{
if (arr[0][j] == arr[i][j])
{
count++;
}
}
if (count == (row - 1))
{
return arr[0][j];
}
}
}
//检查对角线是否相等
if (arr[0][0] != ' ')
{
count = 0;
for (i = 1; i < row; i++)
{
if (arr[0][0] == arr[i][i])
{
count++;
}
}
if (count == (row - 1))
{
return arr[0][0];
}
}
if (arr[0][2] != ' ')
{
count = 0;
for (i = 1; i < row; i++)
{
if (arr[0][col-1] == arr[i][col-1-i])
{
count++;
}
}
if (count == (row - 1))
{
return arr[0][col-1];
}
}
//平局
if (IsFull(arr, row, col) == 1)
{
return 'D';
}
return ' ';//继续
}
主函数,游戏整体框架实现
#define _CRT_SECURE_NO_WARNINGS
#include "game.h"
void menu()
{
printf("***************************************\n");
printf("************ 1.play **************\n");
printf("************ 2.exit **************\n");
printf("***************************************\n");
}
void game()
{
printf("玩游戏\n");
char arr[ROW][COL] = { 0 };
InitArr(arr, ROW, COL);
PrintBoard(arr, ROW, COL);
char ret = 0;
while (1)
{
ComputerMove(arr, ROW, COL);
ret = IsWin(arr, ROW, COL);
if (ret != ' ')
break;
system("cls");
PrintBoard(arr, ROW, COL);
PlayerMove(arr, ROW, COL);
ret = IsWin(arr, ROW, COL);
if (ret != ' ')
break;
system("cls");
PrintBoard(arr, ROW, COL);
}
if (ret == 'O')
{
printf("玩家胜\n");
}
else if (ret == 'X')
{
printf("电脑胜\n");
}
else if (ret == 'D')
{
printf("平局\n");
}
PrintBoard(arr, ROW, COL);
}
int main()
{
srand((unsigned int)time(NULL));
do
{
int i = 0;
menu();
printf("请选择数字\n");
scanf("%d", &i);
if (i == 1)
{
game();
}
else if (i == 0)
{
printf("退出游戏\n");
break;
}
else
{
printf("您的输入有误,请您重新选择\n");
}
} while (1);
system("pause");
return 0;
}