目录
(1).将三子棋棋盘看作一个3X3的二维数组board[3][3],数组里面存放走的棋子(用*表示子)
(2).编写自定义函数来初始化棋盘,数组里面放空格,表示目前棋盘每个格子里什么都没有
(6).编写自定义函数判断游戏输赢。IsWin()函数有四种情况,玩家赢返回*,电脑赢返回#,平局返回P,游戏继续(表示目前还没有人赢,继续下棋)返回C
1.编写简单框架test()函数(test.cpp)
用户输入数字1开始游戏,0退出游戏。
只有用户输入0退出游戏,否则可以重复游玩多次。用do while来实现。
#include <stdio.h>
//函数声明
void game();
void test();
void test()
{
int input;
do
{
printf("开始游戏 1,退出游戏 0\n");
scanf_s("%d", &input); //用户输入数字选择
switch (input)
{
case 1:
printf("游戏开始\n");
game(); //游戏正式运行函数
break;
case 0:
printf("成功退出游戏\n");
break;
default:
printf("选择错误,请重新输入\n");
break;
}
} while (input);
}
void game()
{
printf("......\n"); //框架简单用....代替
}
int main()
{
test(); //游戏运行
}
2.编写游戏正式运行函数game()(test.cpp)
(1).将三子棋棋盘看作一个3X3的二维数组board[3][3],数组里面存放走的棋子(用*表示子)
void game()
{
char board[ROW][COL]; //ROW行,COL列,自定义常量
}
将自定义常量ROW和COL放在game.h头文件里,方便以后改变棋盘大小。
在test.cpp里包含game.h头文件
(2).编写自定义函数来初始化棋盘,数组里面放空格,表示目前棋盘每个格子里什么都没有
void game()
{
char board[ROW][COL]; //ROW行,COL列,自定义常量
//初始化棋盘
Initboard(board, ROW, COL); //此函数的声明在game.h文件,定义在game.cpp文件
}
将初始化棋盘函数定义放在game.cpp文件里
声明放在game.h文件里
(3).编写自定义函数来打印棋盘,效果如下:
void game()
{
char board[ROW][COL]; //ROW行,COL列,自定义常量
//初始化棋盘
Initboard(board, ROW, COL);
//打印棋盘
Printboard(board, ROW, COL); 此函数的声明在game.h文件,定义在game.cpp文件
}
定义放在game.cpp里
声明放在game.h里,因为要用到printf()函数所以加上<stdio.h>头文件
(4).编写自定义函数让玩家下棋
void game()
{
char board[ROW][COL]; //ROW行,COL列,自定义常量
//初始化棋盘
Initboard(board, ROW, COL);
//打印棋盘
Printboard(board, ROW, COL);
while (1) //重复下棋,直到分出胜负
{
//玩家下棋
PlayerMove(board, ROW, COL);
//下一次棋打印一次棋盘
Printboard(board, ROW, COL);
}
}
定义放在game.cpp里
声明放在game.h里
(5).编写自定义函数让电脑下棋,采用随机数来下棋
void game()
{
char board[ROW][COL]; //ROW行,COL列,自定义常量
//初始化棋盘
Initboard(board, ROW, COL);
//打印棋盘
Printboard(board, ROW, COL);
while (1) //重复下棋,直到分出胜负
{
//玩家下棋
PlayerMove(board, ROW, COL);
//下一次棋打印一次棋盘
Printboard(board, ROW, COL);
//电脑下棋
ComputerMove(board, ROW, COL);
//下一次棋打印一次棋盘
Printboard(board, ROW, COL);
}
}
定义放在game.cpp里
由于需要rand()函数来产生随机数,所以在test()函数里加上时间戳,在game.h文件里加上<time.h>和<stdlib.h>头文件
声明放在game.h里
(6).编写自定义函数判断游戏输赢。IsWin()函数有四种情况,玩家赢返回*,电脑赢返回#,平局返回P,游戏继续(表示目前还没有人赢,继续下棋)返回C
每次下棋前先判断有人是否已经赢了,如果没有则继续下棋,如果有则需要判断是玩家赢了还是电脑赢了,其次游戏还有平局的可能。所以将game()函数修改一下。
void game()
{
char ret = 0;
char board[ROW][COL]; //ROW行,COL列,自定义常量
//初始化棋盘
Initboard(board, ROW, COL);
//打印棋盘
Printboard(board, ROW, COL);
while (1) //重复下棋,直到分出胜负
{
//下棋前先判断游戏输赢
ret = IsWin(board, ROW, COL); //用ret来接收IsWin()返回值
if (ret != 'C') //C为游戏继续,不为C表示游戏以分出胜负
{
break;
}
//玩家下棋
PlayerMove(board, ROW, COL);
//下一次棋打印一次棋盘
Printboard(board, ROW, COL);
//下棋前先判断游戏输赢
ret = IsWin(board, ROW, COL);
if (ret != 'C')
{
break;
}
//电脑下棋
ComputerMove(board, ROW, COL);
//下一次棋打印一次棋盘
Printboard(board, ROW, COL);
}
if (ret == '*')
{
printf("玩家赢了");
}
else if (ret == '#')
{
printf("电脑赢了");
}
else
{
printf("平局");
}
}
定义放在game.cpp里,而游戏赢的条件是有三个棋子连在一起,横着竖着斜着,我们分别判断。
//判断游戏输赢
char IsWin(char board[ROW][COL], int row, int col)
{
int i;
int j;
//判断横着的三列
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][i] != ' ')
return board[0][0];
if (board[0][2] == board[1][1] && board[1][1] == board[2][0] && board[0][2] != ' ')
return board[0][2];
//判断平局
for (i = 0; i < row; i++)
{
for (j = 0; j < col; j++)
{
if (board[i][j] == ' ') //棋盘没有满,还找得到空格
return 'C'; //就返回C继续下棋
}
}
return 'P'; //循环结束都没return就表示棋盘满了,平局
}
声明放在game.h的文件里
(7).至此代码已完成,运行一下
完整源代码-test.cpp
#include <stdio.h>
#include "game.h"
//函数声明
void game();
void test();
void test()
{
int input;
srand((unsigned int)time(NULL));
do
{
printf("开始游戏 1,退出游戏 0\n");
scanf_s("%d", &input); //用户输入数字选择
switch (input)
{
case 1:
printf("游戏开始\n");
game(); //游戏正式运行函数
break;
case 0:
printf("成功退出游戏\n");
break;
default:
printf("选择错误,请重新输入\n");
break;
}
} while (input);
}
void game()
{
char ret = 0;
char board[ROW][COL]; //ROW行,COL列,自定义常量
//初始化棋盘
Initboard(board, ROW, COL);
//打印棋盘
Printboard(board, ROW, COL);
while (1) //重复下棋,直到分出胜负
{
//下棋前先判断游戏输赢
ret = IsWin(board, ROW, COL); //用ret来接收IsWin()返回值
if (ret != 'C') //C为游戏继续,不为C表示游戏以分出胜负
{
break;
}
//玩家下棋
PlayerMove(board, ROW, COL);
//下一次棋打印一次棋盘
Printboard(board, ROW, COL);
//下棋前先判断游戏输赢
ret = IsWin(board, ROW, COL);
if (ret != 'C')
{
break;
}
//电脑下棋
ComputerMove(board, ROW, COL);
//下一次棋打印一次棋盘
Printboard(board, ROW, COL);
}
if (ret == '*')
{
printf("玩家赢了\n");
}
else if (ret == '#')
{
printf("电脑赢了\n");
}
else
{
printf("平局\n");
}
}
int main()
{
test(); //游戏运行
}
完整源代码-game.h
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <time.h>
#include <stdlib.h>
#define ROW 3
#define COL 3
//函数声明
void Initboard(char board[ROW][COL], int row, int col); //初始化棋盘
void Printboard(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); //判断游戏输赢
完整源代码-game.cpp
#include "game.h"
//初始化棋盘
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 Printboard(char board[ROW][COL], int row, int col)
{
int i;
int 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");
}
}
}
//玩家下棋
void PlayerMove(char board[ROW][COL], int row, int col)
{
int x = 0;
int y = 0;
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;
int y = 0;
while (1)
{
x = rand() % row;
y = rand() % col;
if (board[x][y] == ' ')
{
printf("电脑走:%d %d\n", x, y);
board[x][y] = '#';
break;
}
}
}
//判断游戏输赢
char IsWin(char board[ROW][COL], int row, int col)
{
int i;
int j;
//判断横着的三列
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][i] != ' ')
return board[0][0];
if (board[0][2] == board[1][1] && board[1][1] == board[2][0] && board[0][2] != ' ')
return board[0][2];
//判断平局
for (i = 0; i < row; i++)
{
for (j = 0; j < col; j++)
{
if (board[i][j] == ' ') //棋盘没有满,还找得到空格
return 'C'; //就返回C继续下棋
}
}
return 'P'; //循环结束表示棋盘满了,平局
}