三子棋游戏思路:
1.利用二维数组打印棋盘
2.电脑下子
3.判断是否输赢,是否棋盘已经满了
4.玩家下子
5.判断是否输赢,是否棋盘已经满了
接下来就是把这些功能变成一个一个的函数了,有打印棋盘函数,玩家下子函数,电脑下子函数,判断输赢函数,判断棋盘是不是满了的函数
代码如下
头文件game.h
#ifndef _GAME_H__
#define _GAME_H__
#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
#include<windows.h>
#include<stdlib.h>
#include<time.h>
#include<math.h>
#define row 3
#define col 3
void meau();
void play();
void init(char arr[row][col],int ROW,int COL);
void display(char arr[row][col],int ROW, int COL);
void player(char arr[row][col], int ROW, int COL);
void computer(char arr[row][col], int ROW, int COL);
int IsFull(char arr[row][col], int ROW, int COL);
int IsWin(char arr[row][col], int ROW, int COL);
#endif
game.c
#include"game.h"
void meau()
{
printf("***********************************\n");
printf("******1.play 0.exit*****\n");
printf("***********************************\n");
}
void init(char arr[row][col], int ROW, int COL)
{
int j = 0, i = 0;
for (i = 0; i < row; i++)
{
for (j = 0; j < col; j++)
{
arr[i][j] = ' ';
}
}
}
void display(char arr[row][col], int ROW, int COL)
{
int i = 0;
for (i = 0; i < row; i++)
{
printf(" %c|%c |%c \n",arr[0][i],arr[1][i],arr[2][i]);
if (i < 2)
{
printf("--|--|--");
}
printf("\n");
}
}
void player(char arr[row][col], int ROW, int COL)
{
int x = 0, y = 0;
while (1)
{
printf("请输入坐标:");
scanf("%d%d", &x, &y);
x--;
y--;
if (((x >= 0) && (x <= 2)) && ((y >= 0) && (y <= 2)))
{
if (arr[x][y] == ' ')
{
arr[x][y] = 'X';
return 0;
}
}
else
{
printf("输入坐标有误!\n");
}
}
}
void computer(char arr[row][col], int ROW, int COL)
{
int x = 0;
int y = 0;
while (1)
{
x = rand() % row;
y = rand() % col;
if (arr[x][y] == ' ')
{
arr[x][y] = '$';
return 0;
}
}
}
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;
}
int IsWin(char arr[row][col], int ROW, int COL)
{
int i = 0;
for (i = 0; i < row; i++)
{
if ((arr[i][0] == arr[i][1]) && (arr[i][1] == arr[i][2]) && (arr[i][0] != ' '))
{
return arr[i][0];
}
}
for (i = 0; i < col; i++)
{
if ((arr[0][i] == arr[1][i]) && (arr[1][i] == arr[2][i]) && (arr[0][i] != ' '))
{
return arr[0][i];
}
}
if ((arr[0][0] == arr[1][1]) && (arr[1][1] == arr[2][2]) && (arr[0][0] != ' '))
{
return arr[0][0];
}
if ((arr[0][2] == arr[1][1]) && (arr[1][1] == arr[2][0]) && (arr[0][2] != ' '))
{
return arr[0][2];
}
if (IsFull(arr, row, col))//判断棋盘是否满了
{
return 'q';
}
return ' ';
}
void play()
{
char ret = 0;
char arr[row][col];
init(arr, row, col);//初始化棋盘
display(arr, row, col);//打印棋盘
do
{
computer(arr, row, col);//电脑走
display(arr, row, col);
ret = IsWin(arr, row, col);//判断输赢
if (ret != ' ')
{
break;
}
player(arr, row, col);//玩家走
display(arr, row, col);
ret = IsWin(arr, row, col);//判断输赢
} while (ret == ' ');
if (ret == 'X')
{
printf("玩家赢!\n");
}
else if (ret == '$')
{
printf("电脑赢!\n");
}
else if (ret == 'q')
{
printf("平局!\n");
}
}
test.c
#include"game.h"
int main()
{
int input = 0;
srand((unsigned int)time(NULL));
do
{
meau();
printf("请选择:");
scanf("%d", &input);
switch (input)
{
case 1:
play();
break;
case 0:
break;
default:
printf("选择错误,请重新选择!\n");
break;
}
} while (input);
}
在我看来这个小游戏的难点在于电脑下棋,应该使用产生随机数函数rand
rand函数不是真正的随机数生成器,而srand()会设置供rand()使用的随机数种子。如果你在第一次调用rand()之前没有调用srand(),那么系统会为你自动调用srand()。而使用同种子相同的数调用 rand()会导致相同的随机数序列被生成。
所以我在游戏中的思路在主函数的前面通常可以利用系统时间来改变系统的种子值,即srand(time(NULL)),可以为rand函数提供不同的种子值,进而产生不同的随机数序列
对本游戏进行了测试
三种可能都能实现