目錄
前言
問題描述
工具
基本思路和流程
三子棋的規則
代碼實作思路
實作步驟
模塊化
選單界面
代碼
選擇的實作
初始化和列印棋盤
棋盤
使用宏定義
初始化
列印
考慮如何實作圖表
提供代碼
效果圖
玩家落子
考慮問題
參考代碼
電腦實作落子
簡單落子(實作亂數)
參考代碼
判斷
采取回傳值
參考代碼
整體游戲流程代碼
下附原始碼
game.h
test.c
game.c
前言
檢驗學習成果最好的方式是實踐
在學習完C語言的函式和陣列以后,就可以簡易的實作一些小游戲
本文章為手把手講解實作C語言三子棋(好好看,相信不會太難的說)
當你自己完成后一定成就感幸福感滿滿的!!
問題描述
用C語言實作小游戲三子棋
工具
vs2019
基本思路和流程
三子棋的規則
在3X3的棋盤里,率先將三個棋子連成一條直線則勝出
代碼實作思路
1.選單界面:選擇開始或者退出游戲
2.初始化棋盤并列印棋盤
3.玩家選擇落子坐標
4.電腦實作落子
5.每次落子判斷輸贏平還是繼續
實作步驟
模塊化
1.test.c :寫整個游戲實作思路流程
2.game.c: 寫游戲實作思路中的各個函式的定義,完成函式內容實作函式功用
3.game.h :參考需要用到的頭檔案,以及對各個自定義函式的宣告
(其他模板上方只需要加上 #include “game.h”,避免重復參考相同頭檔案)
注:模塊化便于管理和修改
選單界面
比較簡單直接上代碼
代碼
void menu()//游戲選單
{
printf("******************************\n");
printf("********** 1.play **********\n");
printf("********** 0.exit **********\n");
printf("******************************\n");
}
選擇的實作
玩家通過輸入1/0 來選擇是開始游戲還是退出游戲
用do while陳述句實作比較適合
menu();
printf("請開始你的選擇:>>>\n");
scanf("%d", &input);
switch (input)
{
case 0:
printf("退出游戲成功\n");
break;
case 1:
printf("即將開始游戲\n");
game();
break;
default:
printf("輸入錯誤:please input your number again!\n");
break;
}
} while (input);
初始化和列印棋盤
棋盤
使用3行3列的二維陣列來表示,元素型別是char
char board[ROW][COL] = { 0 };
使用宏定義
1.推高代碼可讀性,后續代碼中遇到3,方便理解含義
2.提高擴展性,如果將來要修改棋盤尺寸,代碼修改會很方便
#define ROW 3
#define COL 3
初始化
void Initboard(char board[ROW][COL], int row, int col)//初始化棋盤內容
{
for (int i = 0; i < row; i++)//行
{
for (int n = 0; n < col; n++)//列
{
board[i][n] = ' ';
}
}
}
列印
考慮如何實作圖表
什么時候該列印
什么時候不該列印
列印的間距
換行的考慮
提供代碼
void Displayboard(char board[ROW][COL], int row, int col)//列印棋盤
{
for (int i = 0; i < row; i++)//行數
{
for (int j = 0; j < col; j++)//列數
{
if (j < col - 1)//第一排內容,控制最后一次不列印‘|’
printf(" %c |", board[i][j]);
else
printf(" %c ", board[i][j]);
}
printf("\n");//換行
if (i < row - 1)//第二排,控制最后一次不列印
{
for (int k = 0; k < col; k++)
{
if (k < col - 1)
printf("---|");
else
printf("---");
}
printf("\n");//同樣換行
}
}
}
效果圖

