目录

如何用C写一个简单的小游戏

目录

如何用C++写一个简单的小游戏?

另,只推荐一本书,搜 (google或者百度一下,有pdf和code下载的)

再往后,循序渐进就知道下一步了。

祝,学习快乐:)


首先我分析下你的问题:

“怎么从我们这样一开始学C++到能做一个像平时玩的一个简单的游戏”

“从我们这样一开始学C++”

这是你的现在状态,那么我假定:你还没有C++入门咯,或者C++刚完成“理论部分”

其实第一个答主,

这位同学说的是调用游戏引擎和图形库去开发游戏,我觉得题主还没有达到这个水平,所以我暂时不和你说一些图形库和游戏引擎。

我认为你是刚入门。(如果我理解错了,请纠正O(∩_∩)O哈!)

“能做一个像平时玩的一个简单的游戏”

我不知道咯租户对于这个“简单的游戏”是怎么定义的?

黑窗口的贪吃蛇你玩过没?

(你懂黑窗口吧,就是cmd菜单,就是你第一次输入" world"那个黑黑的窗口,学术名:控制台程序)

听懂了吗?

或者说,你所谓“简单游戏”,是电脑上的“拳皇“,” “,这些单机,

或者一些更炫的桌游或者,现在很流行的撸啊撸这类网游。

或者说,你想要的是安卓手机上,社么”2048“ " " “3D飙车”


这三类都是游戏,所谓"简单",我觉得不好理解。

我建议楼主以后问问题的时候,可以打个比方,举个详细的例子,否则他人无法理解,你到底想要什么?


言归正传,我上面标记为1的是楼主必须要会的,就是你如果想做2,3,这种类型的游戏,第一步

1代表的 控制台程序 必须要会。

这些游戏,比如 “贪吃蛇” ”俄罗斯方块“ ”飞行器“

这类控制台的游戏,虽然无趣,但是如果你想做一些看起来很炫很艳丽的2,3类游戏,相信我,你控制台这关,最好是认真做完。

这类游戏,你可以去图书馆借一本 ”C语言课程设计”

这本书真的认认真真学完,敲出每一行代码,你的面向过程编程能力,基本可以放心了。

有什么代码细节搞不定,上 CSDN, 博客园,overflow 去问,去发帖问。

问百度。

翻墙问谷歌。

但如果是架构上的问题,问老师吧或者一些 “真的很” 牛逼的学长。

不要急躁,打基础这一步,千万不要跳

完成这一步,第 1 类游戏相信,对你来说不在话下,更重要的是,你的C语言功底绝对会有一个很大提升。


第二,当你第一步完成了,1类游戏搞定了,那我就可以告诉你,第二类游戏,会接触4个概念: 面向对象编程OOP游戏引擎可视化编程GUI (图形界面)

这个时候C++的确可以做,一些简单的带图形的游戏。

至于用了啥技术,你把我说的下面这本书看一下,就都知道了,码字好累。。。

比如,你能力够,完全可以把 合金弹头 那种游戏,或者 手机上 天天酷跑 这些游戏移植到windows上来,只是你至少要去图书馆借一本书:

https://i-blog.csdnimg.cn/blog_migrate/c5ae13d534ca3059e89568cc595dfbed.jpeg

当初我倒是做过一个 坦克大战的windows版。可惜源码已不知所踪。

你可以百度试试有没有写好的源码。

这本书当时我是下的pdf版,如果嫌弃太老了,你去图书馆借一本和这本书类似的吧,推荐我就不了,其实我也就完整看了这一本,我觉得对于初学者,够了。

至于第3类,那是安卓程序,所以, 你至少需要再学一门java ,它不是C++能搞定的,

然后再百度 “安卓开发入门”

然后再百度安卓游戏开发

之后,等你搞清楚什么是安卓开发的,搞定java基础,对OOP有一点实战经验,

而且决心做安卓,再去做 社么 “天天酷跑”子类的游戏吧、


我也不是专业做游戏的,也就大一做过一段时间,玩过MFC,我觉得吧,做游戏最主要是游戏引擎要玩的好,其他的都是浮云。

