1.为实现三子棋功能,首先我们要理清需要分几步
简单的游戏界面实现;棋盘的打印;玩家下棋;电脑下棋;判断输赢;可重复游戏;
需要创建这五个函数,最后来组合实现三子棋功能;
2.关于不愿暴露自己编写代码的具体内容
如果你不想实现这五个函数的具体过程被别人看到,可以单独放在一个源文件中,并创建一个头文件,右击项目名称,属性,常规,配置类型,改为静态库形式,然后生成即可,把头文件和静态文件给别人使用。
第一步整体框架构造
void test()
{
srand((unsigned int)time(NULL));//执行一次就够了,下面会介绍用处
int input = 0;
do
{
screen();//游戏界面函数
scanf("%d", &input);//选择是否开始或结束游戏
switch (input)
{
case 1:game(); break;
case 0:printf("退出游戏\n"); break;//输入0才可以使while条件为假不执行终止
default:printf("请重新输入\n"); break;
}
} while (input);
}
游戏界面显示实现
void screen()
{
printf("........................\n");
printf("...... 1. Play ......\n");
printf("...... 0.退出游戏 ......\n");
printf("........................\n");
}
time时间戳函数,time(NULL)用来获取系统现在时间,它的返回值为从 00:00:00 GMT, January 1, 1970 到现在所持续的秒数(使用需引用头文件time.h),srand实现随机数需要先给他一个随机值,此处srand函数(需要引用头文件stdlib.h),(unsigned int)是将time转换为无符号整形。
真正产生随机数是不可能的,只能产生伪随机数。
srand函数的使用是为了rand()使用做准备。rand()用来实现电脑下棋。
二 .game过程分步实现
void game()
{
//初始化棋盘为全空格' ',才可以看不见
char ches[row][rank] = { 0 };//放# *来下棋
empt(ches, row, rank);//初始化棋盘
int m;
chessboard(ches, row, rank);
while (1)
{
replay(ches, row, rank);
chessboard(ches, row, rank);
m = win(ches, row, rank);
if (m != 'n')//谁都没赢,也没下满返回n
{
break;
}
cumpter(ches, row, rank);
chessboard(ches, row, rank);
m = win(ches, row, rank);
if (m != 'n')
{
break;
}
}
if (m == '*')
{
printf("电脑获胜\n");
}
else if (m == '#')
{
printf("你赢了\n");
}
else
{
printf("平局\n");
}
//chessboard(chess, row, rank);
}
第er部:棋盘的打印
首先我们要想需要什么样子的棋盘,最先能想到的应该是这种
棋盘内容初始化
void empt(char chesn[row][rank],int ROW,int RANK)//把二维数组传过来,定义两个整形接收row,rank
{
int i;
int j;
for (i = 0; i < ROW; i++)
{
for (j = 0; j <RANK; j++)
{
chesn[i][j] = ' ';//kong
}
}
}
那么我们可以用|和---来实现棋盘打印
void chessboard(char chess[row][rank], int ROW, int RANK)//不直接用roe,rank为了以后方便改动,不用每次变动需要全局变量
{
//棋盘,我们需要行列变量来控制打印,因此创建两个变量
int i;
int j;
//按照行列打印
for (i = 0; i<ROW; i++)//控制行打印
{
for (j = 0; j <RANK; j++)//控制列打印
{
printf(" %c ", chess[i][j]);//参数输入
if (j <RANK - 1)//最后一列不需要|
{
printf("|");
}
}
printf("\n");//注意,先把第一行打印结束才换行
if (i <ROW - 1)//最后一行不需打印---
{
for (j = 0; j <RANK; j++)
{
printf("---");
if (j <RANK - 1)//让棋盘好看一点
{
printf("|");
}
}
printf("\n");
}
}
}
人下棋
void replay(char chess[row][rank], int ROW, int RANK)
{
printf("请输入行列进行下棋:");
int i=1;
int j=1;
scanf("%d %d", &i, &j);
if (i>0&&i <= ROW&&j>0 && j <= RANK)
{
if (chess[i - 1][j - 1] == ' ')//用户输入没有从0下标开始的概念
{
chess[i - 1][j - 1] = '#';//之后没进行初始化直接打印出来
}
else
{
printf("该位置已被占用!\n");
}
}
else
{
printf("超出棋盘范围请重新输入\n");
}
}
电脑下棋
rand产生一个0-0x7fff的随机数,最大为32767。
void cumpter(char chess[row][rank], int ROW, int RANK)
{
printf("电脑下棋\n");
int i;
int j;
while (1)
{
i = rand() % ROW;//0~2
j = rand() % RANK;
if (chess[i][j] == ' ')
{
chess[i][j] = '*';
break;
}
}
}
判断输赢
int win(char chess[row][rank], int ROW, int RANK)
{
int i;
int j;
//行
for (i = 0; i < ROW; i++)
{
if (chess[i][0]==chess[i][1]&& chess[i][1]==chess[i][2] && chess[i][1] != ' ')
{
return chess[i][0];
}
}
//列
for (j = 0; j < RANK; j++)
{
if (chess[0][j]==chess[1][j] && chess[1][j]==chess[2][j] && chess[1][j] != ' ')
{
return chess[0][j];
}
}
//对角线
if (chess[0][0] ==chess[1][1]&& chess[1][1]==chess[2][2]&& chess[2][2] != ' ')
{
return chess[1][1];
}
if (chess[0][2] == chess[1][1] && chess[1][1] == chess[2][0] && chess[1][1] != ' ')
{
return chess[1][1];
}
//平局
if (full(chess, row, rank) == 1)
{
return 'c';
}
return 'n';
}
平局判断
只用于本文件的函数可用static关键字,这种代码习惯比较好。
static int full(char chess[row][rank], int ROW, int RANK)//判断满不满
{
int i;
int j;
for (i = 0; i < ROW; i++)
{
for (j = 0; j < RANK; j++)
{
if (chess[i][j] == ' ')
return 0;
}
}
return 1;//manle
}
头文件
#include<stdio.h>
#define row 3//3行
#define rank 3//3列
#include<time.h>
#include<stdlib.h>
//初始化函数
void empt(char chesn[row][rank], int ROW, int RANK);
//如果不单独定义,别人想单独用这个功能会实现不了,因为没有char chess
//打出棋盘
void chessboard(char chess[row][rank], int ROW, int RANK);
//操作棋盘人下
void replay(char chess[row][rank], int ROW, int RANK);
//电脑下随机下
void cumpter(char chess[row][rank], int ROW, int RANK);
//判断输赢
int win(char chess[row][rank], int ROW, int RANK);
引用创建的头文件#include "自己的头文件名字.h"。
运行文件three.c
#include "therr.h"
int main()
{
test();
return 0;
}