多子琪的实现总共有这么几步
(1)游戏的大体设计
#include
int main()
{
int input = 0;
do
{
menu();//游戏菜单
printf("请作出选择:>");
scanf("%d", &input);
switch (input)
{
case 1:
game();
break;
case 0:
printf("退出游戏\n");
break;
default:printf("选择有误,请重新选择\n");
break;
}
} while (input);
return 0;
}
先是利用do while()语句来实现游戏的重复使用,然后再使用Switch函数来搭建游戏开始界面和菜单搭配使用。
(2)游戏菜单的设计
void menu()
{
printf("********************************\n");
printf("***** 1、进入游戏 **************\n");
printf("***** 0、退出游戏 **************\n");
printf("********************************\n");
}
游戏菜单还是利用了printf()函数来简单的实现菜单功能。
(3)游戏的设计
由于棋盘是一个一个的小个子符合二维空间的意思,故采取二维数组来实现,首先定义数组一个二维数组。
int arr[ROW][COL] = {0} ;
ROW和COL是利用了宏定义的方式,就是为了能够实现多子琪,而不仅仅局限于三子棋或四子棋等等。
#define ROW 3
#define COL 3
这里我们先定义成三来讲解,后面可以自己随意改变数字。
棋盘首先是白板,我们得先把数组初始化,初始化为空格刚好可以留出下棋的空间。
先构建一个初始化函数initialize(arr,ROW,COL)。再继续搭建该函数的功能。
void initialize(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++)
{
arr[i][j] = ' ';
}
}
}
初始化完成后,目前只有多了9个空间,还需要把棋盘的初始样子打印出来,构建一个函数来打印棋盘。
void copychec(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++)
{
printf(" %c ", arr[i][j]);
if (j < col - 1)
printf("|");
}
printf("\n");
if (i < row - 1)
{
for (j = 0; j < col; j++)
{
printf("---");
if (j < col - 1)
printf("|");
}
printf("\n");
}
}
}
完成棋盘的打印后就正式开始下棋。
首先是玩家下棋,构建函数。
因为我们是了解了一些计算机的知识,因此知道数组是从下标0开始,而非计算机人士大概不知道因此我们玩家下棋的范围,横纵坐标都应该是大于等于1,小于等于ROW或COL(就是你一开始设置的多子琪的棋数,而我们开头是用三子棋来写,故我们这的范围是大于等于1,小于等于3)。
void playmove(char arr[ROW][COL], int row, int col)
{
int x = 0;
int y = 0;
printf("玩家下棋\n");
while (1)
{
printf("请输入下棋的坐标:>");
scanf("%d %d", &x, &y);
if (x >= 1 && x <= row && y >= 1 && y <= col)
{
if (arr[x - 1][y - 1] == ' ')
{
arr[x - 1][y - 1] = '*' ;
break;
}
else
{
printf("位置被占,请重新输入\n");
}
}
else
{
printf("输入不合法,请重新输入\n");
}
}
}
下完棋后,为了方便下一步下棋,我们得把此时棋盘打印出来
再次调用copychec()函数。
然后轮到电脑下棋,也是构建函数。其中我们还利用了rand()函数,来让电脑下的坐标是随机值。使用rand函数前还需在main函数中加上 srand((unsigned int )time(NULL));头文件名为:#include
void computemove(char arr[ROW][COL], int row, int col)
{
int x = 0;
int y = 0;
printf("电脑下棋\n");
while (1)
{
x = rand() % row;
y = rand() % col;
if (arr[x][y] == ' ')
{
arr[x][y] = '#';
break;
}
}
}
同样需要打印棋盘,调用copychec()函数。
--------------------------------------------------------------------------------
我们下棋不可能只下一步,所以我们把上述放在while()函数中
此时游戏框架简单搭建好
void game()
{
char arr[ROW][COL] = { 0 };
initialize(arr, ROW, COL);//数组初始化
copychec(arr, ROW, COL);//打印棋盘
while (1)
{
playmove(arr, ROW, COL);//玩家下棋
copychec(arr, ROW, COL);//打印棋盘
computemove(arr, ROW, COL);//电脑下棋
copychec(arr, ROW, COL);//打印棋盘
}
}
当然游戏是有输赢的。
得分别在玩家下完判断以及电脑下完棋进行判断。因此设计一个函数来满足这个功能。
在判断中总共有四种情况,“玩家赢、电脑赢、平局、继续”,分别用返回值“*、#、m、n”来表示而在判断过程中我们采用计数的形式来判断谁赢,这也满足了多子琪变化的要求,不局限于确定的棋子数,这样写更灵活。在判断列时,我们交换了i与j的循环位置,这样能让它一列一列的判断。
而最后在判断平局时我们利用了Inspect()函数来对整个棋盘检查是否还有空的格子,如果有则返回0,反之则返回1.
//返回的是‘*’玩家赢
//返回的是‘#’电脑赢
//返回的是‘m'平局
//返回的是‘n'继续
//
int Inspect(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;
}
char Deter(char arr[ROW][COL], int row, int col)
{
int i = 0;
int j = 0;
//判断行
for (i = 0; i < row ; i++)
{
int count = 0;
for (j = 0; j < col - 1; j++)
{
if (arr[i][j] == arr[i][j + 1] && arr[i][j] != ' ')
{
count++;
}
if(count == row - 1)
return arr[i][j];
}
}
//判断列
for (j = 0; j < col ; j++)
{
int count = 0;
for (i = 0; i < row - 1; i++)
{
if (arr[i][j] == arr[i + 1][j] && arr[i][j] != ' ')
{
count++;
}
if(count == row -1)
return arr[i][j];
}
}
//判断对角线
int countn = 0;
for (i = 0; i < row - 1; i++)
{
//判断右对角线
for (j = 0; j < col; j++)
{
if (i + j == row - 1 && arr[i][j] == arr[i + 1][j - 1] && arr[i][j] != ' ')
{
countn++;
}
if(countn == row - 1)
return arr[i][j];
}
}
//判断左对角线
int count = 0;
for (i = 0; i < row - 1; i++)
{
for (j = 0; j < col - 1; j++)
{
if (i == j && arr[i][j] == arr[i + 1][j + 1] && arr[i][j] != ' ')
{
count++;
}
if(count == row - 1)
return arr[i][j];
}
}
//平局
if (Inspect(arr, ROW, COL) == 1)
{
return 'm';
}
//继续
return 'n';
}
最后游戏的功能成功设计完成。
void game()
{
char arr[ROW][COL] = { 0 };
initialize(arr, ROW, COL);//数组初始化
copychec(arr, ROW, COL);//打印棋盘
char net = 0;
while (1)
{
playmove(arr, ROW, COL);//玩家下棋
copychec(arr, ROW, COL);//打印棋盘
net = Deter(arr, ROW, COL);//判断输赢
if (net != 'n')
break;
computemove(arr, ROW, COL);//电脑下棋
copychec(arr, ROW, COL);//打印棋盘
net = Deter(arr, ROW, COL);//判断输赢
if (net != 'n')
break;
}
if (net == '*')
{
printf("玩家赢了\n");
}
else if (net == '#')
{
printf("电脑赢了\n");
}
else if (net == 'm')
{
printf("平局\n");
}
}
游戏整体的代码为:
#define ROW 3
#define COL 3
#include
#include
#include
void menu()
{
printf("********************************\n");
printf("***** 1、进入游戏 **************\n");
printf("***** 0、退出游戏 **************\n");
printf("********************************\n");
}
void initialize(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++)
{
arr[i][j] = ' ';
}
}
}
void copychec(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++)
{
printf(" %c ", arr[i][j]);
if (j < col - 1)
printf("|");
}
printf("\n");
if (i < row - 1)
{
for (j = 0; j < col; j++)
{
printf("---");
if (j < col - 1)
printf("|");
}
printf("\n");
}
}
}
void playmove(char arr[ROW][COL], int row, int col)
{
int x = 0;
int y = 0;
printf("玩家下棋\n");
while (1)
{
printf("请输入下棋的坐标:>");
scanf("%d %d", &x, &y);
if (x >= 1 && x <= row && y >= 1 && y <= col)
{
if (arr[x - 1][y - 1] == ' ')
{
arr[x - 1][y - 1] = '*';
break;
}
else
{
printf("位置被占,请重新输入\n");
}
}
else
{
printf("输入不合法,请重新输入\n");
}
}
}
void computemove(char arr[ROW][COL], int row, int col)
{
int x = 0;
int y = 0;
printf("电脑下棋\n");
while (1)
{
x = rand() % row;
y = rand() % col;
if (arr[x][y] == ' ')
{
arr[x][y] = '#';
break;
}
}
}
//返回的是‘*’玩家赢
//返回的是‘#’电脑赢
//返回的是‘m'平局
//返回的是‘n'继续
//
int Inspect(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;
}
char Deter(char arr[ROW][COL], int row, int col)
{
int i = 0;
int j = 0;
//判断行
for (i = 0; i < row; i++)
{
int count = 0;
for (j = 0; j < col - 1; j++)
{
if (arr[i][j] == arr[i][j + 1] && arr[i][j] != ' ')
{
count++;
}
if (count == row - 1)
return arr[i][j];
}
}
//判断列
for (j = 0; j < col; j++)
{
int count = 0;
for (i = 0; i < row - 1; i++)
{
if (arr[i][j] == arr[i + 1][j] && arr[i][j] != ' ')
{
count++;
}
if (count == row - 1)
return arr[i][j];
}
}
//判断对角线
int countn = 0;
for (i = 0; i < row - 1; i++)
{
//判断右对角线
for (j = 0; j < col; j++)
{
if (i + j == row - 1 && arr[i][j] == arr[i + 1][j - 1] && arr[i][j] != ' ')
{
countn++;
}
if (countn == row - 1)
return arr[i][j];
}
}
//判断左对角线
int count = 0;
for (i = 0; i < row - 1; i++)
{
for (j = 0; j < col - 1; j++)
{
if (i == j && arr[i][j] == arr[i + 1][j + 1] && arr[i][j] != ' ')
{
count++;
}
if (count == row - 1)
return arr[i][j];
}
}
//平局
if (Inspect(arr, ROW, COL) == 1)
{
return 'm';
}
return 'n';
}
void game()
{
char arr[ROW][COL] = { 0 };
initialize(arr, ROW, COL);//数组初始化
copychec(arr, ROW, COL);//打印棋盘
char net = 0;
while (1)
{
playmove(arr, ROW, COL);//玩家下棋
copychec(arr, ROW, COL);//打印棋盘
net = Deter(arr, ROW, COL);//判断输赢
if (net != 'n')
break;
computemove(arr, ROW, COL);//电脑下棋
copychec(arr, ROW, COL);//打印棋盘
net = Deter(arr, ROW, COL);//判断输赢
if (net != 'n')
break;
}
if (net == '*')
{
printf("玩家赢了\n");
}
else if (net == '#')
{
printf("电脑赢了\n");
}
else if (net == 'm')
{
printf("平局\n");
}
}
int main()
{
int input = 0;
do
{
menu();//游戏菜单
printf("请作出选择:>");
scanf("%d", &input);
switch (input)
{
case 1:
game();
break;
case 0:
printf("退出游戏\n");
break;
default:printf("选择有误,请重新选择\n");
break;
}
} while (input);
return 0;
}
本次的多子琪游戏就讲解到此,因为本人水平有限,在某些地方讲解的不是很清楚,欢迎大家纠正,谢谢!