思路:
三子棋游戏是玩家和电脑对战的小游戏,最先练成一条线的一方获胜。
1.在一个游戏打开的时候,都会有一个选择界面:开始游戏、退出游戏等;所以第一步是打印菜单。
2.开始游戏后,需要提供一个棋盘给玩家;所以第二步是打印棋盘(二维数组)。
3.棋盘打印完成之后,该玩家下棋了。玩家输入对应坐标来下棋,下棋时需要考虑输入坐标合法性,输入坐标是否已经被占用;之后要再次打印棋盘并判断输赢。
4.电脑下棋(随机产生),需要考虑随机产生的坐标是否已经被占用;之后要再次打印棋盘并判断输赢。
5.判断输赢,有四种情况,玩家赢、电脑赢、平局、继续游戏;
1.打印菜单
void menu()
{
printf("**********************\n");
printf("****** 1.play ******\n");
printf("****** 0.exit ******\n");
printf("**********************\n");
}
2.打印棋盘
void InitBoard(char board[ROW][COL], int row, int col)
{
memset(board, ' ', row*col*sizeof(board[0][0]));//初始化为全空格
}
//打印棋盘
//┏ ┛┓┗ ━┃┫┣ ┳ ┻ ╋
void PrintfBoard(char board[ROW][COL], int row, int col)
{
int i = 0;//行
int j = 0;//列
//1.打印┏━┳━┳━┓
printf("┏");
for (j = 0; j < col - 1; j++)
{
printf("━┳");
}
printf("━┓\n");
//2.
for (i = 0; i < row; i++)
{
//(1)打印┃ ┃ ┃ ┃
printf("┃");
for (j = 0; j < col; j++)
{
printf("%c", board[i][j]);
printf("┃");
}
printf("\n");
//(2)打印┣━╋━╋━┫
if (i < col - 1)
{
printf("┣");
for (j = 0; j < col - 1; j++)
{
printf("━╋");
}
printf("━┫\n");
}
//(3)打印┗━┻━┻━┛
else
{
printf("┗");
for (j = 0; j<col - 1; j++)
{
printf("━┻");
}
printf("━┛\n");
}
}
}
3.玩家下棋
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] = 'X';
break;
}
else
{
printf("该坐标已被占用\n");
}
}
else
{
//坐标非法
printf("该坐标不在范围之内\n");
}
}
}
4.电脑下棋
void ComputerMove(char board[ROW][COL], int row, int col)
{
int x = 0;
int y = 0;
printf("电脑走~\n");
while (1)
{
x = rand() % row;//rand0~32767; rand()%row表示小于row的数
y = rand() % col;
if (board[x][y] == ' ')
{
board[x][y] = 'O';//大写字母O
break;
}
}
}
5.判断输赢
//当函数被static修饰时:
//1.只能在当前源文件中看到
//2.减少命名冲突 (别人也可以定义一个函数名为IsFull)
static 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;
}
//1.电脑赢 返回字母O 2.玩家赢 返回字母X 3.平局 返回P 4.游戏继续 返回' '
char IsWin(char board[ROW][COL], int row, int col)
{
//1.2.判断电脑或者玩家赢
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[1][1] != ' ')
{
return board[1][1];
}
if (board[0][2] == board[1][1] && board[1][1] == board[2][0] && board[1][1] != ' ')
{
return board[1][1];
}
//3判断平局->棋盘满了->IsFull函数返回1
if (IsFull(board,row,col)==1)
{
return 'P';
}
//4.游戏继续
return ' ';
}
整体代码
- test.c → 测试源文件
#include "game.h"
void game()
{
char board[ROW][COL] = { 0 };//不能直接全部初始化为空格
char ret = 0;
InitBoard(board,ROW,COL);
PrintfBoard(board, ROW, COL);
while (1)
{
PlayerMove(board, ROW, COL);//玩家走用 X 表示
//判断输赢
ret = IsWin(board, ROW, COL);
if (ret != ' ')
{
break;
}
PrintfBoard(board, ROW, COL);
ComputerMove(board, ROW, COL);//电脑走用O表示
//判断输赢
ret = IsWin(board, ROW, COL);
if (ret != ' ')
{
break;
}
PrintfBoard(board, ROW, COL);
}
if (ret == 'X')
{
printf("玩家赢!\n");
}
else if (ret == 'O')
{
printf("电脑赢!\n");
}
else if (ret == 'P')
{
printf("平局。\n");
}
PrintfBoard(board, ROW, COL);
}
void menu()
{
printf("**********************\n");
printf("****** 1.play ******\n");
printf("****** 0.exit ******\n");
printf("**********************\n");
}
void test()
{
int input = 0;
srand((unsigned int)time(NULL));
do
{
menu();
printf("请选择:\n");
scanf("%d", &input);
switch (input)
{
case 1:
//开始游戏
game();
break;
case 0:
//退出游戏
printf("游戏退出成功!\n");
break;
default:
printf("输入错误!\n");
break;
}
} while (input);
}
int main()
{
test();
return 0;
}
- game.c → 游戏源文件
#include "game.h"
//初始化棋盘
void InitBoard(char board[ROW][COL], int row, int col)
{
memset(board, ' ', row*col*sizeof(board[0][0]));//初始化为全空格
}
//打印棋盘
//┏ ┛┓┗ ━┃┫┣ ┳ ┻ ╋
void PrintfBoard(char board[ROW][COL], int row, int col)
{
int i = 0;//行
int j = 0;//列
//1.打印┏━┳━┳━┓
printf("┏");
for (j = 0; j < col - 1; j++)
{
printf("━┳");
}
printf("━┓\n");
//2.
for (i = 0; i < row; i++)
{
//(1)打印┃ ┃ ┃ ┃
printf("┃");
for (j = 0; j < col; j++)
{
printf("%c", board[i][j]);
printf("┃");
}
printf("\n");
//(2)打印┣━╋━╋━┫
if (i < col - 1)
{
printf("┣");
for (j = 0; j < col - 1; j++)
{
printf("━╋");
}
printf("━┫\n");
}
//(3)打印┗━┻━┻━┛
else
{
printf("┗");
for (j = 0; j<col - 1; j++)
{
printf("━┻");
}
printf("━┛\n");
}
}
}
//玩家走
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] = 'X';
break;
}
else
{
printf("该坐标已被占用\n");
}
}
else
{
//坐标非法
printf("该坐标不在范围之内\n");
}
}
}
//当函数被static修饰时:
//1.只能在当前源文件中看到
//2.减少命名冲突 (别人也可以定义一个函数名为IsFull)
static 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;
}
//1.电脑赢 返回字母O 2.玩家赢 返回字母X 3.平局 返回P 4.游戏继续 返回' '
char IsWin(char board[ROW][COL], int row, int col)
{
//1.2.判断电脑或者玩家赢
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[1][1] != ' ')
{
return board[1][1];
}
if (board[0][2] == board[1][1] && board[1][1] == board[2][0] && board[1][1] != ' ')
{
return board[1][1];
}
//3判断平局->棋盘满了->IsFull函数返回1
if (IsFull(board,row,col)==1)
{
return 'P';
}
//4.游戏继续
return ' ';
}
//电脑走
void ComputerMove(char board[ROW][COL], int row, int col)
{
int x = 0;
int y = 0;
printf("电脑走~\n");
while (1)
{
x = rand() % row;//rand0~32767; rand()%row表示小于row的数
y = rand() % col;
if (board[x][y] == ' ')
{
board[x][y] = 'O';//大写字母O
break;
}
}
}
- game.h → 头文件
#ifndef __GAME_H__
#define __GAME_H__
#define ROW 3
#define COL 3
#include <string.h>
#include<stdio.h>
#include<time.h>
#include<stdlib.h>
void InitBoard(char board[ROW][COL], int row, int col);
void PrintfBoard(char board[ROW][COL], int row, int col);
void PlayerMove(char board[ROW][COL], int row, int col);
void ComputerMove(char board[ROW][COL], int row, int col);
char IsWin(char board[ROW][COL], int row, int col);
#endif//__GAME_H__
运行结果