三子棋小游戏代码实现
一:三子棋代码实现逻辑分析
(1):棋盘打印
图片构思:先打印一行棋盘 %c | %c | %c ,最后一个不用加分隔符在后面
在打印一行分割符- - -|- - -|- - -,最后一个不用加分隔符在后面
一行棋盘的打印构思图
(2):玩家下棋逻辑
a:输入坐标
b:判断坐标是否合法,不合法重新输入
c:坐标若合法在判断该坐标是否被占用,若该坐标位置被占用,请重新输入
(3):电脑下棋逻辑
a:使用随机数函数rand(),随机输入坐标
b:判断坐标是否被占用
(4):判断输赢继续下棋逻辑
a:横纵、对角线任意一条三个字符连为一条线则就判断为赢,返回三个字符中的一个即可,'*‘为玩家赢、’#‘为电脑赢
b:判断完输赢后若无输赢,再判断棋盘是否满,棋盘满了横纵、对角线都无三个字符连成一条线则为平局返回一个字符’Q’,若棋盘没有满则返回字符’C’继续游戏
二:三子棋代码实现
1:先创建三个文件
test.c测试文件
game.c三子棋函数实现文件
game.h存放要使用的头文件和函数声明、默认值定义的文件
2:test.c
(1):在test.c中提供一个菜单函数,为玩家提供选择
void menu()
{
printf("*******************************\n");
printf("****** 1:play *******\n");
printf("****** 0:exit *******\n");
printf("*******************************\n");
}
(2):开辟一个数组存放游戏数据与定义一个初始化数组函数
char board[ROW][COL] = { 0 };
init_board(board, ROW, COL);
(3):打印棋盘函数定义
display_board(board, ROW, COL);//打印棋盘函数定义
棋盘图片构思
(4):再定义玩家下棋、电脑下棋与判断游戏状态
//玩家下棋
player_board(board, ROW, COL);//玩家下棋函数定义
display_board(board, ROW, COL);//打印棋盘函数定义
//判断对局情况 输 赢 平局 游戏继续
//玩家赢* 电脑赢# 平局Q 游戏继续C
ret = is_win(board, ROW, COL);
if (ret != 'C')
{
break;
}
//电脑下棋
compter_board(board, ROW, COL);//电脑下棋函数定义
display_board(board, ROW, COL);
//判断对全局情况 输 赢 平局 游戏继续
//玩家赢* 电脑赢# 平局Q 游戏继续C
ret = is_win(board, ROW, COL);
if (ret != 'C')
{
break;
}
}
if (ret == '*')
{
printf("玩家赢\n");
}
else if (ret == '#')
{
printf("电脑赢\n");
}
else if (ret == 'Q')
{
printf("平局\n");
}
test.c完整代码
#define _CRT_SECURE_NO_WARNINGS 1
#include"game.h"
void menu()
{
printf("*******************************\n");
printf("****** 1:play *******\n");
printf("****** 0:exit *******\n");
printf("*******************************\n");
}
void game()
{
printf("开始游戏:>\n");
//创建一个3*3数组存储数据
char board[ROW][COL] = { 0 };
//初始化棋盘
init_board(board, ROW, COL);
//打印棋盘
display_board(board, ROW, COL);
//接收返回值判断变量创建
char ret = 0;
while (1)
{
//玩家下棋
player_board(board, ROW, COL);
display_board(board, ROW, COL);
//判断对局情况 输 赢 平局 游戏继续
//玩家赢* 电脑赢# 平局Q 游戏继续C
ret = is_win(board, ROW, COL);
if (ret != 'C')
{
break;
}
//电脑下棋
compter_board(board, ROW, COL);
display_board(board, ROW, COL);
//判断对全局情况 输 赢 平局 游戏继续
//玩家赢* 电脑赢# 平局Q 游戏继续C
ret = is_win(board, ROW, COL);
if (ret != 'C')
{
break;
}
}
if (ret == '*')
{
printf("玩家赢\n");
}
else if (ret == '#')
{
printf("电脑赢\n");
}
else if (ret == 'Q')
{
printf("平局\n");
}
}
int main()
{
int input = 0;
srand((unsigned)time(NULL));
do{
menu();
printf("请选择:>");
scanf("%d", &input);
switch (input)
{
case 1:
game();
break;
case 0:
break;
default:
printf("输入错误重新输入:>\n");
break;
}
} while (input);
}
2:game.c
(1):初始化棋盘函数实现
//初始化棋盘函数
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] = ' ';
}
}
}
(2):打印棋盘函数实现
//打印棋盘函数实现
void display_board(char board[ROW][COL], int row, int col)
{
//(" %c | %c | %c ")棋盘一行
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");
//分隔符:---|---|---
for (j = 0; j < row; j++)
{
if (i < row - 1)
{
printf("---");//最后一行下面不用分隔符
if (j<row -1)//末尾不打印分隔符
printf("|");
}
}
printf("\n");
}
}
(3):玩家下棋函数实现与电脑下棋函数实现
//玩家下棋函数实现
void player_board(char board[ROW][COL], int row, int col)
{
printf("玩家下棋\n");
int x = 0;
int y = 0;
printf("请输入下棋坐标:>");
while (1)
{
scanf("%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("坐标被占用,请重新输入:>");
}
}
else
{
printf("坐标非法请重新输入:>");
}
}
}
//电脑下棋函数实现
void compter_board(char board[ROW][COL], int row, int col)
{
//电脑随机输入
printf("电脑下棋\n");
while (1)
{
int x = rand() % row;
int y = rand() % col;
if (board[x][y] == ' ')
{
board[x][y] = '#';
break;
}
}
}
(4):判断游戏状态函数实现
static int is_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][0] != ' ')
{
return board[i][0];
}
}
for (i = 0; i < col; i++)
{
if (board[0][i] == board[1][i] && board[1][i] == board[2][i] && board[2][i] != ' ')
{
return board[0][i];
}
}
if (board[0][0] == board[1][1] && board[1][1] == board[2][2] && board[0][0] != ' ')
{
return board[1][1];
}
if (board[2][0] == board[1][1] && board[1][1] == board[0][2] && board[2][0] != ' ')
{
return board[1][1];
}
if (is_full(board, ROW, COL) == 1)//判断棋盘是否满
{
return 'Q';//返回'Q'平局
}
return 'C';//返回'C'游戏继续
}
game.c完整代码
#define _CRT_SECURE_NO_WARNINGS 1
#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 display_board(char board[ROW][COL], int row, int col)
{
//(" %c | %c | %c ")棋盘一行
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");
//分隔符:---|---|---
for (j = 0; j < row; j++)
{
if (i < row - 1)
{
printf("---");//最后一行下面不用分隔符
if (j<row -1)//末尾不打印分隔符
printf("|");
}
}
printf("\n");
}
}
//玩家下棋函数实现
void player_board(char board[ROW][COL], int row, int col)
{
printf("玩家下棋\n");
int x = 0;
int y = 0;
printf("请输入下棋坐标:>");
while (1)
{
scanf("%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("坐标被占用,请重新输入:>");
}
}
else
{
printf("坐标非法请重新输入:>");
}
}
}
//电脑下棋函数实现
void compter_board(char board[ROW][COL], int row, int col)
{
//电脑随机输入
printf("电脑下棋\n");
while (1)
{
int x = rand() % row;
int y = rand() % col;
if (board[x][y] == ' ')
{
board[x][y] = '#';
break;
}
}
}
static int is_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][0] != ' ')
{
return board[i][0];
}
}
for (i = 0; i < col; i++)
{
if (board[0][i] == board[1][i] && board[1][i] == board[2][i] && board[2][i] != ' ')
{
return board[0][i];
}
}
if (board[0][0] == board[1][1] && board[1][1] == board[2][2] && board[0][0] != ' ')
{
return board[1][1];
}
if (board[2][0] == board[1][1] && board[1][1] == board[0][2] && board[2][0] != ' ')
{
return board[1][1];
}
if (is_full(board, ROW, COL) == 1)//判断棋盘是否满
{
return 'Q';//返回'Q'平局
}
return 'C';//返回'C'游戏继续
}
3: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 display_board(char board[ROW][COL], int row, int col);
//玩家下棋声明
void player_board(char board[ROW][COL], int row, int col);
//电脑下棋声明
void compter_board(char board[ROW][COL], int row, int col);
//判断对局情况
char is_win(char board[ROW][COL], int row, int col);
三:三子棋完整代码
(1):test.c
#define _CRT_SECURE_NO_WARNINGS 1
#include"game.h"
void menu()
{
printf("*******************************\n");
printf("****** 1:play *******\n");
printf("****** 0:exit *******\n");
printf("*******************************\n");
}
void game()
{
printf("开始游戏:>\n");
//创建一个3*3数组存储数据
char board[ROW][COL] = { 0 };
//初始化棋盘
init_board(board, ROW, COL);
//打印棋盘
display_board(board, ROW, COL);
//接收返回值判断变量创建
char ret = 0;
while (1)
{
//玩家下棋
player_board(board, ROW, COL);
display_board(board, ROW, COL);
//判断对局情况 输 赢 平局 游戏继续
//玩家赢* 电脑赢# 平局Q 游戏继续C
ret = is_win(board, ROW, COL);
if (ret != 'C')
{
break;
}
//电脑下棋
compter_board(board, ROW, COL);
display_board(board, ROW, COL);
//判断对全局情况 输 赢 平局 游戏继续
//玩家赢* 电脑赢# 平局Q 游戏继续C
ret = is_win(board, ROW, COL);
if (ret != 'C')
{
break;
}
}
if (ret == '*')
{
printf("玩家赢\n");
}
else if (ret == '#')
{
printf("电脑赢\n");
}
else if (ret == 'Q')
{
printf("平局\n");
}
}
int main()
{
int input = 0;
srand((unsigned)time(NULL));
do{
menu();
printf("请选择:>");
scanf("%d", &input);
switch (input)
{
case 1:
game();
break;
case 0:
break;
default:
printf("输入错误重新输入:>\n");
break;
}
} while (input);
}
(2): game.c
#define _CRT_SECURE_NO_WARNINGS 1
#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 display_board(char board[ROW][COL], int row, int col)
{
//(" %c | %c | %c ")棋盘一行
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");
//分隔符:---|---|---
for (j = 0; j < row; j++)
{
if (i < row - 1)
{
printf("---");//最后一行下面不用分隔符
if (j<row -1)//末尾不打印分隔符
printf("|");
}
}
printf("\n");
}
}
//玩家下棋函数实现
void player_board(char board[ROW][COL], int row, int col)
{
printf("玩家下棋\n");
int x = 0;
int y = 0;
printf("请输入下棋坐标:>");
while (1)
{
scanf("%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("坐标被占用,请重新输入:>");
}
}
else
{
printf("坐标非法请重新输入:>");
}
}
}
//电脑下棋函数实现
void compter_board(char board[ROW][COL], int row, int col)
{
//电脑随机输入
printf("电脑下棋\n");
while (1)
{
int x = rand() % row;
int y = rand() % col;
if (board[x][y] == ' ')
{
board[x][y] = '#';
break;
}
}
}
static int is_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][0] != ' ')
{
return board[i][0];
}
}
for (i = 0; i < col; i++)
{
if (board[0][i] == board[1][i] && board[1][i] == board[2][i] && board[2][i] != ' ')
{
return board[0][i];
}
}
if (board[0][0] == board[1][1] && board[1][1] == board[2][2] && board[0][0] != ' ')
{
return board[1][1];
}
if (board[2][0] == board[1][1] && board[1][1] == board[0][2] && board[2][0] != ' ')
{
return board[1][1];
}
if (is_full(board, ROW, COL) == 1)//判断棋盘是否满
{
return 'Q';//返回'Q'平局
}
return 'C';//返回'C'游戏继续
}
(3):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 display_board(char board[ROW][COL], int row, int col);
//玩家下棋声明
void player_board(char board[ROW][COL], int row, int col);
//电脑下棋声明
void compter_board(char board[ROW][COL], int row, int col);
//判断对局情况
char is_win(char board[ROW][COL], int row, int col);
以上就是我对三子棋小游戏的代码实现与逻辑分析,欢迎大家一起学习分享,若有错误欢迎大家对我指导,我将会及时改正。
本文含有隐藏内容,请 开通VIP 后查看