三子棋(附源码)
作者:互联网
一.基本流程
1.创建初始菜单页面
2.初始化棋盘(3*3)
3.打印棋盘内容
4.玩家下棋
5.电脑随机下棋
6.判断输赢
二.游戏设计
函数声明:
#pragma once
#include<stdio.h>
#include<stdlib.h>
#include<time.h>
#define ROW 3 //行
#define COL 3 //列
//菜单函数
void meau();
//初始化棋盘
void InitChess(char board[ROW][COL]);
//打印棋盘
void Showboard(char board[ROW][COL]);
//玩家下棋
void Player(char board[ROW][COL]);
//电脑下棋
void Computer(char board[ROW][COL]);
//判断输赢
//玩家赢 W
//玩家数 L
//平局 F
//游戏继续 C
char JudgeWin(char board[ROW][COL]);
//进行游戏
void Game();
菜单界面:
//菜单函数
void meau()
{
printf("******************************************\n");
printf("******* 1. PLAY *********\n");
printf("******* 0. EXIT *********\n");
printf("******************************************\n");
}
初始化棋盘:
将3*3的棋盘内容初始化为空格
//初始化棋盘 初始化为空格
void InitChess(char board[ROW][COL])
{
for (int i = 0; i < ROW; i++)
{
for (int j = 0; j < COL; j++)
{
board[i][j] = ' ';
}
}
}
打印棋盘:
//打印棋盘
void Showboard(char board[ROW][COL])
{
int i;
for (i = 0; i < ROW; i++)
{
int j;
for (j = 0; j < COL; j++)
{
printf(" %c ", board[i][j]); //打印每一行的每一个数据和后面分隔符
printf("|");
}
printf("\n"); //换行
if (i < ROW-1)
{
int j;
for (j = 0; j < COL; j++)
{
printf("---");
printf("|");
}
printf("\n");
}
}
}
这种方法可以打印n*n式的棋盘
效果演示:
玩家落棋:
考虑内容:
1.在棋盘范围内落子,若不在范围内,重新输入
2.输入坐标为玩家主观感受,并非二维数组正常下标、例如(0,0)位置玩家需输入(1,1)
代码演示:
void Player(char board[ROW][COL])
{
int x = 0;
int y = 0;
printf("请玩家落子\n");
while (1)
{
printf("请输入棋子的坐标:");
scanf("%d %d", &x, &y);
//判断坐标是否合法 (玩家输入的坐标从1开始并非二维数组的0开始)
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");
}
}
}
电脑随机落棋:
使用时间函数,产生随机值(不过此方法电脑想赢玩家太难),在棋盘范围内落子
在主函数内下时间戳srand函数
void Computer(char board[ROW][COL])
{
printf("电脑落子\n");
while (1)
{
int x = rand() % ROW;
int y = rand() % COL;
if (board[x][y] == ' ')
{
board[x][y] = '+';
break;
}
}
}
效果演示:
判断输赢:
//玩家赢 返回W
//玩家数返回 L
//平局返回F (判断是否和棋)
//游戏继续返回 C
1.判断输赢,从各行,各列,对角线是否满足
2.判断和棋,需要判断棋盘内容是否已满创建IsFull函数,此函数只应用于判断输赢,可设置为static静态保护,隐藏文件。
代码实现:
//判断棋盘是否满了
static int Isfull(char board[ROW][COL])//只服务与判断输赢 利用static静态
{
int i, j;
for (i = 0; i < ROW; i++)
{
for (j = 0; j < COL; j++)
{
if (board[i][j] == ' ')
return 0; //没有满
}
}
return 1; //满了
}
//判断输赢
char JudgeWin(char board[ROW][COL])
{
//判断三行
for (int row = 0; row < ROW; row++)
{
if (board[row][0] != ' '&& board[row][0] == board[row][1]&& board[row][1] == board[row][2])
{
if (board[row][0] == '*')
return 'W';
else
return 'L';
}
}
//判断三列
for (int col = 0; col < COL; col++)
{
if (board[0][col] != ' '&& board[0][col] == board[1][col]&& board[0][col] == board[2][col])
{
if (board[0][col] == '*')
return 'W';
else
return 'L';
}
}
//判断对角线
if (board[1][1] != ' '&& board[0][0] == board[1][1]&& board[1][1] == board[2][2])
{
if (board[1][1] == '*')
return 'W';
else
return 'L';
}
if (board[2][0] != ' '&& board[2][0] == board[1][1]&& board[2][0] == board[0][2])
{
if (board[2][0] == '*')
return 'W';
else
return 'L';
}
//判断平局
//如果棋盘满了 返回1 没满返回0
if (Isfull(board) ==1)
{
return 'F';
}
else
return 'C';
}
进行游戏:
void Game()
{
//储存数据 二维数组
char board[ROW][COL];
char net = 0; //接受游戏状态
InitChess(board);
Showboard(board);
while (1)
{
//玩家下棋
Player(board);
Showboard(board);
net = JudgeWin(board);
if (net != 'C')
break;
//电脑下棋
Computer(board);
Showboard(board);
net = JudgeWin(board);
if (net != 'C')
break;
}
if (net == 'W')
{
printf("恭喜玩家获胜\n");
}
else if (net == 'L')
{
printf("真可惜玩家输了\n");
}
else if(net=='F')
printf("平局\n");
}
主函数:
#define _CRT_SECURE_NO_WARNINGS
#include"play.h"
int main()
{
int num;
srand((unsigned int)time(NULL));
do
{
meau();
printf("请选择>");
scanf("%d", &num);
switch (num)
{
case 1:
Game();
break;
case 0:
printf("退出游戏^*^\n");
break;
default:
printf("选择错误,请重新输入\n");
break;
}
} while (num);
return 0;
}
游戏效果展示:
这种方法满足基本实现,但是电脑过于笨重,可以在电脑落子的函数进行针对于于玩家获胜的算法设计
源代码:
//头文件
#include<stdio.h>
#include<stdlib.h>
#include<time.h>
#define ROW 3
#define COL 3
//菜单函数
void meau();
//初始化棋盘
void InitChess(char board[ROW][COL]);
//打印棋盘
void Showboard(char board[ROW][COL]);
//玩家下棋
void Player(char board[ROW][COL]);
//电脑下棋
void Computer(char board[ROW][COL]);
//判断输赢
//玩家赢 W
//玩家数 L
//平局 F
//游戏继续 C
char JudgeWin(char board[ROW][COL]);
//进行游戏
void Game();
//函数实现
#define _CRT_SECURE_NO_WARNINGS
#include"play.h"
//菜单函数
void meau()
{
printf("******************************************\n");
printf("******* 1. PLAY *********\n");
printf("******* 0. EXIT *********\n");
printf("******************************************\n");
}
//初始化棋盘 初始化为空格
void InitChess(char board[ROW][COL])
{
for (int i = 0; i < ROW; i++)
{
for (int j = 0; j < COL; j++)
{
board[i][j] = ' ';
}
}
}
//打印棋盘
void Showboard(char board[ROW][COL])
{
int i;
for (i = 0; i < ROW; i++)
{
int j;
for (j = 0; j < COL; j++)
{
printf(" %c ", board[i][j]); //打印每一行的每一个数据和后面分隔符
printf("|");
}
printf("\n"); //换行
if (i < ROW-1)
{
int j;
for (j = 0; j < COL; j++)
{
printf("---");
printf("|");
}
printf("\n");
}
}
}
//玩家下棋
void Player(char board[ROW][COL])
{
int x = 0;
int y = 0;
printf("请玩家落子\n");
while (1)
{
printf("请输入棋子的坐标:");
scanf("%d %d", &x, &y);
//判断坐标是否合法 (玩家输入的坐标从1开始并非二维数组的0开始)
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(char board[ROW][COL])
{
printf("电脑落子\n");
while (1)
{
int x = rand() % ROW;
int y = rand() % COL;
if (board[x][y] == ' ')
{
board[x][y] = '+';
break;
}
}
}
//判断棋盘是否满了
static int Isfull(char board[ROW][COL])//只服务与判断输赢 利用static静态
{
int i, j;
for (i = 0; i < ROW; i++)
{
for (j = 0; j < COL; j++)
{
if (board[i][j] == ' ')
return 0; //没有满
}
}
return 1; //满了
}
//判断输赢
char JudgeWin(char board[ROW][COL])
{
//判断三行
for (int row = 0; row < ROW; row++)
{
if (board[row][0] != ' '&& board[row][0] == board[row][1]&& board[row][1] == board[row][2])
{
if (board[row][0] == '*')
return 'W';
else
return 'L';
}
}
//判断三列
for (int col = 0; col < COL; col++)
{
if (board[0][col] != ' '&& board[0][col] == board[1][col]&& board[0][col] == board[2][col])
{
if (board[0][col] == '*')
return 'W';
else
return 'L';
}
}
//判断对角线
if (board[1][1] != ' '&& board[0][0] == board[1][1]&& board[1][1] == board[2][2])
{
if (board[1][1] == '*')
return 'W';
else
return 'L';
}
if (board[2][0] != ' '&& board[2][0] == board[1][1]&& board[2][0] == board[0][2])
{
if (board[2][0] == '*')
return 'W';
else
return 'L';
}
//判断平局
//如果棋盘满了 返回1 没满返回0
if (Isfull(board) ==1)
{
return 'F';
}
else
return 'C';
}
//进行游戏
void Game()
{
//储存数据 二维数组
char board[ROW][COL];
char net = 0; //接受游戏状态
InitChess(board);
Showboard(board);
while (1)
{
//玩家下棋
Player(board);
Showboard(board);
net = JudgeWin(board);
if (net != 'C')
break;
//电脑下棋
Computer(board);
Showboard(board);
net = JudgeWin(board);
if (net != 'C')
break;
}
if (net == 'W')
{
printf("恭喜玩家获胜\n");
}
else if (net == 'L')
{
printf("真可惜玩家输了\n");
}
else if(net=='F')
printf("平局\n");
}
//测试用例(主函数)
#include"play.h"
int main()
{
int num;
srand((unsigned int)time(NULL));
do
{
meau();
printf("请选择>");
scanf("%d", &num);
switch (num)
{
case 1:
Game();
break;
case 0:
printf("退出游戏^*^\n");
break;
default:
printf("选择错误,请重新输入\n");
break;
}
} while (num);
return 0;
}
标签:int,三子,char,源码,board,printf,COL,ROW 来源: https://blog.csdn.net/weixin_51609435/article/details/122516437