文章目录
井字棋小游戏游戏实现一、创建新项目及游戏文件二、引头文件,定义符号三、主函数打印菜单 四、开始游戏1.创建二维数组2.初始化棋盘3.打印棋盘4.玩家下棋5.电脑下棋6.判断游戏是否结束7.playgame完整函数 完整代码本文章将详细说明如何用C语言实现简易的井字棋小游戏,编译器用的是VS。
井字棋小游戏
最终效果如图:
游戏实现
一、创建新项目及游戏文件
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;}