希望你按照顺序学东西,不要嫌弃黑窗口,先打好黑窗口的基础。

学东西一定要踏实,稳扎稳打。

学东西一定要踏实,稳扎稳打。

学东西一定要踏实,稳扎稳打。

我的答案,其实也就是一条路线了吧。

详细术语的描述,等我下次再来改一下,码字多了,累了。

这是我用python写的超级马里奥的代码

希望对你有帮助。

#!/usr/bin/env python 
# -*- coding:utf-8 -*- 
import pygame,os,wx
from random import randint
from sys import exit
from pygame.locals import *
pygame.init()

def main(): #获取屏幕大小
app=wx.App()
WHFRAMES=wx.DisplaySize()
WIDTH=int(WHFRAMES[0]*0.7)
HEIGHT=int(WHFRAMES[1]*0.8)
Timers = 0 #游戏定时器
TimersSec = 0 #秒
tim_psd = 0 #获取屏幕大小
screen=pygame.display.set_mode((WIDTH,HEIGHT),0,32)
caption=pygame.display.set_caption("超级马里奥")
screen.fill([255,255,255])
mariofont = pygame.font.Font('fonts/poster.ttf',22)
mario_name = mariofont.render("MARIO",True,(84,65,190),None)
#Game_world = mariofont.render("WORLD",True,(84,65,190),None)
Game_moneyX = mariofont.render("X",True,(255,255,128),None)
Game_time = mariofont.render("TIME",True,(84,65,190),None)

money_ic5 = pygame.image.load('images/PTModelSprite_ID21675.png')
money_ic5 = pygame.transform.scale(money_ic5, (25, 25))
money_ic6 = pygame.image.load('images/PTModelSprite_ID21676.png')
money_ic6 = pygame.transform.scale(money_ic6, (10, 25))
money_ic7 = pygame.image.load('images/PTModelSprite_ID21677.png')
money_ic7 = pygame.transform.scale(money_ic7, (25, 25))
money_ic8 = pygame.image.load('images/PTModelSprite_ID21678.png')
money_ic8 = pygame.transform.scale(money_ic8, (25, 25))
money_timers = 0 #图片轮播定时器

Game_world = pygame.image.load('images/PTModelSprite_ID2478.png')

background = pygame.image.load('images/PTModelSprite_ID35342.png').convert_alpha()
background = pygame.transform.scale(background, (WIDTH, HEIGHT))

Roads = pygame.image.load('images/PTModelSprite_ID3790.png').convert_alpha()
Roads2 = pygame.image.load('images/PTModelSprite_ID4224.png').convert_alpha()

hero = pygame.image.load('images/PTModelSprite_ID34297.png').convert_alpha()
x,y = 15,HEIGHT-200
inp_flag = -2 #(stop:-1 left drection ,-2 right drection) ,(walk:1 right drection ,2 left drection)
times,times2 = 0,0 #人物动作定时器
move_values,jump_values,jump_values2,jump_values3 = 12,0,0,0 #一步移动的距离 和 跳跃的值 1,2
jump_adder,jump_max_point = 0,50 #跳跃累加器 用来累加按键的长短 然后判断跳跃的高度,跳跃的初始值最高点
jump_flag = 0
bg_w_1,bg_w_2 = 0,WIDTH-2 #两张壁纸 一前一后循环拖动的变量

#播放背景

#播放背景

#游戏信息数据定义
score = 0
money = 0
world = 11
time = 400
Gdata = [score,money,world,time] #游戏信息数据定义

