目录
三子棋:
1.介绍:
当进入游戏时首先会弹出一个界面,可以去选择 0(退出游戏) 1(开始游戏),当进入游戏后首先会打印一个初始化后的棋盘,此时玩家可以去输入对应坐标,当输入了坐标后,代表玩家的棋子(*)会下到对应的位置,当玩家下完后电脑也会在一个范围内的随机位置处下一个棋子(#),每当有一方下完后都会打印一次棋盘,与此同时,电脑和玩家下完一次后都会对棋盘的输赢,平局情况进行判断,直到有一方赢或输又或者平局则游戏结束。
2.代码的实现:
2.1 头文件部分 (game.h)
#pragma once
#include<stdio.h>
#include<stdlib.h>
#include<time.h>
#define ROW 3//棋盘行数
#define COL 3//棋盘列数
//初始化棋盘
void Init_Board(char board[ROW][COL],int row,int col);
//打印棋盘
void DisplayBoard(char board[ROW][COL],int row,int col);
//玩家下棋
void player_move(char board[ROW][COL], int row,int col);
//电脑下棋
void computer_move(char board[ROW][COL], int row,int col);
//判断输赢
char is_win(char board[ROW][COL], int row, int col);
2.2 函数主体的实现(test.c)
#include"game.h"
void menu()
{
printf("######################\n");
printf("##### 1. play #####\n");
printf("##### 0. exit #####\n");
printf("######################\n");
}
void game()
{
int ret = 0;
//创建一块2维数组的空间用来存放下棋的数据
char board[ROW][COL] = { 0 };
//初始化棋盘全为空格
Init_Board(board,ROW,COL);
//打印棋盘
DisplayBoard(board, ROW, COL);
while (1)//先玩家下一个,然后玩家下棋结束,打印棋盘,电脑下一个棋,然后打印棋盘,此时第1个循环结束,然后进入到第2个循环中
{
//玩家下棋
player_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;
}
}
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));
do {
menu();
printf("请选择:>");
scanf_s("%d", &input);
switch (input)
{
case 1:
game();
break;
case 0:
printf("退出游戏\n");
break;
default:
printf("选择错误\n");
break;
}
} while (input);
}
int main()
{
test();
return 0;
}
2.3 在函数的主体中函数接口的实现(game.c)
#include"game.h"
//初始化棋盘
void Init_Board(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]);
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 player_move(char board[ROW][COL], int row, int col)
{
int x = 0;
int y = 0;
printf("玩家下棋\n");
while (1)
{
printf("请输入坐标:>");
scanf_s("%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 computer_move(char board[ROW][COL], 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;
}
}
}
//判断平局(并不是功能性函数,不写到game.h中)(加上static表示,被static修饰的函数不能被其它文件直接使用)
static int 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[1][i] == board[2][i] && board[1][i] != ' ')//board[0][i] == board[1][i] && board[1][i] == board[2][i]当这3个为空格时也相等,随便判断一个不为空格
{
return board[1][i];
}
}
//判断对角线(3*3)
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 (if_full(board, row, col) == 1)
{
return 'Q';//为平局时则返回一个Q
}
return 'C';//当没人赢时返回一个C,继续
}