一、三子棋
三子棋,即井字棋。
二、代码实现
test.c 测试游戏的逻辑
game.c 游戏功能的实现
game.h 游戏代码的申明(函数声明、符号申明)
角色分类:
玩家下棋 PlayerMove
电脑下棋ComputerMove
玩法分类
玩家 VS 电脑
玩家 VS 玩家(待实现)
Main:
(1)menu--->1 or 0 (输入1 表示play,0表示exit)
(2)初始化棋盘
(3)打印棋盘
(4)玩家下棋
(5)电脑下棋
(6)判断输赢
三、具体实现方式
1.主函数逻辑实现
通过do while 循环的方式先打印菜单,再根据用户的输入值,通过switch函数选择是否进行游戏
主函数体中GAME函数实现
2.菜单实现
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++)
{
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");
}
}
}
设置Initboard函数以实现初始二维数组初始化
设置Displayboard函数以实现棋盘建立,此处利用循环语句构建了如下的结构
%c | %c | %c
--- | --- | ---
%c | %c | %c
--- | --- | ---
%c | %c | %c
此处%c表示初始二维数组的对应位置数据 第一个即为board[0][0]
3.玩家下棋以及电脑下棋实现
void PlayerMove(char board[ROW][COL], int row, int col)
{
while (1)
{
int x = 0;
int y = 0;
printf("玩家下棋\n");
printf("请输入坐标:->");
scanf("%d %d", &x, &y);
if (board[x - 1][y - 1] == ' ' && board[x - 1][y - 1] != '*' && board[x - 1][y - 1] != '#')
{
board[x - 1][y - 1] = '*';
break;
}
else
{
printf("非法输入,请重新输入\n");
}
}
}
void ComputerMove(char board[ROW][COL], int row, int col)
{
printf("电脑下棋\n");
while (1)
{
int x = 0;
int y = 0;
x = rand() % row;
y = rand() % col;
if (board[x][y] == ' ' && board[x][y] != '*' && board[x][y] != '#')
{
board[x][y] = '#';
break;
}
}
}
此处使用if和while函数对二维数组中的非SPACE元素进行填充
4.判断函数
int Is_Win(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 - 1; j++)
{
if (board[i][j] != board[i][j + 1])
{
break;
}
}
if (j == col - 1)
{
return board[i][0];
}
}
//判断列
for (i = 0; i < col; i++)
{
for (j = 0; j < row - 1; j++)
{
if (board[j][i] != board[j+1][i])
{
break;
}
}
if (j == row - 1)
{
return board[0][i];
}
}
//判断对角线
for (i = 0; i <= row - 1; i++)
{
if (board[i][i] != board[i + 1][i + 1])
{
break;
}
}
if (i == row - 1)
{
return board[0][0];
}
for (i = row -1 ,j = 0; i > 0,j <= col - 1; i--,j++)
{
if (board[i][j] != board[i-1][j+1])
{
break;
}
}
if (i == 0 && j == col -1)
{
return board[row-1][0];
}
//平局判断
int ret = 0;
if(ret = FULL(board,ROW,COL) == 1)
{
return 1;
}
}
int FULL(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;
}
}
}
if (i == row)
{
return 1;
}
}
这里设置了一个新的FULL函数以判断数组是否被储存圆满
5.函数声明和头文件
四、完整代码
#pragma once
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include<windows.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);
//判断下棋
int Is_Win(char board[ROW][COL], int row, int col);
//*玩家胜利 #电脑胜利 1平局 0继续
//上述为头文件
-----------------------------------------------------------------------------------------
#define _CRT_SECURE_NO_WARNINGS
#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)
{
while (1)
{
int x = 0;
int y = 0;
printf("玩家下棋\n");
printf("请输入坐标:->");
scanf("%d %d", &x, &y);
if (board[x - 1][y - 1] == ' ' && board[x - 1][y - 1] != '*' && board[x - 1][y - 1] != '#')
{
board[x - 1][y - 1] = '*';
break;
}
else
{
printf("非法输入,请重新输入\n");
}
}
}
void ComputerMove(char board[ROW][COL], int row, int col)
{
printf("电脑下棋\n");
while (1)
{
int x = 0;
int y = 0;
x = rand() % row;
y = rand() % col;
if (board[x][y] == ' ' && board[x][y] != '*' && board[x][y] != '#')
{
board[x][y] = '#';
break;
}
}
}
int FULL(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;
}
}
}
if (i == row)
{
return 1;
}
}
int Is_Win(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 - 1; j++)
{
if (board[i][j] != board[i][j + 1])
{
break;
}
}
if (j == col - 1)
{
return board[i][0];
}
}
//判断列
for (i = 0; i < col; i++)
{
for (j = 0; j < row - 1; j++)
{
if (board[j][i] != board[j+1][i])
{
break;
}
}
if (j == row - 1)
{
return board[0][i];
}
}
//判断对角线
for (i = 0; i <= row - 1; i++)
{
if (board[i][i] != board[i + 1][i + 1])
{
break;
}
}
if (i == row - 1)
{
return board[0][0];
}
for (i = row -1 ,j = 0; i > 0,j <= col - 1; i--,j++)
{
if (board[i][j] != board[i-1][j+1])
{
break;
}
}
if (i == 0 && j == col -1)
{
return board[row-1][0];
}
//平局判断
int ret = 0;
if(ret = FULL(board,ROW,COL) == 1)
{
return 1;
}
}
//上述为game.c文件
-----------------------------------------------------------------------------------------
#define _CRT_SECURE_NO_WARNINGS
#include "game.h"
//菜单
//生成棋盘
//下棋 判断胜负
void menu()
{
printf("--------------------------------\n");
printf("------- 1 . play -------\n");
printf("------- 0 . exit -------\n");
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);
if(Is_Win(board, ROW, COL) == '*')
{
printf("玩家胜利\n");
break;
}
else if (Is_Win(board, ROW, COL) == 1)
{
printf("平局\n");
break;
}
//电脑下棋
ComputerMove(board, ROW, COL);
Displayboard(board, ROW, COL);
Is_Win(board, ROW, COL);
if (Is_Win(board, ROW, COL) == '#')
{
printf("电脑胜利\n");
break;
}
}
}
int main()
{
srand((unsigned int)time(NULL));
int input = 0;
do
{
menu();
printf("请输入数字以确定是否开始游戏:->");
scanf("%d", &input);
switch (input)
{
case 1 :
game();
Sleep(1500);
system("cls");
break;
case 0 :
printf("好的,退出程序\n");
break;
default :
printf("输入非法,请重新输入\n");
Sleep(1000);
system("cls");
break;
}
} while (input);
return 0;
}
//上述为test.c文件
-----------------------------------------------------------------------------------------