三子棋游戏及部分外观优化代码

目录

编写起因

游戏设计

游戏简介

游戏名

文件组成

代码

代码评价

代码展示

   ChessTest.cpp

ChessGame.h

ChessGame.cpp

游戏部分视图

游戏菜单

棋盘概览

 游戏中的各种情况

1.选择错误

2.坐标错误(超出棋盘坐标范围) 

3.同处落子 

4.胜利

​编辑

5.失败

6.平局

​编辑

注意

延伸


编写起因

最近在B站学习了鹏哥有关三子棋C语言游戏制作的讲解,看完之后觉得确实是挺厉害的。这个项目不仅对于才接触C语言不久的小伙伴来说极容易上手,而且趣味性也是很强,因为这个项目涵盖了从初识C语言到数组的所有知识点,所以对于新手来说还可以在体验到了比较强的成就感之后整合和复习之前学过的所有知识,一举多得。于是在看完了视频之后作为新手的我也准备去试试自己用这种思想编写代码,结果发现确实是收获颇丰,第一次不是单纯完成一道编程题而是系统写出了一整个简单的游戏,收获有多少自然不言而喻,建议还是新手的码友们都可以去学一学。下面话不多说,上我们的代码:

游戏设计

游戏简介

游戏名

N Chess Game

文件组成

ChessTest.cpp(游戏主体框架编写及游戏测试运行文件)

ChessGame.h(存储库函数和游戏细节类自定义函数声明总头文件)

ChessGame.cpp(游戏细节类自定义函数具体编写文件)

N_Chess_Game.exe(N Chess Game游戏可执行程序)

代码

代码评价

优点:1.较好的实现了三子棋人机对战的游戏逻辑

           2.游戏整体框架具体完备,符合三子棋游戏的要求

           3.在鹏哥代码的基础上还做了部分游戏美观的代码设计,体验感更佳

缺点:1.游戏自定义程度不高,只实现了三子棋的游戏设定,无法自定义棋盘大小和N子棋N的个数

           2.电脑落子逻辑较简单,无法更改游戏的难度,游戏难度较低

代码展示

   ChessTest.cpp


#include"ChessGame.h"
void menu()
{
	printf("*******************************  N Chess Game!!  *******************************\n");
	printf("****************************  1.play  ****  0.exit  ****************************\n");
	printf("**************************************-++-**************************************\n");
}//游戏菜单打印函数
void game()
{
	char board[ROW][COL]={0};//定义储存棋盘信息数组
	InitBoard(board,ROW,COL);//初始化棋盘函数
	printf("|棋盘概览 >\n");
	DisplayBoard(board,ROW,COL);//打印棋盘函数
	printf("                                 <  回合开始  >\n\n");
	while(1)
	{
		Playermove(board,ROW,COL);//玩家落子函数
		DisplayBoard(board,ROW,COL);
		Judge(board,ROW,COL);//判断并打印游戏结果函数
		if(Iswin(board,ROW,COL)=='X'||Iswin(board,ROW,COL)=='O'||Iswin(board,ROW,COL)=='F') 
		{
			printf("                                 <  该局结束  >\n");
	        break;
		}//如果游戏结束,则打印结束信息并退出该局游戏
		Computermove(board,ROW,COL);
		DisplayBoard(board,ROW,COL);
		Judge(board,ROW,COL);
		if(Iswin(board,ROW,COL)=='X'||Iswin(board,ROW,COL)=='O'||Iswin(board,ROW,COL)=='F') 
		{
			printf("                                 <  该局结束  >\n\n");
	        break;
		}
		printf("                                 <  下一回合  >\n");
		printf("\n");
	}//如果游戏未结束则打印继续游戏信息并继续进行下一次游戏循环
}//三子棋游戏运行函数
void test()
{
	menu();
	int input;
	do
	{
	printf("请选择:");
	scanf("%d",&input);
	switch(input)
	{
		case(1):
			printf("\n");
			printf("开始游戏。\n");
			printf("\n");
			game();
			break;
		case(0):
			printf("退出游戏。\n");
			break;
		default:
			printf("选择错误,请重新选择!\n");
			break;
	}
	}while(input);
}//整体游戏运行测试函数

int main()
{
	srand((unsigned int)time(NULL));//设计电脑落子坐标随机数的初始化种子为系统时间
	test();
	return 0;
}

ChessGame.h


//防止头文件多次定义结构
#ifndef _GAME_H
#define _GAME_H
//定义棋盘的行数和列数,方便后续如果将棋盘大小设置成自定义结构时的更改
#define ROW 3
#define COL 3
//包含整个项目需要引用的头文件,提高引用头文件时的便利性
#include<stdio.h>
#include<stdlib.h>
#include<time.h>
//细节类游戏运行函数的声明,只写声明方便阅读的便利性和美观
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);
int Isfull(char board[ROW][COL],int row,int col);
char Iswin(char board[ROW][COL],int row,int col);
void Judge(char board[ROW][COL],int row,int col);
#endif

ChessGame.cpp


