目录
1.进入游戏的基本搭建:
2. game()内容开发
game()函数——棋盘
game()函数——下棋
实现玩家下棋 PlayerMove()函数
实现电脑(随机)下棋 ComputerMove()函数
game()函数——判断输赢
判断函数 IsWin()实现
3.学习心得:
4.全部源码
#define _CRT_SECURE_NO_WARNINGS 1
#include
void menu()
{
printf("*********************************\n");
printf("********1.play 0.exit********\n");
printf("*********************************\n");
}
void game()
{
//真正的游戏内容在此
}
void test()
{
int input = 0;
do
{
menu();
printf("请选择:>");
scanf("%d", &input);
switch (input)
{
case 1:
printf("游戏开始\n");
game();
break;
case 0:
printf("退出游戏\n");
break;
default:
printf("选择错误,请重新选择\n");
break;
}
} while (input);
}
//测试三子棋游戏
int main()
{
test();
return 0;
}
此处记录一下开发game()过程中出现的一个小问题,
浪费了不少时间,简单描述一下,便于之后了解原因
问题出在哪里呢?看后面!
如上所见,我在声明和定义函数的时候接收用的形参是原来的大写就不行,一直报错,死活不理解。这里形参需要变为小写原因是,如果不是小写,他就会报错,错误是出现相同定义的变量
最后 我给接收的这换了名字(换成小写)才跑过去了
回归正题
void game()
{
//定义数组——存放棋盘信息
char board[ROW][COL] = { 0 };
//棋盘需要初始化,定义一个初始化函数解决
InitBoard(board, ROW, COL);
//打印棋盘
DisplayBoard(board, ROW, COL);
}
#pragma once
#define ROW 10
//定义行数
#define COL 10
//定义列数
#include
//声明
void InitBoard(char board[ROW][COL], int row, int col);
void DisplayBoard(char board[ROW][COL], int row, int col);
相关函数内容:
#define _CRT_SECURE_NO_WARNINGS 1
#include "game.h"
// 3 X 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] = ' ';
}
}
}
//打印棋盘
void DisplayBoard(char board[ROW][COL], int row, int col)
{
int i = 0 ;
int j = 0;
for (i = 0; i < row; i++)
{
//打印数据行 ===优化空间==== printf(" %c | %c | %c \n", board[i][0], board[i][1], board[i][2]);
for (j = 0; j < col; j++)
{
printf(" %c ", board[i][j]);
if (j < col - 1)
{
printf("|");
}
}
printf("\n");
//打印分隔行 ===优化空间==== printf("---|---|---\n");
if (i < row - 1)
{
for (j = 0; j < col; j++)
{
printf("---");
if (j < col - 1)
{
printf("|");
}
}
}
printf("\n");
}
}
void game()
{
//定义数组——存放棋盘信息
char board[ROW][COL] = { 0 };
//棋盘需要初始化,定义一个初始化函数解决
InitBoard(board, ROW, COL);
//打印棋盘
DisplayBoard(board, ROW, COL);
//下棋
while (1)
{
//玩家
PlayerMove(board, ROW, COL);
DisplayBoard(board, ROW, COL);
//电脑
ComputerMove(board, ROW, COL);
DisplayBoard(board, ROW, COL);
}
}
(备注:头文件声明):
//玩家下棋
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("坐标占用,请选择其他位置");
}
}
else
{
printf("坐标非法,请重新输入");
}
}
}
(备注:头文件声明):
知识点待补充:随机值的生成(此处直接使用,之后再详细了解)
主函数中设置随机数起点
int main()
{
//随机数生成起点
srand((unsigned int)time(NULL));
//测试
test();
return 0;
}
电脑随机下棋( rand( ) 使用随机数):
//电脑下棋
void ComputerMove(char board[ROW][COL], int row, int col)
{
printf("电脑下棋:>\n");
int x = 0;
int y = 0;
//随机下 ===对应==== 使用主函数里的随机值
while (1)
{
x = rand() % row;//0~2
y = rand() % col;//0~2
if (board[x][y] == ' ')
{
board[x][y] = '#';
printf("电脑下棋:>%d %d\n",x+1,y+1);
break;
}
}
}
可以对电脑下棋进行算法优化(比如对玩家落子进行堵截等操作)
等我成为一个大佬的时候再回来优化
void game()
{
//定义数组——存放棋盘信息
char board[ROW][COL] = { 0 };
//棋盘需要初始化,定义一个初始化函数解决
InitBoard(board, ROW, COL);
//打印棋盘
DisplayBoard(board, ROW, COL);
//下棋
int ret = 0;
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");
}
printf("最终结局:>\n");
DisplayBoard(board, ROW, COL);
}
//没人赢的判断函数返回值
int IsFull(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++)
{
if (board[i][j] == ' ')
{
return 0;
}
}
}
return 1;
}
//判断输赢
char IsWin(char board[ROW][COL], 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][1];
}
}
//列
int j = 0;
for (j = 0; j < col; j++)
{
if (board[0][j] == board[1][j] && board[1][j] == board[2][j] && board[1][j] != ' ')
{
return board[1][j];
}
}
//斜
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[2][2];
}
//没人赢,
if (IsFull(board, ROW, COL))
{
return 'q';
}
return 'c';
}
IsWin()函数 也具备可优化空间,此处只判断了 井格三子棋。
建议练习修改为动态的判断方式
例如:5格三子棋;10格五子棋 .......
test.c
#define _CRT_SECURE_NO_WARNINGS 1
#include "game.h"
void menu()
{
printf("*********************************\n");
printf("********1.play 0.exit********\n");
printf("*********************************\n");
}
void game()
{
//定义数组——存放棋盘信息
char board[ROW][COL] = { 0 };
//棋盘需要初始化,定义一个初始化函数解决
InitBoard(board, ROW, COL);
//打印棋盘
DisplayBoard(board, ROW, COL);
//下棋
int ret = 0;
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");
}
printf("最终结局:>\n");
DisplayBoard(board, ROW, COL);
}
void test()
{
int input = 0;
do
{
menu();
printf("请选择:>");
scanf("%d", &input);
switch (input)
{
case 1:
printf("游戏开始\n");
game();
break;
case 0:
printf("退出游戏\n");
break;
default:
printf("选择错误,请重新选择\n");
break;
}
} while (input);
}
//测试三子棋游戏
int main()
{
//随机数生成起点
srand((unsigned int)time(NULL));
//测试
test();
return 0;
}
game.h
#pragma once
#define ROW 3
//定义行数
#define COL 3
//定义列数
#include
#include
#include
//声明
//初始化棋盘
void InitBoard(char board[ROW][COL], int row, int col);
//打印棋盘
void DisplayBoard(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);
//玩家胜利 == '*'
//电脑胜利 == '#'
//游戏平局 == 'q'
//游戏继续 == 'c'
char IsWin(char board[ROW][COL], int row, int col);
game.c
#define _CRT_SECURE_NO_WARNINGS 1
#include "game.h"
// 3 X 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] = ' ';
}
}
}
//打印棋盘
void DisplayBoard(char board[ROW][COL], int row, int col)
{
int i = 0 ;
int j = 0;
for (i = 0; i < row; i++)
{
//打印数据行 ===优化空间==== printf(" %c | %c | %c \n", board[i][0], board[i][1], board[i][2]);
for (j = 0; j < col; j++)
{
printf(" %c ", board[i][j]);
if (j < col - 1)
{
printf("|");
}
}
printf("\n");
//打印分隔行 ===优化空间==== 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;
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("坐标占用,请选择其他位置");
}
}
else
{
printf("坐标非法,请重新输入");
}
}
}
//电脑下棋
void ComputerMove(char board[ROW][COL], int row, int col)
{
printf("电脑下棋:>\n");
int x = 0;
int y = 0;
//随机下 ===对应==== 使用主函数里的随机值
while (1)
{
x = rand() % row;//0~2
y = rand() % col;//0~2
if (board[x][y] == ' ')
{
board[x][y] = '#';
printf("电脑下棋:>%d %d\n",x+1,y+1);
break;
}
}
}
//没人赢的判断函数返回值
int IsFull(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++)
{
if (board[i][j] == ' ')
{
return 0;
}
}
}
return 1;
}
//判断输赢
char IsWin(char board[ROW][COL], 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][1];
}
}
//列
int j = 0;
for (j = 0; j < col; j++)
{
if (board[0][j] == board[1][j] && board[1][j] == board[2][j] && board[1][j] != ' ')
{
return board[1][j];
}
}
//斜
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[2][2];
}
//没人赢,
if (IsFull(board, ROW, COL))
{
return 'q';
}
return 'c';
}