玩家落子
考慮問題
1.作為玩家的思維坐標從1開始,而電腦規定標碼從0開始,所以玩家落子坐標還需-1處理
2.落子范圍
3.落子位置是否已經覆寫
參考代碼
void Player(char board[ROW][COL], int row, int col)
{
printf("player:輸入坐標>\n");
int i, j;
while (1)
{
scanf("%d%d", &i, &j);
if (i > 0 && i <= col && j > 0 && j <= row)//范圍
{
if (board[i - 1][j - 1] == ' ')//減一處理
{
board[i - 1][j - 1] = '*';
break;
}
else
printf("已經被走過了,請重新輸入坐標>\n");//重復
}
else
printf("超出范圍啦,請重新輸入坐標>\n");
}
}
電腦實作落子
簡單落子(實作亂數)
1.主函式中使用srand((unsigned int)time(0))
將時間作為亂數種子,確保得到的行列坐標是真隨機
2.包含對應頭檔案
3.實作亂數還應符合范圍(直接取余)
#include<time.h>
#include<stdlib.h>
參考代碼
void Compter(char board[ROW][COL], int row, int col)
{
printf("Compter:輸入坐標>\n");
while (1)
{
int i = rand() % col;
int j = rand() % row;//范圍
if (i >= 0 && i <col && j >= 0 && j < row)
{
if (board[i][j] == ' ')//是否覆寫
{
board[i][j] = '#';
break;
}
}
}
}
判斷
采取回傳值
1.回傳‘*’ 表示玩家獲勝
2.回傳‘#’ 表示電腦獲勝
3.回傳’g’ 表示勝負未分
4.回傳‘s’ 表示和棋
勝負:判定所有的行,列,對角線
繼續游戲:如果陣列中有元素為’ ‘,那么沒下完,回傳‘g’,游戲繼續,不跳出
平局:如果以上條件都未實作回傳值,既是無勝負,也無繼續游戲,那就是平局則回傳‘s’
參考代碼
char Iswin(char board[ROW][COL], int row, int col)//判斷輸贏
{
for (int i = 0; i < row; i++)//橫排
{
if (board[i][0] == board[i][1]&& board[i][0] == board[i][2] && board[i][0] == '*')
{
return '*';
}
if (board[i][0] == board[i][1] && board[i][0] == board[i][2] && board[i][0] == '#')
{
return '#';
}
}
for (int j = 0; j < col; j++)//判斷豎排
{
if (board[0][j] == board[1][j] && board[0][j] == board[2][j] && board[0][j] == '*')
{
return '*';
}
if (board[0][j] == board[1][j] && board[0][j] == board[2][j] && board[0][j] == '#')
{
return '#';
}
}
//判斷對角線
if ((board[0][0] == board[1][1] && board[1][1] == board[2][2] && board[0][0] == '*')|| (board[0][2] == board[1][1] && board[1][1] == board[2][0] && board[0][2] == '*'))
{
return '*';
}
if ((board[0][0] == board[1][1] && board[1][1] == board[2][2] && board[0][0] == '#')|| (board[0][2] == board[1][1] && board[1][1] == board[2][0] && board[0][2] == '#'))
{
return '#';
}
for (int i = 0; i < row; i++)
{
for (int n = 0; n < col; n++)
{
if (board[i][n] == ' ')
return 'g';//繼續游戲
}
}
return 's';//平局
}
整體游戲流程代碼
void game()//進入游戲
{
srand((unsigned int)time(NULL));
char ret = { 0 };
char board[ROW][COL] = { 0 };
Initboard(board, ROW, COL);//初始化棋盤
Displayboard(board, ROW, COL);//展示列印棋盤
while (1)
{
Player(board, ROW, COL);//玩家落子
Displayboard(board, ROW, COL);//列印落子后棋盤
ret=Iswin(board, ROW, COL);//回傳判斷結果
if (ret != 'g')//不是繼續的回傳值就退出
break;
Compter(board, ROW, COL);//電腦落子
Displayboard(board, ROW, COL);//列印落子后棋盤
ret=Iswin(board, ROW, COL);//回傳判斷結果
if (ret != 'g')//不是繼續的回傳值就退出
break;
}
if (ret == '*')//進一步選擇游戲結果
printf("恭喜你贏了!\n");
else if (ret == '#')
printf("別灰心,下次再來\n");
else
printf("平局\n");
}
效果示意
******************************
請開始你的選擇:>>>
1
即將開始游戲
| |
---|---|---
| |
---|---|---
| |
player:輸入坐標>
11
11
超出范圍啦,請重新輸入坐標>
1 1
* | |
---|---|---
| |
---|---|---
| |
Compter:輸入坐標>
* | |
---|---|---
| | #
---|---|---
| |
player:輸入坐標>
1 2
* | * |
---|---|---
| | #
---|---|---
| |
Compter:輸入坐標>
* | * | #
---|---|---
| | #
---|---|---
| |
player:輸入坐標>
2 1
* | * | #
---|---|---
* | | #
---|---|---
| |
Compter:輸入坐標>
* | * | #
---|---|---
* | | #
---|---|---
| | #
別灰心,下次再來
******************************
********** 1.play **********
********** 0.exit **********
******************************
請開始你的選擇:>>>
趕緊試試吧,鍛煉代碼能力!
下附原始碼
game.h
#pragma once
#define _CRT_SECURE_NO_WARNINGS
#define ROW 3
#define COL 3
#include<stdio.h>
#include<time.h>
#include<stdlib.h>
extern void Initboard(char board[ROW][COL], int row, int col);
extern void Displayboard(char board[ROW][COL], int row, int col);
extern void Player(char board[ROW][COL], int row, int col);
extern void Compter(char board[ROW][COL], int row, int col);
extern char Iswin(char board[ROW][COL], int row, int col);
test.c
#include"game.h"
void menu()//游戲選單
{
printf("******************************\n");
printf("********** 1.play **********\n");
printf("********** 0.exit **********\n");
printf("******************************\n");
}
void game()//進入游戲
{
srand((unsigned int)time(NULL));
char ret = { 0 };
char board[ROW][COL] = { 0 };
Initboard(board, ROW, COL);
Displayboard(board, ROW, COL);
while (1)
{
Player(board, ROW, COL);
Displayboard(board, ROW, COL);
ret=Iswin(board, ROW, COL);
if (ret != 'g')//不是繼續就退出
break;
Compter(board, ROW, COL);
Displayboard(board, ROW, COL);
ret=Iswin(board, ROW, COL);
if (ret != 'g')//不是繼續就退出
break;
}
if (ret == '*')
printf("恭喜你贏了!\n");
else if (ret == '#')
printf("別灰心,下次再來\n");
else
printf("平局\n");
}
int main()
{
int input = 0;
do
{
menu();
printf("請開始你的選擇:>>>\n");
scanf("%d", &input);
switch (input)
{
case 0:
printf("退出游戲成功\n");
break;
case 1:
printf("即將開始游戲\n");
game();
break;
default:
printf("輸入錯誤:please input your number again!\n");
break;
}
} while (input);
return 0;
}
game.c
#include"game.h"
void Initboard(char board[ROW][COL], int row, int col)//初始化棋盤內容
{
for (int i = 0; i < row; i++)
{
for (int n = 0; n < col; n++)
{
board[i][n] = ' ';
}
}
}
void Displayboard(char board[ROW][COL], int row, int col)//列印棋盤
{
for (int i = 0; i < row; i++)//行數
{
for (int j = 0; j < col; j++)//列數
{
if (j < col - 1)//第一排內容,控制最后一次不列印‘|’
printf(" %c |", board[i][j]);
else
printf(" %c ", board[i][j]);
}
printf("\n");//換行
if (i < row - 1)//第二排,控制最后一次不列印
{
for (int k = 0; k < col; k++)
{
if (k < col - 1)
printf("---|");
else
printf("---");
}
printf("\n");//同樣換行
}
}
}
void Player(char board[ROW][COL], int row, int col)
{
printf("player:輸入坐標>\n");
int i, j;
while (1)
{
scanf("%d%d", &i, &j);
if (i > 0 && i <= col && j > 0 && j <= row)
{
if (board[i - 1][j - 1] == ' ')
{
board[i - 1][j - 1] = '*';
break;
}
else
printf("已經被走過了,請重新輸入坐標>\n");
}
else
printf("超出范圍啦,請重新輸入坐標>\n");
}
}
void Compter(char board[ROW][COL], int row, int col)
{
printf("Compter:輸入坐標>\n");
while (1)
{
int i = rand() % col;
int j = rand() % row;
if (i >= 0 && i <col && j >= 0 && j < row)
{
if (board[i][j] == ' ')
{
board[i][j] = '#';
break;
}
}
}
}
char Iswin(char board[ROW][COL], int row, int col)//判斷輸贏
{
for (int i = 0; i < row; i++)//橫排
{
if (board[i][0] == board[i][1]&& board[i][0] == board[i][2] && board[i][0] == '*')
{
return '*';
}
if (board[i][0] == board[i][1] && board[i][0] == board[i][2] && board[i][0] == '#')
{
return '#';
}
}
for (int j = 0; j < col; j++)//判斷豎排
{
if (board[0][j] == board[1][j] && board[0][j] == board[2][j] && board[0][j] == '*')
{
return '*';
}
if (board[0][j] == board[1][j] && board[0][j] == board[2][j] && board[0][j] == '#')
{
return '#';
}
}
//判斷對角線
if ((board[0][0] == board[1][1] && board[1][1] == board[2][2] && board[0][0] == '*')|| (board[0][2] == board[1][1] && board[1][1] == board[2][0] && board[0][2] == '*'))
{
return '*';
}
if ((board[0][0] == board[1][1] && board[1][1] == board[2][2] && board[0][0] == '#')|| (board[0][2] == board[1][1] && board[1][1] == board[2][0] && board[0][2] == '#'))
{
return '#';
}
for (int i = 0; i < row; i++)
{
for (int n = 0; n < col; n++)
{
if (board[i][n] == ' ')
return 'g';//繼續游戲
}
}
return 's';//平局
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/290993.html
標籤:其他
上一篇:優化的三子棋
