三子棋部分
今天我们准备写一个三子棋的游戏
首先要几个步骤:
初始化棋盘
首先把棋盘数组中的内容全部初始化为空格,这样的话可以在下棋的时候,用其他字符来填充这个空格,就能很好地达到下棋的目的
//数组初始化
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++)
{
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");
}
}
玩家下棋
玩家下棋的时候,既要进行判断该位置上面的坐标对不对,也就是在不在棋盘里面,还要想到棋盘上的这个位置有没有人落子,如果有人落子,就要被告知有棋子在上面,如果想下棋的位置不在这个棋盘内,就要被告知这个坐标是不对的,要重新输入,如果坐标是棋盘上的,就用break跳出这次下棋的过程
//棋手下棋
void PlayerMove(char board[Row][Col], int row, int col)
{
int x = 0;
int y = 0;
while (1)
{
printf("棋手下棋\n");
printf("请输入要下入的坐标:>\n");
scanf("%d%d", &x, &y);
if (x >= 1 && y >= 1 && x <= row && y <= col)
{
if (board[x - 1][y - 1] == ' ')
{
board[x - 1][y - 1] = '*';
break;
}
else
printf("该位置上有棋子了,请选择其他位置\n");
}
else
printf("输入的坐标位置不合法,请重新输入\n");
}
}
电脑下棋
在电脑下棋的时候,用到rand函数进行随机生成一个数,但在调用rand函数之前,要在主函数内部进行srand函数的调用
利用time函数可以随机根据时间戳随机生成一个数
//电脑下棋
void ComputerMove(char board[Row][Col], int row, int col)
{
//用rand和srand函数进行随机生成数
int x = 0;
int y = 0;
while (1)
{
printf("电脑下棋\n");
x = rand() % row;
y = rand() % col;
printf("电脑下棋的位置为:%d %d\n", x + 1, y + 1);
if (board[x][y] == ' ')
{
board[x][y] = '#';
break;
}
}
}
判断输赢
判断输赢是在行,列,左对角线和右对角线判断是否有三个相同的棋子,如果有的话,就要对这个棋子进行返回,如果是玩家下的那种棋子,就是玩家赢了,否则是电脑赢了。
//判断输赢
char IsWin(char board[Row][Col], int row, int col)
{
//行
int i = 0;
int j = 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 (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][2] == board[1][1] && board[1][1] == board[2][0] && board[1][1] != ' ')
{
return board[1][1];
}
//判断棋盘是否为满
if(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;
}
一共分为三个文件,以工程的形式进行书写
分别是game.h头文件
game.c函数实现文件
test.c测试运行文件
game.h
#pragma once
#define _CRT_SECURE_NO_WARNINGS 1
#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 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);
//判断输赢
char IsWin(char board[Row][Col], int row, int col);
game.c
#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 DisplayBoard(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++)
{
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("棋手下棋\n");
printf("请输入要下入的坐标:>\n");
scanf("%d%d", &x, &y);
if (x >= 1 && y >= 1 && x <= row && 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)
{
//用rand和srand函数进行随机生成数
int x = 0;
int y = 0;
while (1)
{
printf("电脑下棋\n");
x = rand() % row;
y = rand() % col;
printf("电脑下棋的位置为:%d %d\n", x + 1, y + 1);
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;
int j = 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 (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][2] == board[1][1] && board[1][1] == board[2][0] && board[1][1] != ' ')
{
return board[1][1];
}
//判断棋盘是否为满
if(IsFull(board,row,col))
{
return 'Q';
}
return 'C';
}
test.c
#include"game.h"
void menu()
{
printf("***********************************\n");
printf("*************1.play****************\n");
printf("***********************************\n");
printf("*************0.exit****************\n");
printf("***********************************\n");
}
void game()
{
//定义数组并初始化
char board[Row][Col] = { 0 };
char ret = 0;
//数组进行初始化
InitBoard(board, Row, Col);
//打印棋盘
DisplayBoard(board, Row, Col);
//判断输赢
IsWin(board, Row, Col);
while (1)
{
//棋手下棋
PlayerMove(board, Row, Col);
ret = IsWin(board, Row, Col);
if (ret != 'C')
{
break;
}
DisplayBoard(board, Row, Col);
//电脑下棋
ComputerMove(board, Row, Col);
ret = IsWin(board, Row, Col);
if (ret != 'C')
{
break;
}
DisplayBoard(board, Row, Col);
}
if (ret == '*')
{
printf("玩家赢了\n");
}
else if (ret == '#')
{
printf("电脑赢了\n");
}
else
{
printf("平局\n");
}
DisplayBoard(board, Row, Col);
}
int main()
{
srand((unsigned)time(NULL));
//菜单函数
int input = 0;
do
{
menu();
scanf("%d", &input);
switch (input)
{
case 1:
game();
break;
case 0:
printf("退出游戏\n");
break;
default:
printf("输入错误,请重新输入\n");
break;
}
} while (input);
}