完成一个简单的小程序(三子棋)
先简单介绍一下三子棋的规则,方便我们接下来的编程和理解。规则如下:
在九宫格棋盘上,只要将自己的三个棋子走成一条线(横、竖、对角线),对方就算输了。
三子棋主要运用函数传参和数组来完成。
当然一个游戏首先得有他到菜单界面,为用户提供选择游戏和退出。
void menu()
{
printf("*********************\n");
printf("*******0.exit********\n");
printf("*******1.play********\n");
printf("*********************\n");
}
接下来就要提供游戏次数了,这个应该由用户自由控制,不能只执行一次。所以我们做一个do{}while循环。
do {
menu();
printf("请输入你的选择:");
scanf_s("%d", &input);
switch (input)
{
case 1:
game();
break;
case 0:
printf("游戏退出!\n");
break;
default:
break;
}
} while (input);
进入重点了:
那就是游戏环节,首先我们玩三子棋必须要有棋盘(创建一个3*3的数组)吧,那就来初始化一个棋盘,初始化棋盘的时候棋盘必须是空的我们就用(space)来代替。
void InitBoard(char board[][ROW],int col, int row, char set) //初始化棋盘
{
int i = 0;
int j = 0;
for (i = 0; i < row; i++)
{
for (j = 0; j < col; j++)
{
board[i][j] = set;
}
}
}
好了系统内有棋盘了,可是游戏是给用户玩的,不能仅仅放在系统内,我们要讲其展示给用户,那就有了如下操作喽(注意:我们为了使棋盘好看给他加了分割线)
void ShowBoard(char board[][ROW], int row, int col) //棋盘展示
{
int i = 0;
int j = 0;
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");
}
}
}
终于到了玩家上手操作了,玩家下棋的代码展示了,玩家要下棋我们得注意啥子内,不能下到棋盘外吧,不能下到有棋的地方吧,OK,来实现一下:
void PlayerMove(char board[][ROW], int row, int col) //玩家移动
{
int x = 0;
int y = 0;
printf("玩家移动\n");
while (1)
{
printf("请输入1-3的坐标: ");
scanf_s("%d%d", &x, &y);
if (x >= 1 && x <= 3 && y>=1 && y<=3)
{
if (board[x - 1][y - 1] == ' ')
{
board[x - 1][y - 1] = 'X';
break;
}
else
{
printf("位置已经被占");
}
}
else
{
printf("输入错误!\n");
}
}
}
落棋了,该怎么办?我们必须得知道他是否胜利了吧follow me
char IsWin(char board[][ROW], int row, int col) //判断是否胜利
{
int i = 0;
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[i][0];
}
}
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[i][i] != ' ')
{
return board[0][2];
}
if (IsFull(board,ROW, ROW)) //判断棋盘是否已满
{
return 'Q'; //平局
}
return ' ';//谁都没有赢
}
自然在棋盘就那么大,不可能一直下下去,我们得来给他判断一下是不是满了尼
static int IsFull(char board[][ROW], int row, int col) //判断棋盘是否已满
{
int i = 0;
int j = 0;
for (i = 0; i < row; i++)
{
for (j = 0; j < col; j++)
{
if (board[i][j] == ' ')
{
return 0;
}
}
}
return 1;
}
一个人怎么下棋,自己和自己嘛,不可能吧,即使可能我相信处于我这种平庸状态的人也不会那样去做,我们让电脑来陪他:
void ComputerMove(char board[][ROW], 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] = 'O';
break;
}
}
};
好嘞好嘞,
完整代码展示不会忘:
- 我们的 game.h 文件
#ifndef _GAME_H_
#define _GAME_H_
#include<stdio.h>
#include<stdlib.h>
#define ROW 3
void InitBoard(char board[][ROW], int col, int row, char set);//初始化棋盘
void ShowBoard(char board[][ROW], int row, int col); //打印棋盘
void PlayerMove(char board[][ROW], int row, int col);//玩家移动
char IsWin(char board[][ROW], int row, int col);//判断是否胜利
void ComputerMove(char board[][ROW], int row, int col); //电脑移动
#endif // ! _GAME_H_
2.game.c文件
#include"game.h"
void InitBoard(char board[][ROW],int col, int row, char set) //初始化棋盘
{
int i = 0;
int j = 0;
for (i = 0; i < row; i++)
{
for (j = 0; j < col; j++)
{
board[i][j] = set;
}
}
}
void ShowBoard(char board[][ROW], int row, int col) //棋盘展示
{
int i = 0;
int j = 0;
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");
}
}
}
void PlayerMove(char board[][ROW], int row, int col) //玩家移动
{
int x = 0;
int y = 0;
printf("玩家移动\n");
while (1)
{
printf("请输入1-3的坐标: ");
scanf_s("%d%d", &x, &y);
if (x >= 1 && x <= 3 && y>=1 && y<=3)
{
if (board[x - 1][y - 1] == ' ')
{
board[x - 1][y - 1] = 'X';
break;
}
else
{
printf("位置已经被占");
}
}
else
{
printf("输入错误!\n");
}
}
}
static int IsFull(char board[][ROW], int row, int col) //判断棋盘是否已满
{
int i = 0;
int j = 0;
for (i = 0; i < row; i++)
{
for (j = 0; j < col; j++)
{
if (board[i][j] == ' ')
{
return 0;
}
}
}
return 1;
}
char IsWin(char board[][ROW], int row, int col) //判断是否胜利
{
int i = 0;
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[i][0];
}
}
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[i][i] != ' ')
{
return board[0][2];
}
if (IsFull(board,ROW, ROW)) //判断棋盘是否已满
{
return 'Q'; //平局
}
return ' ';//谁都没有赢
}
void ComputerMove(char board[][ROW], 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] = 'O';
break;
}
}
};
3.最后test.c
#include"game.h"
void menu()
{
printf("*********************\n");
printf("*******0.exit********\n");
printf("*******1.play********\n");
printf("*********************\n");
}
void game()
{
char board[ROW][ROW] = { 0 };
InitBoard(board, ROW, ROW, ' ');
ShowBoard(board, ROW, ROW);
char ret = 0;
while (1) {
PlayerMove(board, ROW, ROW);
ret = IsWin(board, ROW, ROW);
ShowBoard(board, ROW, ROW);
if (ret != ' ')
{
break;
}
ComputerMove(board, ROW, ROW);
ret = IsWin(board, ROW, ROW);
ShowBoard(board, ROW, ROW);
if (ret != ' ')
{
break;
}
}
if (ret == 'X')
{
printf("玩家赢\n");
}
else if (ret == 'O')
{
printf("电脑赢\n");
}
else if(ret =='Q'){
printf("平局\n");
}
}
int main()
{
int input = 0;
do {
menu();
printf("请输入你的选择:");
scanf_s("%d", &input);
switch (input)
{
case 1:
game();
break;
case 0:
printf("游戏退出!\n");
break;
default:
break;
}
} while (input);
return 0;
}