闲来无事,竟意外发现了三子棋游戏,顺便实现了这个过程,我们一起来看下。
三子棋的实现需要的是五个函数,我用了InitBoard(初始化棋盘函数),Display(打印棋盘函数),Player(玩家), Computer(电脑),Check_Full(判断棋盘是否已满,从而判断输赢)
game.h
#define _CRT_SECURE_NO_WARNINGS
#ifndef __TEST_H__
#define __TEST_H__
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include <Windows.h>
#define ROWS 3
#define COLS 3
void InitBoard(char[ROWS][COLS], int row, int cols);
void Display(char[ROWS][COLS], int row, int cols);
void Player(char[ROWS][COLS], int row, int cols);
void Computer(char[ROWS][COLS], int row, int cols);
int Check_Full(char[ROWS][COLS], int row, int cols);
#endif
game.c
#define _CRT_SECURE_NO_WARNINGS
#include "test.h"
void InitBoard(char arr[ROWS][COLS], int rows, int cols)
{
memset(arr, ' ', ROWS*COLS*sizeof(char));//这个函数是初始化棋盘;
}
void Display(char arr[ROWS][COLS], int rows, int cols)
{
int i;
for (i = 0; i < rows; i++)
{
printf("——————\n");
for (i = 0; i < cols; i++)
{
printf(" %c | %c | %c |\n", arr[i][0], arr[i][1], arr[i][2]);
printf("——————\n");
}
}
}
void Computer(char arr[ROWS][COLS], int rows, int cols)
{
int i = 0;
int j = 0;
while (1)
{
i = rand() % 4;//产生随机数,随机产生不同的数,每次必须产生不同的随机值;
j = rand() % 4;
if (arr[i - 1][j - 1] == ' ')
{
arr[i - 1][j - 1] ='O';//"="是赋值;而"=="是判断
break;
}
}
Check_Full(arr, rows, cols);
}
void Player(char arr[ROWS][COLS], int rows, int cols)
{
int x = 0;
int y = 0;
printf("输入你要放的棋子的坐标");
scanf("%d %d", &x, &y);//%d只能表示输入一个数
while (1)
{
if ((x<4 && x>0) && (y<4 && y>0))
{
if (arr[x - 1][y - 1] == ' ')
{
arr[x - 1][y - 1] = 'X';
break;
}
else
{
printf("此处有棋子,请重新输入");
scanf("%d %d", &x, &y);
}
}
else
{
printf("坐标有误,请重新输入");
scanf("%d", &x, &y);
}
}
Check_Full(arr, rows, cols);
}
int Check_Full(char arr[ROWS][COLS], int rows, int cols)
{
int i = 0;
int j = 0;
for (i = 0; i < rows; i++)
{
if ((arr[i][0] == arr[i][1]) && (arr[i][1] == arr[i][2]) && arr[i][0] != ' ') // 行相同
{
return 0;
}
}
for (i = 0; i < cols; i++)
{
if ((arr[0][i] == arr[1][i]) && (arr[1][i] == arr[2][i]) && arr[0][i] != ' ') //列相同
{
return 0;
}
if ((((arr[0][0] == arr[1][1]) && (arr[1][1] == arr[2][2])) || ((arr[0][2] == arr[1][1]) && (arr[1][1] == arr[2][0]))) && (arr[1][1] != ' '))
{
return 0;
}
}
for (i = 0; i < rows; i++)
{
for (j = 0; j < cols; j++)
{
if (arr[i][j] == ' ')
{
return 1;
}
}
}
return 'P';
}
test.c
#define _CRT_SECURE_NO_WARNINGS
#include "test.h"
void menu()
{
printf("**************************************************\n");
printf("*****************1.play 0.exist**************\n");
printf("**************************************************\n");
}
void game()
{
char arr[ROWS][COLS] = { 0 };
char ret = 0;
InitBoard(arr, ROWS, COLS);
Display(arr, ROWS, COLS);
srand((unsigned int)time(NULL));
while (1)
{
Computer(arr, ROWS, COLS);
Display(arr, ROWS, COLS);
if (Check_Full(arr, ROWS, COLS) == 0)
{
printf("电脑赢\n");
break;
}
if(Check_Full(arr, ROWS, COLS) == 'P')
{
printf("输出是平局\n");
break;
}
Player(arr, ROWS, COLS);
Display(arr, ROWS, COLS);
if (Check_Full(arr, ROWS, COLS) == 0)
{
printf("玩家赢\n");
break;
}
if (Check_Full(arr, ROWS, COLS) == 'P')
{
printf("输出是平局\n");
break;
}
}
}
int main()
{
int input = 0;
do
{
menu();
printf("请选择\n");
scanf("%d", &input);
switch (input)
{
case 1:
game();
case 0:
break;
default:
printf("请重新输入\n");
}
} while (input);
getchar();
return 0;
}
运行效果图