实现的功能:
在一个井子中实现
玩家根据这一井子输入要下棋的坐标,然后打印棋盘(玩家是*)
随后电脑也随机下棋,然后打印棋盘(电脑是#)
直到三个一样的棋连成一条线,判断谁赢,或者是平局
整体代码在最后,下面是分模块算法的实现
1、编写主函数main
int main()
{
//进入游戏
test();
return 0;
}
2、进入游戏,test()函数实现
首先根据输入的值判断是否开始或结束游戏——do...while循环
void test()
{
//无限制进行游戏:do...while
int input = 0;
//时间戳
srand((unsigned int)time(NULL));
do
{
//打印菜单
menu();
printf("请选择:");
scanf("%d", &input);
switch(input)
{
case 1:
game();
break;
case 0:
printf("退出\n");
break;
default:
printf("输入错误,请重新输入!\n");
break;
}
}
while(input);
}
menu()函数打印菜单
//打印菜单函数
void menu()
{
printf("********************************\n");
printf("****1、开始游戏 0、退出游戏***\n");
printf("********************************\n");
}
3、如果用户输入1,则进入游戏——game()函数
先声明棋盘,这里为了使代码简洁高效,需创建game.h(函数的声明)和game.c(函数的定义)
void game()
{
int res = 0;
//声明棋盘
char board[ROW][COL] = {0};
}
(1)定义棋盘行列数 (game.h文件)
//定义行列数
#define ROW 3
#define COL 3
(2)初始化棋盘,内容都为空格
game()主函数:
//初始化棋盘:全部空格
InitBoard(board, ROW, COL);
game.h声明初始化棋盘
//初始化棋盘的声明
void InitBoard(char board[ROW][COL], int row, int col);
game.c定义初始化棋盘
//初始化棋盘的定义
/*
初始化,棋盘里都是空格
| |
---|---|---
| |
---|---|---
| |
*/
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] = ' ';
}
}
}
(3)打印棋盘
//打印棋盘
Displace(board, ROW, COL);
//打印棋盘声明
void Displace(char board[ROW][COL], int row, int col);
//打印棋盘的定义
void Displace(char board[ROW][COL], int row, int col)
{
int i = 0;
for(i=0; i<row; i++)
{
int j = 0;
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");
}
}
(4)开始游戏
a.玩家下棋——*
while(1)
{
//玩家下棋
PlayerMove(board, ROW, COL);
Displace(board, ROW, COL);
}
void PlayerMove(char board[ROW][COL], int row, int 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("该坐标被占用\n");
}
}
else
{
printf("坐标非法,请重新输入!");
}
}
}
玩家输入x、y坐标,在坐标合法的范围内,如果该坐标是空格,则可以下棋,然后直接退出while
下了一个棋之后就打印一次棋盘
(在判断是否是空格时,为什么是board[x-1][y-1]:因为玩家不是程序员,不知道下标从0开始)
b.电脑下棋——#
//电脑下棋
ComputerMove(board, ROW, COL);
Displace(board, ROW, COL);
void ComputerMove(char board[ROW][COL], int row, int col);
void ComputerMove(char board[ROW][COL], int row, int col)
{
int x = 0;
int y = 0;
printf("电脑走->\n");
while(1)
{
//rand生成0-32767的随机数,%数:生成比该数小的数,如:%3生成0、1、2
x = rand() % row;
y = rand() % col;
if(board[x][y] == ' ')
{
board[x][y] = '#';
break;
}
}
}
c.在玩家和电脑下棋最后,需要判断游戏输赢
四种状态:玩家赢——*、电脑赢——#、平局——Q、继续——C
用一个变量res存放结果,放在每一轮玩家和电脑分别下棋后
//判断输赢
res = IsWin(board, ROW, COL);
判断:如果res!=‘C’,退出循环,否则游戏继续
if(res != 'C')
{
break;
}
如果退出循环,则根据res的值得出最后结果
if(res == '*')
{
printf("玩家赢\n");
}
else if(res == '#')
{
printf("电脑赢\n");
}
else
{
printf("平局");
}
IsWin()函数的实现:
char IsWin(char board[ROW][COL], int row, int col);
只要横三行或者竖三列或者斜对角三个元素值相同,则返回对应的字符
char IsWin(char board[ROW][COL], int row, int col)
{
int i = 0;
//横3行
for(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];
}
//竖3列
for(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];
//判断是否平局
if(1 == IsFull(board, ROW, COL))
{
return 'Q';
}
return 'C';
}
平局:棋盘上没有空格
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;//满了
}
--------------------------------------------------------------------------------------------------------------------------------到这里,整个代码就结束了,整体如下:
test.c
#define _CRT_SECURE_NO_WARNINGS 1
#include "game.h"
//主函数——测试三子棋游戏
//打印菜单函数
void menu()
{
printf("********************************\n");
printf("****1、开始游戏 0、退出游戏***\n");
printf("********************************\n");
}
//游戏主函数
void game()
{
int res = 0;
//声明棋盘
char board[ROW][COL] = {0};
//初始化棋盘:全部空格
InitBoard(board, ROW, COL);
//打印棋盘
Displace(board, ROW, COL);
//开始游戏
while(1)
{
//玩家下棋
PlayerMove(board, ROW, COL);
Displace(board, ROW, COL);
//判断输赢
res = IsWin(board, ROW, COL);
if(res != 'C')
{
break;
}
//电脑下棋
ComputerMove(board, ROW, COL);
Displace(board, ROW, COL);
//判断输赢
res = IsWin(board, ROW, COL);
if(res != 'C')
{
break;
}
}
if(res == '*')
{
printf("玩家赢\n");
}
else if(res == '#')
{
printf("电脑赢\n");
}
else
{
printf("平局");
}
}
void test()
{
//无限制进行游戏:do...while
int input = 0;
//时间戳
srand((unsigned int)time(NULL));
do
{
//打印菜单
menu();
printf("请选择:");
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.h
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
//函数的声明
//定义行列数
#define ROW 3
#define COL 3
//初始化棋盘的声明
void InitBoard(char board[ROW][COL], int row, int col);
//打印棋盘声明
void Displace(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"
//函数的定义
//初始化棋盘的定义
/*
初始化,棋盘里都是空格
| |
---|---|---
| |
---|---|---
| |
*/
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 Displace(char board[ROW][COL], int row, int col)
{
int i = 0;
for(i=0; i<row; i++)
{
int j = 0;
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;
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("坐标非法,请重新输入!");
}
}
}
void ComputerMove(char board[ROW][COL], int row, int col)
{
int x = 0;
int y = 0;
printf("电脑走->\n");
while(1)
{
//rand生成0-32767的随机数,%数:生成比该数小的数,如:%3生成0、1、2
x = rand() % row;
y = rand() % col;
if(board[x][y] == ' ')
{
board[x][y] = '#';
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;
//横3行
for(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];
}
//竖3列
for(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];
//判断是否平局
if(1 == IsFull(board, ROW, COL))
{
return 'Q';
}
return 'C';
}