#初始化函数
def game_initializaion(score,money,world,time,Gdata,TimersSec,Timers,x,y,inp_flag,times,times2,move_values,jump_values,jump_values2,jump_values3,jump_adder,jump_max_point,jump_flag,bg_w_1,bg_w_2,tim_psd):#数据初始化 #游戏初始化数据
inp_flag = -2 #(stop:-1 left drection ,-2 right drection) ,(walk:1 right drection ,2 left drection)
x,y = 15,HEIGHT-200 #马里奥坐标
times,times2 = 0,0 #人物动作定时器
move_values,jump_values,jump_values2,jump_values3 = 12,0,0,0 #一步移动的距离 和 跳跃的值 1,2
jump_adder,jump_max_point = 0,50 #跳跃累加器 用来累加按键的长短 然后判断跳跃的高度,跳跃的初始值最高点
jump_flag = 0
tim_psd = 0
bg_w_1,bg_w_2 = 0,WIDTH-2 #两张壁纸 一前一后循环拖动的变量
Timers = 0 #游戏定时器
score = 0 #开始分数
money = 0 #开始金钱
world = 11 #世界关卡第一关 1-1 = 11
time = 400 #游戏总时间
TimersSec = 0 #游戏里的秒
Gdata = [score,money,world,time] #游戏初始化数据
return score,money,world,time,Gdata,TimersSec,Timers,x,y,inp_flag,times,times2,move_values,jump_values,jump_values2,jump_values3,jump_adder,jump_max_point,jump_flag,bg_w_1,bg_w_2,tim_psd #初始化函数

score,money,world,time,Gdata,TimersSec,Timers,x,y,inp_flag,times,times2,move_values,jump_values,jump_values2,jump_values3,jump_adder,jump_max_point,jump_flag,bg_w_1,bg_w_2,tim_psd = \
 game_initializaion(score,money,world,time,Gdata,TimersSec,Timers,x,y,inp_flag,times,times2,move_values,jump_values,jump_values2,jump_values3,jump_adder,jump_max_point,jump_flag,bg_w_1,bg_w_2,tim_psd)#数据初始化主调函数

clock = pygame.time.Clock()
pygame.key.set_repeat(55)
pygame.display.flip()

def WalkAction(times,times2,inp_flag,hero):
#walk action
if y < HEIGHT -200: #如果在空中 为跳跃图片
if inp_flag == 1: #right
hero = pygame.image.load('images/PTModelSprite_ID34259.png').convert_alpha()
if inp_flag == 2: #left
hero = pygame.image.load('images/PTModelSprite_ID34259.png').convert_alpha()
hero = pygame.transform.flip(hero, True, False)
else:
if inp_flag == 1: #right
times += 2
if times < 20:
hero = pygame.image.load('images/PTModelSprite_ID34256.png').convert_alpha()
elif times < 20:
hero = pygame.image.load('images/PTModelSprite_ID34257..png').convert_alpha()
elif times < 40:
hero = pygame.image.load('images/PTModelSprite_ID34258.png').convert_alpha()
elif times < 60:
hero = pygame.image.load('images/PTModelSprite_ID34259.png').convert_alpha()
elif times < 80:
hero = pygame.image.load('images/PTModelSprite_ID34260.png').convert_alpha()
elif times < 100:
hero = pygame.image.load('images/PTModelSprite_ID34261.png').convert_alpha()
elif times < 120:
hero = pygame.image.load('images/PTModelSprite_ID34297.png').convert_alpha()
elif times < 140:
times = 0
if inp_flag == 2: #left
times2 += 2
if times2 < 20:
hero = pygame.image.load('images/PTModelSprite_ID34256.png').convert_alpha()
hero = pygame.transform.flip(hero, True, False)
elif times2 < 20:
hero = pygame.image.load('images/PTModelSprite_ID34257..png').convert_alpha()
hero = pygame.transform.flip(hero, True, False)
elif times2 < 40:
hero = pygame.image.load('images/PTModelSprite_ID34258.png').convert_alpha()
hero = pygame.transform.flip(hero, True, False)
elif times2 < 60:
hero = pygame.image.load('images/PTModelSprite_ID34259.png').convert_alpha()
hero = pygame.transform.flip(hero, True, False)
elif times2 < 80:
hero = pygame.image.load('images/PTModelSprite_ID34260.png').convert_alpha()
hero = pygame.transform.flip(hero, True, False)
elif times2 < 100:
hero = pygame.image.load('images/PTModelSprite_ID34261.png').convert_alpha()
hero = pygame.transform.flip(hero, True, False)
elif times2 < 120:
hero = pygame.image.load('images/PTModelSprite_ID34297.png').convert_alpha()
hero = pygame.transform.flip(hero, True, False)
elif times2 < 140:
times2 = 0
elif inp_flag == -1:
hero = pygame.image.load('images/PTModelSprite_ID34297.png').convert_alpha()
hero = pygame.transform.flip(hero, True, False)
times2 = 0
elif inp_flag == -2:
hero = pygame.image.load('images/PTModelSprite_ID34297.png').convert_alpha()
times2 = 0

