前言
本次游戏设计为三子棋游戏,不涉及算法相关内容,属于初步学习c语言所能设计的游戏。
在正式开始前呢,我们需要明白文件的分装进行。
game.h以及game.c两个文件
一、 三子棋游戏思想
相信各位读者都玩过三子棋游戏,在三子棋游戏中,我们都知道,任何一方横排、竖排或者对角线都是自己的棋子,便可获得胜利。基于这个思想,我们在c语言中,又该如何进行设计呢?
1.1 菜单函数声明与game函数的声明
玩过游戏的读者都知道,游戏首先得有菜单,其次根据菜单的提示我们再进行游戏或是设置退出游戏。在设计三子棋游戏中我们也是如此,我们先设置一个简易的菜单,例如输入1进行游戏,输入0退出游戏,那么我们就可以根据如下方式来设置菜单。
void menu()
{
printf("****************************\n");
printf("******* 1.开始游戏 *******\n");
printf("******* 0.退出游戏 *******\n");
printf("****************************\n");}
那么我们在设置完菜单之后,便可以引用到主函数中,那么玩游戏肯定不是只玩一次,二是可以选择一直玩直到自己选择退出游戏再退出。这时我们便可以借助do while循环来实现。同时我们也需要来控制输入1或0分别会如何执行下去,这时便可以使用到switch。代码如下。
#include <stdio.h>
void menu()
{
printf("****************************\n");
printf("******* 1.开始游戏 *******\n");
printf("******* 0.退出游戏 *******\n");
printf("****************************\n");
}
int main()
{
int input;
do
{
menu();
printf("请选择是否开始游戏:>\n");
scanf("%d",&input);
switch(input)
{
case 1:
break;
case 0:
break;
default:
break;
}
}while(input);
return 0;
}
在以上代码完成之后,我们便可以开始写我们的game函数代码了。那么game函数我们又该如何去设计呢?
1.2game函数的设计
基础代码写完之后,我们便要开始写我们的游戏代码game()函数。
下面则是代码的实现。
void game()
{
char ret;
char board[ROW][COL];
InitBoard(board, ROW, COL);
DisplayBoard(board, ROW, COL);
while (1)
{
PlayerMove(board, ROW, COL);
DisplayBoard(board, ROW, COL);
ret = Win(board, ROW, COL);
if (ret != 'C')
{
break;
}
ComuputerMove(board, ROW, COL);
DisplayBoard(board, ROW, COL);
ret = Win(board, ROW, COL);
if (ret != 'C')
{
break;
}
}
if (ret == '*')
{
printf("玩家获胜\n");
}
else if (ret == '#')
{
printf("电脑获胜 \n");
}
else
{
printf("平局\n");
}
}
棋盘初始化
void InitBoard(char board[ROW][COL], int row, int col)
{
int i, j;
for (i = 0; i < row; i++)
{
for (j = 0; j < col; j++)
{
board[i][j] = ' ';
}
}
}
打印分割线
void DisplayBoard(char board[ROW][COL], int row, int col)
{
int i, j;
for (i = 0; i < row; i++)
{
for (j = 0; j < col; j++)
{
printf(" %c ", board[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");
}
}
}
1.3人机下棋以及玩家下棋
人机下棋时,我们采取随机下的方式,也就是使用随机数rand让rand的范围在1~9之间,玩家下棋则是采用输入的方式。下面是代码的实现。
void PlayerMove(char board[ROW][COL], int row, int col)
{
int a, b;
printf("玩家下棋\n");
while (1)
{
printf("请输入要下的坐标:>\n");
scanf("%d %d", &a, &b);
if (a >= 1 && a <= row && b >= 1 && b <=col)
{
if (board[a - 1][b - 1] == ' ')
{
board[a - 1][b - 1] = '*';
break;
}
else
{
printf("此处坐标已被占用,请重新输入\n");
}
}
else
{
printf("坐标错误,请再次输入\n");
}
}
}
void ComuputerMove(char board[ROW][COL], int row, int col)
{
int x, y;
x = rand() % row;
y = rand() % col;
printf("电脑下棋\n");
while (1)
{
if (board[x][y] == ' ')
{
board[x][y] = '#';
break;
}
}
}
1.4判断输赢
判断输赢其实比较简单,下面是代码实现。
static int Full(char board[ROW][COL], int row, int col)
{
int i, j;
for (i = 0; i < row; i++)
{
for (j = 0; j < col; j++)
{
if (board[i][j] != ' ')
return 0;
}
}
return 1;
}
char Win(char board[ROW][COL], int row, int col)
{
int i;
for (i = 0; i < row; i++)
{
if (board[i][0] == board[i][1] && board[i][1] == board[i][2] && board[i][0] != ' ')
{
return board[i][0];
}
}
for (i = 0; i < col; i++)
{
if (board[0][i] == board[1][i] && board[1][i] == board[2][i] && board[0][i] != ' ')
{
return board[0][i];
}
}
if (board[0][0] == board[1][1] && board[1][1] == board[2][2] && board[0][0] != ' ')
{
return board[0][0];
}
if (board[0][2] == board[1][1] && board[1][1] == board[2][0] && board[0][2] != ' ')
{
return board[0][2];
}
if (Full(board, ROW, COL))
{
return 'Q';
}
return 'C';
}
总结
总的来说,每个文件之间需要进行分装,同时在使用时,game.h文件用来放头文件以及函数声明相关内容。
以上便是本篇博客的所有内容,可能比较简洁,有所不足欢迎各位大佬指路,觉得有所帮助可以来个免费的三连谢谢。