(创作不易,感谢有你,你的支持,就是我前行的最大动力,如果看完对你有帮助,请留下您的足迹)
今天我们来尝试用c语言实现一个小游戏-三子棋
首先先打印一下游戏的菜单
void menu()//菜单
{
printf("*************************\n");
printf("*****1.play 0.exit*****\n");
printf("*************************\n");
}
接下来就是游戏的整个运行框架的构建了,这里我们用switch()函数实现键盘控制,按下1则开始游戏,按下0则退出,如果不小心按到其他键,则会显示选择错误
void text()//运行
{
int input = 0;
while (1)
{
menu();
printf("请选择:");
scanf("%d", &input);
switch(input)
{
case 1:
game();//游戏的实现
break;
case 0:
printf("退出游戏\n");
break;
default:
printf("选择错误\n");
break;
}
}
}
然后我们就对game()函数进行完善
如图所示,三子棋由井字构成框架,玩家在内部布棋,所以我们可以用二维数组实现井字及其内部的构建
首先先创建一个二维数组作为棋盘
#define ROW 3
#define COL 3char board[ROW][COL] = {0};
然后对棋盘进行初始化,在玩家没有布棋之前,我们可以默认棋盘内容为空(空格)
//初始化棋盘
initboard(board,ROW,COL);
void initboard(char board[ROW][COL],int row,int col)
{
for (int i = 0; i < row; i++)
{
for (int j = 0; j < col; j++)
{
board[i][j] = ' ';//注意这里面是空格
}
}
}
接下来就是棋盘的打印,我们要打印的棋盘模型为:
//打印棋盘
displayboard(board,ROW,COL);
void displayboard(char board[ROW][COL], int row, int col)
{
for (int i = 0; i < row; i++)
{
//打印一行
for (int j = 0; j < col; j++)
{
printf(" %c ", board[i][j]);//为了与分割线平齐,注意%c左右都有空格
if (j < col - 1)
{
printf("|");
}
}
printf("\n");
//打印分割线
if (i < row - 1)
{
for (int j = 0; j < col; j++)
{
printf("---");
if (j < col - 1)
{
printf("|");
}
}
printf("\n");
}
}
}
棋盘打印完成后,接下来就要对下棋的操作进行编程
首先让玩家先下棋:注意玩家下棋时要确保其坐标的合法性(在棋盘范围内且当前位置没有棋子)
playermove(board,ROW,COL);
void playermove(char board[ROW][COL], int row, int col)
{
int x = 0, 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");
}
}
}
接下来就是电脑走,这里我们用随机函数rand()来实现电脑的布棋,因为rand()函数每一次的随机值都是一样的,为了使电脑更加灵活,我们需要先创建一个随机函数种子
#include<time.h>
srand((unsigned int)time(NULL));
与玩家行动一样,我们要确保电脑行动时的合法性。
//电脑走
computermove(board, ROW, COL);
void computermove(char board[ROW][COL], int row, int col)
{
int x = 0, y = 0;
printf("电脑走\n");
while (1)
{
x = rand() % row;
y = rand() % col;
if (board[x][y] == ' ')
{
board[x][y] = 'X';
break;
}
}
}
在完成玩家和电脑的行动后,就要开始判断胜负了
三字棋胜负规则
1、双方轮流在格子里摆放棋子,先连成三棋一线者视为胜利;
2、棋盘被摆满棋子仍未分出胜利,视为平局。
首先对规则1进行编程
//判断胜负
char iswin(char board[ROW][COL], int row, int col)
{
for (int 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 (int i = 0; i < col; i++)
{
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[0][0] != ' ')//斜向
return board[0][0];
if (board[2][0] == board[1][1] && board[1][1] == board[0][2] && board[1][1] != ' ')//斜向
return board[1][1];
return 'c';//如果上述条件都没有满足,则表示棋没有下完,继续下棋
}
接下来对规则2进行编程
//判断棋盘是否满
int isfull(char board[ROW][COL], int row, int col)
{
for (int i = 0; i < row; i++)
{
for (int j = 0; j < col; j++)
{
if (board[i][j] == ' ')
return 0;
}
}
return 1;
}if (isfull(board, ROW, COL)==1)//棋盘满了,平局
return 'q';
接下来就是将上述代码全部转移到game()函数中
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 == 'X')
printf("电脑赢\n");
else
printf("平局\n");
}
总体代码就是这样,如果大家发现bug或者有更好的方法 ,欢迎大家一起来讨论呀,一起加油
#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#include<time.h>
#define ROW 3
#define COL 3
void menu()//菜单
{
printf("*************************\n");
printf("*****1.play 0.exit*****\n");
printf("*************************\n");
}
//初始化棋盘
void initboard(char board[ROW][COL],int row,int col)
{
for (int i = 0; i < row; i++)
{
for (int j = 0; j < col; j++)
{
board[i][j] = ' ';
}
}
}
//打印棋盘
void displayboard(char board[ROW][COL], int row, int col)
{
for (int i = 0; i < row; i++)
{
//打印一行
for (int j = 0; j < col; j++)
{
printf(" %c ", board[i][j]);
if (j < col - 1)
{
printf("|");
}
}
printf("\n");
//打印分割线
if (i < row - 1)
{
for (int j = 0; j < col; j++)
{
printf("---");
if (j < col - 1)
{
printf("|");
}
}
printf("\n");
}
}
}
//玩家移动
void playermove(char board[ROW][COL], int row, int col)
{
int x = 0, 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");
}
}
}
//电脑走
void computermove(char board[ROW][COL], int row, int col)
{
int x = 0, y = 0;
printf("电脑走\n");
while (1)
{
x = rand() % row;
y = rand() % col;
if (board[x][y] == ' ')
{
board[x][y] = 'X';
break;
}
}
}
//判断棋盘是否满
int isfull(char board[ROW][COL], int row, int col)
{
for (int i = 0; i < row; i++)
{
for (int j = 0; j < col; j++)
{
if (board[i][j] == ' ')
return 0;
}
}
return 1;
}
//判断胜负
char iswin(char board[ROW][COL], int row, int col)
{
for (int 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 (int i = 0; i < col; i++)
{
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[0][0] != ' ')//斜向
return board[0][0];
if (board[2][0] == board[1][1] && board[1][1] == board[0][2] && board[1][1] != ' ')//斜向
return board[1][1];
if (isfull(board, ROW, COL)==1)//棋盘满了,平局
return 'q';
return 'c';//如果上述条件都没有满足,则表示棋没有下完,继续下棋
}
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 == 'X')
printf("电脑赢\n");
else
printf("平局\n");
}
void text()//运行
{
srand((unsigned int)time(NULL));
int input = 0;
while (1)
{
menu();
printf("请选择:");
scanf("%d", &input);
switch(input)
{
case 1:
game();
break;
case 0:
printf("退出游戏\n");
break;
default:
printf("选择错误\n");
break;
}
}
}
int main()
{
text();
return 0;
}