IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 游戏开发 -> 用c语言写三字棋小游戏及其他感悟 -> 正文阅读

[游戏开发]用c语言写三字棋小游戏及其他感悟

我是一名大一计算机新生,某天看到其他学校朋友写了个三字棋游戏,决定自己也来写.看了比特鹏教学视频2天后,终于有时间来写写这个代码,话不多说,马上开始

11.21

给宿友发现bug,修改后重新上传代码

bug为平局时,第九格为玩家走,走完之后电脑走不了,无法走到下面判定平局的函数

改的时候直接复制判定部分到玩家走于电脑走中间,又出现了新的bug,全是玩家走步骤,经过检查发现是有空时候的continue让程序跳过下面部分,于是把continue删除了

另外新加Sleep,企图让电脑走得更随机;以后有时间再提升电脑走的能力,争取让电脑有更高的智慧

1.三字棋小游戏

game.h? ?(调用函数库及函数声明)

#include <stdio.h>
#include <time.h>
#include <stdlib.h>
#include <windows.h>
#define ROW 3
#define COL 3
	//函数的声明
//初始化棋盘
	void IntiBoard(char board[ROW][COL],int row,int col);
		//打印棋盘情况
	void DisplayBoard(char board[ROW][COL],int row,int col);
	   //玩家走
		void GamerMove(char board[ROW][COL],int row,int col);
		//电脑走
		void ComputerMove(char board[ROW][COL],int row,int col);
		//判定
		char judge(char board[ROW][COL],int row,int col);

test.c? ?(主要流程)

#include "game.h"
//打印出一个菜单
void menu()
{
	printf("*************************************************\n");
	printf("****************输入1来开始游戏*****************\n");		
	printf("****************输入0来退出游戏*****************\n");
	printf("*************************************************\n");
	printf("请输入数字----->");
}
void game()
	{   
		char board[ROW][COL],result;
				//初始化棋盘棋子为空
		IntiBoard(board,ROW,COL);
				//打印棋盘情况
	   DisplayBoard(board,ROW,COL);
		while(1)
		{
		//玩家走
		GamerMove(board,ROW,COL);
		judge(board,ROW,COL);
		//判定
		result=judge(board,ROW,COL);
		if( result=='*'){printf("电脑赢了");break;}
		if( result=='#'){printf("玩家赢了");break;}
		if(result=='c' ){}//删掉continue
		if(result==0) printf("平局了");
		//电脑走
		ComputerMove(board,ROW,COL);
		//判定游戏进程和胜利
		judge(board,ROW,COL);
		result=judge(board,ROW,COL);
		if( result=='*'){printf("电脑赢了");break;}
		if( result=='#'){printf("玩家赢了");break;}
		if(result=='c' ){continue;}
		if(result==0) printf("平局了");
		}
	}
 

int main()
{   
	int input;
do{
	menu();
	scanf_s("%d",&input);
	  switch(input)
	  {
	  case 1:
	    	printf("进入井字棋游戏");
	     	game();
	        goto end;
	  case 0:
		    printf("退出游戏\n");
		    goto end;
	  default:
		    printf("输入错误,请重新选择\n");
	}
}while(1);
    
	end: return 0;
}

game.c? (游戏具体部分的实现)

#include"game.h"
//初始化棋盘棋子为空
void IntiBoard(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; 
	printf("\n");
	for(i=0;i<row;i++)
	{
		printf(" %c | %c | %c \n",board[i][0],board[i][1],board[i][2]);	
		if(i<ROW-1)printf("---|---|---\n");

	}
}
//玩家走
void GamerMove(char board[ROW][COL],int row,int col)
{   
	int i,j;
	while(1)
	{
	printf("玩家走,请输入一个坐标---->");
	scanf_s("%d %d",&i,&j);
	
			if(i>3||i<1||j>3||j<1)//防止填到外面去了
			{
				printf("输入错误的坐标,请重新选择");
			}
			else if(board[i-1][j-1]=='#'||board[i-1][j-1]=='*'){printf("输入了重复的坐标");}
			else
			{
				board[i-1][j-1]='#';
				DisplayBoard(board,ROW,COL);
				break;
			}

	}
}
	
//电脑走
void ComputerMove(char board[ROW][COL],int row,int col)
{
	int i,j;
		printf("电脑走");
	while(1)
	{
	//srand((unsigned)time(NULL));//随机数,
	i=rand()%row;
	Sleep(120);
	j=rand()%col;//随机数
		
	if(board[i][j]=='*'||board[i][j]=='#'){}//防止填到外面去了
			else
			{
				board[i][j]='*';
				DisplayBoard(board,ROW,COL);
				break;
			}
	}

}
		//判定
char judge(char board[ROW][COL],int row,int col)
{   
	int i,j;
//3个相同横的
	for(i=0;i<ROW;i++)
	{if(board[i][0]==board[i][1]&&board[i][1]==board[i][2]){return board[i][0];}}
//3个相同竖的
	for(j=0;j<ROW;j++)
	{if(board[0][j]==board[1][j]&&board[2][j]==board[1][j]){return board[0][j];}}
//3个相同斜着的
	if(board[0][0]==board[1][1]&&board[1][1]==board[2][2]){return board[1][1];}
	if(board[0][2]==board[1][1]&&board[1][1]==board[2][0]){return board[1][1];}
//检查是否还有空格的地方
	for(i=0;i<ROW;i++)
	{   
		for(j=0;j<COL;j++)
		{
		     if(board[i][j]==' ')return 'c';//有空游戏继续
		}
	}
	return 0;

}
	

如果有什么错误,欢迎评论区`私信评论.

编写三字棋途中遇到的问题:

1.函数声明,定义,调用时没有注意大小写字母(已经改正)
2.LINK : fatal error LNK1168:(csdn上说任务管理器关掉再起就好,确实但是不知道为什么)
莫名错误,调试没有问题,但是运行上一次错误的代码
3.数组常识错误board[0](已经改正)
3.5 用goto莫名其妙变成像递归函数的东西
4.随机数错误
?? ?srand((unsigned)time(NULL));
??? ?i=rand()%3;
??? ?j=rand()%3;
?? ?出错,
?? ?i=rand()%row;
?? ?j=rand()%col
?? ?没出错.
?? ?2者区别在于哪,现在还不知道
5.莫名奇妙吞了第一个位置(1,1)board[0][0]的字符
平局判定出错.(判定是否还有空时,把==打成=)

不足之处:

1.电脑是随机下棋,玩家比较容易赢,有待改善

2.还有其他不足

2.感悟

大一才开始学习c语言,还是比较感兴趣的,b站小甲鱼,比特鹏,翁恺的视频都看了一点,感觉自己进度相比同校同学快,一比其他好朋友又慢了许多.经常上知乎等寻找学习道路,c语言也快学完了.感觉c语言要精通很难,准备开始学数据结构,要开始痛苦了,再然后就是acwing上的算法基础课了,好像下学期学校安排我们学java.


?

  游戏开发 最新文章
6、英飞凌-AURIX-TC3XX: PWM实验之使用 GT
泛型自动装箱
CubeMax添加Rtthread操作系统 组件STM32F10
python多线程编程:如何优雅地关闭线程
数据类型隐式转换导致的阻塞
WebAPi实现多文件上传,并附带参数
from origin ‘null‘ has been blocked by
UE4 蓝图调用C++函数(附带项目工程)
Unity学习笔记(一)结构体的简单理解与应用
【Memory As a Programming Concept in C a
上一篇文章      下一篇文章      查看所有文章
加:2021-11-22 12:40:53  更:2021-11-22 12:42:06 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/27 22:22:39-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码