知不足而奋进,望远山而前行。
今天让我们来学习一下C语言实现简易版三子棋游戏。
《三子棋》是一款古老的民间传统游戏,又被称为黑白棋、圈圈叉叉棋、井字棋、一条龙、九宫棋等。游戏分为双方对战,双方依次在9宫格棋盘上摆放棋子,率先将自己的三个棋子连成一条线的一方则视为胜利者。
想用C语言来实现三子棋游戏,首先我们要创建三个文件,一个头文件:game.h 两个源文件:game.c test.c
这里我们给大家介绍一下在三子棋这个游戏里面,每个文件是做什么的呢? (1)头文件game.h,头文件里是用来存放函数的声明,#define常量的定义,库函数的引用 (2)源文件test.c,这个文件里面放的是游戏的测试逻辑 (3)源文件game.c,这个文件里面放的是游戏的实现逻辑,用于函数实现
首先,我们都知道,一个游戏,最起码要存在一个游戏的菜单,以便让玩家更好的去进入这个游戏进而去玩这个游戏,所以,我们先创建一个游戏菜单,不用过于花哨,简便一些即可。
#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
void menu() //游戏菜单
{
printf("******************************\n");
printf("********** 1.play **********\n");
printf("********** 0.exit **********\n");
printf("******************************\n");
}
void game()//实现玩游戏的函数,这里我们先不去写出来,便于游戏菜单的观看
{
}
int main()
{
int input = 0;
do //这里我们利用do-while循环可以便于用户进行多次游戏
{
menu();
printf("请选择:>");
scanf("%d", &input);
switch (input)
{
case 1:
game();
break;
case 0:
printf("退出游戏!\n");
break;
default:
printf("选择错误,重新选择!\n");
break;
}
} while (input);//根据do-while的特性,若输入0,则游戏结束
return 0;
}
通过以上代码,我们便构建出来一个大致的游戏菜单,这里建议大家代码到这一步时,先去检测一下是否存在错误,便于之后代码的进行。
生成游戏菜单之后,我们便可以进一步去思考这个游戏的一步步的实现过程
#pragma once
# define ROW 3 //在此对游戏键盘的大小进行规定,便于后来的修改
# define COL 3
void InitBoard(char board[ROW][COL],int row,int col);
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] = ' ';
}
}
}
//test.c
void game()
{
//最开始的时候数组的内容全是空格,进而达到初始化这一个目的
char board[ROW][COL];
InitBoard(board, ROW, COL);
}
当然这只是一个简单的初始化,我们还要让其变得更加的美观
像这样:
void DisplayBoard(char board[ROW][COL],int row,int col)
{
int i = 0,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)
{
int j = 0;
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;
printf("玩家请下棋:>\n");
while (1) {
printf("请输入坐标:>");
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("坐标被占用,请选择其他位置\n");
}
}
else {
printf("坐标非法,请重新输入\n");
}
}
}
为了区分玩家与电脑的棋子,我们规定电脑的棋子为'#',下面我们来看一下如何实现:
void ComputerMove(char board[ROW][COL], int row, int col)
{
int x = 0, y = 0;
printf("电脑下棋:>\n");
while (1) {
x = rand() % row;//生成的随机数已经是0~2了
y = rand() % col;
if (board[x][y] == ' ')
{
board[x][y] = '#';
break;
}
}
}
在此我们要知道如何去随机生成一个位置,来让电脑去下棋,在此我们利用的是rand函数,同时要记住在使用rand函数时要求的头文件及调用srand函数
下面我们通过几行简单的代码看一下rand函数如何使用
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
int main() {
// 使用当前时间作为种子
srand((unsigned int)time(NULL));
// 生成并打印 5 个随机数
for (int i = 0; i < 5; i++) {
printf("%d\n", rand());
}
return 0;
}
不要去认为这个代码过于简单,记住,多难得事情都要从0做起,多难得知识也应该从一个个小的知识点去开始
这里我们规定一下玩家或电脑输赢的不同返回值 首先游戏的结束一定分为三种情况: 1玩家赢 我们规定返回值为’*‘ 2电脑赢 我们规定返回值为’#‘ 3平局 我们规定返回值为’Q‘ 4我们在游戏中还需去判断游戏是否结束,这里我们利用’C‘
int IsFull(char board[ROW][COL], int row, int col) {
int i = 0,j=0;
for (i = 0; i < row; i++) {
for (j = 0; j < col; j++) {
if (board[i][j] == ' ') {
return 0;
}
}
}
return 1;
}
//找出获胜者
//电脑玩家or平局
//玩家 -'*'
//电脑-’#‘
//平局-'Q'
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][0] != ' ') {
return board[i][0];
}
}
//列
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][0] == board[1][1] && board[1][1] == board[2][2] && board[1][1] != ' ')
{
return board[1][1];
}
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';
}
同时,我也将几种情况展示给大家:
1玩家胜利:
2.电脑胜利:
3.平局:
这便是所有情况的展示
#pragma once
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<time.h>
#include<stdlib.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);
int IsFull(char board[ROW][COL], int row, int col);
#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,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)
{
int j = 0;
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;
printf("玩家请下棋:>\n");
while (1) {
printf("请输入坐标:>");
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("坐标被占用,请选择其他位置\n");
}
}
else {
printf("坐标非法,请重新输入\n");
}
}
}
void ComputerMove(char board[ROW][COL], int row, int col)
{
int x = 0, y = 0;
printf("电脑下棋:>\n");
while (1) {
x = rand() % row;//生成的随机数已经是0~2了
y = rand() % col;
if (board[x][y] == ' ')
{
board[x][y] = '#';
break;
}
}
}
int IsFull(char board[ROW][COL], int row, int col) {
int i = 0,j=0;
for (i = 0; i < row; i++) {
for (j = 0; j < col; j++) {
if (board[i][j] == ' ') {
return 0;
}
}
}
return 1;
}
//找出获胜者
//电脑玩家or平局
//玩家 -'*'
//电脑-’#‘
//平局-'Q'
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][0] != ' ') {
return board[i][0];
}
}
//列
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][0] == board[1][1] && board[1][1] == board[2][2] && board[1][1] != ' ')
{
return board[1][1];
}
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';
}
#include"game.h"
void menu()
{
printf("******************\n");
printf("***** 1.play *****\n");
printf("***** 0.exit *****\n");
printf("******************\n");
}
void game()
{
char ret = 0;
char board[ROW][COL] = { 0 };
//初始化棋盘的函数
InitBoard(board, ROW, COL);
//打印棋盘
DisplayBoard( 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();//打印菜单
printf("请选择:>");
scanf("%d", &input);
switch (input)
{
case 1:
printf("---三子棋游戏---\n");
game();
break;
case 0:
printf("成功退出游戏\n");
break;
default:
printf("选择错误,请重新选择\n");
break;
}
} while (input); //input为非0就继续,为0就结束
return 0;
}
以上便是C语言简易版三子棋游戏的代码了,同时,这个游戏还可以有更好的想法,比如能否建立三个难度(简单,正常,困难),当然,我们要在弄懂这些的基础上才能进一步的去探索。同时也欢迎大家找我来探讨。