return times,times2,inp_flag,hero

def HeroHeightIs(): #判断角色是否为地面 y 轴
if y >= HEIGHT-200:
return False
else: #这是在控制的状况
return True

def Reset_max_point(jump_max_point): #在地面重设默认跳跃的最高点(还原)
if y >= (HEIGHT-200):
jump_max_point = 50 #默认最高点是 50
return jump_max_point

def jump_leftScreenBgnotMove(x):
if x<(WIDTH/4):
if jump_max_point == 50 :
if inp_flag == 1:
x+=(2.7)
if inp_flag == 2:
x-=(2.7)
elif jump_max_point == 100 :
if inp_flag == 1:
x+=(0.27)
if inp_flag == 2:
x-=(0.27)
return x

def Screen_MoneyIc(screen,money_ic5,money_ic6,money_ic7,money_ic8,money_timers) : #绘制第二项 金钱图标

money_timers += 1
if money_timers < 15 :
screen.blit(money_ic5,(WIDTH*0.24,25)) #绘制第二项 金钱图标 1
elif money_timers < 40 :
screen.blit(money_ic6,(WIDTH*0.24+7.5,25)) #绘制第二项 金钱图标 2
elif money_timers < 55 :
screen.blit(money_ic7,(WIDTH*0.24,25)) #绘制第二项 金钱图标 3
elif money_timers < 80 :
screen.blit(money_ic8,(WIDTH*0.24,25)) #绘制第二项 金钱图标 4
else:
money_timers = 0
return screen,money_ic5,money_ic6,money_ic7,money_ic8,money_timers

def Game_Timers(TimersSec,Gdata,time_passed,tim_psd) : #游戏定时器

tim_psd += time_passed
if tim_psd >= 1000 : #为 1 秒的时候
TimersSec += 1
tim_psd = 0
Gdata[3] = 400 - TimersSec #游戏所剩时间

return TimersSec,Gdata,time_passed,tim_psd

while True:

#事件检测
for event in pygame.event.get():
if event.type == pygame.QUIT:
exit()

if event.type == KEYDOWN:
keys=pygame.key.get_pressed()
if keys[pygame.K_a]:
if event.key == K_w and inp_flag == 0:
if y <= HEIGHT-200: #看 y 坐标 必须在起点
jump_flag = 3 #按了上 和 向前
if y >= HEIGHT-200:#如果角色在平地才走动 后退 左
#if bg_w_1==0:
#x-=5
x-=(move_values+3.5)
inp_flag = 2

if keys[pygame.K_d]:
if event.key == K_w and inp_flag == 0:
if y <= HEIGHT-200: #看 y 坐标 必须在起点
jump_flag = 2 #按了上 和 向前
if y >= HEIGHT-200:#如果角色在平地才走动 前景 右
if x<(WIDTH/4): #角色还在屏幕左边 可移动
x+=(move_values+3.5)
inp_flag = 1

if keys[pygame.K_w]: #jump
jump_flag = 1 #仅仅是按了跳跃
jump_adder += 1 #跳跃累加器
if event.key == pygame.K_d and (jump_flag == 1):
if y == HEIGHT-200: #看 y 坐标 必须在起点
jump_flag = 2 #按了上 和 向前
if event.key == pygame.K_a and (jump_flag == 1):
if y == HEIGHT-200: #看 y 坐标 必须在起点
jump_flag = 3 #按了上 和 向后

if keys[pygame.K_p]: #重启
score,money,world,time,Gdata,TimersSec,Timers,x,y,inp_flag,times,times2,move_values,\
 jump_values,jump_values2,jump_values3,jump_adder,jump_max_point,jump_flag,bg_w_1,bg_w_2,tim_psd = \
 game_initializaion(score,money,world,time,Gdata,TimersSec,Timers,x,y,inp_flag,times,times2,\
 move_values,jump_values,jump_values2,jump_values3,jump_adder,jump_max_point,jump_flag,bg_w_1,\
 bg_w_2,tim_psd)

