编程新手,如有其他见解或者更好的优化方案,欢迎评论区讨论。
要想实现三子棋游戏,首要的是建立一个游戏的整体框架,理清游戏的具体逻辑,将一个实际问题拆分成一个个小步骤,再用代码编译。
此框架仅供参考。
三子棋游戏。
1.游戏的整体框架
a.设置一个菜单提示用户如何进入与退出游戏 。 输入1开始玩,输入0退出。
void menu()
{
printf("**********************************\n");
printf("******* 1. play *******\n");
printf("******* 0. exit *******\n");
printf("**********************************\n");
}
b.要能够实现用户玩一局游戏可继续下一游戏,所以我们把整个游戏放入一个do while循环语句中。
void test()
{
int input = 0;
srand((unsigned int)time(NULL)); //生成随机数
do
{
menu();
printf("请选择:>");
scanf("%d", &input);
switch (input)
{
case 1:
game(); //函数里实现游戏
break;
case 2:
printf("退出游戏\n");
break;
default:
printf("选择错误,请重新选择!\n");
break;
}
} while (input);
}
2.三子棋游戏的逻辑实现
a.三子棋的棋盘构思
// * | * | *
// ---|---|---
// # | # | *
// ---|---|---
// * | # | #
b.创建一个字符数组,能够存放棋子的信息,即 * #,并初始化。
//此处是define定义的ROW COL为3,若是想扩大棋盘,只需修改定义即可
void InitBoard(char board[ROW][COL], int row, int col)
{
int i = 0;
int j = 0;
for (i = 0; i < row; i++)
{
for (j = 0; j < col; j++)
{
board[i][j] = ' '; //初始化为空格,打印出来不会显示
}
}
}
c.打印棋盘。
void DisplayBoard(char board[ROW][COL], int row, int col)
{
int i = 0;
for (i = 0; i < row; i++)
{
int j = 0;
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");
}
}
}
d.玩家输入坐标可在棋盘上下棋,但是要注意每走一次需打印一次棋盘
void PlayerMove(char board[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 (board[x - 1][y - 1] == ' ')
{
board[x - 1][y - 1] = '*';
break;
} //判断坐标是否合法
else
{
printf("改坐标已被占用\n");
}
}
else
{
printf("坐标非法,请重新输入!\n");
}
}
}
e.设置电脑下棋的 *** 作,需使用到随机数rand函数,使用前需先使用srand函数
void ComputerMove(char board[ROW][COL], int row, int col)
{
int x = 0;
int y = 0;
printf("电脑走:>\n");
while (1)
{
x = rand() % row;
y = rand() % col;
if (board[x][y] == ' ')
{
board[x][y] = '#';
break;
}
}
}
f.最后即是逐个遍历,判断是否输赢,或者平局,此处省略判断平局(即判断数组是否已满)
char Iswin(char board[ROW][COL], int row, int col)
{
int i = 0;
//横3行,三子连线
for (i = 0; i < row; i++)
{
if (board[i][0] == board[i][1] && board[i][1] == board[i][2] && board[i][1] != ' ')
{
return board[i][1]; //返回'*',玩家赢,返回'#',电脑赢
}
}
for (i = 0; i < col; i++)
{
//竖3列,三子连线
if (board[0][i] == board[1][i] && board[1][i] == board[2][i] && board[1][i] != ' ')
{
return board[1][i]; //同上
}
}
//对角线,三子连线
if (board[0][0] == board[1][1] && board[1][1] == board[2][2] && board[1][1] != ' ')
return board[1][1]; //同上
if (board[2][0] == board[1][1] && board[1][1] == board[0][2] && board[1][1] != ' ')
return board[1][1]; //同上
if (1 == Isfull(board, ROW, COL))
{
return 'Q'; //若棋盘已满,返回Q表示平局
}
return 'C'; //返回C表示,游戏未结束,继续游戏
}
g.放入循环将整个游戏逻辑串联起来
void game()
{
char ret = '0';
char board[ROW][COL]= {0};
InitBoard(board, ROW, COL);
DisplayBoard(board, ROW, COL);
while (1)
{
//玩家下棋
PlayerMove(board, ROW, COL);
DisplayBoard(board, ROW, COL);
//判断玩家是否赢
ret = Iswin(board, ROW, COL); //接收返回值
if (ret != 'C')
{
break;
}
//电脑下棋
ComputerMove(board, ROW, COL);
DisplayBoard(board, ROW, COL);
ret = Iswin(board, ROW, COL);
if (ret != 'C')
{
break; //游戏继续
}
}
if (ret == '*')
{
printf("玩家赢\n");
}
else if(ret == '#')
{
printf("电脑赢\n");
}
else
{
printf("平局\n");
}
}
最后,展示一下游戏效果
**********************************
******* 1. play *******
******* 0. exit *******
**********************************
请选择:>1
| |
---|---|---
| |
---|---|---
| |
玩家走:>
请输入要下的坐标:>1 1
* | |
---|---|---
| |
---|---|---
| |
电脑走:>
* | |
---|---|---
| |
---|---|---
# | |
玩家走:>
请输入要下的坐标:>1 2
* | * |
---|---|---
| |
---|---|---
# | |
电脑走:>
* | * |
---|---|---
| # |
---|---|---
# | |
玩家走:>
请输入要下的坐标:>1 3
* | * | *
---|---|---
| # |
---|---|---
# | |
玩家赢
**********************************
******* 1. play *******
******* 0. exit *******
**********************************
请选择:>
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)