文章目录
本文章将详细说明如何用C语言实现简易的井字棋小游戏,编译器用的是VS2019。
井字棋小游戏
最终效果如图:
游戏实现
一、创建新项目及游戏文件
1.打开VS创建新的空项目。
2.在解决方案资源管理器选中 源文件 > 右键点击添加 > 新建项 > 选中C++文件并分别创建 game.c 和 text.c 。
3.用同样的方法在解决方案资源管理器 创建头文件 game.h 。
二、引头文件,定义符号
在game.h引入头文件并定义井字棋的行数和列数。
井字棋是3*3的棋盘,因此定义行数3,列数3。
game.h
#pragma once
#define _CRT_SECURE_NO_WARNINGS
#define ROW 3 //棋盘行数
#define COL 3 //棋盘列数
#include <stdio.h>
#include<stdlib.h>
#include<time.h>
#include<windows.h>
然后在game.c 和 text.c 引入头文件 “game.h”
game.c
#include"game.h"
text.c
#include"game.h"
三、主函数
主函数用do while语句和switch语句构成,定义整形 input 来接收玩家输入的数字,输入0则退出游戏,输入1则开始游戏。输入其他数字时则显示输入错误。
text.c
int main()
{
srand((unsigned int)time(NULL));//设置随机数起点
int input = 0;//接收玩家输入的数字
do
{
printmenu();//打印菜单
scanf("%d", &input);
switch (input)
{
case 0:
printf("退出成功!\n");
break;
case 1:
system("cls");//清屏
printf("开始游戏!\n\n\n");
playgame();//开始游戏
break;
default:
printf("输入错误,请重试!\n");
break;
}
} while (input);//当input为0,相当于假 退出循环
return 0;
}
打印菜单
在主函数种do while语句中先打印菜单让玩家知道输入什么开始游戏,输入什么退出游戏。定义函数printmenu() 来打印菜单。在game.c实现函数并在game.h声明。
game.c
void printmenu()
{
printf("■■■■■■■■■■■■■■■\n");
printf("■■■ 1.开始游戏 ■■■\n");
printf("■■■ 0.退出游戏 ■■■\n");
printf("■■■■■■■■■■■■■■■\n");
printf("请输入数字‘0’或数字‘1’>>>\n");
}
需要在game.h声明这个函数的存在,不然在text.c用不了。
game.h
void printmenu();
四、开始游戏
当玩家输入数字1,则开始游戏,因此需要在text.c
定义一个 playgame() 函数来实现井字棋游戏。playgame()的完整函数将在最后面展示。
void playgame()
{
}
1.创建二维数组
在playgame函数内定义一个二维数组,用于存储井字棋的棋子信息。如电脑为 字符‘X’ 玩家为 字符‘O’。
text.c > playgame()函数内
char table[ROW][COL]={0};//创建一个3行3列的二维数组
2.初始化棋盘
定义一个函数 inittable() 初始化棋盘,将来玩完一盘井字棋后需要清空存储的棋子信息,初始化是十分必要的。然后在playgame函数内传table这个二维数组作为参数。
函数实现:
game.c
void inittable(char table[ROW][COL]) //初始化棋盘
{
for (int i = 0; i < ROW; i++)
{
for (int j = 0; j < COL; j++)
{
table[i][j] = ' '; //将信息置为空
}
}
}
函数声明:
game.h
void printmenu();//打印菜单
3.打印棋盘
棋盘的展示也是必不可少的,因此定义一个函数printtable() 用于打印棋盘。利用 ‘ - ’ 以及 ‘ | ’ 打印一个简易的棋盘。
井字棋可看成
第一行: 空格 棋子 空格 | 空格 棋子 空格 | 空格 棋子 空格
第二行: 横杠 横杠 横杠 | 横杠 横杠 横杠 | 横杠 横杠 横杠
第三行: 空格 棋子 空格 | 空格 棋子 空格 | 空格 棋子 空格
第四行: 横杠 横杠 横杠 | 横杠 横杠 横杠 | 横杠 横杠 横杠
第五行: 空格 棋子 空格 | 空格 棋子 空格 | 空格 棋子 空格
棋子则对应棋盘table内存储的棋子信息。
函数实现:
game.c
//打印棋盘
void printtable(char table[ROW][COL])
{
for (int i = 0; i < ROW; i++)
{
//打印空格 棋子 空格 | 空格 棋子 空格 | 空格 棋子 空格
for (int j = 0; j < COL; j++)
{
printf(" %c ", table[i][j]);
if (j < COL - 1)
{
printf("|");
}
}
printf("\n");
//打印 横杠 横杠 横杠 | 横杠 横杠 横杠 | 横杠 横杠 横杠
if (i < ROW - 1)
{
for (int j = 0; j < COL; j++)
{
printf("---");
if (j < COL - 1)
{
printf("|");
}
}
}
printf("\n");
}
}
函数声明:
game.h
void printtable(char table[ROW][COL]);//打印棋盘
4.玩家下棋
当有了棋盘后,玩家就可以开始下棋了。定义函数 player() 接收玩家输入的想下棋的位置 即第几行,第几列。如果这个位置在棋盘table中对应的下标元素为空,这将这个元素置为字符‘O’。如玩家输入第二行第二列,对应table二维数组下标为[1] [1]。
函数实现:
game.c
//玩家下棋
void player(char table[ROW][COL])
{
printf("玩家(O)走>>>> (输入: 行 空格 列 ) \n");
int row = 0;
int col = 0;
int k = 0;
while (1)
{
scanf("%d %d", &row,&col);
if (row > 0 && row <= ROW && col>0 && col<=COL && table[row - 1][col - 1] == ' ')
{
table[row-1][col-1] = 'O';
break;
}
else
{
printf("输入错误,请重试\n");
continue;
}
}
}
函数声明:
game.h
void computer(char table[ROW][COL]);//电脑下棋
5.电脑下棋
玩家下完棋后,就到电脑下棋了。这里运用随机数代替电脑下棋算法。
首先在主函数设置随机数起点。
int main()
{
srand((unsigned int)time(NULL));
return 0;
}
定义computer() 函数,然后使用rand()函数 随机生成第row行,第col列,如果这个位置在棋盘table中对应的下标元素为空,这将这个元素置为字符‘X’。
函数实现:
game.c
//电脑下棋
void computer(char table[ROW][COL])
{
printf("电脑(X)走>>>>\n");
while (1)
{
int col = rand() % COL;
int row = rand() % ROW;
if (table[row][col] != ' ')
{
continue;
}
else
{
table[row][col] = 'X';
break;
}
}
Sleep(500);
}
函数声明:
game.h
void computer(char table[ROW][COL]);//电脑下棋
6.判断游戏是否结束
当双方有一方下棋时,应该实时检查游戏是否结束,如电脑胜利,玩家胜利还是平局,不然游戏将无止境。因此定义函数check() 检测是否游戏结束,定义iswin() 检测是胜利还是失败还是平局还是继续游戏。
check() 函数如何判断一方的胜利呢?其实只需要分别检测井字棋的三行三列以及两个斜线八条连线 对应的三个元素是否相同,如果相同,返回对应元素的字符,如返回‘O’ 则知道是玩家赢了。如果八条连线对应的元素没有三个都相同,且已经没有空位了,返回字符‘P’表示平局。如果还有空格则返回字符‘C’表示游戏继续。
接着通过iswin() 函数打印游戏结束后是谁赢的信息,并退出游戏循环。游戏结束返回1,没有结束返回0。
函数实现
game.c
//检测是否游戏结束
char check(char table[ROW][COL])
{
int i = 0;
int j = 0;
for (j = 0; j < COL; j++)
{
if (table[j][0] == table[j][1] && table[j][1] == table[j][2] && table[j][0] != 0)//判断竖
{
return table[j][0];
}
}
for (i = 0; i < ROW; i++)
{
if (table[0][i] == table[1][i] && table[1][i] == table[2][i] && table[0][i] != 0)//判断横
{
return table[0][i];
}
}
if (table[0][0] == table[1][1] && table[2][2] == table[1][1] && table[1][1] != 0)//判断斜行
{
return table[0][0];
}
if (table[0][2] == table[1][1] && table[1][1] == table[2][0] && table[1][1] != 0)//判断斜行
{
return table[0][2];
}
for (i = 0; i < ROW; i++) //判断是否继续 不是两方胜利也不是平局
{
for (j = 0; j < COL; j++)
{
if (table[i][j] == ' ')
{
return 'C';
}
}
}
return 'P'; //判断平局
}
//检测是胜利还是失败还是平局还是继续游戏。
int iswin(char table[ROW][COL])
{
char ret = check(table);
if (ret == 'O')
{
printf("恭喜你赢了!玩家胜利\n");
return 1;
}
else if (ret == 'X')
{
printf("很遗憾你输了!电脑胜利\n");
return 1;
}
else if (ret == 'P')
{
printf("平局!!!");
return 1;
}
else
{
return 0;
}
}
函数声明
game.h
//检测是否游戏结束
char check(char table[ROW][COL]);
//检测是胜利还是失败还是平局还是继续游戏
int iswin(char table[ROW][COL]);
7.playgame完整函数
有了以上的函数,就可以将它们放入游戏函数内了。
void playgame()
{
char table[ROW][COL] = { 0 };
inittable(table);//初始化棋盘
printtable(table);//打印棋盘
//进入游戏循环
while (1)
{
player(table);//玩家下棋
system("cls");//清屏
printtable(table);//打印棋盘
if (iswin(table))//检测是否游戏结束
{
system("pause");
system("cls");//清屏
break;
}
computer(table);//电脑下棋
system("cls");//清屏
printtable(table);//打印棋盘
if (iswin(table))//检测是否游戏结束
{
system("pause");
system("cls");//清屏
break;
}
}
}
以上就是井字棋的游戏实现的所有内容,可以参考下面的完整代码~
完整代码
game.h
#pragma once
#define _CRT_SECURE_NO_WARNINGS
#define ROW 3 //棋盘行数
#define COL 3 //棋盘列数
#include <stdio.h>
#include<stdlib.h>
#include<time.h>
#include<windows.h>
//打印菜单
void printmenu();
//初始化棋盘
void inittable(char table[ROW][COL]);
//打印棋盘
void printtable(char table[ROW][COL]);
//玩家下棋
void player(char table[ROW][COL]);
//电脑下棋
void computer(char table[ROW][COL]);
//检测是否游戏结束
char check(char table[ROW][COL]);
//检测是胜利还是失败还是平局还是继续游戏
int iswin(char table[ROW][COL]);
game.c
#include"game.h"
//打印菜单
void printmenu()
{
printf("■■■■■■■■■■■■■■■\n");
printf("■■■ 1.开始游戏 ■■■\n");
printf("■■■ 0.退出游戏 ■■■\n");
printf("■■■■■■■■■■■■■■■\n");
printf("请输入数字‘0’或数字‘1’>>>\n");
}
//初始化棋盘
void inittable(char table[ROW][COL])
{
for (int i = 0; i < ROW; i++)
{
for (int j = 0; j < COL; j++)
{
table[i][j] = ' ';
}
}
}
//打印棋盘
void printtable(char table[ROW][COL])
{
for (int i = 0; i < ROW; i++)
{
for (int j = 0; j < COL; j++)
{
printf(" %c ", table[i][j]);
if (j < COL - 1)
{
printf("|");
}
}
printf("\n");
if (i < ROW - 1)
{
for (int j = 0; j < COL; j++)
{
printf("---");
if (j < COL - 1)
{
printf("|");
}
}
}
printf("\n");
}
}
//玩家下棋
void player(char table[ROW][COL])
{
printf("玩家(O)走>>>> (输入: 行 空格 列 ) \n");
int row = 0;
int col = 0;
int k = 0;
while (1)
{
scanf("%d %d", &row,&col);
if (row > 0 && row <= ROW && col>0 && col<=COL && table[row - 1][col - 1] == ' ')
{
table[row-1][col-1] = 'O';
break;
}
else
{
printf("输入错误,请重试\n");
continue;
}
}
}
//电脑下棋
void computer(char table[ROW][COL])
{
printf("电脑(X)走>>>>\n");
while (1)
{
int col = rand() % COL;
int row = rand() % ROW;
if (table[row][col] != ' ')
{
continue;
}
else
{
table[row][col] = 'X';
break;
}
}
Sleep(500);
}
char check(char table[ROW][COL])
{
int i = 0;
int j = 0;
for (j = 0; j < COL; j++)
{
if (table[j][0] == table[j][1] && table[j][1] == table[j][2] && table[j][0] != 0)//判断竖
{
return table[j][0];
}
}
for (i = 0; i < ROW; i++)
{
if (table[0][i] == table[1][i] && table[1][i] == table[2][i] && table[0][i] != 0)//判断横
{
return table[0][i];
}
}
if (table[0][0] == table[1][1] && table[2][2] == table[1][1] && table[1][1] != 0)//判断斜行
{
return table[0][0];
}
if (table[0][2] == table[1][1] && table[1][1] == table[2][0] && table[1][1] != 0)//判断斜行
{
return table[0][2];
}
for (i = 0; i < ROW; i++) //判断是否继续 不是两方胜利也不是平局
{
for (j = 0; j < COL; j++)
{
if (table[i][j] == ' ')
{
return 'C';
}
}
}
return 'P'; //判断平局
}
int iswin(char table[ROW][COL])
{
char ret = check(table);
if (ret == 'O')
{
printf("恭喜你赢了!玩家胜利\n");
return 1;
}
else if (ret == 'X')
{
printf("很遗憾你输了!电脑胜利\n");
return 1;
}
else if (ret == 'P')
{
printf("平局!!!");
return 1;
}
else
{
return 0;
}
}
text.c
#include"game.h"
void playgame()
{
char table[ROW][COL] = { 0 };
inittable(table);//初始化棋盘
printtable(table);//打印棋盘
//进入游戏循环
while (1)
{
player(table);//玩家下棋
system("cls");//清屏
printtable(table);//打印棋盘
if (iswin(table))//检测是否游戏结束
{
system("pause");
system("cls");//清屏
break;
}
computer(table);//电脑下棋
system("cls");//清屏
printtable(table);//打印棋盘
if (iswin(table))//检测是否游戏结束
{
system("pause");
system("cls");//清屏
break;
}
}
}
int main()
{
srand((unsigned int)time(NULL));
int input = 0;
do
{
printmenu();//打印菜单
scanf("%d", &input);
switch (input)
{
case 0:
printf("退出成功!\n");
break;
case 1:
system("cls");
printf("开始游戏!\n\n\n");
playgame();
break;
default:
printf("输入错误,请重试!\n");
break;
}
} while (input);
return 0;
}