#include"ChessGame.h"
void InitBoard(char board[ROW][COL], int row, int col)
{
		int i,j;
	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,j;
	printf("\n                                 *-----------*\n");
	for(i=0;i<row;i++)
	{
		printf("                                 |");
		for(j=0;j<col;j++)
		{
			printf(" %c ",board[i][j]);
			if(j<col-1) 
			printf("|");
		}
		printf("|");
		printf("\n");
		if(i<row-1)
		{
			printf("                                 |");
			for(j=0;j<col;j++)
			{
				printf("---");
				if (j<col-1)
				printf("|");
			}
			printf("|");
			printf("\n");
		}
	}
	printf("                                 *-----------*\n");
}//打印棋盘的整体框架和落子信息
void Playermove(char board[ROW][COL],int row,int col)
{
	int x,y;
	printf("                                  -|玩家落子|-\n");
	printf("\n");
    while(1)
    {
    	printf("请输入坐标<—以空格作为数据分隔符键入—>:");
	    scanf("%d%d",&x,&y);//记录玩家落子的坐标
	    if(x>0&&x<row+1&&y>0&&y<col+1)
	    {
		    if(board[x-1][y-1]==' ') 
		    {
		        board[x-1][y-1]='X';
			    break;
		    }//通过字符赋值实现落子,并跳出玩家落子回合
		    else 
		    {
		    	printf("\n");
		        printf("                         <  该处已落子,请重新输入!  >\n");
		        printf("\n");
			}
	    }//防止一处多次落子
	    else 
		    {
		    	printf("\n");
			    printf("                          <  坐标错误,请重新输入!  >\n");
				printf("\n");
			}
	}//防止落子跳出棋盘范围
}
void Computermove(char board[ROW][COL],int row,int col)
{
	int x,y;
	printf("                                  -|电脑落子|-\n");
    while(1)
    {
    	x=rand()%row;//布置随机值坐标,并使其范围在棋盘范围内
	    y=rand()%col;
    	if(board[x][y]==' ')
	    {
		    board[x][y]='O';
		    break;
	    }//只在未落子处落子,否则继续循环选位置落子
	}
}
int Isfull(char board[ROW][COL],int row,int col)//判断棋盘是否已经布满棋子函数
{
	int i,j;
	for(i=0;i<row;i++)
	for(j=0;j<col;j++)
	if(board[i][j]==' ') {return 0;}
	return 1;
}
char Iswin(char board[ROW][COL],int row,int col)//返回游戏结果信息
{
	int i,j;
	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[0][j]!=' ') {return board[0][j];}
	if(board[0][0]==board[1][1]&&board[1][1]==board[2][2]&&board[0][0]!=' ') {return board[0][0];}
	if(board[0][2]==board[1][1]&&board[1][1]==board[2][0]&&board[0][2]!=' ') {return board[0][2];}	
	return Isfull(board,row,col)?'F':'U';//设计平局时返回的字符信息	 
}
void Judge(char board[ROW][COL],int row,int col)//判断游戏结果并打印游戏结果
{
	if(Iswin(board,row,col)=='X') {printf("                                < 恭喜,你赢了!>\n\n");}
	else if(Iswin(board,row,col)=='O') {printf("                              < 很遗憾,你输了。>\n\n");}
	else if(Iswin(board,row,col)=='F') {printf("                                   <  平局  >\n\n");}
}

游戏部分视图

游戏菜单


217d464549f643929670d97a8d830b3b.png

棋盘概览


6075b9f7015848688feac81e31ac1d51.png

 游戏中的各种情况

1.选择错误


899155d776c24c108e425b2bd00bb040.png

2.坐标错误(超出棋盘坐标范围) 


385715852438473a86c79e167b4cf74c.png

3.同处落子 


725e4564de47405092087caae3809fe4.png

4.胜利


7fcb057ee6274922b84174706c06076a.png

5.失败


47f4ec1a8dc645d7a1bc7daf363d911f.png

6.平局


ded603c5a652444ebab615c6584583bd.png

注意

1.游戏视图的美观性仅基于未完全放大的cmd窗口的大小,如条件不同需对美观部分代码自行进行调整。

2.所选开发工具是否初始就支持多文件编译!!!如果是和我一样用的是visual studio code编辑器的麻油们应当先在vs.code中配置好多文件编译环境后才可以进行编译哦~~~

3.用vscode进行游戏开发时可能会出现UTF-8和GBK不匹配导致的代码中和输出中的中文显示乱码现象,需注意!

延伸

1.游戏设计参考:14.C语言实现三子棋(1)(C语言程序设计教程谭浩强 c语言谭浩强视频教程 c语言零基础入门教程 学习c语言 c语言视频教程 c语音 C语言教程 C语言编程项_哔哩哔哩_bilibili

2.有关visual studio code下载安装及如何配制C/C++编译及多文件编译环境教程请见:VScode最新安装使用教程,Visual Studio Code安装使用教程,vscode配置c/c++VScode汉化中文_哔哩哔哩_bilibili

  • 7
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 6
    评论
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值