三字棋的实现和运行
三子棋
(如有不对不好的请明示!抱拳了)
先知道什么是三子棋
1.游戏获胜的条件三行三竖或者对角线能连成三个都算赢
2.当下满棋盘没有实现赢家则为平局
一、应该需要什么
制作三子棋游戏需要较多的代码所以建议用一个头文件和两个源文件来方便实现。
game.h 的作用是把需要改的值写里面,避免后期一个一个更改;避免重复操作(定义的头文件,函数),只需要包含一下他,就不要在包别的头文件里,前提你在自定义头文件里已经包含过了
game.c 的文件中来实现我们游戏的
test.c 中来制定游戏的规则和游戏的菜单
二、使用步骤
1.先打印菜单
用 do…while 来实现游戏可以多次的使用,再用menu函数来打印我们的菜单
代码如下(示例):
int main()
{
int improt = 0;//创建一个变量 由玩家输入
do//do while循环语句 让你可以多次的体验
{
menu(); //打印菜单
printf("请选择:");//让玩家输入
scanf("%d", &improt);
switch (improt)//选择语句
{
case 1://选择1进入游戏
game();
break;
case 0:
printf("退出游戏\n");
break;
default://第三种选择直接报错 只能选择 1 0
printf("输入错误,请重新输入\n");
break;
}
}
while (improt);//反回菜单选择 1 0
return 0;
}
void menu()//游戏的菜单 运行起来可以提供玩家选择
{
printf("********************\n");
printf("****** 1. play *****\n");
printf("****** 0. exit *****\n");
printf("********************\n");
}
菜单打印完毕
2.开始创建棋盘
当选择1时进入游戏game
代码如下(示例):
void game()
{//创建二维数组,存储数据
char board[ROW][COL];//引用头文件中定义的函数为3行3列
in_board(board, ROW, COL);//初始化棋盘行列为空格
play_board(board, ROW, COL);//打印棋盘
这里开始引用头文件创造的
在头文件用ROW COL 来定义行列的行数,在后面在用来修改行列时可以直接在头文件中修改,省去在代码中一个个修改带来的麻烦。
void game()
{///初始化棋盘的函数
void in_board(char board[ROW][COL], int row, int col);//初始化棋盘
//打印棋盘的函数
void play_board(char board[ROW][COL], int row, int col);
开始先初始化棋盘:
void in_board(char board[ROW][COL], int row, int col)//初始化棋盘为空格
{
int a = 0;
int b = 0;
for (a = 0; a < row; a++)//初始化行
{
for (b = 0; b < col; b++)//初始化列
{
board[a][b] = ' ';//初始化棋盘为空格//必须是英文单引号 才能打印空格,双引号是0
}
}
}
再打印棋盘的样子——行列
void play_board(char board[ROW][COL], int row, int col)//打印棋盘的样子(九宫格)
{
int x = 0;//当做行
for (x = 0; x < row; x++)//当条件完成停止打印棋盘
{
int y = 0;//作为列
for (y = 0;y < col;y++)
{//将( +|)看做一个元素在行上打印
printf(" %c ", board[x][y]);//在行上打印( +|)
if (y < col - 1)//最后一个 ‘|’不需要 只用打印2个‘|’但( )还是打印了
printf("|");
}
printf("\n");//在行上打印完( +|)换行打印
if (x < row - 1)
{//将(---+|)看做一个元素打印
int y = 0;//创建一个变量
for (y= 0; y < col;y++)
{//y小于col=小于3
printf("---");//这里打印三次
if(y<col-1)//应为这个条件第三个‘|’没有打印
printf("|");
}
printf("\n");//这打印完一行返回for
}
}
}
开始实现玩家下棋和电脑下棋
1.先实现玩家下棋 玩家下棋 先提示他下棋 在让其输入坐标,如果坐标是超出了范围则提示错误重新输入;还要判断下的坐标上是否有棋子
先在test文件中打印函数
//玩家下棋
play_man(board, ROW, COL);
play_board(board, ROW, COL);
第二行代码则表示每次玩家输入后的坐标在图上表示在次打印出来
然后再头文件中声明
在到game.c文件中实现它的过程
void play_man(char board[ROW][COL], int row, int col)
{//打印玩家下棋
int n = 0;
int m = 0;
printf("请玩家下:\n");
while (1)
{
printf("请输入坐标:");
scanf("%d %d", &n, &m);
if (n >= 1 && n <= row && m >= 1 && m <= col)//判断玩家下的棋是否符合规则
{//语言中第一个坐标是0,0, 人下棋的第一个是1,1
if (board[n - 1][m - 1] == ' ')
{//判断n-1,m-1的坐标是空格就落子
board[n - 1][m- 1] = '*';//如果有子 就跳出重新下子
break;
}
else//表示这个地方有子
{
printf("坐标被占用,请重新输入 \n");
}
}
else
{//超出棋盘的范围
printf("坐标非法,请重新输入 \n");
}
}
}
在这实现完玩家然后就可以在游戏中输入相应的坐标
开始打印电脑的:
和打印玩家的一样开头
在test文件中创建一个函数在到头文件中声明
头文件中声明
game.c文件中实现电脑输入
void comquter_play(char board[ROW][COL], int row, int col)
{
printf("电脑走:\n");
while (1)
{
int x = rand() & row;//生成的范围只有0-2之间
int y = rand() & col;//不用判断是否合法性;只用考虑是否占用
//控制电脑的坐标是否正确
printf("电脑下棋:\n");
if (board[x][y] == ' ')
{
board[x][y] = '#';//判断落子的地方是否有棋
break;
}
}
}
电脑和人不一样不需要提示 电脑也不懂你的提示只需要规范好它的范围和规则就可以落子。需要用到rand库函数;需要在test文件中应用他的返回值和game.h中引用头文件
到这里游戏就可以进行一大半了 但是游戏只能运行但是没有判断输赢或者平局的条件,那这就是个半成品。接下来实现游戏的最后一步。
判断输赢
赢的条件有横 3联子 竖3联子 两个对角3联子;需要建立while 循环,判断电脑和玩家的输赢
while (1)
{//玩家下棋
play_man(board, ROW, COL);
play_board(board, ROW, COL);
//判断玩家是否赢
ret =IFwin(board, ROW, COL);
if (ret != 'C')//3种情况判断游戏谁赢谁输或者平局 结束游戏
break;
//电脑下棋
comquter_play(board, ROW, COL);
play_board(board, ROW, COL);
//判断电脑是否赢
ret = IFwin(board, ROW, COL);
if (ret != 'C')//3种情况判断游戏谁赢谁输或者平局 结束游戏
break;
}
if (ret == '*')
{
printf("玩家赢了\n");
}
//玩家赢了-* 电脑赢了-# 平局--Q 继续游戏--C
else if (ret == '#')
{
printf("电脑赢了\n");
}
else
{
printf("平局\n");
}
play_board(board, ROW, COL);
}
创立输赢的条件后在文件game.c来实现输赢的条件
char IFwin(char board[ROW][COL], int row, int col)
{//判断输赢
int a = 0;
for (a = 0; a < row; a++)
{//行
if (board[a][0] == board[a][1] && board[a][1] == board[a][2] && board[a][1] != ' ')
{
return board[a][1];//只用判断三联同一行中是哪个 代表哪个赢
}
}
for (a = 0; a < col; a++)
{//列
if (board[0][a] == board[1][a] && board[1][a] == board[2][a] && board[1][a] != ' ')
{
return board[1][a];
}
}
//对角线
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];
}
int ret = IF_man(board, row, col);
if (ret == 1)
{
return 'Q';//平局 返回1则
}
return 'C';//继续 返回0则
}
IF_man函数来实现平局和游戏进行时的样子则需要一下的代码:
int IF_man(char board[ROW][COL], int row, int col)//判断棋盘是否满子没
{
int a = 0;
int b = 0;
for (a = 0; a < row; a++)
{
for (b = 0; b < col; b++)
{
if (board[a][b] == ' ')
{
return 0;//表示棋盘没满
}
}
}
return 1;//表示棋盘满了
}
总结
三子棋游戏就可以实现运行了。第一次用代码来实现个小游戏确实挺困难的但是游戏能实现后带来的喜悦真的巴适。这么多个代码分成三个来写则思路变得清晰 代码也看的清楚每一个文件都有对应相应;在头文件声明定义的条件在源文件中就只用引用下头文件就可拿来直接使用。省下不少的事情,而且还为后来想改变游戏的规则也带来一定的方便。
以下是全部的代码
game.h 中的代码
#pragma once
#include<stdio.h>//头文件的包含
#include<stdlib.h>
#include<time.h>
//符号的定义
#define ROW 3//在头文件中定义
#define COL 3//定义一个三行三列的一个数组
//函数的声明
//
//
//初始化棋盘的函数
void in_board(char board[ROW][COL], int row, int col);//初始化棋盘
//打印棋盘的函数
void play_board(char board[ROW][COL], int row, int col);
//实现玩家下棋
void play_man(char board[ROW][COL], int row, int col);
//实现电脑下棋
void comquter_play(char board[ROW][COL], int row, int col);
//判断输赢条件
char IFwin(char board[ROW][COL], int row, int col);
game.c
#define _CRT_SECURE_NO_WARNINGS 1//游戏的运行在这进行
#include "game.h"//引用头文件
void in_board(char board[ROW][COL], int row, int col)//初始化棋盘为空格
{
int a = 0;
int b = 0;
for (a = 0; a < row; a++)//初始化行
{
for (b = 0; b < col; b++)//初始化列
{
board[a][b] = ' ';//初始化棋盘为空格//必须是英文单引号 才能打印空格,双引号是0
}
}
}
void play_board(char board[ROW][COL], int row, int col)//打印棋盘的样子(九宫格)
{
int x = 0;
for (x = 0; x < row; x++)//当条件完成停止打印棋盘
{
int y = 0;
for (y = 0;y < col;y++)
{//将( +|)看做一个元素在行上打印
printf(" %c ", board[x][y]);//在行上打印( +|)
if (y < col - 1)//最后一个 ‘|’不需要 只用打印2个‘|’但( )还是打印了
printf("|");
}
printf("\n");//在行上打印完( +|)换行打印
if (x < row - 1)
{//将(---+|)看做一个元素打印
int y = 0;//创建一个变量
for (y= 0; y < col;y++)
{//y小于col=小于3
printf("---");//这里打印三次
if(y<col-1)//应为这个条件第三个‘|’没有打印
printf("|");
}
printf("\n");//这打印完一行返回for
}
}
}
void play_man(char board[ROW][COL], int row, int col)
{//打印玩家下棋
int n = 0;
int m = 0;
printf("请玩家下:\n");
while (1)
{
printf("请输入坐标:");
scanf("%d %d", &n, &m);
if (n >= 1 && n <= row && m >= 1 && m <= col)//判断玩家下的棋是否符合规则
{//语言中第一个坐标是0,0, 人下棋的第一个是1,1
if (board[n - 1][m - 1] == ' ')
{//判断n-1,m-1的坐标是空格就落子
board[n - 1][m- 1] = '*';//如果有子 就跳出重新下子
break;
}
else//表示这个地方有子
{
printf("坐标被占用,请重新输入 \n");
}
}
else
{//超出棋盘的范围
printf("坐标非法,请重新输入 \n");
}
}
}
void comquter_play(char board[ROW][COL], int row, int col)
{
printf("电脑走:\n");
while (1)
{
int x = rand() & row;//生成的范围只有0-2之间
int y = rand() & col;//不用判断是否合法性;只用考虑是否占用
//控制电脑的坐标是否正确
printf("电脑下棋:\n");
if (board[x][y] == ' ')
{
board[x][y] = '#';//判断落子的地方是否有棋
break;
}
}
}
int IF_man(char board[ROW][COL], int row, int col)//判断棋盘是否满子没
{
int a = 0;
int b = 0;
for (a = 0; a < row; a++)
{
for (b = 0; b < col; b++)
{
if (board[a][b] == ' ')
{
return 0;//表示棋盘没满
}
}
}
return 1;//表示棋盘满了
}
char IFwin(char board[ROW][COL], int row, int col)
{//判断输赢
int a = 0;
for (a = 0; a < row; a++)
{//行
if (board[a][0] == board[a][1] && board[a][1] == board[a][2] && board[a][1] != ' ')
{
return board[a][1];//只用判断三联同一行中是哪个 代表哪个赢
}
}
for (a = 0; a < col; a++)
{//列
if (board[0][a] == board[1][a] && board[1][a] == board[2][a] && board[1][a] != ' ')
{
return board[1][a];
}
}
//对角线
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];
}
int ret = IF_man(board, row, col);
if (ret == 1)
{
return 'Q';//平局 返回1则
}
return 'C';//继续 返回0则
}
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()
{//创建二维数组,存储数据
char board[ROW][COL];//引用头文件中定义的函数为3行3列
in_board(board, ROW, COL);//初始化棋盘行列为空格
play_board(board, ROW, COL);//打印棋盘
char ret = 0;//接收游戏状态
while (1)
{//玩家下棋
play_man(board, ROW, COL);
play_board(board, ROW, COL);
//判断玩家是否赢
ret =IFwin(board, ROW, COL);
if (ret != 'C')//3种情况判断游戏谁赢谁输或者平局 结束游戏
break;
//电脑下棋
comquter_play(board, ROW, COL);
play_board(board, ROW, COL);
//判断电脑是否赢
ret = IFwin(board, ROW, COL);
if (ret != 'C')//3种情况判断游戏谁赢谁输或者平局 结束游戏
break;
}
if (ret == '*')
{
printf("玩家赢了\n");
}
//玩家赢了-* 电脑赢了-# 平局--Q 继续游戏--C
else if (ret == '#')
{
printf("电脑赢了\n");
}
else
{
printf("平局\n");
}
play_board(board, ROW, COL);
}
int main()
{
int improt = 0;//创建一个变量 由玩家输入
srand((unsigned int)time(NULL));
do//do while循环语句 让你可以多次的体验
{
menu(); //打印菜单
printf("请选择:");//让玩家输入
scanf("%d", &improt);
switch (improt)//选择语句
{
case 1://选择1进入游戏
game();
break;
case 0:
printf("退出游戏\n");
break;
default://第三种选择直接报错 只能选择 1 0
printf("输入错误,请重新输入\n");
break;
}
}
while (improt);//反回菜单选择 1 0
return 0;
}