我是一名大一计算机新生,某天看到其他学校朋友写了个三字棋游戏,决定自己也来写.看了比特鹏教学视频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.
?
|