重拾小时候的美好回忆,用C语言代码完成简单三子棋游戏
一.游戏规则
在一个棋盘上,两方选手对弈,先将三个棋连成一条线的一方获胜(包括斜线)。
二.设计思路
1. 代码布局:分别创立两个源文件和一个头文件 text.c (用于代码测试) game.c(封装该游戏相关函数) game.h(对相关函数的申明),之所以这样是为了增加代码的可读性和逻辑性。
2.封装一个菜单menu()函数,让用户自己选择开始游戏还是退出游戏。
3.封装一个棋盘board()函数,并且能让自定义大小(可通过宏定义简易实现)。
4.封装2个函数分别能让玩家和电脑下棋。(有空位的地方才能下棋,否则出现提示)。
5.封装函数判断谁获胜
6.在text.c中循环和switch语句将game.c中的文件联系起来测试游戏
7.当玩家还想玩时,但棋盘上已经有数据啦,这时候需要一个初始化函数init
三.game.c中各功能代码实现
void player(char arr[row][col], int ROW, int COL)//玩家下棋
{
int i, j;
while (1)
{
printf("玩家下:请输入下棋指标:\n");
scanf("%d,%d",&i,&j);
if (0 < i && i< ROW + 1 && 0 < j && j<COL + 1)//用正常人的思维下棋,而不是用程序员的,不是从0开始
{
if (arr[i - 1][j - 1] == ' ') { arr[i-1][j-1] = '*'; break; }
else printf("位置已经被占用请重新输入");
}
else printf("输入值不在指定范围类,请重新输入");
}board(arr, row, col);//玩家下完棋后再次打印棋盘,能更好的看到下棋·位置
}
void menu()//菜单
{
printf("**********************************\n");
printf("******1.开始游戏 0.退出游戏******\n");
printf("**********************************\n");
printf("请输入你的选择\n");
}
void board(char arr[row][col], int ROW, int COL)//棋盘,row,col为宏定义的值,
{
int a = 0;
for (a; a < ROW; a++)
{
int i = 0;
for (i; i < COL;i++)//通过循环实现棋盘的打印
{
printf(" %c ", arr[a][i]);
if (i < COL - 1)
printf("|");
}
printf("\n");
int b = 0;
if (a < ROW - 1)
{
for (b; b < COL;b++)
{
printf("---");
if(b < COL-1)
printf("|");
}
}printf("\n");
}
}
void windos(char arr[row][col], int ROW, int COL)//电脑下棋
{
int i,j;
srand((unsigned int)time(NULL));//运用时间戳随机下棋
printf("电脑下\n");
while (1)
{
i = rand() % 3;//限定随机数范围
j = rand() % 3;
if (arr[i][j] == ' ') { arr[i][j] = '#'; break; }
}board(arr, row, col);//下完后打印棋盘
}
char judge(char arr[row][col], int ROW, int COL)//通过返回值判断游戏是否结束(三子连一线或无处可下棋)
{
int i,j;
for (i = 0; i < ROW; i++)//计算机不能连续判断
{
if (arr[i][0] == arr[i][1]&& arr[i][1] == arr[i][2] && arr[i][0] != ' ')return arr[i][0];
if (arr[0][i] == arr[1][i] && arr[1][i] == arr[2][i] && arr[1][i] != ' ')return arr[0][i];
if (arr[0][0] == arr[1][1] && arr[1][1] == arr[2][2] && arr[0][0] != ' ')return arr[0][0];
if (arr[0][2] == arr[1][1] && arr[1][1] == arr[2][0] && arr[0][2] != ' ')return arr[0][2];
}//游戏结束
for (i = 0; i < ROW; i++)
{
for (j = 0; j < COL; j++)
{
if (arr[i][j] == ' ')return 'c';//说明还没结束,还有位置
}
}return 'd';//平局
}
int vocity(char ret)//对判断函数的返回值判断游戏结果
{
if (ret == '*') { printf("玩家赢\n"); return 0; }
if (ret == '#') { printf("电脑赢\n"); return 0; }
if (ret == 'c') { return 1; }
if (ret == 'd') { printf("平局\n"); return 1; }
}
void init(char arr[row][col], int ROW, int COL)//初始化函数
{
int q,b;
for (q=0; q <ROW; q++)
{
for (b=0; b < COL; b++)
{
arr[q][b]=' ';
}//遍历数组
}
}
四.text.c中基本结构代码实现
#define _CRT_SECURE_NO_WARNINGS
#include "game.h"
int main()
{
char arr[row][col] = {0};
char ret;
int a,b=1;//定义变量
while (1)//利用循环实现重复选择菜单
{
mean();//调用菜单函数
scanf("%d",&a);//输入选择
if (a == 1)
{
printf("开始游戏\n");
init(arr, row, col);//棋盘初始化
board(arr, row, col);//打印棋盘
while (b)
{
player(arr, row, col);//玩家下
ret =judge(arr, row, col);//判断
b=vocity(ret);//判断赢家,并通过返回值确定游戏是否结束
windos(arr, row, col);
ret = judge(arr, row, col);
b=vocity(ret);
}
}
else if (a == 0)
{
printf("退出游戏");
break;
}
else { printf("请输入正确的选择\n"); }
}
return 0;
}
五.game.h中函数申明
#pragma once
#define col 3//定义棋盘列大小
#define row 3//定义棋盘行大小
#include <stdio.h>
#include <time.h>
#include <stdlib.h>
void mean();
void init(char arr[row][col], int ROW, int COL );
void board(char arr[row][col], int ROW, int COL);
void player(char arr[row][col], int ROW, int COL);
void windos(char arr[row][col], int ROW,int COL);
char judge(char arr[row][col], int ROW, int COL);
int vocity(char ret);
六.结果展示