1.游戏想法图解
2.游戏框架
//游戏测试,主函数所在。逻辑框架
#include<stdio.h>
void menu()
{
printf("##################################\n");
printf("#####1.play#######################\n");
printf("#####0.exit###################\n");
printf("请选择-》\n");
}
int main()
{
int input = 0;
//1.想实现游戏的继续使用do while
do
{
//2.再次开始游戏要出现菜单所以,菜单显示放在循环里面
menu();
//3.菜单打印完成,客户输入选择
scanf("%d", &input);
switch (input)
{
case 1:
printf("正在为您加载游戏,请稍等\n");
break;
case 0:
printf("游戏退出\n");
break;
default:
printf("选择错误\n");
break;
}
} while (input);
return 0;
}
本次游戏我分三个文件来写,
一个游戏测试文件test.c ,用于游戏测试,主函数所在文件
一个游戏函数实现或者封存到这个文件,负责具体游戏代码的实现:game.c
一个头文件,包含函数和公用头文件:game.h.
接下来一步一步来实现三子棋游戏版吧。
1.游戏开始,棋盘显示。
首先显示棋盘 a.最开始应该是个空白棋盘,下棋就是往一个棋盘格子里放入元素,如果把每一个格子看成是存储数据的格子,那么整个棋盘就可以看做一个数组,放入棋子就是往数组里放入元素
b.最开始的棋盘是空白和一些线条框构成,数组里该是有元素的,有元素但是看不见:空格,下棋就是用代表棋子的符号替换空格,储存在数组并打印出来,这一步棋就算是下好了。
1.创建二维数组,棋盘基础
#include"game.h"
//游戏代码,函数的实现
void menu()
{
printf("##################################\n");
printf("#####1.play#######################\n");
printf("#####0.exit###################\n");
printf("请选择-》\n");
}
void game()
{
char arr[HANG][LIE] = { 0 };//创建棋盘初始化棋盘觉得写在这里太冗余了,不如封装一个函数
Startbord(arr, HANG, LIE);//初始化数组
}
2.数组初始化,将数组每一个元素变为空格;
#include"game.h"
//游戏代码,函数的实现
void menu()
{
printf("##################################\n");
printf("#####1.play#######################\n");
printf("#####0.exit###################\n");
printf("请选择-》\n");
}
void Startbord( char arr[HANG][LIE], int hang, int lie)
{
int i = 0;
int j = 0;
for (i = 0; i < hang; i++)
{
for (j = 0; j < lie; j++)
{
arr[hang][lie] = ' ';
}
}
}
void game()
{
char arr[HANG][LIE] = { 0 };//创建棋盘初始化棋盘觉得写在这里太冗余了,不如封装一个函数
Startbord(arr, HANG, LIE);//初始化数组
}
3.显示棋盘(打印数组)
这是棋盘初始化的样子,实际上是打印了,但是由于都是空格我们没有办法看见。
还欠缺一些棋盘的边框该如何去体现呢?看图解。
效果如下:
void Printbord(char arr[HANG][LIE],int hang,int lie)
{
int i = 0;
int j = 0;
for (i = 0; i < hang; i++)
{
int x = 0;
for (x = 0; x < lie; x++)
{
printf(" —— ");
}
printf("\n");
for (j = 0; j < lie; j++)
{
printf("| %c ", arr[i][j]);
}
printf("|\n");
}
int y= 0;
for (y = 0; y < lie; y++)
{
printf(" —— ");
}
printf("\n");
}
2.玩家下棋
void Player(char arr[HANG][LIE],int hang,int lie)
{
while (1)
{
//玩家输入坐标
printf("请输入坐标:》,两个数中间有空格隔开\n");
int i = 0;
int j = 0;
scanf("%d %d", &i, &j);
//大多数玩家,都认为坐标是从1开始,所以第一个我们需要判断一下玩家输入的坐标合理不合理,是不是在范围内
if (i > 0 && i <= hang && j > 0 && j <= lie)//考虑棋子落子的位置是不是在棋盘内部
{
if (arr[i - 1][j - 1] != ' ')//考虑落子这个位置是不是有对手的棋子或者自己的棋子
{
printf("该位已经被占了,请重新输入\n");
}
else
{
arr[i - 1][j - 1] = '*';
//Printbord(arr, HANG, LIE);
break;
}
}
else
{
printf("输入不合法,请重新输入\n");
}
}
}
3.电脑落子
电脑落子要随机,产生随机坐标,引入rand函数用法。
电脑下棋应该是随机落子,那么意味着电脑下棋的坐标是随机的,那么电脑下标就要是随机数
调用rand函数。
我们想一下:
任何除数的余数是不是都应该小于除数才对
无论用什么数来除10,余数只可能是0~9,所以,我们这里可以这样用,
用产生的随机数除HANG,LIE就能够得到在坐标范围内的随机数了
void Computerplay(char arr[HANG][LIE], int hang, int lie)
{
printf("现在是电脑玩家落子,请稍等\n");
while (1)
{
int i = 0;//范围0~hang-1
int j = 0;//范围0~lie-1
i = rand() % hang;
j = rand() % lie;
if (arr[i][j] != ' ')//考虑落子这个位置是不是有对手的棋子或者自己的棋子
{
printf("该位已经被占了,请重新输入\n");
}
else
{
arr[i][j] = '#';
//Printbord(arr, HANG, LIE);
break;
}
}
}
4.判断输赢
对于电脑和用户来说,行列对角线有自己的三个元素一样就可以结束游戏,但是也有棋盘满平局
分情况考虑。
int Isping(char arr[HANG][LIE], int hang, int lie)
{
int i = 0;
for (i = 0; i < hang; i++)
{
int j = 0;
for (j = 0; j < lie; j++)
{
if (arr[i][j] == ' ')
{
return 0;//这个函数在看棋盘满了没有,如果还有空格就返回0如果没有空格了就返回1,用于判断
}
}
}
return 1;
}
char Iswin(char arr[HANG][LIE], int hang, int lie)
{
int i = 0;
for (i = 0; i < hang; i++)
{
if (arr[i][0] == arr[i][1] && arr[i][1] == arr[i][2] && arr[i][2] != ' ')
{
return arr[i][0];//如果一行全是‘*’或者‘#’,就返回判断,如果是‘*’就是用户赢了,如果是‘#’就是电脑赢了
}
}
int j = 0;
for (j = 0; j < lie; j++)
{
if (arr[0][j] == arr[1][j] && arr[1][j] == arr[2][j] && arr[0][j] != ' ')//如果一列全是‘*’或者‘#’,就返回判断,如果是‘*’就是用户赢了,如果是‘#’就是电脑赢了
{
return arr[0][j];
}
}
if (arr[0][0] == arr[1][1] && arr[1][1] == arr[2][2]&&arr[1][1] != ' ')//对角线,如果对角线全是‘*’或者‘#’,就返回判断,如果是‘*’就是用户赢了,如果是‘#’就是电脑赢了
return arr[0][0];
if (arr[0][2] == arr[1][1] && arr[1][1] == arr[2][0] && arr[0][2] != ' ')
return arr[1][1];
if (Isping(arr, HANG, LIE) ==1)//如果棋盘满了就返回‘w'
{
return 'W';
}
return 'r';//没有输赢也没有平局就返回’r'继续
}
3 ,整个项目完毕,测试效果。(完整代码展示)
1.主函数框架()
//游戏测试,主函数所在。逻辑框架
#include"game.h"
int main()
{
int input = 0;
srand((unsigned int)time(NULL));
//1.想实现游戏的继续使用do while
do
{
//2.再次开始游戏要出现菜单所以,菜单显示放在循环里面
menu();
//3.菜单打印完成,客户输入选择
scanf("%d", &input);
switch (input)
{
case 1:
printf("正在为您加载游戏,请稍等\n");
game();
//开始游戏
// 1.首先显示棋盘 a.最开始应该是个空白棋盘,下棋就是往一个棋盘格子里放入元素,如果把每一个格子看成是存储数据的格子
// 那么整个棋盘就可以看做一个数组,放入棋子就是往数组里放入元素
// b.最开始的棋盘是空白和一些线条框构成,数组里该是有元素的,有元素但是看不见:空格,下棋就是用代表棋子的符号替换空格,储存在数组里
// 并打印出来,这一步棋就算是下好了。
//
// 2.棋盘好了过后就是玩家下棋了
// 输入坐标,但是玩家的思路坐标都是从1开始,所以要判断一下玩家输入是不是合规是否合法
// 但是也有就是玩家要下的位置被对手占了也不能1下,所以合法输入看一下有没有被占用,这里应该循环判断,然后跳出结束这个
// 落子的过程
// 3.电脑下棋,随机生成rand函数搭配srand使用
// 一样判断是不是被占用
// 4.判断输赢
// 行
// 列
// 对角线
//
break;
case 0:
printf("游戏退出\n");
break;
default:
printf("选择错误\n");
break;
}
} while (input);
return 0;
}
2.函数功能实现(game.c)
#include"game.h"
//游戏代码,函数的实现
void menu()
{
printf("##################################\n");
printf("#####1.play#######################\n");
printf("#####0.exit###################\n");
printf("请选择-》\n");
}
void Startbord( char arr[HANG][LIE], int hang, int lie)
{
int i = 0;
int j = 0;
for (i = 0; i < hang; i++)
{
for (j = 0; j < lie; j++)
{
arr[i][j] = ' ';
}
}
}
void Printbord(char arr[HANG][LIE],int hang,int lie)
{
int i = 0;
int j = 0;
for (i = 0; i < hang; i++)
{
int x = 0;
for (x = 0; x < lie; x++)
{
printf(" —— ");
}
printf("\n");
for (j = 0; j < lie; j++)
{
printf("| %c ", arr[i][j]);
}
printf("|\n");
}
int y= 0;
for (y = 0; y < lie; y++)
{
printf(" —— ");
}
printf("\n");
}
void Player(char arr[HANG][LIE],int hang,int lie)
{
while (1)
{
//玩家输入坐标
printf("请玩家输入坐标:》,两个数中间有空格隔开\n");
int i = 0;
int j = 0;
scanf("%d %d", &i, &j);
//大多数玩家,都认为坐标是从1开始,所以第一个我们需要判断一下玩家输入的坐标合理不合理,是不是在范围内
if (i > 0 && i <= hang && j > 0 && j <= lie)//考虑棋子落子的位置是不是在棋盘内部
{
if (arr[i - 1][j - 1] != ' ')//考虑落子这个位置是不是有对手的棋子或者自己的棋子
{
printf("该位已经被占了,请重新输入\n");
}
else
{
arr[i - 1][j - 1] = '*';
//Printbord(arr, HANG, LIE);
break;
}
}
else
{
printf("输入不合法,请重新输入\n");
}
}
}
void Computerplay(char arr[HANG][LIE], int hang, int lie)
{
printf("现在是电脑玩家落子,请稍等\n");
while (1)
{
int i = 0;//范围0~hang-1
int j = 0;//范围0~lie-1
i = rand() % hang;
j = rand() % lie;
if (arr[i][j] != ' ')//考虑落子这个位置是不是有对手的棋子或者自己的棋子
{
printf("该位已经被占了,请重新输入\n");
}
else
{
arr[i][j] = '#';
//Printbord(arr, HANG, LIE);
break;
}
}
}
int Isping(char arr[HANG][LIE], int hang, int lie)
{
int i = 0;
for (i = 0; i < hang; i++)
{
int j = 0;
for (j = 0; j < lie; j++)
{
if (arr[i][j] == ' ')
{
return 0;//这个函数在看棋盘满了没有,如果还有空格就返回0如果没有空格了就返回1,用于判断
}
}
}
return 1;
}
char Iswin(char arr[HANG][LIE], int hang, int lie)
{
int i = 0;
for (i = 0; i < hang; i++)
{
if (arr[i][0] == arr[i][1] && arr[i][1] == arr[i][2] && arr[i][2] != ' ')
{
return arr[i][0];//如果一行全是‘*’或者‘#’,就返回判断,如果是‘*’就是用户赢了,如果是‘#’就是电脑赢了
}
}
int j = 0;
for (j = 0; j < lie; j++)
{
if (arr[0][j] == arr[1][j] && arr[1][j] == arr[2][j] && arr[0][j] != ' ')//如果一列全是‘*’或者‘#’,就返回判断,如果是‘*’就是用户赢了,如果是‘#’就是电脑赢了
{
return arr[0][j];
}
}
if (arr[0][0] == arr[1][1] && arr[1][1] == arr[2][2]&&arr[1][1] != ' ')//对角线,如果对角线全是‘*’或者‘#’,就返回判断,如果是‘*’就是用户赢了,如果是‘#’就是电脑赢了
return arr[0][0];
if (arr[0][2] == arr[1][1] && arr[1][1] == arr[2][0] && arr[0][2] != ' ')
return arr[1][1];
if (Isping(arr, HANG, LIE) ==1)//如果棋盘满了就返回‘w'
{
return 'W';
}
return 'r';//没有输赢也没有平局就返回’r'继续
}
void game()
{
char arr[HANG][LIE] = { 0 };//创建棋盘初始化棋盘觉得写在这里太冗余了,不如封装一个函数
Startbord(arr, HANG, LIE);//初始化数组
Printbord(arr, HANG, LIE);//打印数组
char ch = 0;
while (1)
{
Player(arr, HANG, LIE);
Printbord(arr, HANG, LIE);
ch = Iswin(arr, HANG, LIE);
if (ch != 'r')
break;
Computerplay(arr, HANG, LIE);
Printbord(arr, HANG, LIE);
Iswin(arr, HANG, LIE);
ch = Iswin(arr, HANG, LIE);
if (ch != 'r')
break;
}
if (ch == '*')
{
printf("玩家赢了\n");
}
else if (ch == '#')
{
printf("电脑赢了\n");
}
else
{
printf("平局\n");
}
}
3.封装头文件(game.h)
#pragma once
#include<stdio.h>
#include<stdlib.h>
#include<time.h>
#define HANG 3
#define LIE 3 //为了能够实现5子棋等,定义了宏就行修改棋盘布局
void menu();//菜单
void game();//游戏
void Startbord(char arr[HANG][LIE], int hang, int lie);//数组初始化
void Printbord(char arr[HANG][LIE], int hang, int lie);//数组打印
void Player(char arr[HANG][LIE], int hang, int lie);//玩家落子
void Computerplay(char arr[HANG][LIE], int hang, int lie);//电脑落子
char Iswin(char arr[HANG][LIE], int hang, int lie);//判断输赢
int Isping(char arr[HANG][LIE], int hang, int lie);//判断是否平局
以上就是本次三子棋游戏的思路和实现分享。抛转引玉,大家可以再次升级。