if event.type == KEYUP:
if keys[pygame.K_a]:
inp_flag = -1
if keys[pygame.K_d]:
inp_flag = -2
if keys[pygame.K_w]:
if jump_adder < 4 : #如果松开按键没有达到 jump_adder 跳跃累加器的值 (那么就他们置零)
jump_adder = 0

##在地面时 重设默认跳跃的最高点(还原)
jump_max_point = Reset_max_point(jump_max_point)

#jump action 1
if jump_flag == 1: #只有跳跃 #让其他方式跳跃值为 0
jump_values2 = 0
jump_values3 = 0
#------ #持续按键跳跃的结构
if jump_adder >=4 :
jump_max_point = 100 #第二次跳跃最大值
jump_adder = 0
#------
jump_values+=1.25
if jump_values <= jump_max_point:
y -= 5

x = jump_leftScreenBgnotMove(x)

if jump_max_point == 100:#跳跃的高度不同 y 坐标的速度也要慢点
y += 1.5
x = jump_leftScreenBgnotMove(x)

elif jump_values <= jump_max_point+8:
pass
elif jump_values <=jump_max_point*2+8:
if HeroHeightIs(): #如果角色在控制 就继续加 y 轴的值 1
y += 5

x = jump_leftScreenBgnotMove(x)

if jump_max_point == 100:#跳跃的高度不同 y 坐标的速度也要慢点
y -= 1.5
x = jump_leftScreenBgnotMove(x)

else:
y = HEIGHT-200
jump_flag = 0
jump_values = 0

#wall detection
if x<=0:
x=0
if x+hero.get_width()>WIDTH:
x=WIDTH-hero.get_width()

#角色的动作 函数
times,times2,inp_flag,hero = WalkAction(times,times2,inp_flag,hero)

#1 .bg move---blit
screen.blit(background,(bg_w_2,0))
screen.blit(background,(bg_w_1,0))

#绘制信息

screen.blit(mario_name,(WIDTH*0.03,3))#绘制第一项 名字

screen,money_ic5,money_ic6,money_ic7,money_ic8,money_timers = \
 Screen_MoneyIc(screen,money_ic5,money_ic6,money_ic7,money_ic8,money_timers) #绘制第二项 金钱图标

screen.blit(Game_moneyX,(WIDTH*0.28,24))#绘制第二项 x
screen.blit(Game_world,(WIDTH*0.5-Game_world.get_width()/2,3))#绘制第三项 世界地图
screen.blit(Game_time,(WIDTH*0.84,3))#绘制第四项 游戏时间

for DATAi in range(4):
Game_data = mariofont.render("%s"% Gdata[DATAi],True,(255,255,128),None) #综合绘制: 分数 金币 关卡 游戏时间
if DATAi != 2:
screen.blit(Game_data,(WIDTH*(0.03+DATAi*0.27),24))
elif DATAi == 2:
Game_data = mariofont.render("%s-%s"% (Gdata[DATAi]/10,Gdata[DATAi]%10),True,(255,255,128),None) #综合绘制: 分数 金币 关卡 游戏时间
screen.blit(Game_data,(WIDTH*0.5-Game_data.get_width()/2,15))

#绘制信息

#2 .bg move--panel
#if inp_flag == 2: #往左走 壁纸向右拖动

# bg_w_1+=move_values/4

# bg_w_2+=move_values/4

if inp_flag == 1 and x>=(WIDTH/4):#往右走 壁纸向左拖动
bg_w_1-=(move_values/4-0.5)
bg_w_2-=(move_values/4-0.5)

if bg_w_1>=0:
bg_w_1,bg_w_2 = 0,WIDTH-2
if bg_w_1<-WIDTH:
bg_w_1,bg_w_2 = 0,WIDTH-2

screen.blit(hero,(x,y))
pygame.time.delay(2) #毫秒

time_passed = clock.tick()
TimersSec,Gdata,time_passed,tim_psd = Game_Timers(TimersSec,Gdata,time_passed,tim_psd) #游戏定时

pygame.display.update()

if **name** == '**main**':
main()