赞
踩
重拾小时候的美好回忆,用C语言代码完成简单三子棋游戏
一.游戏规则
在一个棋盘上,两方选手对弈,先将三个棋连成一条线的一方获胜(包括斜线)。
二.设计思路
1. 代码布局:分别创立两个源文件和一个头文件 text.c (用于代码测试) game.c(封装该游戏相关函数) game.h(对相关函数的申明),之所以这样是为了增加代码的可读性和逻辑性。
2.封装一个菜单menu()函数,让用户自己选择开始游戏还是退出游戏。
3.封装一个棋盘board()函数,并且能让自定义大小(可通过宏定义简易实现)。
4.封装2个函数分别能让玩家和电脑下棋。(有空位的地方才能下棋,否则出现提示)。
5.封装函数判断谁获胜
6.在text.c中循环和switch语句将game.c中的文件联系起来测试游戏
7.当玩家还想玩时,但棋盘上已经有数据啦,这时候需要一个初始化函数init
三.game.c中各功能代码实现
- void player(char arr[row][col], int ROW, int COL)//玩家下棋
- {
- int i, j;
- while (1)
- {
- printf("玩家下:请输入下棋指标:\n");
- scanf("%d,%d",&i,&j);
- if (0 < i && i< ROW + 1 && 0 < j && j<COL + 1)//用正常人的思维下棋,而不是用程序员的,不是从0开始
- {
- if (arr[i - 1][j - 1] == ' ') { arr[i-1][j-1] = '*'; break; }
- else printf("位置已经被占用请重新输入");
-
- }
- else printf("输入值不在指定范围类,请重新输入");
- }board(arr, row, col);//玩家下完棋后再次打印棋盘,能更好的看到下棋·位置
- }
- void menu()//菜单
- {
- printf("**********************************\n");
- printf("******1.开始游戏 0.退出游戏******\n");
- printf("**********************************\n");
- printf("请输入你的选择\n");
- }
- void board(char arr[row][col], int ROW, int COL)//棋盘,row,col为宏定义的值,
- {
- int a = 0;
- for (a; a < ROW; a++)
- {
- int i = 0;
- for (i; i < COL;i++)//通过循环实现棋盘的打印
- {
- printf(" %c ", arr[a][i]);
- if (i < COL - 1)
- printf("|");
- }
- printf("\n");
- int b = 0;
- if (a < ROW - 1)
- {
- for (b; b < COL;b++)
- {
- printf("---");
- if(b < COL-1)
- printf("|");
- }
- }printf("\n");
- }
- }
- void windos(char arr[row][col], int ROW, int COL)//电脑下棋
- {
- int i,j;
- srand((unsigned int)time(NULL));//运用时间戳随机下棋
- printf("电脑下\n");
- while (1)
- {
- i = rand() % 3;//限定随机数范围
- j = rand() % 3;
- if (arr[i][j] == ' ') { arr[i][j] = '#'; break; }
- }board(arr, row, col);//下完后打印棋盘
-
- }
- char judge(char arr[row][col], int ROW, int COL)//通过返回值判断游戏是否结束(三子连一线或无处可下棋)
- {
- int i,j;
- for (i = 0; i < ROW; i++)//计算机不能连续判断
- {
- if (arr[i][0] == arr[i][1]&& arr[i][1] == arr[i][2] && arr[i][0] != ' ')return arr[i][0];
- if (arr[0][i] == arr[1][i] && arr[1][i] == arr[2][i] && arr[1][i] != ' ')return arr[0][i];
- if (arr[0][0] == arr[1][1] && arr[1][1] == arr[2][2] && arr[0][0] != ' ')return arr[0][0];
- if (arr[0][2] == arr[1][1] && arr[1][1] == arr[2][0] && arr[0][2] != ' ')return arr[0][2];
- }//游戏结束
- for (i = 0; i < ROW; i++)
- {
- for (j = 0; j < COL; j++)
- {
- if (arr[i][j] == ' ')return 'c';//说明还没结束,还有位置
-
- }
- }return 'd';//平局
- }
- int vocity(char ret)//对判断函数的返回值判断游戏结果
- {
- if (ret == '*') { printf("玩家赢\n"); return 0; }
- if (ret == '#') { printf("电脑赢\n"); return 0; }
- if (ret == 'c') { return 1; }
- if (ret == 'd') { printf("平局\n"); return 1; }
- }
- void init(char arr[row][col], int ROW, int COL)//初始化函数
- {
- int q,b;
- for (q=0; q <ROW; q++)
- {
- for (b=0; b < COL; b++)
- {
- arr[q][b]=' ';
- }//遍历数组
- }
- }
四.text.c中基本结构代码实现
- #define _CRT_SECURE_NO_WARNINGS
- #include "game.h"
- int main()
- {
- char arr[row][col] = {0};
- char ret;
- int a,b=1;//定义变量
- while (1)//利用循环实现重复选择菜单
- {
- mean();//调用菜单函数
- scanf("%d",&a);//输入选择
- if (a == 1)
- {
- printf("开始游戏\n");
- init(arr, row, col);//棋盘初始化
- board(arr, row, col);//打印棋盘
- while (b)
- {
- player(arr, row, col);//玩家下
- ret =judge(arr, row, col);//判断
- b=vocity(ret);//判断赢家,并通过返回值确定游戏是否结束
- windos(arr, row, col);
- ret = judge(arr, row, col);
- b=vocity(ret);
-
- }
- }
- else if (a == 0)
- {
- printf("退出游戏");
- break;
- }
- else { printf("请输入正确的选择\n"); }
- }
- return 0;
- }
五.game.h中函数申明
- #pragma once
- #define col 3//定义棋盘列大小
- #define row 3//定义棋盘行大小
- #include <stdio.h>
- #include <time.h>
- #include <stdlib.h>
- void mean();
- void init(char arr[row][col], int ROW, int COL );
- void board(char arr[row][col], int ROW, int COL);
- void player(char arr[row][col], int ROW, int COL);
- void windos(char arr[row][col], int ROW,int COL);
- char judge(char arr[row][col], int ROW, int COL);
- int vocity(char ret);
六.结果展示
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。