1
在写三子棋的代码之前,我们来看看实现这个游戏的逻辑:
1.菜单界面选择开始或者退出游戏。
2.创建棋盘并初始化。
3.打印棋盘。
4.玩家落子(玩家输入行列坐标的方式来落子),'x’表示玩家落子。
5.判定胜负关系(输,赢,和棋),'q’表示和棋。
6.电脑落子(随机位置落子) ,'o’表示电脑落子。
7.判定胜负关系。
8.回到 步骤2 继续执行。
以下几个文件
三、步骤
1.菜单界面
1.开始游戏 0.退出游戏
void menu()
{
printf("******************************\n");
printf("********* 1. play ********\n");
printf("********* 0. exit ********\n");
printf("******************************\n");
}
//游戏的整个算法的实现!
void game()
{
char ret = 0;
//存放下棋的数据
char board[ROW][COL] = { 0 };
//初始化棋盘为全空格
InitBoard(board, ROW, COL);
//打印棋盘
// | |
//---|---|---
// | |
//---|---|---
// | |
//打印棋盘
DisplayBoard(board, ROW, COL);
//下棋
while(1){
//玩家下棋
play_move(board, ROW, COL);
//显示一下玩家下的
DisplayBoard(board, ROW, COL);
//判断输赢
ret=is_win(board,ROW,COL);
if (ret != 'C')
{
break;
}
//电脑下棋
computer_move(board, ROW, COL);//随机下棋,传参!
DisplayBoard(board, ROW, COL);
//判断电脑是否赢
ret = is_win(board, ROW, COL);
if (ret != 'C')
{
break;
}
}
//break跳到的部分,单独进行判断
if (ret == '*')
{
printf("玩家赢了\n");
}
else if (ret == '#')
{
printf("电脑赢了\n");
}
else {
printf("平局\n");
}
DisplayBoard(board, ROW, COL);//再打印一次棋局
}
//什么情况游戏,结束
//玩家赢 返回*
//电脑赢 返回#
//平局 返回Q
//继续 返回C
void test()
{
int input = 0;
srand((unsigned int)time(NULL));//time返回类型是time-t!
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;
}
test.c文件
#define _CRT_SECURE_NO_WARNINGS 1
#include "game.h"
void InitBoard(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++)
{
board[i][j] = ' ';//所有棋盘初始化为空格
}
}
}
//void DisplayBoard(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]);//所有棋盘初始化为空格
// }
// printf("\n");
// }
//
//}
/*
* 1.第2版不太好,由于这样写死了,沒有办法把一行不是3个表示!
*/
//void DisplayBoard(char board[ROW][COL], int row, int col)
//{
// int i = 0;
// for (i = 0; i < row; i++)
// {
// //打印数据
// printf(" %c | %c | %c \n", board[i][0], board[i][1], board[i][2]);
// //打印分隔的行
// if (i < row - 1)
// printf("---|---|---\n");
// }
//
//}
/*
* 3.第三版,可改变的棋盘!
*/
void DisplayBoard(char board[ROW][COL], int row, int col)
{
int i = 0;
for (i = 0; i < row; i++)
{
//1.打印一行的数据
int j = 0;
for (j = 0; j < col; j++)
{
printf(" %c ", board[i][j]);
if (j < col - 1)
{
printf("|");
}
}
printf("\n");
//2.打印分隔的行
if (i < row - 1)
{
for (j = 0; j < col; j++)
{
printf("---");
if (j < col - 1)
{
printf("|");
}
}
}
printf("\n");
}
}
void play_move(char board[3][3], int row, int col)
{
int x = 0;//储存
int y = 0;
printf("玩家下棋\n");
while(1){
printf("请输入坐标\n");
scanf("%d %d", &x, &y);
if (x >= 1 && x <= row && y >= 1 && y <= col)
{
//下棋 数组下标从0开始
if (board[x - 1][y - 1] == ' ')
{
board[x - 1][y - 1] = '*';
break;
}
else
{
printf("该坐标被占用,请重新输入");
}
}
else
{
printf("坐标非法,请重新输入\n");
}
}
}
void computer_move(char board[3][3], int row, int col)
{
int x = 0;
int y = 0;
printf("电脑下棋\n");
while(1){
x = rand() % row;//0~2
y = rand() % col;//0~2,电脑下棋的坐标!
//判断坐标有没有下过棋
if (board[x][y] = ' ')
{
board[x][y] = '#';
break;
}
}
}
//返回1表示棋盘满了
//返回0表示棋盘没满
//这个函数只是为is_win函数声明
static if_full(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++)
{
if (board[i][j] == ' ') //没满
{
return 0;
}
}
}
return 1;//满了
}
//判断棋盘有没有成线
char is_win(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][1] != ' ')
{
return board[i][1];//返回*就是玩家赢了!
}
}
//判断横两列
for (i = 0; i < col; i++)
{
if (board[0][i] == board[1][i] && board[2][i] == board[i][2] && board[1][i] != ' ')
{
return board[1][i];
}
}
//判断两条对角线
if (board[0][0] == board[1][1] && board[2][2] && board[1][1] != ' ')
{
return board[1][1];
}
if (board[0][2] == board[1][1] && board[2][0] && board[1][1] != ' ')
{
return board[1][1];
}
//判断平局
if(if_full(board,row,col)==1)
{
return 'Q';
}
//继续
return 'C';
}